Как исправить ошибку «Запись не верна! Значение поля не соответствует установленному отбору» при загрузке регистра в КД 2?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При переносе данных между конфигурациями «1С:Предприятие» с использованием конфигурации «Конвертация данных 2» (КД 2) и обработки «Универсальный обмен данными XML» разработчики нередко сталкиваются с ошибкой записи независимого регистра сведений: «Запись не верна! Значение поля не соответствует установленному отбору». Проанализируем природу этой ошибки, разберем причины ее возникновения и рассмотрим все способы ее устранения.

Механизм возникновения ошибки

Разберем, почему платформа «1С:Предприятие» выбрасывает данное исключение. При записи объектов РегистрСведенийНаборЗаписей или РегистрСведенийМенеджерЗаписи действует строгое платформенное правило: если в коллекции Отбор для измерения или периода включено использование (Использование = Истина), то значения этих полей во всех строках набора обязаны строго совпадать со значением, указанным в Отбор[ИмяПоля].Значение.

Обработка «Универсальный обмен данными XML» при стандартной загрузке независимого регистра формирует набор записей с построчным отбором по всем ключевым полям (периоду и всем измерениям). Если в процессе выгрузки, сопоставления ссылок, выполнения обработчиков КД или работы программного кода базы-приемника значение поля в строке набора изменяется, а в отборе остается старым, платформа блокирует запись с указанной ошибкой.

Основные причины несовпадения отбора и строки

  1. Незаполненный или некорректный период: если регистр сведений является периодическим, отсутствие передачи реквизита Период в ПКО/ПКС или несовпадение периодичности (например, точность День в источнике и Секунда в приемнике) приводит к искажению даты отбора.
  2. Переопределение ссылок правилами поиска: если измерение регистра имеет ссылочный тип (например, справочник ТехнологическиеКарты) и при поиске в приемнике по полям поиска находится элемент с другим внутренним идентификатором (GUID), в строку набора подставляется найденная ссылка, тогда как отбор набора инициализируется первоначальным значением из XML.
  3. Модификация полей в модуле набора записей или подписках: события ПередЗаписью и ПриЗаписи модуля набора записей выполняются всегда, даже если включен режим ОбменДанными.Загрузка = Истина. Если в конфигурации-приемнике логика модуля изменяет реквизиты строки набора, отбор автоматически не обновляется.
  4. Обработчики событий КД 2: изменение значений измерений в событиях ПриЗагрузке, ПослеЗагрузки или ПередЗаписьюПолученныхДанных без синхронизации с коллекцией отбора набора записей.

Способ 1. Синхронизация отбора в обработчике «ПередЗаписьюПолученныхДанных»

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

Добавим в обработчик следующий код:


Если Объект.Количество() > 0 Тогда
    СтрокаНабора = Объект[0];
    Для Каждого ЭлементОтбора Из Объект.Отбор Цикл
        Если ЭлементОтбора.Использование Тогда
            ЭлементОтбора.Значение = СтрокаНабора[ЭлементОтбора.Имя];
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

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

Способ 2. Проверка флага загрузки в модуле набора записей и подписках

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

Откроем модуль набора записей регистра в конфигураторе и в процедуре ПередЗаписью добавим проверку флага загрузки данных:


Процедура ПередЗаписью(Отказ, Замещение)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Основная прикладная логика
КонецПроцедуры

Аналогичную проверку выполним во всех подписках на события, объектом-источником которых выступает данный регистр сведений.

Способ 3. Проверка настроек поиска ссылочных измерений в КД 2

Разберем настройки ПКО для справочников, являющихся измерениями регистра сведений:

  1. Откроем ПКО справочника-измерения (например, ТехнологическиеКарты).
  2. Если перенос выполняется между идентичными конфигурациями, убедимся, что включен флаг «Искать объект приемника по внутреннему идентификатору».
  3. Если конфигурации различаются и поиск ведется по реквизитам (код, наименование), проверим, не создаются ли дубли и однозначно ли сопоставляется элемент в базе-приемнике.
  4. Проверим, заполняется ли свойство Период в правилах конвертации свойств (ПКС) регистра, если регистр периодический.

Способ 4. Изменение режима записи регистра

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

← На главную