Как передать значение Организации в базу-приемник в «1С:Конвертация данных 2»?

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

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

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

Почему ПКС «не видит» реквизит источника?

Если в настройках ПКС (Правила конвертации свойств) для нужного реквизита в колонке «Источник» поле остается пустым или не дает выбрать нужный справочник, в первую очередь необходимо проверить соответствие типов данных в правилах обмена.

Как показывает практика, самой частой причиной является банальная невнимательность при выгрузке метаданных. Если в файле описания метаданных источника реквизит Организация определен как тип Строка (например, из-за старой версии обработки выгрузки или ручной корректировки), а в приемнике это ссылочный тип СправочникСсылка.Организации, то КД 2 не сможет автоматически сопоставить эти поля.

Чтобы исправить это, выполните следующие шаги:

  1. Откройте конфигурацию источника и убедитесь, что реквизит имеет правильный тип данных.
  2. Выгрузите актуальные метаданные с помощью обработки MD83Exp.epf.
  3. Загрузите новые метаданные в КД 2 и обновите настройки правил конвертации.

---

Разбор ошибок в коде: почему не работает стандартный поиск?

Рассмотрим код, который часто пытаются использовать начинающие разработчики в обработчиках «Перед выгрузкой»:


// Ошибочный код!
Значение = Источник.Справочник.Организации.НайтиПоКоду(000000001);

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

  1. Неверное обращение к менеджеру справочника: в платформе 1С обращение к коллекциям объектов всегда происходит во множественном числе через глобальный контекст — Справочники, а не Справочник.
  2. Использование контекста источника: переменная Источник в обработчиках ПКС представляет собой конкретный выгружаемый объект (например, ДокументОбъект.ВводНачальныхОстатков). У этого объекта нет свойства Справочники, так как это свойство глобального контекста всей информационной базы.
  3. Неверный формат кода (число вместо строки): коды справочников в 1С практически всегда имеют текстовый тип данных. Передача числа 000000001 без кавычек приведет к тому, что компилятор воспримет его как обычную единицу 1. Поиск по такому коду вернет пустую ссылку, так как в базе код хранится с ведущими нулями как строка "000000001".

Теперь рассмотрим правильные и эффективные способы реализации этой задачи.

---

Способ А. Поиск организации в базе-источнике (через ПКС «Перед выгрузкой»)

Этот способ применяется, если в документе-источнике реквизита Организация физически нет, но мы хотим жестко прописать выгрузку определенной организации, которая точно существует в справочнике источника.

Разберем по шагам настройку в КД 2:

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

// Находим ссылку на организацию в базе-источнике
СсылкаНаОрг = Справочники.Организации.НайтиПоКоду("000000001");

Если ЗначениеЗаполнено(СсылкаНаОрг) Тогда
    Значение = СсылкаНаОрг;
Иначе
    // Если организация не найдена, можно зафиксировать ошибку или отменить выгрузку свойства
    ПродолжитьВыгрузку = Ложь; 
КонецЕсли;

При таком подходе КД 2 получит найденную ссылку в источнике, выгрузит ее по правилам ПКО Организации в XML-файл, а при загрузке база-приемник сопоставит ее по полям поиска (например, по ИНН или Коду).

---

Способ Б. Динамический поиск в базе-приемнике (через свойство «Выражение»)

Если организация гарантированно создана в базе-приемнике и вам не нужно передавать данные о ней из источника, можно выполнить поиск непосредственно в момент загрузки данных. Это существенно ускоряет процесс обмена, так как файл выгрузки не засоряется лишней XML-структурой справочника.

Выполним настройку:

  1. В ПКС для Организации оставьте поле «Источник» пустым.
  2. Поле «Правило конвертации» (ПКО) также оставьте пустым.
  3. В обработчике ПКС «Перед выгрузкой» пропишите специальный параметр Выражение:

// Данная строка будет выполнена на стороне приемника в момент загрузки
Выражение = "Справочники.Организации.НайтиПоКоду(""000000001"")";

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

---

Способ В. Использование предопределенных элементов в базе-приемнике

Если в конфигурации-приемнике справочник Организации содержит предопределенные элементы (например, НашаОрганизация), мы можем назначить ее напрямую на этапе загрузки объекта.

Для этого в ПКО нужного документа (например, ВводНачальныхОстатков) перейдите в обработчик «После загрузки» и пропишите простой код:


// Напрямую заполняем реквизит загруженного объекта предопределенным значением приемника
Объект.Организация = Справочники.Организации.НашаОрганизация;

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

---

Способ Г. Передача Организации через Параметры (Best Practice)

Жесткое прописывание кодов (так называемый «хардкод») вроде "000000001" в правилах обмена считается плохим стилем разработки. Если у пользователя изменится рабочая организация, вам придется заново переписывать и перевыгружать правила обмена.

Правильное решение — предоставить пользователю возможность выбора организации прямо в интерфейсе обработки выгрузки.

Разберем, как настроить передачу через параметры обмена:

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

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

Теперь при открытии обработки «Универсальный обмен данными в формате XML» на вкладке «Параметры» появится удобное поле выбора. Пользователь сможет сам указать, по какой организации выгружать документы, что делает ваши правила обмена гибкими и универсальными.

← На главную