Как правильно передать значение из табличной части в параметр объекта в «1С:Конвертация данных 2.1»?

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

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

Однако на этом этапе легко совершить архитектурные ошибки, из-за которых передаваемые параметры в приемнике оказываются незаполненными (возвращается значение Неопределено или пустая ссылка). В данной статье мы подробно разберем, почему возникает эта проблема, проанализируем разницу между типами параметров в КД 2.1 и рассмотрим два надежных способа решения задачи с готовыми примерами кода.

Выясняем причину проблемы: типичные ошибки разработчиков

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

Проанализируем две ключевые причины, почему так происходит:

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

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

Рассмотрим по шагам правильный алгоритм настройки передачи реквизита из табличной части источника через параметр ПКС.

Шаг 1. Настройка ПКС в базе-источнике

В правилах конвертации объектов (ПКО) вашего документа найдите или добавьте строку ПКС. Настройте её следующим образом:

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


// Проверяем, что табличная часть заполнена и содержит строки
Если Источник.ПеречислениеЗаработнойПлаты.Количество() > 0 Тогда
    // Берем значение из первой строки табличной части
    Значение = Источник.ПеречислениеЗаработнойПлаты[0].СтатьяДвиженияДенежныхСредств;
Иначе
    // Если строк нет, параметр выгружать не нужно
    Отказ = Истина;
КонецЕсли;

Шаг 2. Обработка параметра в базе-приемнике

Теперь перейдем в настройки ПКО нашего документа. Чтение переданного параметра должно осуществляться строго на стороне приемника. Для этого идеально подходит обработчик событий «После загрузки» в ПКО документа.

Проанализируем пример безопасного кода для заполнения реквизита шапки документа-приемника:


// 1. Проверяем, существует ли коллекция ПараметрыОбъекта (она может быть Неопределено)
Если ПараметрыОбъекта <> Неопределено Тогда
    
    // 2. Безопасно пытаемся получить значение параметра по его имени
    СтатьяПриемник = Неопределено;
    Если ПараметрыОбъекта.Свойство("пСтатьяДДС", СтатьяПриемник) Тогда
        
        // 3. Проверяем, что ссылка успешно сопоставлена и не является пустой
        Если ЗначениеЗаполнено(СтатьяПриемник) Тогда
            // Записываем полученное значение в реквизит шапки загружаемого объекта
            Объект.СтатьяДвиженияДенежныхСредств = СтатьяПриемник;
        КонецЕсли;
        
    КонецЕсли;
    
КонецЕсли;

Использование свойства ПараметрыОбъекта.Свойство() страхует программный код от вызова исключений в случаях, когда параметр по какой-то причине не был передан в файле обмена.

Способ 2. Передача данных через «ИсходящиеДанные» и «ВходящиеДанные»

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

Шаг 1. Формирование исходящей структуры (Выгрузка)

В ПКО документа переходим в обработчик события «Перед выгрузкой». Здесь мы можем инициализировать структуру ИсходящиеДанные и поместить в нее любые необходимые параметры, вычисленные на основе источника:


// Инициализируем структуру исходящих данных
ИсходящиеДанные = Новый Структура;

// Реализуем проверку на вид операции документа или другие условия
Если Источник.ВидОперации = Перечисления.ВидыОпераций.ВыплатаЗаработнойПлаты Тогда
    Если Источник.ПеречислениеЗаработнойПлаты.Количество() > 0 Тогда
        ИсходящиеДанные.Вставить("СтатьяДДС", Источник.ПеречислениеЗаработнойПлаты[0].СтатьяДвиженияДенежныхСредств);
    КонецЕсли;
Иначе
    // Если операция стандартная, берем статью напрямую из шапки источника
    ИсходящиеДанные.Вставить("СтатьяДДС", Источник.СтатьяДвиженияДенежныхСредств);
КонецЕсли;

Шаг 2. Прием данных (Загрузка)

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


// Проверяем наличие входящих данных
Если ВходящиеДанные <> Неопределено Тогда
    
    СтатьяСсылка = Неопределено;
    // Считываем значение по ключу структуры
    Если ВходящиеДанные.Свойство("СтатьяДДС", СтатьяСсылка) Тогда
        
        Если ЗначениеЗаполнено(СтатьяСсылка) Тогда
            // Заполняем реквизит приемника
            Объект.СтатьяДвиженияДенежныхСредств = СтатьяСсылка;
        КонецЕсли;
        
    КонецЕсли;
    
КонецЕсли;

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

Рекомендации по работе со ссылочными типами данных

При передаче ссылочных объектов (таких как справочники или документы) через параметры всегда помните о правилах сопоставления типов:

← На главную