При работе с механизмами обмена данными в конфигурации «1С:Бухгалтерия предприятия 3.0» (и других решениях на базе платформы «1С:Предприятие 8.3») разработчики могут столкнуться с исключением при попытке записи в регистр сведений СоответствияОбъектовИнформационныхБаз. Ошибка происходит в обработчике ПередЗаписью модуля набора записей регистра при выполнении строки кода:
ОбменДанными.Получатели.Добавить(Отбор.УзелИнформационнойБазы.Значение);
Текст ошибки выглядит следующим образом:
Ошибка при вызове метода контекста (Добавить): Недопустимое значение параметра (параметр номер '1')
Рассмотрим подробно причины возникновения данной проблемы и разберем практические способы ее решения.
Коллекция ОбменДанными.Получатели предназначена для регистрации изменений объектов с целью их последующей выгрузки в другие информационные базы. Метод Добавить() этой коллекции принимает в качестве единственного параметра ссылку на узел плана обмена. Однако платформой 1С накладываются жесткие ограничения на передаваемое значение:
СоответствияОбъектовИнформационныхБаз должен быть включен в состав того плана обмена, к узлу которого относится ссылка из отбора. Если объект метаданных не входит в состав выбранного плана обмена, платформа выбрасывает исключение «Недопустимое значение параметра».Отбор.УзелИнформационнойБазы.Значение может содержать незаполненную ссылку, недействительную ссылку («Объект не найден»), либо ссылку на предопределенный узел ЭтотУзел (для которого регистрация изменений не производится).Отбор.УзелИнформационнойБазы свойство Использование равно Ложь, обращение к свойству Значение возвращает неинициализированные данные.Проанализируем основные варианты устранения проблемы в зависимости от исходной задачи.
Проверим настройки метаданных в Конфигураторе:
СоответствияОбъектовИнформационныхБаз установлен флаг участия в составе обмена.Конфигурация -> Обновить конфигурацию базы данных).Если запись в регистр выполняется программно в рамках загрузки данных или создания технических записей, когда регистрация изменений для узлов не требуется, необходимо отключить выполнение обработчиков модуля набора записей:
НаборЗаписей = РегистрыСведений.СоответствияОбъектовИнформационныхБаз.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.УзелИнформационнойБазы.Установить(СсылкаНаУзел);
// Отключаем выполнение обработчиков модуля набора записей
НаборЗаписей.ОбменДанными.Загрузка = Истина;
// Заполнение записей и запись набора
...
НаборЗаписей.Записать();
Флаг Загрузка = Истина предотвращает вызов кода в событии ПередЗаписью, избегая вызова метода ОбменДанными.Получатели.Добавить().
Перед передачей значения в метод Добавить() выполним проверку доступности отбора и некорректных узлов:
Если Отбор.УзелИнформационнойБазы.Использование
И ЗначениеЗаполнено(Отбор.УзелИнформационнойБазы.Значение)
И Отбор.УзелИнформационнойБазы.Значение <> Отбор.УзелИнформационнойБазы.Значение.Метаданные().ЭтотУзел() Тогда
ОбменДанными.Получатели.Добавить(Отбор.УзелИнформационнойБазы.Значение);
КонецЕсли;
В типовых конфигурациях 1С не рекомендуется изменять регистр СоответствияОбъектовИнформационныхБаз напрямую через наборы записей. Для создания и обновления сопоставлений объектов следует применять методы общего модуля БСП ОбменДаннымиСервер (например, ОбменДаннымиСервер.ЗафиксироватьСоответствие()), которые самостоятельно обрабатывают отборы, права доступа и параметры обмена.