При разработке правил обмена в конфигурации «1С:Конвертация данных 2.1» (КД 2.1) программисты часто сталкиваются с необходимостью предоставить пользователю возможность интерактивного выбора выгружаемых данных. Типичный сценарий — перенос сотрудников «по списку» с сопутствующей информацией (кадровые документы, плановые начисления, контактные данные). Однако попытка перенести привычный интерфейсный код управляемых форм напрямую в обработчики КД 2.1 приводит к синтаксическим ошибкам компиляции.
В этой статье мы подробно разберем причины возникновения таких ошибок, проанализируем специфику выполнения кода в правилах обмена и рассмотрим два правильных способа реализации отбора сотрудников: с помощью штатных параметров конвертации и посредством создания внешней обработки-обертки.
Разберем ситуацию, когда разработчик пытается написать интерактивный код выбора (например, открытие формы справочника с помощью ОписаниеОповещения и директивы &НаКлиенте) прямо в обработчиках событий КД 2.1 (например, в событии ПослеЗагрузкиПравилОбмена или ПередВыгрузкойДанных). При попытке загрузить такие правила в обработку «Универсальный обмен данными в формате XML» система выдает критическую ошибку вида: «Ожидается последовательность операторов» или «Не найден экспортируемый метод».
Выясним причину такого поведения платформы. Дело в том, что «Конвертация данных 2.1» устроена специфическим образом:
Выполнить(). Это происходит внутри уже предопределенных процедур самой обработки обмена. Попытка объявить конструкцию Процедура... КонецПроцедуры внутри другой процедуры синтаксически недопустима в языке 1С.&НаКлиенте, &НаСервере, &НаСервереБезКонтекста). Весь код в окне обработчика должен идти сплошным текстом (линейным исполняемым кодом).ОткрытьФорму(), ПоказатьВопрос()) на сервере гарантированно приведет к аварийному завершению работы обмена.Теперь, когда мы понимаем архитектурные ограничения КД 2.1, рассмотрим правильные и безопасные варианты решения нашей задачи.
Этот способ является наиболее простым, надежным и не требует создания дополнительных внешних объектов. Мы воспользуемся встроенным механизмом параметров «Конвертации данных 2.1», который автоматически генерирует диалог выбора в стандартной обработке выгрузки.
Проанализируем пошагово, как это настроить:
Шаг 1. Создание параметра в КД 2.1
СписокСотрудниковСписокЗначений (это позволит пользователю выбирать сразу нескольких сотрудников).СправочникСсылка.Сотрудники (или укажем тип конкретного справочника вашей конфигурации).Шаг 2. Описание логики фильтрации в правилах
Теперь нам необходимо применить созданный параметр при выгрузке. Ограничение выгрузки можно наложить как на уровне Правил выгрузки данных (ПВД), так и на уровне Правил конвертации объектов (ПКО). Самым надежным вариантом является проверка в ПКО справочника «Сотрудники» в обработчике ПередВыгрузкой.
Перейдем в ПКО нужного справочника, найдем вкладку «Обработчики событий», выберем событие ПередВыгрузкой и напишем следующий код:
// Проверим, заполнен ли пользователем список сотрудников в параметрах обмена
Если ЗначениеЗаполнено(Параметры.СписокСотрудников) Тогда
// Если текущий выгружаемый объект (Источник) отсутствует в выбранном списке,
// то отменяем его выгрузку с помощью предопределенной переменной Отказ
Если Параметры.СписокСотрудников.НайтиПоЗначению(Источник) = Неопределено Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Проанализируем работу этого кода. При выгрузке каждого сотрудника система обращается к переменной Источник (которая содержит ссылку на текущего сотрудника) и проверяет ее наличие в списке значений Параметры.СписокСотрудников. Если соответствие не найдено, переменной Отказ присваивается значение Истина, и объект не попадает в файл обмена.
Шаг 3. Запуск выгрузки пользователем
СписокСотрудников.Бывают ситуации, когда стандартного диалога выбора параметров в обработке обмена пользователю недостаточно. Например, требуется сложная форма выбора с возможностью отбора по подразделениям, организациям, должностям, со сложным визуальным оформлением или кастомными проверками. В этом случае, согласно стандартам разработки 1С, рекомендуется использовать внешнюю обработку-обертку.
Разберем этот подход по шагам:
Шаг 1. Создание внешней обработки
В конфигураторе создадим новую внешнюю обработку. Назовем ее, например, ВыгрузкаСотрудниковПоОтбору. Создадим управляемую форму этой обработки. На форме разместим динамический список сотрудников или табличную часть для удобного интерактивного выбора. В модуле формы мы можем полноценно использовать любые процедуры, функции и асинхронные вызовы платформы, так как это штатный объект конфигурации.
Приведем пример кода кнопки «Выбрать сотрудников» на клиенте:
&НаКлиенте
Процедура ВыбратьСотрудников(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("МножественныйВыбор", Истина);
ОписаниеОповещения = Новый ОписаниеОповещения("ВыборСотрудниковЗавершение", ЭтотОбъект);
ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ВыборСотрудниковЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора <> Неопределено Тогда
// Заполняем список сотрудников на форме полученным результатом
Для Каждого СсылкаНаСотрудника Из РезультатВыбора Цикл
Объект.ТаблицаСотрудников.Добавить().Сотрудник = СсылкаНаСотрудника;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Шаг 2. Программный запуск обмена из обработки-обертки
Когда пользователь сформировал список сотрудников на форме нашей обработки, он нажимает кнопку «Выполнить выгрузку». В этот момент наша обработка-обертка должна программно подключить обработку обмена данными, передать туда выбранных сотрудников и запустить процесс. Рассмотрим, как выглядит этот код в серверном модуле нашей обработки:
&НаСервере
Процедура ВыполнитьВыгрузкуНаСервере()
// Получаем внешнюю или встроенную обработку обмена данными
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать();
// Задаем основные параметры выгрузки
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\Rules_Employees.xml";
ОбработкаОбмена.ИмяФайлаОбмена = "C:\Exchange\Export_Data.xml";
ОбработкаОбмена.РежимОбмена = "Выгрузка";
// Загружаем правила обмена, чтобы инициализировать структуру параметров
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
// Формируем список значений сотрудников из нашей таблицы на форме
СписокДляПередачи = Новый СписокЗначений;
Для Каждого СтрокаТаблицы Из Объект.ТаблицаСотрудников Цикл
СписокДляПередачи.Добавить(СтрокаТаблицы.Sotrudnik);
КонецЦикла;
// Записываем наш список в параметры обработки обмена
// Обратите внимание: имя параметра в структуре должно точно совпадать с именем в КД 2.1
ОбработкаОбмена.Параметры.Вставить("СписокСотрудников", СписокДляПередачи);
// Запускаем выгрузку данных
ОбработкаОбмена.ВыполнитьВыгрузку();
ПоказатьПредупреждениеИнформационное("Выгрузка успешно завершена!");
КонецПроцедуры
При таком подходе в самих правилах обмена в КД 2.1 вам останется написать лишь простую серверную проверку в событии ПередВыгрузкой ПКО, которую мы подробно разобрали в первом способе. Вся интерфейсная часть выносится за рамки конвертации данных, что исключает возникновение ошибок синтаксиса и делает код чистым и легко поддерживаемым.