Как перенести реквизит в табличную часть приемника, если его нет в источнике при использовании Конвертации данных 2.0

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

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

Анализ причин возникновения ошибок 11 и 47

Прежде чем перейти к решениям, проанализируем, почему стандартные попытки подстановки параметров в ПКС (Правила конвертации свойств) табличной части часто терпят неудачу:

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

Для обхода этих ограничений мы рассмотрим два основных метода: программное формирование всей коллекции и использование параметров строки. Для проверки структуры реквизитов и строк в файле выгрузки перед загрузкой подойдёт обработка для анализа состава выгруженных данных конвертации.

Решение 1: Использование переменной КоллекцияОбъектов в ПКГС

Это самый гибкий и «чистый» метод с точки зрения архитектуры КД 2.0. Он позволяет полностью подменить стандартную выборку строк табличной части вашей собственной таблицей значений. Разберем этот процесс по шагам.

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

Проанализируем пример кода, который можно разместить в этом обработчике:


// Создаем таблицу значений, которая будет имитировать нашу ТЧ
ТЗ_БудущейТЧ = Новый ТаблицаЗначений;
ТЗ_БудущейТЧ.Колонки.Добавить("Сотрудник");
ТЗ_БудущейТЧ.Колонки.Добавить("СчетУчета");
ТЗ_БудущейТЧ.Колонки.Добавить("Сумма");

// Формируем запрос для получения данных, которых нет в объекте
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Зарплата.Сотрудник КАК Сотрудник,
    |   Зарплата.Сумма КАК Сумма
    |ИЗ
    |   РегистрНакопления.ЗарплатаКВыплате КАК Зарплата
    |ГДЕ
    |   Зарплата.Регистратор = &Источник";

Запрос.УстановитьПараметр("Источник", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    НоваяСтр = ТЗ_БудущейТЧ.Добавить();
    НоваяСтр.Сотрудник = Выборка.Sotrudnik;
    НоваяСтр.Сумма = Выборка.Summa;
    
    // Вычисляем счет учета, которого нет в источнике
    // Здесь может быть ваша логика или получение из констант/настроек
    НоваяСтр.СчетУчета = "70"; 
КонецЦикла;

// Передаем нашу таблицу в КД
КоллекцияОбъектов = ТЗ_БудущейТЧ;

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

Решение 2: Передача данных через параметры ПКС (флаг Передавать в параметр)

Если табличная часть в источнике существует, и вам нужно лишь «докинуть» в каждую строку дополнительную информацию, не переписывая всю коллекцию, используем механизм параметров строки.

Разберем алгоритм настройки:

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

// Вычисляем значение или берем из переменной
Значение = "401.20"; // Пример кода счета

В этом случае КД не будет пытаться записать Значение в реквизит СчетУчета напрямую (что часто вызывает ошибку 47), а поместит его в структуру Параметры текущей строки. Выясним, как это использовать на стороне приемника.

В ПКО (Правило конвертации объекта) в обработчике После загрузки (или в обработчике При загрузке самой ТЧ) мы можем прочитать этот параметр:


Для Каждого СтрокаТЧ Из Объект.Зарплата Цикл
    // Если мы передавали параметр для каждой строки, 
    // его нужно уметь идентифицировать.
    // Однако чаще параметры ПКС используются для поиска.
    // Если нужно прямое заполнение, лучше использовать Решение 1 или 3.
КонецЦикла;

Решение 3: Обработка на стороне приемника через поиск

Если расчет счета на стороне источника затруднителен, мы можем перенести только ключевые данные (например, ВидОперации), а счет определить уже в базе-приемнике. Это часто применяется при переносе данных из ERP Управление предприятием в УПП.

Посмотрим на пример кода в ПКС реквизита СчетУчета в обработчике Перед загрузкой (на стороне приемника):


// Код выполняется в базе-приемнике
Если Объект.ВидОперации = Перечисления.ВидыОпераций.ВыплатаЗарплаты Тогда
    Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду("70");
Иначе
    Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду("71");
КонецЕсли;

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

Особенности переноса проводок по зарплате (ERP — УПП)

Проанализируем специфику, упомянутую в обсуждении. При переносе данных из ERP в УПП счета учета часто зависят от настроек отражения зарплаты в финансовом учете. Вместо прямой передачи счета рекомендуется передавать Способ отражения (ссылкой или строкой). Для более масштабных проектов выделения исторических сведений в другие системы будет полезен раздел готовых решений для переноса из ERP.

Выясним, почему это надежнее:

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

Резюме

Для успешного переноса отсутствующих в источнике реквизитов ТЧ:

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