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

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

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

Базовый алгоритм заполнения

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

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


// Предположим, что у нас есть реквизит Месяц (тип Перечисление)
// и табличная часть ТБ с колонками Дата и КолВо
ТБ.Очистить();
ДатаНачала = НачалоГода(ТекущаяДата());
Если Месяц = Перечисления.МесяцаГода.Январь Тогда
    ДнейВМесяце = 31;
ИначеЕсли Месяц = Перечисления.МесяцаГода.Февраль Тогда
    ДнейВМесяце = 28;
    ДатаНачала = ДобавитьМесяц(ДатаНачала, 1);
// ... и так далее для всех месяцев
КонецЕсли;

Для Сч = 0 По ДнейВМесяце - 1 Цикл
    НоваяСтрока = ТБ.Добавить();
    НоваяСтрока.Дата = ДатаНачала + (Сч * 86400); // 86400 секунд в сутках
    НоваяСтрока.КолВо = 10;
КонецЦикла;

Оптимизация кода: отходим от «ИначеЕсли»

Хотя вышеприведенный код работает, он является громоздким и требует ручного пересчета дней (например, для високосных лет). Профессиональный подход в 1С подразумевает использование встроенных функций работы с датами. Давайте сделаем наш код универсальным и лаконичным.

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


// Определяем количество дней в месяце универсально
ПервоеЧислоМесяца = НачалоМесяца(ВыбраннаяДата);
СледующийМесяц = ДобавитьМесяц(ПервоеЧислоМесяца, 1);
КоличествоДней = День(СледующийМесяц - 1);

Пошаговый алгоритм реализации задачи

  1. Очистка данных: Всегда начинайте с метода Очистить() для табличной части, чтобы избежать дублирования данных при повторном нажатии кнопки.
  2. Определение периода: Используйте функцию НачалоМесяца(). Она гарантированно вернет первое число, избавляя вас от сложной логики вычислений.
  3. Цикл заполнения: Используйте цикл Для или Пока. Внутри цикла создавайте новую строку с помощью Добавить().
  4. Расчет даты: Вместо прибавления секунд (86400), которое может быть неточным при смене часовых поясов или переходе на летнее/зимнее время (хотя в РФ это сейчас неактуально), лучше использовать ДобавитьМесяц() или функцию КонецДня() для перемещения по календарю.

Важные рекомендации для обучения

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

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

Попробуйте реализовать заполнение табличной части через цикл, где в качестве счетчика выступает КоличествоДней. Это позволит вам гибко управлять структурой документа и добавлять любые значения в реквизиты, будь то фиксированное Приход = 10 или вычисляемые показатели.

Помните: работа с датами — это фундамент разработки на платформе. Освоив функции НачалоМесяца, КонецМесяца, День, Месяц и ДобавитьМесяц, вы сможете решать 99% задач, связанных с календарными периодами в 1С.

← На главную