При настройке правил обмена в конфигурации «1С:Конвертация данных 2» (КД 2) разработчики часто сталкиваются с ситуацией, когда необходимо передать значение справочника (например, Организация) в базу-приемник, однако в базе-источнике этот реквизит либо отсутствует, либо имеет другой тип данных, либо правила конвертации свойств (ПКС) упорно «не видят» его.
В этой статье мы подробно разберем, почему возникают подобные проблемы, проанализируем типичные синтаксические ошибки при написании обработчиков и рассмотрим четыре надежных способа передачи организации в приемник.
Если в настройках ПКС (Правила конвертации свойств) для нужного реквизита в колонке «Источник» поле остается пустым или не дает выбрать нужный справочник, в первую очередь необходимо проверить соответствие типов данных в правилах обмена.
Как показывает практика, самой частой причиной является банальная невнимательность при выгрузке метаданных. Если в файле описания метаданных источника реквизит Организация определен как тип Строка (например, из-за старой версии обработки выгрузки или ручной корректировки), а в приемнике это ссылочный тип СправочникСсылка.Организации, то КД 2 не сможет автоматически сопоставить эти поля.
Чтобы исправить это, выполните следующие шаги:
MD83Exp.epf.---
Рассмотрим код, который часто пытаются использовать начинающие разработчики в обработчиках «Перед выгрузкой»:
// Ошибочный код!
Значение = Источник.Справочник.Организации.НайтиПоКоду(000000001);
В этой короткой строке содержатся сразу три критические ошибки, из-за которых правила обмена выдадут ошибку в процессе выгрузки:
Справочники, а не Справочник.Источник в обработчиках ПКС представляет собой конкретный выгружаемый объект (например, ДокументОбъект.ВводНачальныхОстатков). У этого объекта нет свойства Справочники, так как это свойство глобального контекста всей информационной базы.000000001 без кавычек приведет к тому, что компилятор воспримет его как обычную единицу 1. Поиск по такому коду вернет пустую ссылку, так как в базе код хранится с ведущими нулями как строка "000000001".Теперь рассмотрим правильные и эффективные способы реализации этой задачи.
---
Этот способ применяется, если в документе-источнике реквизита Организация физически нет, но мы хотим жестко прописать выгрузку определенной организации, которая точно существует в справочнике источника.
Разберем по шагам настройку в КД 2:
Организация оставьте поле «Источник» пустым.Организация.Организации). Без этого КД 2 не поймет, как именно нужно сериализовать полученную ссылку.
// Находим ссылку на организацию в базе-источнике
СсылкаНаОрг = Справочники.Организации.НайтиПоКоду("000000001");
Если ЗначениеЗаполнено(СсылкаНаОрг) Тогда
Значение = СсылкаНаОрг;
Иначе
// Если организация не найдена, можно зафиксировать ошибку или отменить выгрузку свойства
ПродолжитьВыгрузку = Ложь;
КонецЕсли;
При таком подходе КД 2 получит найденную ссылку в источнике, выгрузит ее по правилам ПКО Организации в XML-файл, а при загрузке база-приемник сопоставит ее по полям поиска (например, по ИНН или Коду).
---
Если организация гарантированно создана в базе-приемнике и вам не нужно передавать данные о ней из источника, можно выполнить поиск непосредственно в момент загрузки данных. Это существенно ускоряет процесс обмена, так как файл выгрузки не засоряется лишней XML-структурой справочника.
Выполним настройку:
Организации оставьте поле «Источник» пустым.Выражение:
// Данная строка будет выполнена на стороне приемника в момент загрузки
Выражение = "Справочники.Организации.НайтиПоКоду(""000000001"")";
Важно: обратите внимание на двойные кавычки вокруг кода организации внутри строки. В базу-приемник передается именно текст команды, который выполнится через функцию Выполнить() или аналогичные механизмы загрузки КД 2.
---
Если в конфигурации-приемнике справочник Организации содержит предопределенные элементы (например, НашаОрганизация), мы можем назначить ее напрямую на этапе загрузки объекта.
Для этого в ПКО нужного документа (например, ВводНачальныхОстатков) перейдите в обработчик «После загрузки» и пропишите простой код:
// Напрямую заполняем реквизит загруженного объекта предопределенным значением приемника
Объект.Организация = Справочники.Организации.НашаОрганизация;
Этот способ является максимально производительным и надежным, так как исключает ошибки ручного изменения кодов или наименований в пользовательском режиме.
---
Жесткое прописывание кодов (так называемый «хардкод») вроде "000000001" в правилах обмена считается плохим стилем разработки. Если у пользователя изменится рабочая организация, вам придется заново переписывать и перевыгружать правила обмена.
Правильное решение — предоставить пользователю возможность выбора организации прямо в интерфейсе обработки выгрузки.
Разберем, как настроить передачу через параметры обмена:
Организация. Укажите тип значения (например, СправочникСсылка.Организации) и обязательно установите флаг «Передавать при выгрузке».Организация документа-источника (где Источник пустой, а Приемник — Организация) в обработчике «Перед выгрузкой» напишите следующий код:
// Проверяем, заполнил ли пользователь параметр перед запуском обмена
Если Параметры.Свойство("Организация") И ЗначениеЗаполнено(Параметры.Организация) Тогда
Значение = Параметры.Организация;
Иначе
// Если параметр не заполнен, отменяем выгрузку этого свойства, чтобы не затереть данные в приемнике
Отказ = Истина;
КонецЕсли;
Теперь при открытии обработки «Универсальный обмен данными в формате XML» на вкладке «Параметры» появится удобное поле выбора. Пользователь сможет сам указать, по какой организации выгружать документы, что делает ваши правила обмена гибкими и универсальными.