База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как вывести таблицу значений с группами в Excel с иерархией и сворачиванием?
- В этой теме 1 ответ, 2 участника, последнее обновление 4 дня, 4 часа назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
30 апреля 2026 в 12:45 #36905
Обычные формы, есть Таблица значений, колонки: номенклатура, цена, группа, категория, подкатегория.
Напиши вывод в Excel чтобы в файле были листы по группам, а на листе группировка категория-подгруппа- номенклатура с возможнотью сворачивания по группировкам -
30 апреля 2026 в 12:45 #36906
Да, такой вывод в Excel с листами по группам и иерархической группировкой (категория — подкатегория — номенклатура) с возможностью сворачивания реализуем. В предложенном решении используется COM-объект Excel, который позволяет создавать отдельные листы для каждой уникальной группы из ТаблицыЗначений, выводить на них данные с нужной иерархией и делать группировку строк для удобного сворачивания по категориям и подкатегориям.
Ключевые моменты решения:
— Для каждой уникальной группы создаётся отдельный лист с именем группы (обрезанным до 31 символа).
— Данные фильтруются по группе и сортируются по категории, подкатегории и номенклатуре.
— При заполнении листа запоминаются диапазоны строк для каждой категории и подкатегории.
— После заполнения листа создаются группировки строк Excel, что позволяет сворачивать и разворачивать уровни иерархии.
— Автоматически подгоняется ширина колонок для удобства просмотра.Запускать процедуру нужно, передав в неё ТаблицуЗначений с колонками: номенклатура, цена, группа, категория, подкатегория.
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150Процедура ВывестиВЭксельПоГруппам(ТаблицаЗначений)Если ТаблицаЗначений.Пустая() ТогдаСообщить("Таблица значений пуста");Возврат;КонецЕсли;Если ТипПлатформы() <> ТипПлатформы.Windows ИлиНе ЗначениеЗаполнено(ОбработкаАктивна()) ТогдаСообщить("Запуск из интерфейса Unix не поддерживается.");Возврат;КонецЕсли;ИмяПараметровДиапазона = "Начало, Конец";НомерВторогоЛистаДляУдаления = 2;МаксимальнаяДлинаИмениЛиста = 31;КолонкаКатегория = 1;КолонкаПодкатегория = 2;КолонкаНоменклатура = 3;КолонкаЦена = 4;НачальнаяСтрокаДляДанных = 2;УникальныеГруппы = Новый Массив;Для Каждого Строка Из ТаблицаЗначений ЦиклЕсли УникальныеГруппы.Найти(Строка.Группа) = Неопределено ТогдаУникальныеГруппы.Добавить(Строка.Группа);КонецЕсли;КонецЦикла;Excel = Новый COMОбъект("Excel.Application");Excel.Visible = Истина;Excel.DisplayAlerts = Ложь;Книга = Excel.Workbooks.Add();Пока Книга.Worksheets.Count > 1 ЦиклКнига.Worksheets.Item(НомерВторогоЛистаДляУдаления).Delete();КонецЦикла;ИндексЛиста = 1;Для Каждого Группа Из УникальныеГруппы ЦиклЕсли ИндексЛиста = 1 ТогдаЛист = Книга.Worksheets.Item(1);ИначеЛист = Книга.Worksheets.Add(, Книга.Worksheets.Item(Книга.Worksheets.Count));КонецЕсли;Лист.Name = Лев(Группа, МаксимальнаяДлинаИмениЛиста);Лист.Cells(1, КолонкаКатегория).Value = "Категория";Лист.Cells(1, КолонкаПодкатегория).Value = "Подкатегория";Лист.Cells(1, КолонкаНоменклатура).Value = "Номенклатура";Лист.Cells(1, КолонкаЦена).Value = "Цена";ОтборПоГруппе = ТаблицаЗначений.Выбрать(Новый Структура("Группа", Группа));ОтборПоГруппе.Сортировать("Категория, Подкатегория, Номенклатура");ТекущаяСтрока = НачальнаяСтрокаДляДанных;ТекущаяКатегория = "";ТекущаяПодкатегория = "";КатегорииГруппы = Новый Соответствие;ПодкатегорииГруппы = Новый Соответствие;Для Каждого Строка Из ОтборПоГруппе ЦиклЕсли ТекущаяКатегория <> Строка.Категория ТогдаКлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);ЗавершитьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока,ИмяПараметровДиапазона);ТекущаяКатегория = Строка.Категория;НачатьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока,ИмяПараметровДиапазона);ТекущаяПодкатегория = "";КонецЕсли;Если ТекущаяПодкатегория <> Строка.Подкатегория ТогдаКлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);ТекущаяПодкатегория = Строка.Подкатегория;КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);НачатьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);КонецЕсли;Лист.Cells(ТекущаяСтрока, КолонкаКатегория).Value = Строка.Категория;Лист.Cells(ТекущаяСтрока, КолонкаПодкатегория).Value = Строка.Подкатегория;Лист.Cells(ТекущаяСтрока, КолонкаНоменклатура).Value = Строка.Номенклатура;Лист.Cells(ТекущаяСтрока, КолонкаЦена).Value = Строка.Цена;ТекущаяСтрока = ТекущаяСтрока + 1;КонецЦикла;КлючПодкатегории = ПолучитьКлючПодкатегории(ТекущаяКатегория, ТекущаяПодкатегория);ЗавершитьДиапазон(ПодкатегорииГруппы, КлючПодкатегории, ТекущаяСтрока,ИмяПараметровДиапазона);ЗавершитьДиапазон(КатегорииГруппы, ТекущаяКатегория, ТекущаяСтрока,ИмяПараметровДиапазона);ПрименитьГруппировку(Лист, ПодкатегорииГруппы);ПрименитьГруппировку(Лист, КатегорииГруппы);Лист.Columns("A:D").AutoFit();ИндексЛиста = ИндексЛиста + 1;КонецЦикла;Сообщить("Выгрузка в Excel завершена");КонецПроцедурыПроцедура НачатьДиапазон(КоллекцияГрупп, Ключ, Строка, ИмяПараметровДиапазона)Если Не ЗначениеЗаполнено(Ключ) ТогдаВозврат;КонецЕсли;КоллекцияГрупп.Вставить(Ключ, Новый Структура(ИмяПараметровДиапазона, Строка, 0));КонецПроцедурыПроцедура ЗавершитьДиапазон(КоллекцияГрупп, Ключ, ТекущаяСтрока, ИмяПараметровДиапазона)Если Не ЗначениеЗаполнено(Ключ) ТогдаВозврат;КонецЕсли;Если КоллекцияГрупп.Найти(Ключ) = Неопределено ТогдаВозврат;КонецЕсли;Начало = КоллекцияГрупп[Ключ].Начало;КоллекцияГрупп.Вставить(Ключ, Новый Структура(ИмяПараметровДиапазона, Начало,ТекущаяСтрока - 1));КонецПроцедурыФункция ПолучитьКлючПодкатегории(Категория, Подкатегория)Если Не ЗначениеЗаполнено(Категория) Или Не ЗначениеЗаполнено(Подкатегория) ТогдаВозврат "";КонецЕсли;Возврат Категория + "|" + Подкатегория;КонецФункцииПроцедура ПрименитьГруппировку(Лист, КоллекцияГрупп)Для Каждого Ключ Из КоллекцияГрупп.Ключи() ЦиклПараметры = КоллекцияГрупп[Ключ];Если Параметры.Конец > Параметры.Начало ТогдаДиапазонСтрок = (Параметры.Начало + 1) + ":" + Параметры.Конец;Лист.Rows(ДиапазонСтрок).Group();КонецЕсли;КонецЦикла;КонецПроцедуры
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.