Программирование в 1С

1С: дата начала месяца в коде и запросе

Коротко

Чтобы получить в 1С дату начала месяца, вызовите НачалоМесяца(Дата) — результатом будет первое число в 00:00:00. Для отбора данных используйте полуинтервал: дата больше или равна началу месяца и меньше начала следующего. Так записи последнего дня не потеряются из-за времени и дробных секунд.

НачалоМесяца и КонецМесяца в 1С

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

ДатаДокумента = ТекущаяДата();
Начало = НачалоМесяца(ДатаДокумента);
Конец = КонецМесяца(ДатаДокумента);

Сообщить(Формат(Начало, "ДФ=dd.MM.yyyy HH:mm:ss"));
Сообщить(Формат(Конец, "ДФ=dd.MM.yyyy HH:mm:ss"));
НачалоМесяца
Датадата внутри нужного месяца
Дата

Для даты 15.04.2025 результат НачалоМесяца() равен 01.04.2025 00:00:00. Значение КонецМесяца() удобно для показа пользователю, но в условиях выборки безопаснее использовать начало следующего месяца как исключающую верхнюю границу.

Предыдущий и следующий месяц через ДобавитьМесяц

ДобавитьМесяц() сдвигает дату на заданное число календарных месяцев. Отрицательное число переносит дату назад, положительное — вперёд. Сначала нормализуйте дату функцией НачалоМесяца(): это исключает перенос 29–31 числа в месяц, где такого дня нет.

НачалоТекущего = НачалоМесяца(ТекущаяДата());

НачалоПредыдущего = ДобавитьМесяц(НачалоТекущего, -1);
КонецПредыдущего = КонецМесяца(НачалоПредыдущего);

НачалоСледующего = ДобавитьМесяц(НачалоТекущего, 1);
КонецСледующего = КонецМесяца(НачалоСледующего);
ДобавитьМесяц
Датаисходная дата
ЧислоМесяцевцелое число; отрицательное — назад
Дата
В Консоли кода можно попросить агента рассчитать границы предыдущего месяца и сразу сформировать параметры конкретного запроса — без ручной подстановки дат.

1С запрос: начало месяца через НАЧАЛОПЕРИОДА

Если начало месяца нужно получить для каждой строки выборки, используйте функцию языка запросов НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ). Это отличается от встроенного языка: в запросе применяется НАЧАЛОПЕРИОДА, а не НачалоМесяца.

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(Реализация.Дата, МЕСЯЦ) КАК Месяц,
    СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
    НЕ Реализация.ПометкаУдаления
СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(Реализация.Дата, МЕСЯЦ)

Такой вариант подходит для группировки по месяцам. Если граница одна для всей выборки, вычислите её в коде и передайте параметром: это делает условие проще и обычно позволяет эффективнее использовать индекс поля даты.

Фильтр запроса полуинтервалом: >= начало и < следующий месяц

Надёжный месячный отбор — полуинтервал [НачалоПериода, НачалоСледующегоПериода). Он включает все события первого дня и исключает первый момент следующего месяца.

НачалоПериода = НачалоМесяца(ДатаОтчета);
НачалоСледующегоПериода = ДобавитьМесяц(НачалоПериода, 1);

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Продажи.Период,
    |   Продажи.СуммаОборот
    |ИЗ
    |   РегистрНакопления.Продажи.Обороты(&НачалоПериода, &НачалоСледующегоПериода) КАК Продажи
    |ГДЕ
    |   Продажи.Период >= &НачалоПериода
    |   И Продажи.Период < &НачалоСледующегоПериода";

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("НачалоСледующегоПериода", НачалоСледующегоПериода);

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

Часовые пояса и границы месяца

Граница месяца должна вычисляться в том часовом поясе, в котором определяется бизнес-дата. На сервере, в файловой базе и в клиентском сеансе ТекущаяДата() может отражать разный контекст времени. Для серверной логики используйте согласованный источник текущей даты, принятый в конфигурации, а при обмене с внешней системой явно преобразуйте входной момент из UTC в локальное время до вызова НачалоМесяца() или выполняйте весь отбор в UTC.

Не смешивайте локальную нижнюю границу с верхней границей в UTC. На переходах часового пояса такой период может получить разрыв или пересечение. Сначала определите обе границы в одной зоне, затем одинаково преобразуйте их для хранения или запроса.

1С: формат даты в строку функцией Формат

Функция Формат() нужна только для отображения или передачи даты текстом. Для сравнений и параметров запроса сохраняйте тип Дата: строка зависит от маски и региональных установок.

Начало = НачалоМесяца(ТекущаяДата());

ДатаДляПользователя = Формат(Начало, "ДФ=dd.MM.yyyy");
ДатаДляОбмена = Формат(Начало, "ДФ=yyyy-MM-dd'T'HH:mm:ss");
МесяцДляИмениФайла = Формат(Начало, "ДФ=yyyy-MM");
Формат
Значениедата или другое форматируемое значение
ФорматнаяСтрокапараметры отображения; для даты — ДФ
Строка

В маске даты регистр важен: MM — месяц, mm — минуты, HH — часы. Текстовый формат не добавляет сведения о часовом поясе автоматически.

Пустая дата и проверка входных значений

Пустая дата в 1С — значение Дата(1, 1, 1). Если применить к ней НачалоМесяца(), получится та же календарная граница, что обычно не имеет бизнес-смысла. Проверяйте необязательный реквизит до расчёта периода.

ПустаяДата = Дата(1, 1, 1);

Если ЗначениеЗаполнено(ДатаОтчета) И ДатаОтчета <> ПустаяДата Тогда
    НачалоПериода = НачалоМесяца(ДатаОтчета);
    НачалоСледующегоПериода = ДобавитьМесяц(НачалоПериода, 1);
Иначе
    ВызватьИсключение "Не указана дата отчета";
КонецЕсли;

При форматировании пустой даты учитывайте параметр ДП форматной строки: он управляет её представлением. Не подменяйте отсутствие даты пустой строкой до завершения вычислений.

Частые ошибки при расчёте начала месяца в 1С

  • Отбор через <= КонецМесяца(). Для границы данных надёжнее использовать < НачалоСледующегоМесяца.
  • Сдвиг исходного 29–31 числа. Перед ДобавитьМесяц() сначала вызовите НачалоМесяца().
  • НачалоМесяца() внутри текста запроса. В языке запросов функция называется НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ).
  • Сравнение даты со строкой. Формат() возвращает строку; в запрос передавайте параметр типа Дата.
  • Путаница MM и mm. В форматной строке это месяц и минуты соответственно.
  • Разные часовые пояса границ. Нижняя и верхняя границы должны быть рассчитаны и преобразованы одинаково.
  • Расчёт периода от пустой даты. Сначала проверяйте заполненность входного значения.
Агент Консоли кода может проверить готовый запрос на ошибки границ: передайте текст запроса и укажите, в каком часовом поясе хранятся даты.

Частые вопросы о начале месяца в 1С

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

Вычислите ДобавитьМесяц(НачалоМесяца(ТекущаяДата()), -1). Верхняя исключающая граница предыдущего месяца — НачалоМесяца(ТекущаяДата()).

Как получить начало месяца в запросе 1С?

Для даты строки используйте НАЧАЛОПЕРИОДА(ПолеДата, МЕСЯЦ). Для общего фильтра лучше рассчитать дату в коде и передать в запрос параметрами нижнюю границу и начало следующего месяца.

Почему для отбора лучше не использовать КонецМесяца?

Полуинтервал >= НачалоМесяца и < НачалоСледующегоМесяца однозначно обрабатывает время последнего дня и не зависит от точности хранения долей секунды.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф