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