При выполнении обмена данными в распределенной информационной базе (РИБ) в момент загрузки сообщения методом ПрочитатьИзменения() может возникнуть исключение: «Запись не верна! Период не может быть пустым! (Регистр накопления: [ИмяРегистра]; Номер строки: N)». Выясним причину этой ошибки и подробно разберем все способы её поиска и устранения.
Рассмотрим, почему это происходит. При загрузке данных в РИБ платформа устанавливает флаг ОбменДанными.Загрузка = Истина. Это отключает пользовательские и прикладные проверки в коде конфигурации, но системные платформенные ограничения СУБД продолжают действовать. Для любого регистра накопления и периодического регистра сведений поле Период входит в состав системного первичного ключа. Попытка записать набор движений с незаполненной датой (значение 0001-01-01) безусловно блокируется платформой «1С:Предприятие».
Чаще всего источник проблемы находится в узле-отправителе:
В специализированных и отраслевых решениях при формировании движений по партионным регистрам дата в Период может подставляться не из даты самого документа, а из реквизита табличной части (например, «Дата партии» или «Дата входящего документа»). Если пользователь не заполнил это поле, в регистр попадает пустая дата. Также причиной могут быть «битые» или осиротевшие записи (движения без документа-регистратора) либо сбои при программном формировании наборов записей.
Разберем самый точный и быстрый способ локализовать проблемный документ без изменения конфигурации — анализ XML-сообщения обмена.
Message_*.xml) в текстовом редакторе (например, Notepad++ или VS Code).<AccumulationRegisterRecordSet.ПартииТоваровНаСкладахУправленческийУчет>.<Record>.<Period> — в нем будет содержаться значение 0001-01-01T00:00:00.<Recorder> найдем уникальный идентификатор (GUID) документа-регистратора. Скопировав этот GUID, мы сможем легко найти исходный документ в информационной базе с помощью стандартной обработки поиска объектов по ссылке/идентификатору или через консоль запросов.Проанализируем данные непосредственно в информационной базе подчиненного узла с помощью консоли запросов. Это позволяет быстро выявить невалидные записи без ручного разбора XML.
Напишем запрос к регистру накопления, отфильтровав пустые даты:
ВЫБРАТЬ
Партии.Регистратор КАК ДокументРегистратор,
Партии.НомерСтроки КАК НомерСтроки,
Партии.Период КАК Период
ИЗ
РегистрНакопления.ПартииТоваровНаСкладахУправленческийУчет КАК Партии
ГДЕ
Партии.Период = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Если запрос возвращает строки, мы сразу видим документ, сформировавший некорректные движения. Также проверим наличие документов с незаполненной датой, которые могли сформировать данный набор записей:
ВЫБРАТЬ
Док.Ссылка КАК ДокументСсылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Док
ГДЕ
Док.Дата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
После того как проблемный регистратор определен, разберем возможные пути решения:
<Period> четвертой строки укажем корректную дату документа (например, 2024-03-15T12:00:00) либо полностью удалим ошибочную запись <Record>...</Record>. Сохраним файл и повторно запустим чтение в узле-приемнике.Регистратор содержит «Объект не найден» (фантомные или осиротевшие движения), в конфигураторе подчиненного узла выполним процедуру Тестирование и исправление информационной базы. Обязательно включим опции «Проверка логической целостности» и «Проверка ссылочной целостности», выбрав действие «Очищать ссылки» или «Удалять записи». Это удалит остатки некорректных наборов из таблиц регистра.