При программном создании и заполнении записей периодических регистров сведений разработчики 1С часто сталкиваются с ситуацией, когда после вызова встроенной процедуры ЗаполнитьЗначенияСвойств системное поле Период остается пустым. В результате при попытке вызвать метод Записать() у объекта НаборЗаписей возникает платформами генерируемая ошибка: "Период не может быть пустым".
Рассмотрим, почему это происходит и какими способами можно гарантированно заполнить все свойства записи регистра.
Проанализируем механику работы платформы при добавлении новых записей в периодический регистр сведений:
Добавить() в набор с установленным отбором по периоду, поле Период автоматически принимает значение из отбора. Однако если в объекте-источнике (например, в выборке из запроса) значение даты не определено, имеет значение NULL или тип данных не совпадает с ожидаемым, процедура ЗаполнитьЗначенияСвойств безусловно перезаписывает это поле пустой датой (01.01.0001 00:00:00).NULL, процедура ЗаполнитьЗначенияСвойств сбрасывает приемник к значению по умолчанию для типа Дата.Разберем несколько практических вариантов решения этой задачи в зависимости от ваших требований к коду.
Самый простой и наглядный вариант — явно переопределить значение поля Период сразу после вызова процедуры универсального заполнения свойств:
Набор = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Заявка.Установить(Выборка.Заявка);
Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Запись.Период = Выборка.Период; // Явное заполнение периода
Набор.Записать();
Если значение периода уже корректно установлено в отборе набора записей, при вызове метода Добавить() платформа автоматически заполнит поле Период новой записи. Чтобы процедура ЗаполнитьЗначенияСвойств не сбрасывала его, укажем Период в 4-м параметре (ИсключаемыеСвойства):
Набор = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Заявка.Установить(Выборка.Заявка);
Запись = Набор.Добавить();
// Третий параметр - заменяемые свойства (пустой), четвертый - исключаемые
ЗаполнитьЗначенияСвойств(Запись, Выборка, , "Период");
Набор.Записать();
Если необходимо явно передать период из источника через функцию заполнения, можно выполнить точечный повторный вызов с указанием конкретных свойств в 3-м параметре (ЗаполняемыеСвойства):
Набор = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Заявка.Установить(Выборка.Заявка);
Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
ЗаполнитьЗначенияСвойств(Запись, Выборка, "Период");
Набор.Записать();
Посмотрим на источник данных. Если источник формируется с помощью языка запросов 1С, проверьте, чтобы ключевые поля периода были обработаны функцией ЕСТЬNULL. Это исключит сброс реквизита типа Дата в пустую дату при копировании свойств:
ВЫБРАТЬ
ЕСТЬNULL(Таблица.Период, &ТекущаяДата) КАК Период,
Таблица.Заявка КАК Заявка,
Таблица.Статус КАК Статус
ИЗ
РегистрСведений.ИсторияСтатусовЗаявок КАК Таблица
Применение любого из описанных методов позволяет избежать сброса реквизита Период и обеспечивает корректную запись набора в регистр сведений.