База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в 1С сформировать таблицу месяцев с произвольными началом и концом периода? › Ответ в теме: Как в 1С сформировать таблицу месяцев с произвольными началом и концом периода?
Вот пример кода 1С, который формирует ТаблицуЗначений с колонками ДатН и ДатК, где каждая строка — период месяца в заданном диапазоне, при этом первый месяц начинается с произвольной даты (например, 15.01.2023), а последний месяц заканчивается на произвольной дате (например, 05.10.2023):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Процедура СформироватьТаблицуМесяцев(ДатаНач, ДатаКон, ТабМес) // ТабМес - ТаблицаЗначений с колонками "ДатН" и "ДатК" ТабМес.Очистить(); ТекДатаНач = ДатаНач; ТекДатаКон = КонецМесяца(ТекДатаНач); Пока ТекДатаНач <= ДатаКон Цикл НоваяСтрока = ТабМес.Добавить(); НоваяСтрока.ДатН = ТекДатаНач; // Для последнего месяца ограничиваем ДатК датой окончания диапазона Если ТекДатаКон > ДатаКон Тогда НоваяСтрока.ДатК = ДатаКон; Иначе НоваяСтрока.ДатК = ТекДатаКон; КонецЕсли; // Переходим к следующему месяцу ТекДатаНач = ТекДатаКон + 1; ТекДатаКон = КонецМесяца(ТекДатаНач); КонецЦикла; КонецПроцедуры // Пример вызова: ТабМес = Новый ТаблицаЗначений; ТабМес.Колонки.Добавить("ДатН", Новый ОписаниеТипов("Дата")); ТабМес.Колонки.Добавить("ДатК", Новый ОписаниеТипов("Дата")); СформироватьТаблицуМесяцев(Дата(2023,1,15), Дата(2023,10,5), ТабМес); // Теперь ТабМес содержит строки: // 1: ДатН = 15.01.2023, ДатК = 31.01.2023 // 2: ДатН = 01.02.2023, ДатК = 28.02.2023 // 3: ДатН = 01.03.2023, ДатК = 31.03.2023 // ... // N: ДатН = 01.10.2023, ДатК = 05.10.2023 |
Объяснение:
— Начинаем с заданной начальной даты (например, 15.01.2023).
— Для каждого месяца вычисляем конец месяца функцией КонецМесяца.
— Для последнего месяца, если конец месяца выходит за пределы конечной даты, ставим ДатК равной конечной дате.
— Переходим к следующему месяцу, устанавливая начало следующего периода на следующий день после текущего конца месяца.
Такой подход универсален и позволяет задать любой произвольный диапазон с частичным первым и последним месяцем.