При настройке обмена данными между различными конфигурациями 1С разработчики часто сталкиваются с ситуацией, когда типы данных в источнике и приемнике не совпадают. Типичный пример — необходимость перенести ссылку на объект (например, на справочник «Вагоны» или «Номенклатура») из табличной части документа-источника в обычное строковое поле табличной части документа-приемника. В этой статье мы подробно разберем, почему стандартное сопоставление свойств здесь не сработает и как правильно написать код в обработчиках «Конвертации данных 2.1» (КД 2.1), чтобы данные успешно дошли до получателя.
Давайте проанализируем, что происходит «под капотом» системы. В платформе 1С:Предприятие Ссылка — это не текст. На уровне базы данных (SQL) это уникальный идентификатор, часто представляемый в виде длинного набора символов (GUID). Когда в правилах конвертации свойств (ПКС) мы сопоставляем ссылку со строкой, механизм КД 2.1 по умолчанию пытается найти Правило Конвертации Объектов (ПКО) для этого типа данных. Если он его не находит или если тип приемника — строка, стандартный алгоритм выгрузки может просто «растеряться», и в результате в приемник упадет либо пустое значение, либо технический идентификатор, который не несет смысла для пользователя.
Для того чтобы в строковое поле попало понятное представление (например, наименование справочника или номер и дата документа), нам необходимо явно указать системе, как именно преобразовать ссылку в текст. Рассмотрим подробнее, как это сделать.
Это самый гибкий и надежный способ. Нам необходимо внести изменения в ПКС (Правило Конвертации Свойства), которое находится внутри ПКГС (Правила Конвертации Группы Свойств). Напомним, что ПКГС отвечает за выгрузку всей табличной части целиком, а ПКС внутри него — за конкретную колонку в этой таблице.
Разберем ситуацию: у нас есть табличная часть документа с реквизитом Вагон (тип Ссылка). В приемнике это поле называется ВагонСтрока (тип Строка). Выполним следующие шаги:
В этом обработчике нам доступны важные параметры:
Значение — то, что в итоге попадет в файл выгрузки.ОбъектКоллекции — это текущая строка табличной части, которую система обрабатывает в данный момент.Источник — это весь объект-владелец (документ целиком), из которого выгружается табличная часть.Проанализируем код, который нам нужно написать:
// В обработчике ПКС "Перед выгрузкой"
// Обращаемся к реквизиту текущей строки через ОбъектКоллекции
Значение = Строка(ОбъектКоллекции.Вагон);
Использование функции Строка() универсально. Если в реквизите ссылка на справочник — она вернет Наименование. Если ссылка на документ — вернет стандартное представление вида «Реализация товаров №... от...». Это решает проблему отсутствия реквизита «Наименование» у документов, о которой часто забывают начинающие разработчики.
Если нам не нужна сложная логика, мы можем обойтись без написания полноценного обработчика. В настройках ПКС есть колонка «Выражение». Код, написанный там, выполняется системой очень быстро и не требует открытия дополнительных окон модуля.
Просто впишите в колонку «Выражение» следующий текст:
Строка(ОбъектКоллекции.ИмяВашегоРеквизита)
Система вычислит это выражение для каждой строки табличной части и подставит результат в выгрузку.
1. Обработка пустых ссылок
Выясним причину возможных сбоев: если реквизит в строке не заполнен, ОбъектКоллекции.Вагон может вернуть пустую ссылку. Функция Строка(ПустаяСсылка) вернет пустую строку, что вполне корректно. Однако, если вы попытаетесь обратиться через точку (например, ОбъектКоллекции.Вагон.Наименование) и ссылка будет пустой, система может работать нестабильно. Рассмотрим более безопасный вариант кода:
Если ЗначениеЗаполнено(ОбъектКоллекции.Вагон) Тогда
Значение = Строка(ОбъектКоллекции.Вагон);
Иначе
Значение = "";
КонецЕсли;
2. Получение Уникального Идентификатора (GUID)
Иногда задача стоит иначе: нужно передать не читаемое имя, а технический ID, чтобы в базе-приемнике найти объект программно. В этом случае используем метод УникальныйИдентификатор():
// Передаем GUID как строку
Если ЗначениеЗаполнено(ОбъектКоллекции.Вагон) Тогда
Значение = Строка(ОбъектКоллекции.Вагон.УникальныйИдентификатор());
КонецЕсли;
3. Сборка данных из нескольких полей
Представим ситуацию, когда в одну строку приемника нужно собрать артикул и наименование. Мы можем легко комбинировать данные, обращаясь к свойствам объекта через ОбъектКоллекции:
// Формируем составную строку: Артикул + Наименование
СсылкаНаНоменклатуру = ОбъектКоллекции.Номенклатура;
Если ЗначениеЗаполнено(СсылкаНаНоменклатуру) Тогда
Значение = СокрЛП(СсылкаНаНоменклатуру.Артикул) + " | " + СсылкаНаНоменклатуру.Наименование;
КонецЕсли;
При переносе ссылки в строку обязательно проверьте длину строкового реквизита в приемнике. Если в целевой базе длина колонки ограничена (например, 20 символов), а представление документа занимает 50, данные будут обрезаны «хвостом», и вы потеряете важную информацию (например, дату документа). Убедитесь, что в конфигурации-приемнике длина строки достаточна (рекомендуется от 100 символов и выше для представлений объектов).
Если данные все равно не «падают» в другую базу, воспользуемся методом отладки «через сообщения». В обработчик «Перед выгрузкой» добавим временный код:
Сообщить("Выгружаем строку ТЧ. Значение реквизита: " + ОбъектКоллекции.Вагон);
Значение = Строка(ОбъектКоллекции.Вагон);
Так при выполнении обработки выгрузки в окне сообщений 1С вы увидите реальные значения, которые программа извлекает из базы. Если в сообщениях пусто — значит, проблема в данных источника или в том, что само правило ПКГС (табличной части) не срабатывает из-за установленных фильтров.
Подводя итог, можно сказать, что конвертация ссылки в строку в табличной части требует лишь правильного обращения к ОбъектКоллекции и явного приведения типа. Мы рассмотрели основные подходы, которые помогут вам сделать обмен данными прозрачным и надежным.