К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать выбор месяца в 1С: настройка поля и программные способы

Как сделать выбор месяца в 1С: настройка поля ввода даты, форма выбора периода, код на встроенном языке для управляемых и обычных форм.

Задача выбора месяца возникает в 1С постоянно: в отчётах, обработках, документах начисления зарплаты, регистрах сведений с периодичностью «в пределах месяца». При этом платформа не предоставляет отдельного типа «месяц» — используется тип «Дата», и задача разработчика сводится к тому, чтобы ограничить ввод и корректно показать пользователю только месяц и год.

Существует несколько рабочих подходов: поле ввода с форматом отображения «месяц и год», стандартный диалог выбора периода, собственная форма с двумя полями (месяц и год) или выпадающий список. Выбор зависит от того, где применяется решение — в управляемой или обычной форме, в отчёте на СКД или в самостоятельной обработке.

Ниже разобраны конкретные способы с примерами кода на встроенном языке, настройкой форматов и типичными ошибками, из-за которых выбранный месяц «съезжает» на день или отображается некорректно.

Как 1С хранит и отображает месяц

В платформе 1С:Предприятие дата всегда содержит день, месяц, год и время с точностью до секунды. Даже если пользователь выбирает «месяц», в реквизите физически хранится конкретная дата — обычно первое число месяца. Именно поэтому все механизмы выбора месяца строятся вокруг типа «Дата» и функций работы с ним.

Ключевые функции встроенного языка для этой задачи: НачалоМесяца(Дата) возвращает первое число месяца в 00:00:00, КонецМесяца(Дата) — последнюю секунду последнего дня, ДобавитьМесяц(Дата, КоличествоМесяцев) — сдвигает дату на нужное число месяцев. Этих трёх функций достаточно для большинства сценариев.

Отображение управляется строкой формата. Конструкция Формат(Дата, "ДФ='ММММ гггг'") выводит значение как «Январь 2026» без дня. Та же строка формата применяется в свойствах поля ввода, чтобы пользователь видел только месяц и год, хотя внутри хранится полная дата.

Выбор месяца через поле ввода в управляемой форме

Самый простой способ — реквизит формы или объекта типа «Дата» с настроенным форматом. Добавьте реквизит, например «МесяцНачисления», с составом даты «Дата» (без времени). Затем в свойствах элемента формы «Поле ввода» установите свойство «Формат» равным ДФ='ММММ гггг' — пользователь увидит «Март 2026» вместо полной даты.

Чтобы при любом вводе значение приводилось к первому числу, добавьте обработчик события «ПриИзменении»:

&НаКлиенте

Процедура МесяцНачисленияПриИзменении(Элемент)

МесяцНачисления = НачалоМесяца(МесяцНачисления);

КонецПроцедуры

Дополнительно можно настроить кнопки регулирования, чтобы стрелки листали именно месяцы, а не дни. Для этого у поля ввода включите «КнопкаРегулирования» и в обработчике «Регулирование» сдвигайте значение через ДобавитьМесяц:

&НаКлиенте

Процедура МесяцНачисленияРегулирование(Элемент, Направление, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

МесяцНачисления = НачалоМесяца(ДобавитьМесяц(МесяцНачисления, Направление));

КонецПроцедуры

Настройка поля выбора месяца
  1. 1
    Создайте реквизит типа «Дата» с составом даты «Дата»
  2. 2
    Выведите его на форму как поле ввода
  3. 3
    В свойстве «Формат» укажите ДФ='ММММ гггг'
  4. 4
    Добавьте обработчик ПриИзменении с НачалоМесяца()
  5. 5
    При необходимости включите регулирование с ДобавитьМесяц()
  6. 6
    Проверьте: в поле виден только месяц и год, значение — первое число

Строка формата: варианты отображения

Строка формата определяет, как дата выглядит для пользователя. Для выбора месяца полезны несколько вариантов, которые сопоставлены в таблице.

Строка форматаПример выводаКогда применять
ДФ='ММММ гггг'Январь 2026Основной вариант для полей ввода
ДФ='ММ.гггг'01.2026Компактные таблицы и колонки
ДФ='МММ гггг'Янв 2026Сокращённое отображение в отчётах
ДФ=MMMyyyyянв. 2026Локализованный короткий формат

Учтите: формат влияет только на отображение. Если реквизит не нормализован функцией НачалоМесяца, внутри может храниться, например, 15-е число, и запросы с отбором по равенству даты дадут неожиданный результат.

Выбор месяца в обычных формах

В обычных формах (толстый клиент, старые конфигурации) механика аналогична: поле ввода связано с реквизитом типа «Дата», а в свойстве «Формат» задаётся та же строка ДФ='ММММ гггг'. Обработчик «ПриИзменении» пишется без директив компиляции, так как весь код исполняется на клиенте.

Дополнительно в обычных формах удобно использовать выпадающий список: заполните «СписокВыбора» поля ввода двенадцатью значениями — первыми числами месяцев текущего года — с представлениями «Январь», «Февраль» и так далее. Пользователь выбирает месяц из списка, а год меняет отдельным полем или регулированием.

// Заполнение списка месяцев для обычной формы

Для НомерМесяца = 1 По 12 Цикл

ДатаМесяца = Дата(Год(ТекущаяДата()), НомерМесяца, 1);

ЭлементыФормы.Месяц.СписокВыбора.Добавить(ДатаМесяца, Формат(ДатаМесяца, "ДФ=ММММ"));

КонецЦикла;

Выбор месяца в отчётах и через стандартный период

В отчётах на СКД месяц чаще всего задают стандартным периодом: в параметрах отчёта используются поля «НачалоПериода» и «КонецПериода», а пользователь выбирает вариант «Месяц» в диалоге стандартного периода. Это избавляет от собственной разработки и даёт корректные границы — с первой секунды первого дня по последнюю секунду последнего.

Если нужен именно один месяц без диапазона, добавьте в отчёт параметр типа «Дата» и в запросе СКД наложите условие через функции языка запросов:

ГДЕ

НАЧАЛОПЕРИОДА(Таблица.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Месяц, МЕСЯЦ)

Такое условие устойчиво к тому, какое число реально передано в параметре: сравниваются начала месяцев, а не сами даты. Это предпочтительный способ отбора по месяцу в запросах.

Способы выбора месяца

Поле ввода с форматом

Быстро настраивается, подходит для документов и обработок; требует нормализации значения в обработчике

Стандартный период

Готовый диалог с вариантом «Месяц»; даёт диапазон, а не одиночное значение, удобен в отчётах

Список выбора

Пользователь не может ввести некорректное значение; требует заполнения списка и отдельного управления годом

Собственная форма выбора

Полный контроль над интерфейсом; трудоёмко, оправдано только при нестандартных требованиях

Собственная форма выбора месяца

Когда стандартных средств недостаточно — например, нужен выбор месяца кнопками-переключателями или таблицей 3×4 — создают отдельную форму. В ней размещают двенадцать элементов, а результат возвращают через Закрыть(ДатаМесяца) или через описание оповещения.

&НаКлиенте

Процедура ВыбратьМесяц(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораМесяца", ЭтотОбъект);

ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаВыбораМесяца", , ЭтотОбъект, , , , Оповещение);

КонецПроцедуры

&НаКлиенте

Процедура ПослеВыбораМесяца(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

МесяцНачисления = НачалоМесяца(Результат);

КонецЕсли;

КонецПроцедуры

Обратите внимание на обработку отмены: если пользователь закрыл форму без выбора, результат равен Неопределено, и присваивать его реквизиту нельзя — иначе текущее значение затрётся пустой датой.

Проверка результата и типичные ошибки

После настройки проверьте три вещи: отображение (виден только месяц и год), хранимое значение (первое число, время 00:00:00) и поведение отборов (записи за месяц находятся независимо от дня в дате). Быстрее всего контрольное значение посмотреть через «Вывести в табличный документ» или в консоли кода.

Контрольные точки

Как проверить результат

Отображение в поле
Норма

Видно «Январь 2026» без числа

Тревожный признак

Показывается полная дата с днём

Значение реквизита
Норма

Первое число месяца, время 00:00:00

Тревожный признак

Произвольный день или текущее время

Отбор в запросе
Норма

Находятся все записи месяца

Тревожный признак

Записи теряются при разных днях

Отмена выбора
Норма

Старое значение сохраняется

Тревожный признак

Поле очищается при закрытии формы

Типичные ошибки
01
Сравнение дат прямым равенством без НачалоМесяца — отборы не находят данные
02
Забытый обработчик ПриИзменении — в реквизите остаётся произвольный день
03
Формат задан только в коде, но не в свойствах поля — в форме видна полная дата
04
Отсутствие проверки на Неопределено после закрытия формы выбора — значение затирается
05
Использование регулирования без ДобавитьМесяц — стрелки листают дни вместо месяцев

FAQ

Можно ли создать реквизит, который хранит только месяц без дня?

Нет, платформа не имеет отдельного типа «месяц». Используйте тип «Дата» и нормализуйте значение функцией НачалоМесяца, а отображение настройте форматом. Альтернатива — хранить месяц строкой или числом, но тогда теряются все встроенные функции работы с датами.

Как получить последний день выбранного месяца?

Примените функцию КонецМесяца(Дата) — она вернёт последнюю секунду последнего дня месяца (23:59:59). В запросах аналог — функция КОНЕЦПЕРИОДА(&Месяц, МЕСЯЦ).

Почему при формате «ММММ гггг» в отборе не находятся записи?

Формат меняет только отображение, а не значение. Если в реквизите хранится 15-е число, а в отбор передано 1-е, равенства нет. Нормализуйте значения через НачалоМесяца или сравнивайте начала периодов в запросе.

Как сделать выбор месяца на мобильной платформе 1С?

Подход тот же: поле ввода типа «Дата» с форматом «ММММ гггг» и обработчиком ПриИзменении. Учтите, что на мобильных устройствах стандартный календарь выглядит иначе, поэтому список выбора из двенадцати месяцев часто удобнее для пользователя.

Как ограничить выбор месяца определённым диапазоном?

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

Чем отличается ДФ='ММММ гггг' от ДФ=MMMyyyy?

Первый вариант выводит полное название месяца и год («Январь 2026»), второй — сокращённое локализованное представление («янв. 2026»). Оба корректны; выбор зависит от того, сколько места есть в интерфейсе.

Итог

Что важно запомнить

Месяц в 1С — это дата с форматом «ММММ гггг» и нормализацией через НачалоМесяца. Для отборов в запросах сравнивайте начала периодов, а при программном открытии форм выбора всегда проверяйте результат на Неопределено.