Как исправить ошибку «Запись не верна! Период не может быть пустым!» в регистре накопления 1С?

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

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

Анализируем причину возникновения ошибки

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

Ошибка «Период не может быть пустым» возникает потому, что любой регистр накопления — это таблица, которая хранит данные в разрезе времени. Поле Период является обязательным для каждой записи в этой таблице. Если при программном создании движения вы не укажете дату, система попытается записать пустое значение (01.01.0001), что недопустимо для регистров накопления, так как на основе этой даты строятся итоги.

Разбираем правильный код для формирования движений (в этом поможет консоль кода с ИИ)

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

Неправильный вариант:


Движение = Движения.Расчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Контрагент = ЭтотОбъект.Контрагент;
Движение.Сумма = ЭтотОбъект.СуммаДокумента;
// Поле Период пропущено

Правильный вариант (решение проблемы):

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


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

Где найти «невидимые» поля в конфигураторе?

Выясним, почему многие новички «не видят» период в дереве метаданных. Рассмотрим пошагово, как отобразить стандартные реквизиты объекта:

  1. Откройте окно редактирования регистра накопления (двойной клик по регистру в дереве метаданных).
  2. Перейдите на закладку Данные.
  3. В нижней части окна найдите кнопку Стандартные реквизиты и нажмите её.

В открывшемся списке вы увидите те самые поля, которые система добавляет автоматически к каждому регистру:

Почему в одних регистрах ошибка есть, а в других нет?

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

  1. Использование конструктора движений: Если для регистра Товары вы использовали «Конструктор движений», платформа автоматически сгенерировала код, в котором строка Движение.Период = Дата; уже присутствует.
  2. Свойство «Записывать»: Проверьте, установлено ли свойство Движения.Расчеты.Записывать = Истина;. Если вы заполняете коллекцию движений, но не устанавливаете этот флаг, данные просто не будут отправлены в базу данных, и ошибка может не проявиться до момента физической записи.

Важность реквизита «Период» для виртуальных таблиц

Посмотрим на ситуацию шире: зачем системе так важен этот Период? Дело в том, что 1С:Предприятие оптимизирует работу с остатками и оборотами. Благодаря наличию этого поля, система строит виртуальные таблицы:

Если бы мы могли записывать данные без периода, платформа не смогла бы рассчитать состояние взаиморасчетов или количество товара на конкретный момент времени (например, на начало дня или на конец месяца). Таким образом, Период — это фундамент всей логики накопления данных в 1С.

Рекомендации по проектированию движений

Разберем несколько правил, которые помогут избежать подобных проблем в будущем:

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

← На главную