Как правильно реализовать отбор по сотрудникам при выгрузке через 1С:Конвертация данных 2.1

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке правил обмена в конфигурации «1С:Конвертация данных 2.1» (КД 2.1) программисты часто сталкиваются с необходимостью предоставить пользователю возможность интерактивного выбора выгружаемых данных. Типичный сценарий — перенос сотрудников «по списку» с сопутствующей информацией (кадровые документы, плановые начисления, контактные данные). Однако попытка перенести привычный интерфейсный код управляемых форм напрямую в обработчики КД 2.1 приводит к синтаксическим ошибкам компиляции.

В этой статье мы подробно разберем причины возникновения таких ошибок, проанализируем специфику выполнения кода в правилах обмена и рассмотрим два правильных способа реализации отбора сотрудников: с помощью штатных параметров конвертации и посредством создания внешней обработки-обертки.

Почему возникают ошибки компиляции в обработчиках КД 2.1?

Разберем ситуацию, когда разработчик пытается написать интерактивный код выбора (например, открытие формы справочника с помощью ОписаниеОповещения и директивы &НаКлиенте) прямо в обработчиках событий КД 2.1 (например, в событии ПослеЗагрузкиПравилОбмена или ПередВыгрузкойДанных). При попытке загрузить такие правила в обработку «Универсальный обмен данными в формате XML» система выдает критическую ошибку вида: «Ожидается последовательность операторов» или «Не найден экспортируемый метод».

Выясним причину такого поведения платформы. Дело в том, что «Конвертация данных 2.1» устроена специфическим образом:

  1. Динамическая компиляция через Выполнить(): Все обработчики событий, которые мы пишем в КД 2.1, при чтении правил обмена преобразуются в текстовые строки. В процессе выполнения обмена эти строки компилируются динамически с помощью встроенной функции платформы Выполнить(). Это происходит внутри уже предопределенных процедур самой обработки обмена. Попытка объявить конструкцию Процедура... КонецПроцедуры внутри другой процедуры синтаксически недопустима в языке 1С.
  2. Отсутствие процедурной структуры: В модулях КД 2.1 нельзя объявлять собственные процедуры и функции, использовать директивы компиляции (такие как &НаКлиенте, &НаСервере, &НаСервереБезКонтекста). Весь код в окне обработчика должен идти сплошным текстом (линейным исполняемым кодом).
  3. Клиент-серверное разделение контекста: Процесс выгрузки данных, как правило, происходит в серверном контексте (особенно если обмен запускается в фоновом задании или на сервере приложений). Попытка вызвать интерактивные методы платформы (например, ОткрытьФорму(), ПоказатьВопрос()) на сервере гарантированно приведет к аварийному завершению работы обмена.

Теперь, когда мы понимаем архитектурные ограничения КД 2.1, рассмотрим правильные и безопасные варианты решения нашей задачи.

Способ №1: Использование штатных параметров конвертации (Рекомендуемый)

Этот способ является наиболее простым, надежным и не требует создания дополнительных внешних объектов. Мы воспользуемся встроенным механизмом параметров «Конвертации данных 2.1», который автоматически генерирует диалог выбора в стандартной обработке выгрузки.

Проанализируем пошагово, как это настроить:

Шаг 1. Создание параметра в КД 2.1

  1. Откроем нашу конвертацию в базе «Конвертация данных 2.1».
  2. Перейдем на вкладку «Параметры».
  3. Добавим новый параметр со следующими настройками:
    • Имя: СписокСотрудников
    • Правило конвертации: оставляем пустым.
    • Тип данных: СписокЗначений (это позволит пользователю выбирать сразу нескольких сотрудников).
    • Тип значения списка: СправочникСсылка.Сотрудники (или укажем тип конкретного справочника вашей конфигурации).
    • Установим флаг «Редактируется в диалоге» — благодаря этому параметр отобразится на форме обработки обмена.
    • При необходимости установим флаг «Передавать при выгрузке», если этот список понадобится нам на этапе загрузки в приемнике.

Шаг 2. Описание логики фильтрации в правилах

Теперь нам необходимо применить созданный параметр при выгрузке. Ограничение выгрузки можно наложить как на уровне Правил выгрузки данных (ПВД), так и на уровне Правил конвертации объектов (ПКО). Самым надежным вариантом является проверка в ПКО справочника «Сотрудники» в обработчике ПередВыгрузкой.

Перейдем в ПКО нужного справочника, найдем вкладку «Обработчики событий», выберем событие ПередВыгрузкой и напишем следующий код:


// Проверим, заполнен ли пользователем список сотрудников в параметрах обмена
Если ЗначениеЗаполнено(Параметры.СписокСотрудников) Тогда
    
    // Если текущий выгружаемый объект (Источник) отсутствует в выбранном списке,
    // то отменяем его выгрузку с помощью предопределенной переменной Отказ
    Если Параметры.СписокСотрудников.НайтиПоЗначению(Источник) = Неопределено Тогда
        Отказ = Истина;
    КонецЕсли;
    
КонецЕсли;

Проанализируем работу этого кода. При выгрузке каждого сотрудника система обращается к переменной Источник (которая содержит ссылку на текущего сотрудника) и проверяет ее наличие в списке значений Параметры.СписокСотрудников. Если соответствие не найдено, переменной Отказ присваивается значение Истина, и объект не попадает в файл обмена.

Шаг 3. Запуск выгрузки пользователем

  1. Сохраним правила обмена в КД 2.1 и выгрузим их в файл XML.
  2. Откроем в нашей рабочей базе стандартную обработку «Универсальный обмен данными в формате XML».
  3. Загрузим наш файл правил на вкладке «Выгрузка данных».
  4. Перейдем на закладку «Параметры». Мы увидим, что в списке параметров автоматически появилась строка СписокСотрудников.
  5. Пользователь может нажать на кнопку выбора в этой строке, перед ним откроется стандартное окно платформы для формирования списка значений, где он сможет интерактивно выбрать нужных сотрудников из справочника. После этого можно запускать выгрузку.

Способ №2: Использование внешней обработки-обертки

Бывают ситуации, когда стандартного диалога выбора параметров в обработке обмена пользователю недостаточно. Например, требуется сложная форма выбора с возможностью отбора по подразделениям, организациям, должностям, со сложным визуальным оформлением или кастомными проверками. В этом случае, согласно стандартам разработки 1С, рекомендуется использовать внешнюю обработку-обертку.

Разберем этот подход по шагам:

Шаг 1. Создание внешней обработки

В конфигураторе создадим новую внешнюю обработку. Назовем ее, например, ВыгрузкаСотрудниковПоОтбору. Создадим управляемую форму этой обработки. На форме разместим динамический список сотрудников или табличную часть для удобного интерактивного выбора. В модуле формы мы можем полноценно использовать любые процедуры, функции и асинхронные вызовы платформы, так как это штатный объект конфигурации.

Приведем пример кода кнопки «Выбрать сотрудников» на клиенте:


&НаКлиенте
Процедура ВыбратьСотрудников(Команда)
    
    ПараметрыФормы = Новый Структура; 
    ПараметрыФормы.Вставить("РежимВыбора", Истина); 
    ПараметрыФормы.Вставить("МножественныйВыбор", Истина); 
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ВыборСотрудниковЗавершение", ЭтотОбъект);
    ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    
КонецПроцедуры

&НаКлиенте
Процедура ВыборСотрудниковЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт
    
    Если РезультатВыбора <> Неопределено Тогда
        // Заполняем список сотрудников на форме полученным результатом
        Для Каждого СсылкаНаСотрудника Из РезультатВыбора Цикл
            Объект.ТаблицаСотрудников.Добавить().Сотрудник = СсылкаНаСотрудника;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Шаг 2. Программный запуск обмена из обработки-обертки

Когда пользователь сформировал список сотрудников на форме нашей обработки, он нажимает кнопку «Выполнить выгрузку». В этот момент наша обработка-обертка должна программно подключить обработку обмена данными, передать туда выбранных сотрудников и запустить процесс. Рассмотрим, как выглядит этот код в серверном модуле нашей обработки:


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

При таком подходе в самих правилах обмена в КД 2.1 вам останется написать лишь простую серверную проверку в событии ПередВыгрузкой ПКО, которую мы подробно разобрали в первом способе. Вся интерфейсная часть выносится за рамки конвертации данных, что исключает возникновение ошибок синтаксиса и делает код чистым и легко поддерживаемым.

← На главную