Как исправить ошибку «Не установлен отбор по регистратору» при переносе регистра цен в 1С

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

При переносе данных между конфигурациями (например, из УТ 11 в Далион) через механизм Конвертация данных 2.1 часто возникает критическая ошибка: «Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Цены номенклатуры)». Эта проблема связана со спецификой работы платформы 1С:Предприятие с регистрами, для которых в метаданных установлен режим записи «Подчинение регистратору». Разберем подробно, почему это происходит и как правильно настроить правила обмена.

Почему возникает эта ошибка?

В платформе 1С регистры сведений могут быть либо независимыми, либо подчиненными регистратору. В последнем случае запись в регистр возможна только в составе набора записей, для которого в обязательном порядке установлен фильтр (отбор) по конкретному документу-владельцу (регистратору). Если при загрузке данных в базу-приемник обработчик УниверсальныйОбменДаннымиXML пытается выполнить метод Записать(), а поле Регистратор в наборе записей не заполнено или не инициализировано, система выдает ошибку.

Проанализируем ситуацию: часто при создании правил для регистра сведений разработчики забывают указать Правило Конвертации Объекта (ПКО) для свойства Регистратор, либо это свойство вовсе исключается из обмена. Также проблема может усугубляться прикладным кодом в самой конфигурации-приемнике (в нашем случае — Далион), который срабатывает при записи, даже если установлен флаг ОбменДанными.Загрузка = Истина.

Способ 1. Настройка ПКС для свойства Регистратор

Это стандартный путь, если вы решили переносить записи регистра как самостоятельные объекты. Рассмотрим по шагам, как настроить Правило Конвертации Свойств (ПКС):

  1. В конфигурации Конвертация данных 2.1 откройте ПКО вашего регистра сведений (например, ЦеныНоменклатуры).
  2. Найдите в списке свойств Регистратор.
  3. Убедитесь, что для него создано ПКС. Если регистратор в источнике и приемнике имеет один и тот же тип, просто выберите соответствующее ПКО для этого документа.
  4. Если поле Регистратор имеет составной тип (может быть разными документами), нам необходимо программно определить ПКО в обработчике ПередВыгрузкой данного ПКС.

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


Если ТипЗнч(Источник.Регистратор) = Тип("ДокументСсылка.УстановкаЦенНоменклатуры") Тогда
    ИмяПКО = "УстановкаЦенНоменклатуры";
ИначеЕсли ТипЗнч(Источник.Регистратор) = Тип("ДокументСсылка.КорректировкаРегистров") Тогда
    ИмяПКО = "КорректировкаРегистров";
КонецЕсли;

Важный нюанс: Обратите внимание на использование функции Тип(). Строковое название типа должно точно соответствовать метаданным. Ошибка «Переменная не определена (ДокументСсылка)» часто возникает, когда разработчик пытается написать тип без кавычек или забывает, что ДокументСсылка — это не глобальный тип, а лишь часть описания конкретного объекта.

Способ 2. Перенос регистра в составе движений документа

Наиболее правильным и надежным способом с точки зрения архитектуры 1С является перенос движений вместе с самим документом. В этом случае платформа автоматически устанавливает все необходимые отборы.

Рассмотрим, как это реализовать:

  1. Откройте ПКО документа (например, УстановкаЦенНоменклатуры).
  2. Перейдите на вкладку «Движения».
  3. Установите флажок напротив регистра ЦеныНоменклатуры.
  4. В этом случае создавать отдельное ПКО для регистра сведений не требуется — данные будут выгружены как часть коллекции движений документа.

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

Анализ кода в конфигурации-приемнике (Далион)

Посмотрим на код модуля набора записей, который привел к ошибке. В процедуре ПередЗаписью выполняются методы УдалитьДублиПоИзмерениям и ИнкриминироватьПериодПриСовпадении. Внутри них есть запрос, который использует:

Запрос.УстановитьПараметр("Регистратор", ЭтотОбъект.Отбор.Регистратор.Значение);

Если при загрузке данных ПКС регистратора не отработало корректно, свойство ЭтотОбъект.Отбор.Регистратор.Значение будет равно Неопределено или ссылке на несуществующий объект. Это приводит к тому, что запрос отрабатывает неверно, а попытка метода Загрузить() обновить набор записей вызывает исключение платформы.

Чтобы минимизировать такие ошибки, рекомендуется в правилах обмена для ПКО регистра сведений в обработчике ПриЗагрузке принудительно отключать подобные проверки, если это допустимо бизнес-логикой:


// В обработчике ПКО "ПриЗагрузке"
Объект.ДополнительныеСвойства.Вставить("НеЗаписыватьДублиПоИзмерениям", Истина);

Типичные ошибки при написании обработчиков

Разберем основные моменты, на которых спотыкаются разработчики при исправлении данной ошибки:

  1. Отсутствие кавычек в функции Тип: Правильно писать Тип("ДокументСсылка.Имя"), а не Тип(ДокументСсылка.Имя).
  2. Несоответствие имен ПКО: Имя, указанное в переменной ИмяПКО, должно символьно совпадать с именем правила, созданного в дереве правил конвертации.
  3. Флаг Поиск: Для свойства Регистратор в ПКС часто полезно устанавливать флаг «Поиск», чтобы система могла сопоставить документ, если он уже был загружен ранее.

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

Резюме для исправления

Для успешного переноса регистра ЦеныНоменклатуры выполните следующие действия:

  1. Убедитесь, что ПКО документа-регистратора существует и корректно настроено.
  2. В ПКС регистратора для ПКО ЦеныНоменклатуры пропишите явное указание ПКО через ИмяПКО = "..." в обработчике ПередВыгрузкой.
  3. Если вы используете ручное создание набора записей в обработчиках, всегда проверяйте заполненность Отбор.Регистратор.
  4. При возникновении ошибок компиляции (код сообщения 55), внимательно проверяйте синтаксис в обработчиках событий — любая опечатка в текстовом поле КД 2.1 приведет к остановке всего обмена.

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

← На главную