Разберем частую задачу, с которой сталкиваются разработчики при проектировании учетных документов: как привязать документ или начисление строго к определенному месяцу, исключив выбор конкретного дня. Проанализируем ограничения платформы 1С:Предприятие и рассмотрим правильные варианты реализации такого механизма.
В платформе 1С:Предприятие примитивный тип Дата на уровне базы данных всегда хранит полную дату и время (год, месяц, день, часы, минуты и секунды). В свойствах реквизитов доступны лишь три варианта состава даты:
Отдельного типа или квалификатора даты для хранения исключительно месяца или года не предусмотрено. Соответственно, задать значение даты вовсе без дня на уровне типа данных невозможно. Однако эту задачу можно решить при помощи нормализации даты и настройки пользовательского интерфейса.
Иногда разработчики пытаются принудительно изменить стандартный реквизит документа Дата в обработчике события перед записью:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Дата = НачалоМесяца(Дата);
КонецПроцедуры
Проанализируем последствия такого подхода. Если все документы за месяц получают одинаковую дату и время (например, 01.05.2026 00:00:00), это влечет за собой серьезные архитектурные проблемы:
Рассмотрим типовое решение (Best Practice), которое применяется в конфигурациях 1С:Зарплата и Управление Персоналом, 1C:ERP и 1С:Бухгалтерия:
Дата оставляем без изменений — он хранит реальную дату и время создания документа.ПериодРегистрации или МесяцНачисления) с типом Дата (состав: Дата).НачалоМесяца().Посмотрим на пример заполнения реквизита при создании или изменении документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() И НЕ ЗначениеЗаполнено(Объект.ПериодРегистрации) Тогда
Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДатаСеанса());
КонецЕсли;
КонецПроцедуры
Чтобы пользователь видел только месяц и год, а не конкретный день, настроим свойства элемента формы. Важно указать не только формат отображения, но и формат редактирования:
ДФ='ММММ гггг' (например, «Май 2026») или ДФ=MM.yyyy (например, «05.2026»).ДФ=MM.yyyy или ДФ='ММММ гггг'. Если не заполнить это свойство, в момент редактирования платформа покажет стандартное поле ввода с днем.Если требуется сформировать текстовое представление даты в программном коде (например, для вывода в печатную форму или отчет), используем функцию Формат():
ПредставлениеМесяца = Формат(Объект.ПериодРегистрации, "ДФ='ММММ гггг'");
// Результат: "Май 2026 г."
Чтобы пользователю было удобно выбирать месяц без использования календаря с днями, в обработчике события НачалоВыбора поля ввода можно открыть стандартный диалог настройки периода:
&НаКлиенте
Процедура ПериодРегистрацииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период.ДатаНачала = Объект.ПериодРегистрации;
Диалог.Период.ДатаОкончания = КонецМесяца(Объект.ПериодРегистрации);
// После выбора периода приводим дату начала к началу месяца
Если Диалог.Редактировать() Тогда
Объект.ПериодРегистрации = НачалоМесяца(Диалог.Период.ДатаНачала);
КонецЕсли;
КонецПроцедуры
Таким образом, сочетание отдельного реквизита с нормализацией через НачалоМесяца() и правильной настройки свойств Формат и ФорматРедактирования позволяет корректно отнести документ к месяцу без риска нарушить хронологию проведения в базе данных.