Почему при записи в периодический регистр сведений 1С возникает ошибка «период не может быть пустым»?

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

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

Давайте разберемся, почему 1С выдает такое сообщение и как выявить причину, которая скрывается в логике работы вашего кода.

Понимание причины ошибки

В периодических регистрах сведений Период является ключевым измерением. Если система сообщает, что период пустой, это означает, что в процессе формирования набора записей (РегистрСведенийНаборЗаписей) одна или несколько записей, которые вы пытаетесь записать в базу данных, не содержат значения даты или содержат «пустую» дату 01.01.0001.

Распространенная ошибка заключается в том, что разработчики смотрят на первую запись в отладчике и видят, что там дата заполнена корректно. Однако при работе с набором записей 1С проверяет все записи, которые вы подготовили к записи. Если во второй или любой последующей строке период не проинициализирован, транзакция прерывается с ошибкой.

Шаг 1: Использование отладчика

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

  1. Установите точку останова перед вызовом метода Написать() или Записать() для вашего набора записей.
  2. В режиме отладки откройте табло (или окно «Вычислить выражение») и добавьте туда переменную вашего набора записей.
  3. Раскройте коллекцию Записи.
  4. Просмотрите Период для каждой записи в наборе. Вы с большой долей вероятности обнаружите, что в одной из них значение равно 0001-01-01.

Шаг 2: Анализ цикла формирования движений

Чаще всего проблема кроется в процедуре ОбработкаПроведения (или там, где вы формируете записи). Рассмотрим пример типичной ошибки:


// Неправильный подход
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
    Движение = Движения.ВашРегистр.Добавить();
    // Мы забыли присвоить период, надеясь, что 1С сделает это сама
    Движение.Измерение = СтрокаТЧ.Значение;
КонецЦикла;

Если РегистрСведений является периодическим, вы обязаны явно заполнить поле Период для каждой создаваемой записи. Если вы этого не делаете, 1С при записи набора попытается записать пустое значение, что запрещено структурой метаданных.

Разберем правильный вариант:


// Правильный подход
ДатаДокумента = ЭтотОбъект.Дата;
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
    Движение = Движения.ВашРегистр.Добавить();
    Движение.Период = ДатаДокумента; // Явное присвоение
    Движение.Измерение = СтрокаТЧ.Значение;
КонецЦикла;

Шаг 3: Проверка архитектурных изменений

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

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

Рекомендации по исправлению

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

← На главную