Почему ЗаполнитьЗначенияСвойств не заполняет Период в записи регистра сведений и как это исправить

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

При программном создании и заполнении записей периодических регистров сведений разработчики 1С часто сталкиваются с ситуацией, когда после вызова встроенной процедуры ЗаполнитьЗначенияСвойств системное поле Период остается пустым. В результате при попытке вызвать метод Записать() у объекта НаборЗаписей возникает платформами генерируемая ошибка: "Период не может быть пустым".

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

Причины возникновения ошибки

Проанализируем механику работы платформы при добавлении новых записей в периодический регистр сведений:

  1. Перезапись значения из отбора: При добавлении новой записи методом Добавить() в набор с установленным отбором по периоду, поле Период автоматически принимает значение из отбора. Однако если в объекте-источнике (например, в выборке из запроса) значение даты не определено, имеет значение NULL или тип данных не совпадает с ожидаемым, процедура ЗаполнитьЗначенияСвойств безусловно перезаписывает это поле пустой датой (01.01.0001 00:00:00).
  2. Неявные особенности типов данных: Если выборка содержит неопределенный тип или результат соединения таблиц вернул NULL, процедура ЗаполнитьЗначенияСвойств сбрасывает приемник к значению по умолчанию для типа Дата.

Способы решения проблемы

Разберем несколько практических вариантов решения этой задачи в зависимости от ваших требований к коду.

Вариант 1. Явное присвоение значения полю Период

Самый простой и наглядный вариант — явно переопределить значение поля Период сразу после вызова процедуры универсального заполнения свойств:


Набор = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Заявка.Установить(Выборка.Заявка);

Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Запись.Период = Выборка.Период; // Явное заполнение периода

Набор.Записать();

Вариант 2. Исключение реквизита Период из заполнения

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


Набор = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Заявка.Установить(Выборка.Заявка);

Запись = Набор.Добавить();
// Третий параметр - заменяемые свойства (пустой), четвертый - исключаемые
ЗаполнитьЗначенияСвойств(Запись, Выборка, , "Период");

Набор.Записать();

Вариант 3. Повторный вызов ЗаполнитьЗначенияСвойств с точечным указанием поля

Если необходимо явно передать период из источника через функцию заполнения, можно выполнить точечный повторный вызов с указанием конкретных свойств в 3-м параметре (ЗаполняемыеСвойства):


Набор = РегистрыСведений.ИсторияСтатусовЗаявок.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Заявка.Установить(Выборка.Заявка);

Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
ЗаполнитьЗначенияСвойств(Запись, Выборка, "Период");

Набор.Записать();

Вариант 4. Проверка значений NULL в запросе

Посмотрим на источник данных. Если источник формируется с помощью языка запросов 1С, проверьте, чтобы ключевые поля периода были обработаны функцией ЕСТЬNULL. Это исключит сброс реквизита типа Дата в пустую дату при копировании свойств:


ВЫБРАТЬ
    ЕСТЬNULL(Таблица.Период, &ТекущаяДата) КАК Период,
    Таблица.Заявка КАК Заявка,
    Таблица.Статус КАК Статус
ИЗ
    РегистрСведений.ИсторияСтатусовЗаявок КАК Таблица

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

← На главную