База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как разбить период по месяцам в 1С 8.3 для табличной части?
- В этой теме 1 ответ, 2 участника, последнее обновление 4 дня, 3 часа назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
30 апреля 2026 в 11:53 #36897
1с83 обычные формы Документ КоммунальныеУслуги. Реквизиты ДатаНач, ДатаКон. Табличная часть Услуги. Создаю запись ТЧ. Контрагент, ДоговорКА, Услуга эти колонки заполняю. Колонки Д_нач, Д_кон пусты. На форме документа задаю реквизиты ДатаНач, ДатаКон. По нажатию кнопки на форме необходимо : 1. Разбить период с ДатаНач (02.02.26) по ДатаКон (19.04.26) на периоды 02.02.26 — 29.02.26, 01.03.26-31.03.26, 01.04.26-19.04.26.
-
30 апреля 2026 в 11:53 #36898
Чтобы разбить период с ДатаНач по ДатаКон на месячные интервалы с учетом частичных месяцев (как в вашем примере), нужно написать код, который будет формировать записи табличной части с нужными датами начала и конца для каждого периода.
Пример кода для кнопки на форме документа 1С 8.3 (обычные формы):
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354&НаКлиентеПроцедура РазбитьПериод(Команда)// Получаем даты из реквизитов формыДатаНач = ЭтаФорма.Элементы.ДатаНач.Значение;ДатаКон = ЭтаФорма.Элементы.ДатаКон.Значение;Если ДатаНач = Неопределено Или ДатаКон = Неопределено ТогдаСообщить("Укажите даты начала и конца периода");Возврат;КонецЕсли;Если ДатаНач > ДатаКон ТогдаСообщить("Дата начала не может быть больше даты конца");Возврат;КонецЕсли;// Очистим табличную часть Услуги, если нужноОбъект = ЭтаФорма.Объект;Объект.Услуги.Очистить();// Переменная для текущей даты начала периодаТекДатаНач = ДатаНач;Пока ТекДатаНач <= ДатаКон Цикл// Определяем последний день месяца для ТекДатаНачПоследнийДеньМесяца = КонецМесяца(ТекДатаНач);// Дата конца периода - либо конец месяца, либо ДатаКон, если он раньшеЕсли ПоследнийДеньМесяца > ДатаКон ТогдаТекДатаКон = ДатаКон;ИначеТекДатаКон = ПоследнийДеньМесяца;КонецЕсли;// Добавляем новую строку в табличную частьНоваяСтрока = Объект.Услуги.Добавить();// Заполняем даты начала и конца периодаНоваяСтрока.Д_нач = ТекДатаНач;НоваяСтрока.Д_кон = ТекДатаКон;// Здесь можно заполнить Контрагент, ДоговорКА, Услуга из текущей строки или по логике// Например, если нужно скопировать из первой строки, то:// НоваяСтрока.Контрагент = ...;// НоваяСтрока.ДоговорКА = ...;// НоваяСтрока.Услуга = ...;// Переходим к следующему периоду - следующий день после ТекДатаКонТекДатаНач = СледующийДень(ТекДатаКон);КонецЦикла;// Обновляем форму, чтобы отобразить измененияЭтаФорма.Обновить();КонецПроцедурыОбъяснение:
— КонецМесяца(Дата) — встроенная функция 1С, возвращает последний день месяца для указанной даты.
— СледующийДень(Дата) — возвращает дату +1 день.
— Цикл идет от ДатаНач до ДатаКон, разбивая период на месячные интервалы.
— В каждой итерации создается новая строка табличной части с заполненными Д_нач и Д_кон.
— Контрагент, ДоговорКА, Услуга нужно заполнить по вашей логике (например, из существующих данных или из реквизитов формы).Если у вас в табличной части уже есть строки с Контрагентом, Договором и Услугой, и нужно для каждой из них разбить период, то нужно вложить этот цикл в перебор строк табличной части, а не очищать её.
Если нужно разбить период для каждой строки ТЧ, то пример:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455&НаКлиентеПроцедура РазбитьПериодПоСтрокам(Команда)Объект = ЭтаФорма.Объект;ДатаНач = ЭтаФорма.Элементы.ДатаНач.Значение;ДатаКон = ЭтаФорма.Элементы.ДатаКон.Значение;Если ДатаНач = Неопределено Или ДатаКон = Неопределено ТогдаСообщить("Укажите даты начала и конца периода");Возврат;КонецЕсли;Если ДатаНач > ДатаКон ТогдаСообщить("Дата начала не может быть больше даты конца");Возврат;КонецЕсли;// Создаем временный массив для новых строкНовыйМассив = Новый Массив;Для Каждого СтрокаТЧ Из Объект.Услуги ЦиклТекДатаНач = ДатаНач;Пока ТекДатаНач <= ДатаКон ЦиклПоследнийДеньМесяца = КонецМесяца(ТекДатаНач);Если ПоследнийДеньМесяца > ДатаКон ТогдаТекДатаКон = ДатаКон;ИначеТекДатаКон = ПоследнийДеньМесяца;КонецЕсли;НоваяСтрока = Новый Структура;НоваяСтрока.Вставить("Контрагент", СтрокаТЧ.Контрагент);НоваяСтрока.Вставить("ДоговорКА", СтрокаТЧ.ДоговорКА);НоваяСтрока.Вставить("Услуга", СтрокаТЧ.Услуга);НоваяСтрока.Вставить("Д_нач", ТекДатаНач);НоваяСтрока.Вставить("Д_кон", ТекДатаКон);НовыйМассив.Добавить(НоваяСтрока);ТекДатаНач = СледующийДень(ТекДатаКон);КонецЦикла;КонецЦикла;// Очистим табличную часть и заполним зановоОбъект.Услуги.Очистить();Для Каждого НоваяСтрока Из НовыйМассив ЦиклНоваяСтрокаТЧ = Объект.Услуги.Добавить();НоваяСтрокаТЧ.Контрагент = НоваяСтрока.Контрагент;НоваяСтрокаТЧ.ДоговорКА = НоваяСтрока.ДоговорКА;НоваяСтрокаТЧ.Услуга = НоваяСтрока.Услуга;НоваяСтрокаТЧ.Д_нач = НоваяСтрока.Д_нач;НоваяСтрокаТЧ.Д_кон = НоваяСтрока.Д_кон;КонецЦикла;ЭтаФорма.Обновить();КонецПроцедурыТак вы для каждой исходной строки создадите несколько новых с разбивкой по месяцам.
Рекомендую посмотреть здесь, как работать с датами и табличными частями в 1С:
https://infostart.ru/public/1042547/
https://helpf.pro/faq82/view/1423.html
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.