Почему не работает отбор в обработке УниверсальныйОбменДаннымиXML и как выгрузить выбранные объекты

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

При переносе данных между конфигурациями (например, при переходе с ЗУП 2.5 на ЗУП 3.0) с помощью типовой обработки УниверсальныйОбменДаннымиXML разработчики часто сталкиваются с ситуацией, когда на вкладке выгрузки невозможно установить отбор по конкретным элементам. Для одних правил (например, настроек или регистров) таблица отборов доступна и активна, а для справочника ФизическиеЛица или документов поле отбора оказывается заблокированным или вовсе отсутствует. Разберем, почему возникает такое поведение платформы и какими способами можно передать произвольный список объектов для выгрузки.

Выясняем причину: особенности работы правил выгрузки данных (ПВД)

Для понимания корня проблемы обратимся к конфигурации Конвертация данных 2.1 (КД 2), в которой разрабатываются правила переноса. В обработке УниверсальныйОбменДаннымиXML табличная часть отборов генерируется динамически на основе построителя отчетов или системы компоновки данных. Этот интерфейсный механизм работает исключительно для тех Правил выгрузки данных (ПВД), у которых в настройках установлен способ выборки «Стандартная выборка».

В правилах переноса из ЗУП 2.5 в ЗУП 3.0 для справочника ФизическиеЛица практически всегда используется способ выборки «Произвольный алгоритм». В этом случае данные извлекаются с помощью программного запроса, описанного в алгоритмах конвертации. Так как платформа не может автоматически вмешаться в сложный внутренний текст запроса и динамически привязать к нему произвольные пользовательские поля отбора, интерфейсная таблица фильтров в обработке отключается.

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

Способ 1. Переключение ПВД на стандартную выборку

Если цель переноса — только выгрузка самого справочника ФизическиеЛица как нормативно-справочной информации без сложных сопутствующих алгоритмов формирования зарплатных регистров, самым быстрым способом будет корректировка правила выгрузки в конфигурации «Конвертация данных»:

  1. Откроем правила переноса в КД 2.
  2. Перейдем в раздел Правила выгрузки данных и найдем правило для физических лиц.
  3. Изменим способ выборки с произвольного алгоритма на «Стандартная выборка».
  4. Укажем в качестве объекта выборки СправочникСсылка.ФизическиеЛица и свяжем его с соответствующим Правилом конвертации объектов (ПКО).
  5. Сохраним файл правил.

После загрузки обновленных правил в обработку УниверсальныйОбменДаннымиXML таблица отборов станет доступной, и вы сможете интерактивно задать список физических лиц через стандартный интерфейс условий платформы 1С.

Способ 2. Фильтрация в обработчике «Перед выгрузкой» правила конвертации (ПКО)

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

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

Посмотрим на пример программного кода в обработчике Перед выгрузкой ПКО:


Если Параметры.Свойство("СписокНужныхФизЛиц") Тогда
    Если Параметры.СписокНужныхФизЛиц.Найти(Источник) = Неопределено Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

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

Способ 3. Программная инициализация параметров через внешнюю обработку

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


ОбработкаВыгрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаВыгрузки.ИмяФайлаПравилОбмена = "C:\Rules\ЗУП25_ЗУП30.xml";
ОбработкаВыгрузки.ИмяФайлаОбмена = "C:\Rules\Data.xml";
ОбработкаВыгрузки.РежимОбмена = "Выгрузка";
ОбработкаВыгрузки.ЗагрузитьПравилаОбмена();

// Передаем массив или список значений в структуру параметров правил
ОбработкаВыгрузки.Параметры.Вставить("СписокНужныхФизЛиц", СписокВыбранныхФизЛиц.ВыгрузитьЗначения());

ОбработкаВыгрузки.ВыполнитьВыгрузку();

В алгоритме самого правила выгрузки в тексте запроса достаточно использовать условие с переданным параметром: ГДЕ Ссылка В (&СписокНужныхФизЛиц), предварительно установив его в запросе: Запрос.УстановитьПараметр("СписокНужныхФизЛиц", Параметры.СписокНужныхФизЛиц);.

Способ 4. Интерактивный диалог выбора непосредственно при старте выгрузки

Поскольку исходная база ЗУП 2.5 работает в обычном приложении (толстый клиент), мы можем запросить список сотрудников у пользователя в интерактивном диалоге в момент запуска выгрузки. Проанализируем реализацию в глобальном обработчике правил Перед выгрузкой данных:


Если РежимДиалога = Неопределено Тогда
    СписокВыбора = Новый СписокЗначений;
    // Открываем форму выбора для интерактивной отметки нужных элементов
    Если СписокВыбора.ОтметитьЭлементы("Выберите физических лиц для выгрузки") Тогда
        МассивСсылок = Новый Массив;
        Для Каждого ЭлементСписка Из СписокВыбора Цикл
            Если ЭлементСписка.Пометка Тогда
                МассивСсылок.Добавить(ЭлементСписка.Значение);
            КонецЕсли;
        КонецЦикла;
        Параметры.Вставить("СписокНужныхФизЛиц", МассивСсылок);
    Иначе
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Способ 5. Использование строкового параметра с кодами или ИНН

Если требуется обойтись без написания внешних обработок и изменения глобальных интерфейсов, можно воспользоваться строковым параметром конвертации:

  1. В КД 2 на вкладке «Параметры» создаем параметр СтрокаКодовСотрудников со строковым типом данных и включаем признак пользовательской настройки.
  2. В обработке выгрузки на вкладке параметров вставляем коды или табельные номера нужных сотрудников через запятую.
  3. В обработчике алгоритма выборки разбираем строку в массив с помощью функции СтрРазделить() (или через объект СтроковыеФункцииКлиентСервер) и передаем полученный массив в условие ГДЕ Код В (&МассивКодов) встроенного запроса.

Подводные камни при частичной выгрузке данных ЗУП 2.5

При переносе данных из зарплатной базы важно учитывать ограничения типовых правил:

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

2. Целостность зарплатных регистров. В переносе ЗУП 2.5 → ЗУП 3.0 информация переносится специальными сводными документами «Перенос данных», формирующими движения по регистрам сведений и накопления. Фильтрация только физических лиц без синхронного отбора связанных с ними записей по сотрудникам и плановым начислениям приведет к некорректным или пустым движениям в базе-приемнике. Поэтому оптимально передавать список отобранных лиц в менеджер временных таблиц исходного алгоритма выборки пакета переноса.

← На главную