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

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

При настройке обмена данными между конфигурациями (например, при переносе документа Отражение зарплаты в бухучете из 1С:ЗУП 3.1 в 1С:Бухгалтерию КОРП) часто возникает необходимость подменить аналитику в табличной части. Распространенная задача — сопоставить подразделение источника с другим подразделением в базе-приемнике по определенному коду.

Попытка напрямую присвоить строковое значение коду в обработчике Перед выгрузкой для ссылочного реквизита приводит к ошибке выполнения: «Ошибка при вызове метода контекста (ЗаполнитьЗначениеСвойств): Недопустимое значение параметра (Параметр номер 2)».

Разберем причины возникновения этой ошибки и рассмотрим корректные способы решения задачи.

Почему возникает ошибка при присвоении строки ссылочному свойству

Проанализируем механизм работы правил конвертации свойств (ПКС). Когда для реквизита табличной части указано Правило конвертации объектов (ПКО), механизм обмена ожидает, что в переменной Значение будет передана ссылка на объект базы-источника, объект целиком или специальная структура свойств. Если же в Значение помещается примитивный тип (строка с кодом, например "1"), типовой алгоритм выгрузки пытается прочитать свойства из этой строки с помощью метода ЗаполнитьЗначениеСвойств(), что вызывает исключительную ситуацию.

Способ 1. Корректировка кода в ПКС самого справочника Подразделения

Если подразделению с кодом «2» из источника всегда должно соответствовать подразделение с кодом «1» в приемнике, правильнее всего изменить выгружаемый код в правиле конвертации самого справочника.

Разберем настройку по шагам:

  1. Открываем ПКО для справочника подразделений (например, ПодразделенияОрганизаций).
  2. Находим ПКС для реквизита Код.
  3. В обработчике Перед выгрузкой пишем код подмены:

Если Источник.Код = "2" Тогда
    Значение = "1";
КонецЕсли;

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

Способ 2. Передача структуры свойств поиска в ПКС табличной части

Если подразделения с требуемым кодом нет в базе-источнике (ЗУП), но его нужно однозначно спозиционировать в приемнике, можно передать в ПКС структуру ключевых полей поиска вместо ссылки:


Если ОбъектКоллекции.Подразделение.Код = "2" Тогда
    СтруктураСвойств = Новый Структура;
    СтруктураСвойств.Вставить("Код", "1");
    // В 1С:Бухгалтерии КОРП справочник подчинен организации
    СтруктураСвойств.Вставить("Владелец", Источник.Организация);
    
    Значение = СтруктураСвойств;
КонецЕсли;

В этом случае типовой механизм конвертации применит ПКО к переданной структуре и найдет в базе-приемнике нужный элемент по переданным реквизитам поиска.

Способ 3. Замена подразделения в обработчике «После загрузки» документа

Если подмена подразделения должна выполняться только для конкретного документа (или конкретной табличной части), а глобальный алгоритм поиска подразделений менять нежелательно, наиболее надежный вариант — выполнить программную подмену уже в базе-приемнике.

Для этого в ПКО документа ОтражениеЗарплатыВБухучете в обработчике После загрузки пропишем следующий алгоритм:


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

Если ЗначениеЗаполнено(СсылкаНаПодразделение) Тогда
    Для Каждого СтрТЧ Из Объект.НачисленнаяЗарплатаИВзносы Цикл
        Если СтрТЧ.Подразделение.Код = "2" Тогда
            СтрТЧ.Подразделение = СсылкаНаПодразделение;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Способ 4. Переопределение полей поиска в обработчике «ПоляПоиска»

Еще один гибкий вариант — скорректировать логику поиска на стороне приемника в ПКО справочника подразделений в обработчике ПоляПоиска:


Если СвойстваПоиска["Код"] = "2" Тогда
    СвойстваПоиска["Код"] = "1";
КонецЕсли;

При таком подходе данные выгружаются из источника без изменений, а сопоставление кодов прозрачно перенаправляется при разборе XML-файла в базе-приемнике.

Особенности работы с 1С:Бухгалтерией КОРП

Обратите внимание на специфику структуры данных конфигурации Бухгалтерия предприятия КОРП:

  1. Справочник ПодразделенияОрганизаций является подчиненным справочнику Организации.
  2. Поиск подразделения только по одному коду без учета владельца (организации) может вернуть неверную ссылку или привести к ошибке дублирования, если одинаковые коды используются в разных филиалах или организациях.
← На главную