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