Стандартная обработка «Выгрузка и загрузка данных XML» предназначена для переноса данных между идентичными конфигурациями 1С без использования правил обмена (в отличие от обработки УниверсальныйОбменДаннымиXML). Однако в её штатном функционале отсутствует встроенный редактор произвольных запросов или гибкий конструктор отборов на базе Системы компоновки данных (СКД). Это вызывает сложности, когда требуется выгрузить не весь справочник или регистр, а лишь определенную выборку, определяемую сложным условием (например, актуальных сотрудников или графики работы на основе среза последних).
Рассмотрим подробно способы решения этой задачи, от доработки формы обработки до использования альтернативных штатных механизмов платформы 1С.
Проанализируем ситуацию и ограничение штатной выгрузки:
Ссылка. Выгрузка таких регистров выполняется наборами записей. Если фильтрация зависит от данных другого регистра (например, среза последних), стандартным интерактивным отбором сформировать такую выборку невозможно.Самый быстрый и удобный способ — добавить на форму обработки пользовательскую кнопку и встроенный редактор запроса (или жестко прописанный алгоритм). При нажатии на кнопку выполняется произвольный запрос, а полученный массив ссылок программно подставляется в отбор обработки с видом сравнения В списке.
Разберем по шагам реализацию этого подхода:
Строка для хранения текста запроса или создадим отдельную кнопку вызова встроенного конструктора запросов.Посмотрим на пример кода для выгрузки актуальных сотрудников:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РаботникиСрезПоследних.Сотрудник КАК Сотрудник
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ПричинаИзменения Состояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)) КАК РаботникиСрезПоследних";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
МассивАктуальных = Новый Массив;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
МассивАктуальных.Добавить(Выборка.Сотрудник);
КонецЦикла;
// Программно устанавливаем отбор в структуре обработки
ЭлементОтбора = ТаблицаНастройкиОтборов.Найти("Сотрудники", "ИмяМетаданных");
Если ЭлементОтбора <> Неопределено Тогда
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбора.Значение.ЗагрузитьЗначения(МассивАктуальных);
КонецЕсли;
Этот подход позволяет избежать ручного ввода тысяч элементов и полностью автоматизирует процесс подготовки списка для выгрузки.
Если необходимо выгрузить сложную выборку объектов или наборов записей независимых регистров без доработки самой обработки ВыгрузкаЗагрузкаДанныхXML, можно использовать штатный механизм планов обмена.
Разберем алгоритм действий:
ПланОбмена.ЗарегистрироватьИзменения().В случаях, когда требуется разово перенести сложные данные (включая записи регистров сведений на основании среза последних) между идентичными конфигурациями, можно написать короткий скрипт с использованием объекта Сериализатор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) объектов и работает с высокой скоростью.