Как перенести реквизит типа Справочник в реквизит типа Строка в КД 2.1

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

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

Проанализируем причину проблемы

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

Выясним основные причины такого поведения:

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

Способ 1. Использование обработчика «Перед выгрузкой» в ПКС

Первый и наиболее очевидный способ — это явное указание строкового значения в правилах конвертации свойств. Проанализируем, как это реализовать. В ПКС для реквизита Выдать необходимо прописать алгоритм получения наименования.

В обработчике Перед выгрузкой для данного ПКС напишем следующий код:


// Получаем текстовое представление справочника из источника
Если ЗначениеЗаполнено(Источник.КомуВыдано) Тогда
    Значение = СокрЛП(Источник.КомуВыдано.Наименование);
Иначе
    Значение = "";
КонецЕсли;

Важные нюансы при использовании этого метода:

Способ 2. Решение через обработчик «После загрузки» в ПКО

Если способ с ПКС не помог (как это случилось у автора рассматриваемой темы), значит, проблема кроется глубже — в механизмах самой конфигурации-приемника. В БП 3.0 документы часто «пересчитывают» свои текстовые реквизиты в момент записи. Чтобы «перебить» эту логику, мы можем воспользоваться обработчиком ПКО документа После загрузки.

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

Пример кода в обработчике После загрузки для ПКО документа:


// Объект — это загруженный документ в приемнике (БП 3.0)
// Проверяем, заполнено ли ссылочное поле, на основании которого мы хотим задать строку
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
    // Прямое присвоение значения в текстовое поле документа-приемника
    Объект.Выдать = СокрЛП(Объект.Контрагент.Наименование);
КонецЕсли;

Почему это работает лучше? В событии После загрузки мы работаем с уже сформированным объектом V8Объект непосредственно перед его окончательной фиксацией в базе данных. Это позволяет гарантированно установить текстовое значение, даже если стандартные механизмы 1С пытались его очистить при сопоставлении свойств.

Дополнительные рекомендации по настройке в КД 2.1

Разберем еще несколько технических моментов, которые помогут избежать ошибок при конвертации Ссылка -> Строка:

1. Отключение стандартной обработки в приемнике.
В правилах конвертации объектов (ПКО) на закладке «Настройки» есть важный флаг: «Генерировать события перед записью и при записи объекта». Если этот флаг установлен, то при загрузке документа в БП 3.0 сработает весь программный код, написанный в модуле объекта конфигурации. Если ваша цель — жестко перенести строку «как есть» из источника, иногда полезно временно отключить этот флаг, но будьте осторожны: это может привести к нарушению целостности данных в приемнике (например, не заполнится аналитика или не сделаются движения).

2. Использование представления объекта.
Если вам нужно не просто наименование, а полное представление (например, для физических лиц с учетом ФИО и паспортных данных), в источнике в ПКС лучше использовать функцию ОбщегоНазначения.ПолучитьПредставлениеОбъекта(Источник.КомуВыдано) (если такая функция есть в вашей конфигурации) или обращаться к системному представлению:

Значение = Строка(Источник.КомуВыдано);

3. Проверка типа приемника.
Всегда проверяйте длину строки в конфигурации-приемнике. Если в источнике наименование справочника составляет 100 символов, а в приемнике реквизит Выдать ограничен 50 символами, данные будут обрезаны. В КД 2.1 это не вызывает ошибку, но может привести к потере важной информации (например, части фамилии).

Резюме

Проанализировав ситуацию, мы выяснили, что наиболее надежным способом передачи данных из Справочника в Строку при возникновении проблем в типовых конфигурациях является использование события «После загрузки» в ПКО документа. Это позволяет обойти внутренние автоматические проверки и заполнения БП 3.0, которые могут очищать реквизиты. Однако, если конфигурация-приемник простая, достаточно правильно настроить ПКС, указав Значение в обработчике «Перед выгрузкой» и оставив поле ПКО пустым.

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

← На главную