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

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

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

Рассмотрим подробно способы решения этой задачи, от доработки формы обработки до использования альтернативных штатных механизмов платформы 1С.

Ограничения стандартного механизма

Проанализируем ситуацию и ограничение штатной выгрузки:

  1. Отсутствие конструктора запросов: В стандартной обработке фильтрация доступна только по базовым полям или периоду для документов. Указать сложное условие с соединением таблиц штатно нельзя.
  2. Особенности регистров сведений: У независимых регистров сведений нет реквизита Ссылка. Выгрузка таких регистров выполняется наборами записей. Если фильтрация зависит от данных другого регистра (например, среза последних), стандартным интерактивным отбором сформировать такую выборку невозможно.

Решение 1. Программное заполнение отбора «Ссылка в списке» по результатам запроса

Самый быстрый и удобный способ — добавить на форму обработки пользовательскую кнопку и встроенный редактор запроса (или жестко прописанный алгоритм). При нажатии на кнопку выполняется произвольный запрос, а полученный массив ссылок программно подставляется в отбор обработки с видом сравнения В списке.

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

  1. Добавим на форму обработки реквизит с типом Строка для хранения текста запроса или создадим отдельную кнопку вызова встроенного конструктора запросов.
  2. Напишем обработчик, который выполняет запрос и собирает найденные ссылки в массив или список значений.
  3. Заполним стандартный элемент отбора обработки для нужного метаданного.

Посмотрим на пример кода для выгрузки актуальных сотрудников:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РаботникиСрезПоследних.Сотрудник КАК Сотрудник
    |ИЗ
    |	РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ПричинаИзменения Состояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)) КАК РаботникиСрезПоследних";

Запрос.УстановитьПараметр("Период", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();

МассивАктуальных = Новый Массив;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    МассивАктуальных.Добавить(Выборка.Сотрудник);
КонецЦикла;

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

Этот подход позволяет избежать ручного ввода тысяч элементов и полностью автоматизирует процесс подготовки списка для выгрузки.

Решение 2. Использование временного узла плана обмена

Если необходимо выгрузить сложную выборку объектов или наборов записей независимых регистров без доработки самой обработки ВыгрузкаЗагрузкаДанныхXML, можно использовать штатный механизм планов обмена.

Разберем алгоритм действий:

  1. В базе-источнике создается или используется существующий произвольный ПланОбмена.
  2. С помощью произвольного запроса на встроенном языке формируется нужная выборка элементов или ключей записей регистров.
  3. Найденные объекты регистрируются на узле плана обмена с помощью функции ЗарегистрироватьИзменения().
  4. Выполняется выгрузка данных по этому узлу плана обмена. В XML-файл попадут исключительно зарегистрированные объекты и наборы записей.

Решение 3. Выгрузка через СериализаторXDTO

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

Посмотрим на пример выгрузки отобранных объектов в XML-файл на стороне источника:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\ExportData.xml");
ЗаписьXML.ЗаписатьОбъявлениеXML();

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Сотрудники ГДЕ НЕ Заблокирован");
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Объект1С = Выборка.Ссылка.ПолучитьОбъект();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Объект1С);
КонецЦикла;

ЗаписьXML.Закрыть();

На стороне базы-приемника чтение и запись данных выполняется обратной операцией:


ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\ExportData.xml");

Пока СериализаторXDTO.ВозможноПрочитатьXML(ЧтениеXML) Цикл
    Объект1С = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
    Объект1С.ОбменДанными.Загрузка = Истина;
    Объект1С.Записать();
КонецЦикла;

ЧтениеXML.Закрыть();

Данный метод не требует создания правил конвертации, сохраняет УИД (GUID) объектов и работает с высокой скоростью.

← На главную