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

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

Часто при разработке отчетов или обработок в 1С возникает задача: нужно определить все календарные месяцы, которые попадают в заданный пользователем период. Например, если указан интервал с февраля по май, система должна вернуть числа 2, 3, 4 и 5. Давайте разберем, как реализовать это максимально эффективно и надежно, не допуская ошибок при переходе через границы календарных лет.

Почему не стоит использовать простую математику?

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

Решение через цикл и функцию ДобавитьМесяц

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

Рассмотрим пошагово, как реализовать этот алгоритм:

  1. Приводим начальную дату к началу месяца с помощью НачалоМесяца().
  2. Запускаем цикл, который будет выполняться, пока наша текущая дата меньше или равна дате окончания.
  3. Внутри цикла забираем номер месяца с помощью функции Месяц().
  4. Увеличиваем текущую дату на один месяц с помощью ДобавитьМесяц(ТекДата, 1).

Вот как выглядит готовый пример кода для реализации этой задачи:


ДатаОкончания = НачалоМесяца(ДатаОкончанияПериода);
ДатаЦикла = НачалоМесяца(ДатаНачалаПериода);
СписокМесяцев = Новый Массив;

Пока ДатаЦикла <= ДатаОкончания Цикл
    СписокМесяцев.Добавить(Месяц(ДатаЦикла));
    ДатаЦикла = ДобавитьМесяц(ДатаЦикла, 1);
КонецЦикла;

Преимущества использования данного подхода

Данный метод обладает рядом достоинств, которые делают его стандартом в разработке на 1С:

Дополнительные возможности: получение названий месяцев

Если вам нужно вывести не просто цифры, а названия месяцев (например, для шапки отчета), используйте функцию Формат(). Внутри того же цикла вы можете легко получить строковое представление месяца:


// Внутри цикла:
НазваниеМесяца = Формат(ДатаЦикла, "ДФ=MMMM");
// Теперь переменная НазваниеМесяца будет содержать "Январь", "Февраль" и т.д.

Важные советы по оптимизации

Если вы планируете использовать полученный массив для дальнейших вычислений (например, для динамического создания колонок в табличной части), помните об ограничениях памяти. Если диапазон дат составляет десятилетия, старайтесь не хранить данные в массиве, а обрабатывать их «на лету» внутри цикла. Это позволит снизить нагрузку на клиентское приложение.

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

← На главную