При разработке правил обмена в конфигурации «1С:Конвертация данных 2.1» (КД 2.1) специалисты часто сталкиваются со специфическими задачами перегрузки данных. Одна из типичных задач — перенос информации, которая в базе-источнике хранится в табличной части документа, в реквизит шапки документа-приемника. Напрямую сопоставить такие реквизиты в таблице правил конвертации свойств (ПКС) невозможно, поэтому разработчики прибегают к использованию механизмов передачи через параметры.
Однако на этом этапе легко совершить архитектурные ошибки, из-за которых передаваемые параметры в приемнике оказываются незаполненными (возвращается значение Неопределено или пустая ссылка). В данной статье мы подробно разберем, почему возникает эта проблема, проанализируем разницу между типами параметров в КД 2.1 и рассмотрим два надежных способа решения задачи с готовыми примерами кода.
Рассмотрим классический сценарий. В документе-источнике есть табличная часть ПеречислениеЗаработнойПлаты, из первой строки которой нам нужно взять реквизит СтатьяДвиженияДенежныхСредств и перенести его в шапку документа-приемника. Разработчик создает ПКС для этого реквизита, устанавливает флаг «Передавать данные в параметр» и указывает имя параметра (например, пСтатьяДДС). На этапе выгрузки все проходит без ошибок, но при попытке прочитать параметр в обработчиках событий ПКО он оказывается пустым.
Проанализируем две ключевые причины, почему так происходит:
Рассмотрим по шагам правильный алгоритм настройки передачи реквизита из табличной части источника через параметр ПКС.
Шаг 1. Настройка ПКС в базе-источнике
В правилах конвертации объектов (ПКО) вашего документа найдите или добавьте строку ПКС. Настройте её следующим образом:
пСтатьяДДС.В обработчике события «Перед выгрузкой» данного ПКС напишем следующий код получения значения:
// Проверяем, что табличная часть заполнена и содержит строки
Если Источник.ПеречислениеЗаработнойПлаты.Количество() > 0 Тогда
// Берем значение из первой строки табличной части
Значение = Источник.ПеречислениеЗаработнойПлаты[0].СтатьяДвиженияДенежныхСредств;
Иначе
// Если строк нет, параметр выгружать не нужно
Отказ = Истина;
КонецЕсли;
Шаг 2. Обработка параметра в базе-приемнике
Теперь перейдем в настройки ПКО нашего документа. Чтение переданного параметра должно осуществляться строго на стороне приемника. Для этого идеально подходит обработчик событий «После загрузки» в ПКО документа.
Проанализируем пример безопасного кода для заполнения реквизита шапки документа-приемника:
// 1. Проверяем, существует ли коллекция ПараметрыОбъекта (она может быть Неопределено)
Если ПараметрыОбъекта <> Неопределено Тогда
// 2. Безопасно пытаемся получить значение параметра по его имени
СтатьяПриемник = Неопределено;
Если ПараметрыОбъекта.Свойство("пСтатьяДДС", СтатьяПриемник) Тогда
// 3. Проверяем, что ссылка успешно сопоставлена и не является пустой
Если ЗначениеЗаполнено(СтатьяПриемник) Тогда
// Записываем полученное значение в реквизит шапки загружаемого объекта
Объект.СтатьяДвиженияДенежныхСредств = СтатьяПриемник;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Использование свойства ПараметрыОбъекта.Свойство() страхует программный код от вызова исключений в случаях, когда параметр по какой-то причине не был передан в файле обмена.
Существует альтернативный, более гибкий метод, который часто используют опытные разработчики. Он позволяет передавать произвольные структуры данных без создания «пустых» строк ПКС в дереве метаданных. Этот подход базируется на использовании предопределенных коллекций ИсходящиеДанные и ВходящиеДанные.
Шаг 1. Формирование исходящей структуры (Выгрузка)
В ПКО документа переходим в обработчик события «Перед выгрузкой». Здесь мы можем инициализировать структуру ИсходящиеДанные и поместить в нее любые необходимые параметры, вычисленные на основе источника:
// Инициализируем структуру исходящих данных
ИсходящиеДанные = Новый Структура;
// Реализуем проверку на вид операции документа или другие условия
Если Источник.ВидОперации = Перечисления.ВидыОпераций.ВыплатаЗаработнойПлаты Тогда
Если Источник.ПеречислениеЗаработнойПлаты.Количество() > 0 Тогда
ИсходящиеДанные.Вставить("СтатьяДДС", Источник.ПеречислениеЗаработнойПлаты[0].СтатьяДвиженияДенежныхСредств);
КонецЕсли;
Иначе
// Если операция стандартная, берем статью напрямую из шапки источника
ИсходящиеДанные.Вставить("СтатьяДДС", Источник.СтатьяДвиженияДенежныхСредств);
КонецЕсли;
Шаг 2. Прием данных (Загрузка)
На стороне загрузки, в обработчике ПКО «После загрузки», переданная структура будет автоматически доступна в переменной ВходящиеДанные. Нам остается лишь прочитать ее и присвоить значение созданному объекту:
// Проверяем наличие входящих данных
Если ВходящиеДанные <> Неопределено Тогда
СтатьяСсылка = Неопределено;
// Считываем значение по ключу структуры
Если ВходящиеДанные.Свойство("СтатьяДДС", СтатьяСсылка) Тогда
Если ЗначениеЗаполнено(СтатьяСсылка) Тогда
// Заполняем реквизит приемника
Объект.СтатьяДвиженияДенежныхСредств = СтатьяСсылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Этот способ более лаконичен, поскольку вся логика выгрузки дополнительных параметров сосредоточена в одном месте (обработчик «Перед выгрузкой» ПКО), что упрощает дальнейшую поддержку и чтение правил обмена другими разработчиками.
При передаче ссылочных объектов (таких как справочники или документы) через параметры всегда помните о правилах сопоставления типов: