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