E-Mail: info@free-da.com
Телефон: +7 (812) 642-98-71
FAQ для начинающего программиста 1С
Пример создания типизированых колонок в таблице значений
Форма списка с деревом групп
-
Отладка 1С не в файловом варианте (SQL)
-
Отладка 1С web сервисов
-
Сверхбыстрое удаление элементов справочника
-
Пример создания типизированых колонок в таблице значений
-
Псевдо-листы (ссыла на регистры)
-
Регистрация 1С Com connector
-
Примеры запросов. Отбор из регистра по документу регистратору
-
Вызываем процедуру другой формы
-
Прогресс-бар для длительных операций в цикле
-
Форма списка с реквизитом отбора
-
Форма cписка новый Элемент с заполнением
-
Форма спиcка с деревом групп
- Расчет в запросе дней месяцев и лет от даты
Отладка 1С не в файловом варианте
Очень часто в клиент-серверном варианте, у начинающих программистов 1С, возникат вопросы относительно отсутсвия останова в тексте модуля под тегом &НаСервере.
По умолчанию, при использовании клиент-серверного режима работы 1С-предприятия никакие серверные функции и процедуры не будут поддаваться пошаговой отладке. Система будет выполнять их «на сервере 1С 8.3″, такие процедуры не видны для клиентской машины. То есть, точки останова на сервере 1С не работают.
Исправляется это редактированием записи в реестре
- [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent].
- Скорректировать ключ для ragent.exe , добавив «-debug».
- Пример редактирования: C:\Program Files (x86)\1cv82\8.2.18.109\bin\ragent.exe» -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d «C:\Program Files (x86)\1cv82\srvinfo»
После правки перезапускаем сервер с новыми параметрами. Теперь программист 1с может отслеживать процедуры на сервере.
Отладка 1С Web-сервиса
Для разрешения отладки на веб-сервере нужно перейти на вкладку "Прочие" диалога публикации на веб-сервере, установить флаг "разрешить отладку" или выбрать (Разрешена (протокол TCP/IP)) и указать адрес отладчика. Для локальной отладки можно указать tcp://localhost
После правки перезапускаем ОБЯЗАТЕЛЬНО! перезапускаем web сервер с новыми параметрами.
Меню - Отладка - Подключение - Автоматическое подключение - выбрать тип сервиса для отладки
Теперь программист 1с может отслеживать процедуры на сервере.
Сверхбыстрое удаление элементов справочника и других объектов конфигурации
//=====================================
&НаСервере
Процедура УдалитьНоменклатуруТестНаСервере()
Запрос = Новый Запрос( "ВЫБРАТЬ
| НоменклатураТест.Ссылка
|ИЗ
| Справочник.НоменклатураТест КАК НоменклатураТест"
);
Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
УдалитьОбъекты(Результат,,);
КонецПроцедуры
//=====================================
.Процедура удаляет все элементы справочника НоменклатураТест без всяких проверок
// удаление помеченных объектов с контролем ссылочной целостности Помеченные = НайтиПомеченныеНаУдаление(); Найденные = 0; УдалитьОбъекты(Помеченные, Истина, Найденные); Для каждого Ссылка из Найденные Цикл СтрСообщения = "Объект не удален: " + СокрЛП(Ссылка[0]); СтрСсылка = ", используется в " + СокрЛП(Ссылка[1]); Сообщить (СтрСообщения + СтрСсылка); КонецЦикла;
Пример создания типизированых колонок в таблице значений
ТЗ.Колонки.Добавить("ИндексСортировки" , Новый ОписаниеТипов("Число")); ТЗ.Колонки.Добавить("ИмяРаздела" , Новый ОписаниеТипов("Строка")); ТЗ.Колонки.Добавить("ДатаКорр" , Новый ОписаниеТипов("Дата")); ТЗ.Колонки.Добавить("БезусловноеУдаление" , Новый ОписаниеТипов("Булево")); ТЗ.Колонки.Добавить("Номенклатура" , Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ТЗ.Колонки.Добавить("ДанныеРаздела" , Новый ОписаниеТипов("Структура")); // пример создания колонок "число" и "строка" с уточнением параметров: ТЗ.Колонки.Добавить("ПроцентВыполнения" , Новый ОписаниеТипов("Число" , Новый КвалификаторыЧисла(18, 2))); ТЗ.Колонки.Добавить("ИмяРаздела" , Новый ОписаниеТипов("Строка" , , Новый КвалификаторыСтроки(200, ДопустимаяДлина.Переменная))); ТЗ.Колонки.Добавить("ДатаСписаания" , Новый ОписаниеТипов("Дата" , , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
Расширение командного интерфейса ( Псевдо листы)
Пример настроек для регистра сведений или подчиненного справочника.
Если нам необходимо создать справочник подчиненный документу.
То делаем у этого справочник реквизит ОбъектВладелец с галочкой Заполнять из Данных заполнения. И создаем команду справочника с параметрами (свойства):
Группа - Панель навигации формы.Перейти
Тип ПараметрКоманды - ДокументВладелец.ссылка
И в модуле команды
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить("ОбъектВладелец",ПараметрКоманды);
ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.ПодчиненныйДокументуСправочник.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
В документе форме проверяем командный интерфейс, а в форме элемента справочника процедуру
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Костыль для подстановки документа владельца
КонецПроцедуры
Регистрация 1С COM connector
- regsvr32 (1C.../bin/)commcntr.dll ( Регистрируем библиотеку)
- "Службы компонентов" (например: Пуск -> Администрирование -> Службы компонентов. *Приложения COM+* добавляем новое приложение: Создать -> Приложение. На вопрос "Установка или создание нового приложения" — выбираем "Создать новое приложение". Имя нового приложения лучше написать чтобы было понятно о чем речь: *1CV8_ComConnector*, способ активации — "серверное приложение".Учетная запись для запуска приложения *Локальная Служба* после нужно будт выбирать учетку users под которой стартует сервер 1С.
- В ветке созданного приложения *1CV8_ComConnector* переходим на ветку "Компоненты" и создаем компонент: Создать -> Компонент
Выбираем "Установка новых компонент", и в диалоге выбираем нужную библиотеку (comcntr.dll) - Идем в роли, в createrOwner выбираем учетку users под которой стартует сервер 1С. "1CV8_ComConnector" свойства - безопасность - убираем галку с Принудительная проверка доступа для приложения. Убеждаемся, что галка напротив createrOwner - Есть.
Примеры запросов. Отбор из регистра по документу регистратору
|ВЫБРАТЬ
| ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыПоставщиковСрезПоследних.Регистратор КАК Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(, Регистратор ССЫЛКА Документ.ПриобретениеТоваровУслуг) КАК ЦеныНоменклатурыПоставщиковСрезПоследних
ВЫБРАТЬ
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних КАК ЦеныНоменклатурыПоставщиковСрезПоследних
ГДЕ
ЦеныНоменклатурыПоставщиковСрезПоследних.Регистратор ССЫЛКА Документ.ПриобретениеТоваровУслуг
ВЫБРАТЬ
ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних КАК ЦеныНоменклатурыПоставщиковСрезПоследних
ГДЕ
ТИПЗНАЧЕНИЯ(ЦеныНоменклатурыПоставщиковСрезПоследних.Регистратор) = ТИП(Документ.ПриобретениеТоваровУслуг)
Вызываем процедуру другой формы
Нередко возникает необходимость такой операции. Например, процедура должна не только быть выполнена на другой форме, но и потянуть за собой цепочку выполнения других процедур и функций указанной формы. Для этих целей можете использовать следующий код:
Форма = Ссылка.ПолучитьФорму("ФормаКакогоТоДокумента");
Форма.Открыть();
Форма.ПроцедураДругойФормы() // в форме должна быть объявлена как экспортная
Форма.Закрыть();
Тяжелый цикл сервера с прогресс-баром.
Порция - количество в пакете. ОбработатьДокументыНаСервере отрабатывает пакет и возвращается на клиент за новым. В этот момент обновляем прогресс-бар
&НаСервере
Функция ОбработатьДокументыНаСервере(Начало,Конец);
Для I = Начало+1 По Конец Цикл
Сообщить(""+I);
КонецЦикла;
КонецФункции
&НаКлиенте
Процедура ОбработатьДокументы(Команда)
Всего = 33;
Порция = 10;
Частей = Цел(Всего/Порция);
Остаток = Всего%Порция;
Состояние("Выполняется обработка ",0,"Старт ");
Для I = 1 По Частей Цикл
ОбработатьДокументыНаСервере((I-1)*Порция,I*Порция);
Состояние("Выполняется обработка ",Цел((I*Порция*100)/Всего),"Обработано "+Строка(I*Порция)+" из "+Всего );
КонецЦикла ;
ОбработатьДокументыНаСервере(Порция*Частей,Порция*Частей + Остаток);
Состояние("Завершено ",100,"Обработано "+Всего+" из "+Всего );
КонецПроцедуры
&НаСервере
Процедура ОбработатьСервер (Начало,Конец)
Для I = Начало По Конец Цикл
Сообщить(""+I);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьСПрогрессом(Всего,Порция)
Состояние("Выполняется обработка ",0,"Старт ");
Частей = Цел(Всего/Порция);
Остаток = Всего%Порция;
// Обработаем сегменты
Для Сегмент = 1 По Частей Цикл
//Если частей = 0 то проскок
Начало = Порция *(Сегмент-1)+1;
Конец = Порция * Сегмент ;
//Подготовка к выводу ПБара
Прогресс = Цел((Порция*Сегмент*100)/Всего);
Обработано = Сегмент*Порция;
ОбработатьСервер(Начало,Конец);
Состояние("Выполняется обработка ",Прогресс,"Обработано "+Строка(Обработано)+" из "+Всего );
КонецЦикла ;
//Обработаем хвост
Начало = Порция*Частей+1;
Конец = Порция*Частей+Остаток;
ОбработатьСервер( Начало, Конец);
Состояние("Завершено ",100,"Обработано "+Всего+" из "+Всего );
КонецПроцедуры
Форма списка с реквизитом отбора
Форма : Два реквизита - ФильтрРеквизитA,ФильтрРеквизитB
Список: Две колонки списка - РеквизитA,РеквизитB
&НаКлиенте
Процедура ВключитьФильтр()
Фильтр = Новый FixedStructure("A,B",Этаформа.ФильтрРеквизитA,Этаформа.ФильтрРеквизитB);
ФильтрНаСервере(Фильтр);
КонецПроцедуры
&НаСервере
Процедура ФильтрНаСервере(Фильтр)
Список.Отбор.Элементы.Очистить();
// Item = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// Если один
// Если много...
GroupAND = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
GroupAND.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
Item0GroupAND = GroupAND.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Item0GroupAND.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РеквизитA");
Item0GroupAND.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Item0GroupAND.ПравоеЗначение = Фильтр.A;
Item1GroupAND = GroupAND.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Item1GroupAND.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("РеквизитB");
Item1GroupAND.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Item1GroupAND.ПравоеЗначение = Фильтр.B;
GroupAND.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
GroupAN .Использование = Истина;
КонецПроцедуры
===========
&НаСервере
Процедура ФильтрПриИзмененииНаСервере(Фильтр)
Список.Отбор.Элементы.Очистить();
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Реквизит1");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Фильтр;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ФильтрПриИзменении(Элемент)
ФильтрПриИзмененииНаСервере(Этаформа.Фильтр);
КонецПроцедуры
Форма cписка новый Элемент с заполнением
У динамического списка на форме делаем вызов перехватывающий создание нового ( в том числе и с кнопки "Создать")
Заполняем программно "ПараметрыЗаполнения". Если у измерений стоит флаг "заполнять из данных заполнения" Процедура "Обработка заполнения" будет вызвана автоматически и не явно
&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
// Если у измерений стоит флаг "заполнять из данных заполнения" = Истина, Процедура "Обработка заполнения" - не нужна!
Отказ= Истина;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Измерение1",Этаформа.Реквизит1);
ПараметрыЗаполнения.Вставить("Измерение2",Этаформа.Реквизит2);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения",ПараметрыЗаполнения );
Форма = ПолучитьФорму("РегистрСведений.Тест1.Форма.ФормаЗаписи",ПараметрыФормы,Этаформа,,);
Форма.Открыть();
КонецПроцедуры
Выбор из формы списка
Установить списку атрибут - Режим выбора в Истина.
СписокВыбор - Отработает при двойном клике
СписокВыборЗначения - По кнопке Выбрать формы
&НаКлиенте
Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
ОповеститьОВыборе(Элемент.ТекущиеДанные);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Форма списка с деревом групп
Динамический список - Дерево Отображение = Дерево
Динамический список - Список Отображение = Иерархия
Форма свойства: (Использование:) Список групп = Дерево(Динамический список)
Работа с XML
//====================================== вспомогательные функции XML =========================
Функция Create_Node (Root_Node,Node_Name)
Возврат Root_Node.AppendChild(Root_Node.OwnerDocument.CreateElement(Node_Name));
конецФункции
Функция Add_Node_Vol(UpNode,Элемент,Значение)
NodeTxt = Create_Node(UpNode,Элемент);
NodeTxt.AppendChild(UpNode.ДокументВладелец.СоздатьТекстовыйУзел(XMLСтрока(Значение)));
Возврат UpNode;
конецФункции
Функция Set_Node_Arg(UpNode,Элемент,Значение)
UpNode.LastChild.SetAttribute(Элемент,Значение);
Возврат UpNode;
конецФункции
//====================================== вспомогательные функции XML =========================
//Создает тело сообщения и записывает его в файл
Функция New_MESSAGE(PathFileSave="С:\test.xml") Export
MESSAGE = Новый ДокументDOM(НЕОПРЕДЕЛЕНО, "MESSAGE");
RootDOM = MESSAGE.DocumentElement;
MESSAGE_BodyCreate(RootDOM);
MESSAGE_2_File(MESSAGE,PathFileSave);
Возврат ""
КонецФункции
//Запись тела сообщения в файл
Функция MESSAGE_2_File(Doc_DOM,FullFileName);
ХМЛ=Новый ЗаписьXML;
ХМЛ.ОткрытьФайл(FullFileName,Новый ПараметрыЗаписиXML("UTF-8",,Ложь,Ложь));
SaveDOM=Новый ЗаписьDOM;
SaveDOM.Write(Doc_DOM ,ХМЛ);
ХМЛ.Закрыть();
Возврат FullFileName;
КонецФункции
Функция MESSAGE_BodyCreate(RootDOM)
SubNode = Create_Node (RootDOM ,"Node");
Add_Node_Vol (SubNode,"A" , "A");
Add_Node_Vol (SubNode,"B" , "B");
SUB2 = Add_Node_Vol (SubNode,"C" , "C");
Set_Node_Arg(SUB2,"SUB2","2")
КонецФункции
Многоколоночный динамический массив
Array = Новый Массив(2);
Array[0] = Новый Массив();
Array[1] = Новый Массив();
//Таблица значений - Колонки Код и Наименование
Для каждого I из ТаблицаЗначений цикл
Array[0].Добавить(I.Код);
Array[1].Добавить(I.Наименование);
КонецЦикла;
F = Array[0].Количество()
Для ID=0 по Array[0].ВГраница() цикл
Сообщить("Код:"+Array[0][ID]+" Наименование: "+Array[1][ID]+"" );
КонецЦикла;
Расчет в запросе дней месяцев и лет от даты
ВЫБРАТЬ
Сотрудник.ДатаСобытия КАК ДатаСобытия,
ВЫБОР
КОГДА ДЕНЬГОДА(&ТекущаяДата) >= ДЕНЬГОДА(Сотрудник.ДатаСобытия)
ТОГДА ГОД(&ТекущаяДата) - ГОД(Сотрудник.ДатаСобытия)
ИНАЧЕ ГОД(&ТекущаяДата) - ГОД(Сотрудник.ДатаСобытия) - 1
КОНЕЦ КАК ПрошлоЛет,
ВЫБОР
КОГДА ДЕНЬГОДА(&ТекущаяДата) >= ДЕНЬГОДА(Сотрудник.ДатаСобытия)
ТОГДА МЕСЯЦ(&ТекущаяДата) - МЕСЯЦ(Сотрудник.ДатаСобытия)
ИНАЧЕ 12 - МЕСЯЦ(Сотрудник.ДатаСобытия) + МЕСЯЦ(&ТекущаяДата)
КОНЕЦ КАК ПрошлоМесяцев,
ВЫБОР
КОГДА ДЕНЬ(&ТекущаяДата) >= ДЕНЬ(Сотрудник.ДатаСобытия)
ТОГДА ДЕНЬ(&ТекущаяДата) - ДЕНЬ(Сотрудник.ДатаСобытия)
ИНАЧЕ ДЕНЬ(Сотрудник.ДатаСобытия) - ДЕНЬ(&ТекущаяДата)
КОНЕЦ КАК ПрошлоДней,
РАЗНОСТЬДАТ(&ТекущаяДата, Сотрудник.ДатаСобытия, ДЕНЬ) КАК ВДнях
ИЗ
Справочник.Сотрудник КАК Сотрудник
ДатаСобытия - Поле справочника сотрудник
&ТекущаяДата - Текущая дата
Вывод:
Сотрудник,ДатаСобытия,ПрошлоЛет,ПрошлоМесяцев,ПрошлоДней
Иванов 10.10.2010 10 12 22
Конвертация расширения 1С в основную базу
1 . Выгружаем расширение в файлы.
2. Открываем файл Configuration.xml
3. Удаляем строки:
<ConfigurationExtensionPurpose>AddOn</ConfigurationExtensionPurpose>
<ObjectBelonging>Adopted</ObjectBelonging>
<NamePrefix>РС_</NamePrefix>
<ConfigurationExtensionCompatibilityMode>False</ConfigurationExtensionCompatibilityMode>
4.Загружаем новую основную конфигурацию из файлов
Отбор дублей запросом
ВЫБРАТЬ
Номенклатура.Артикул КАК Артикул,
КОЛИЧЕСТВО(Номенклатура.Ссылка) КАК ДУБЛИ
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Артикул <> ""
СГРУППИРОВАТЬ ПО
Номенклатура.Артикул
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Номенклатура.Ссылка) > 1
Обработка из Хранилища Значений
В объекте реквизит обработка с типом - ХранилищеЗначений (ЭттОбъект.Объект.Обработка)
В форме дополнительный реквизит Адрес - Строка (Этаформа.Адрес)
&НаКлиенте
Процедура ЗагрузитьОбработку(Команда)
Если ЭтотОбъект.Параметры.Ключ.Пустая() Тогда
ПоказатьПредупреждение(,"Объект не записан !",10,"Ошибка!");
КонецЕсли;
Диалог = ДиалогОбработки(Ложь);
Ключ = Этаформа.УникальныйИдентификатор;
НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьОбработку_", ЭтотОбъект, Этаформа), ,Диалог,Истина,Ключ);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьОбработку_(Флаг,Адрес,ИмяФайла,Этаформа) Export
Если Флаг = Ложь Тогда Возврат КонецЕсли;
этаформа.Адрес = Адрес;
Этаформа.Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Адрес = Этаформа.Адрес;
Если Адрес <> "" Тогда
Данные = ПолучитьИзВременногоХранилища(Адрес);
Обработка = Новый ХранилищеЗначения(Данные,Новый СжатиеДанных(3));
ТекущийОбъект.Обработка = Обработка;
ТекущийОбъект.Загружать = Истина;
КонецЕсли;
КонецПроцедуры
//====================================================
&НаКлиенте
Процедура ВыгрузитьОбработку(Команда)
Если ЭтотОбъект.Параметры.Ключ.Пустая() Тогда
ПоказатьПредупреждение(,"Объект не записан!",10,"Ошибка!");
КонецЕсли;
Диалог = ДиалогОбработки(Истина);
Ключ = Этаформа.УникальныйИдентификатор;
Диалог.Показать(Новый ОписаниеОповещения("ВыгрузитьОбработку_", ЭтотОбъект, Ключ))
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьОбработку_(Файлы, Ключ) Export
Если Файлы = неопределено Тогда Возврат
Иначе ФайлВыбран = Файлы[0];
КонецЕсли;
Адрес = ВыгрузитьОбработкуНаСервере(Ключ,ЭтотОбъект.Объект.Ссылка);
Если Адрес = Неопределено Тогда
ПоказатьПредупреждение(,"Файл пуст!",10,"Ошибка!");
КонецЕсли;
ПолучитьФайл(Адрес,ФайлВыбран,False);
КонецПроцедуры
&НаСервере
Функция ВыгрузитьОбработкуНаСервере(Ключ,Ссылка)
Д = Ссылка.ПолучитьОбъект();
Данные = Д.Обработка.Получить();
Если Данные = Неопределено тогда
Возврат Неопределено;
Иначе
Возврат ПоместитьВоВременноеХранилище(Данные,Ключ);
КонецЕсли
КонецФункции
//=====================================================
&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
Ключ = Этаформа.УникальныйИдентификатор;
Адрес = ВыгрузитьОбработкуНаСервере(Ключ,ЭтотОбъект.Объект.Ссылка);
Если Адрес = Неопределено Тогда
ПоказатьПредупреждение(,"Файл пуст!",10,"Ошибка!");
КонецЕсли;
Попытка
ИмяОбработки = ПодключитьОбработку(Адрес,Ключ);
ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");
Исключение
ПоказатьПредупреждение(,"Обработка не имеет формы или пуста!",10,"Ошибка!");
Возврат;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПодключитьОбработку(Адрес,Ключ)
ОбрИмя = ВнешниеОбработки.Подключить(Адрес,Строка(Ключ));
Возврат ОбрИмя;
КонецФункции
//=====================================================
Функция ДиалогОбработки(Режим)
Загрузка = ?(Режим,РежимДиалогаВыбораФайла.Сохранение,РежимДиалогаВыбораФайла.Открытие);
Фильтр = НСтр("ru = 'Обработка 1С'; en = '1С Processing'") + "(*.epf)|*.epf";
Шапка = ?(Режим,НСтр("ru = 'Сохранить обработку'; en = 'Proc. Save'"), НСтр("ru = 'Згрузить обработку'; en = 'Proc. load'"));
ДиалогОбработки = Новый ДиалогВыбораФайла(Загрузка);
ДиалогОбработки.Фильтр = Фильтр;
ДиалогОбработки.Заголовок = Шапка;
ДиалогОбработки.ПолноеИмяФайла = "";
ДиалогОбработки.МножественныйВыбор = Ложь;
Возврат ДиалогОбработки;
КонецФункции
//=====================================================
После переименования сервера не запускается кластер серверов 1С Так вот, после переименование сервера нужно открыть файл C:\Program Files (x86)\1cv8\srvinfo\1cv8wsrv.lst И заменить старое имя на новое Аналогично и с файлами 1CV8Clst и 1CV8Clsto, которые находятся по пути C:\Program Files (x86)\1cv8\srvinfo\reg_1541 нужно найти и заменить все строки где упоминается старое наименование сервера на новое.