Заполнение табличной части на основании выбранного периода — классическая задача при разработке конфигураций на платформе 1С:Предприятие. Рассмотрим, как реализовать механизм, который автоматически создает строки для каждого дня выбранного месяца и заполняет их начальными данными.
Для решения нашей задачи мы будем использовать цикл, который проходит по количеству дней в месяце. Основная идея заключается в том, чтобы очистить табличную часть перед заполнением, а затем последовательно добавлять строки с нужной датой.
Разберем пример реализации, который использует конструкцию условий для определения количества дней в каждом из месяцев:
// Предположим, что у нас есть реквизит Месяц (тип Перечисление)
// и табличная часть ТБ с колонками Дата и КолВо
ТБ.Очистить();
ДатаНачала = НачалоГода(ТекущаяДата());
Если Месяц = Перечисления.МесяцаГода.Январь Тогда
ДнейВМесяце = 31;
ИначеЕсли Месяц = Перечисления.МесяцаГода.Февраль Тогда
ДнейВМесяце = 28;
ДатаНачала = ДобавитьМесяц(ДатаНачала, 1);
// ... и так далее для всех месяцев
КонецЕсли;
Для Сч = 0 По ДнейВМесяце - 1 Цикл
НоваяСтрока = ТБ.Добавить();
НоваяСтрока.Дата = ДатаНачала + (Сч * 86400); // 86400 секунд в сутках
НоваяСтрока.КолВо = 10;
КонецЦикла;
Хотя вышеприведенный код работает, он является громоздким и требует ручного пересчета дней (например, для високосных лет). Профессиональный подход в 1С подразумевает использование встроенных функций работы с датами. Давайте сделаем наш код универсальным и лаконичным.
Чтобы определить, сколько дней в месяце, не нужно перечислять их вручную. Достаточно получить дату последнего дня месяца. Это делается путем перехода к первому дню следующего месяца и вычитания одной секунды:
// Определяем количество дней в месяце универсально
ПервоеЧислоМесяца = НачалоМесяца(ВыбраннаяДата);
СледующийМесяц = ДобавитьМесяц(ПервоеЧислоМесяца, 1);
КоличествоДней = День(СледующийМесяц - 1);
Очистить() для табличной части, чтобы избежать дублирования данных при повторном нажатии кнопки.НачалоМесяца(). Она гарантированно вернет первое число, избавляя вас от сложной логики вычислений.Для или Пока. Внутри цикла создавайте новую строку с помощью Добавить().86400), которое может быть неточным при смене часовых поясов или переходе на летнее/зимнее время (хотя в РФ это сейчас неактуально), лучше использовать ДобавитьМесяц() или функцию КонецДня() для перемещения по календарю.При изучении 1С важно стремиться к чистоте кода. Рассмотрим, почему профессионалы избегают жестко прописанных условий:
Во-первых, поддержка кода: при использовании Если...ИначеЕсли риск ошибки возрастает. Во-вторых, читаемость: компактный код легче отлаживать. В-третьих, производительность: при больших объемах данных старайтесь минимизировать количество обращений к табличной части внутри цикла, если это возможно.
Попробуйте реализовать заполнение табличной части через цикл, где в качестве счетчика выступает КоличествоДней. Это позволит вам гибко управлять структурой документа и добавлять любые значения в реквизиты, будь то фиксированное Приход = 10 или вычисляемые показатели.
Помните: работа с датами — это фундамент разработки на платформе. Освоив функции НачалоМесяца, КонецМесяца, День, Месяц и ДобавитьМесяц, вы сможете решать 99% задач, связанных с календарными периодами в 1С.