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