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

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

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

Механизм управления полнотой выгрузки: флаг ТолькоПолучитьУзелСсылки

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

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

  1. Перейдем в настройки ПКО нужного объекта.
  2. Найдем обработчик события Перед выгрузкой.
  3. Установим специальный флаг управления выгрузкой:

// В обработчике ПКО "Перед выгрузкой"
ТолькоПолучитьУзелСсылки = Ложь;

Проанализируем, что это дает. Установка ТолькоПолучитьУзелСсылки = Ложь принудительно заставляет движок конвертации обрабатывать все ПКС (Правила конвертации свойств), даже если источником является структура. Однако помните: ключи в вашей структуре должны строго соответствовать именам свойств Источник, указанным в ПКС, иначе система не сможет сопоставить данные.

Почему возникают битые ссылки и проблемы с идентификацией

Рассмотрим более сложную проблему — появление «битых» ссылок после загрузки. Это происходит из-за особенностей кэширования объектов в КД2. Когда выгружается обычная ссылка, система помещает ее в коллекцию ВыгруженныеОбъекты. При повторной встрече этой же ссылки в рамках одной сессии выгрузки, КД2 не дублирует данные, а просто пишет ссылку по номеру узла (атрибут Нпп).

Со структурами ситуация иная. У Структуры нет Уникального Идентификатора (GUID). Для системы КД2 каждая новая структура — это новый, неизвестный ранее объект. Проанализируем последствия:

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

Альтернативный подход: использование Входящих данных

Опытные разработчики часто отказываются от прямой подмены Источника структурой в пользу механизма ВходящиеДанные. Рассмотрим этот метод по шагам, так как он считается более «чистым» с точки зрения архитектуры КД2:

  1. Создаем ПКО, где Источник не указан (пустое значение).
  2. В ПКС (свойствах) этого правила устанавливаем флаг «Получать из входящих данных».
  3. При вызове выгрузки программно передаем структуру в параметр ВходящиеДанные.

Пример программного вызова:


СтруктураДанных = Новый Структура("Артикул, Наименование, Цена");
СтруктураДанных.Артикул = "001";
СтруктураДанных.Наименование = "Тестовый товар";
СтруктураДанных.Цена = 100;

ПараметрыВыгрузки = Новый Структура("ВходящиеДанные", СтруктураДанных);
ВыгрузитьПоПравилу(,, ПараметрыВыгрузки,, "ИмяВашегоПКО");

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

Особенности настройки поиска для структур

Выясним важный нюанс: как КД2 ищет объект в приемнике, если источником была структура? По умолчанию во многих ПКО включен флаг «Поиск по внутреннему идентификатору». Для структур этот флаг бесполезен и даже вреден.

Посмотрим на алгоритм работы: если флаг поиска по GUID включен, система пытается вызвать метод УникальныйИдентификатор() у источника. У структуры такого метода нет, что приведет к ошибке или записи пустого GUID (00000000-0000-0000-0000-000000000000) в файл.

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

Полезная литература

Для глубокого понимания механизмов КД2 крайне рекомендуем изучить профильную литературу. Как упоминалось в обсуждении, базовым пособием является книга «1С:Предприятие 8. Конвертация данных: обмен данными между прикладными решениями» (авторы Бояркин В.Э., Филатов А.И.). В ней подробно разобраны жизненные циклы объектов при выгрузке и загрузке, а также работа всех обработчиков событий.

Подведем итог: выгрузка из структуры — мощный инструмент, но он требует ручного управления флагом ТолькоПолучитьУзелСсылки, внимательного отношения к кэшированию объектов и обязательной настройки поиска по реквизитам вместо поиска по GUID.

← На главную