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