Иерархические данные из 1С в файл: отчёт-дерево, консоль и код
Содержание
Дерево значений из отчёта сохраняют так же, как обычный табличный документ: сформируйте отчёт, нажмите кнопку с дискетой на панели результата (или откройте главное меню и выберите Файл → Сохранить как) и укажите тип «Лист Microsoft Excel 2007-…» (*.xlsx). Группировки дерева уйдут в Excel как уровни структуры со знаками «+» и «−». Если данные лежат не в отчёте, а в переменной типа ДеревоЗначений в коде, их сначала выводят в ТабличныйДокумент и записывают методом Записать(), а само дерево целиком сохраняют через ЗначениеВФайл() или сериализатор XDTO.
Частое заблуждение — «Excel теряет иерархию, поэтому дерево надо копировать вручную». Иерархию теряет не Excel, а свёрнутые перед выгрузкой группы и неудачные настройки структуры отчёта. Оба момента настраиваются за минуту.
Что именно вы сохраняете: отчёт, форму или объект
Слово «дерево» в 1С встречается в трёх разных местах, и способ сохранения у каждого свой.
| Где вы видите дерево | Что это технически | Как сохранить |
|---|---|---|
| Отчёт с группировками («Оборотно-сальдовая ведомость», остатки по группам номенклатуры) | Табличный документ с группами строк | Кнопка сохранения на панели отчёта, формат xlsx |
| Таблица в форме обработки или справочника с иерархией | Реквизит формы типа «Дерево значений» или динамический список | Вывести список в табличный документ, затем сохранить |
| Переменная в модуле | Объект ДеревоЗначений | Код: табличный документ, файл, XML, хранилище значения |
Первые два случая решаются мышкой. Третий — задача разработчика, ему посвящён отдельный раздел ниже.
Сохранение дерева значений из отчёта: кнопки и форматы
Порядок одинаковый для БП 3.0, ЗУП 3.1, УТ 11 и других конфигураций на платформе 8.3 с интерфейсом «Такси».
- Откройте отчёт и нажмите
Сформировать. - Щёлкните по любой ячейке результата, чтобы фокус был в табличном документе.
- Нажмите кнопку с изображением дискеты на панели отчёта. Если её не видно, раскройте меню
Ещёили откройте главное меню (кнопка с тремя полосками в заголовке окна) →Файл → Сохранить как. - В поле типа файла выберите нужный формат, задайте имя и папку.
- Нажмите
Сохранитьи откройте файл, чтобы проверить уровни.
Какой формат выбрать:
| Формат | Когда подходит | Что учесть |
|---|---|---|
xlsx (Excel 2007 и новее) | Дальнейшая работа с цифрами, фильтры, сводные таблицы | Группировки сохраняются как структура Excel |
xls (Excel 97) | Только для очень старых программ | Лимит 65 536 строк на лист |
mxl | Передать коллеге с 1С без потери оформления | Открывается в 1С или бесплатной программе «1С:Предприятие — Работа с файлами» |
pdf | Отправить на согласование, приложить к письму | Цифры не редактируются, видны только раскрытые уровни |
ods | LibreOffice, «Р7-Офис» и другие отечественные пакеты | Уровни группировок обычно читаются корректно |
docx, html, txt | Вставка в текстовый документ или на сайт | Иерархия превращается в плоский текст |
Нужно выгрузить только часть дерева? Выделите мышью диапазон строк и нажмите Ctrl+C, затем вставьте в Excel через Ctrl+V. Скопируются значения и оформление, но без уровней группировки.
В веб-клиенте последний шаг выглядит иначе: 1С формирует файл, а браузер скачивает его в папку загрузок или спрашивает, куда положить.
Как подготовить дерево отчёта к выгрузке
Excel получает ровно то, что вы видите на экране. Поэтому до сохранения стоит потратить пару минут на вид отчёта.
Раскройте все уровни группировок
Слева над строками табличного документа есть кнопки с цифрами уровней: 1, 2, 3 и так далее. Нажмите самую большую цифру — раскроются все группы. Кнопка 1 свернёт дерево до верхних итогов.
Свёрнутые группы в xlsx не пропадают: строки попадают в файл, просто скрытыми внутри структуры. В PDF и при печати свёрнутых строк не будет вовсе.
Настройте структуру отчёта
В отчётах на системе компоновки данных откройте Настройки… (в ряде отчётов сначала нужно переключить вид на расширенный) и найдите вкладку со структурой отчёта. Для группировки по справочнику с папками у поля есть тип группировки:
- 🌳 Иерархия — выводятся и папки, и элементы с промежуточными итогами;
- 📁 Только иерархия — только папки, без элементов;
- 📄 Без групп (обычная группировка) — плоский список элементов без папок.
Для сводных таблиц в Excel удобнее плоский вид. Для отчёта руководителю — полная иерархия.
Уберите лишнее оформление
Объединённые ячейки в шапке и многострочные заголовки мешают сортировке в Excel. Если отчёт пойдёт в обработку, а не на печать, отключите в настройках вывод заголовка и отбора. Пустые колонки тоже лучше убрать в настройках: в Excel они превратятся в пустые столбцы.
Консоль запросов и консоль отчётов: дерево по своим правилам
Когда типовой отчёт не даёт нужного среза, выручают консоли. Это внешние обработки для 1С 8.3, которые разработчики берут с диска ИТС или используют встроенные в конфигурацию инструменты администратора.
Консоль запросов. Запрос с конструкцией ИТОГИ ... ПО ... возвращает результат с группировками. В консоли переключите вывод результата на дерево — увидите те же уровни, что и в отчёте. Чтобы сохранить результат, выведите его в табличный документ командой консоли и сохраните уже его по шагам из предыдущего раздела.
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ИТОГИ
СУММА(Количество)
ПО
Номенклатура ИЕРАРХИЯ
Ключевое слово ИЕРАРХИЯ добавляет в итоги папки справочника. Без него получится группировка только по самим элементам. Имя регистра в примере условное — подставьте регистр своей конфигурации.
Консоль системы компоновки данных. Здесь структура строится так же, как в настройках отчёта: группировки, тип «Иерархия», ресурсы. Результат выводится в табличный документ и сохраняется в xlsx. Плюс консоли — схему и настройки можно сохранить в файл и повторно использовать в другой базе.
Консоли работают с данными напрямую и требуют прав администратора. Запросы на чтение безопасны. Обработки, которые изменяют данные, запускайте только в копии базы.
Как сохранить вид дерева, чтобы не собирать его заново
Если отчёт с иерархией вы строите каждый месяц, настраивать структуру каждый раз незачем.
- Настройте группировки, отборы и колонки.
- Откройте меню
Ещёи выберите командуСохранить вариант отчета…. - Задайте понятное имя, например «Остатки по группам — иерархия».
- Отметьте, кому вариант доступен: только вам или всем пользователям.
- В следующий раз выберите вариант в списке вариантов отчёта и нажмите
Сформировать.
Варианты хранятся в базе, а не на вашем компьютере. Поэтому они доступны с любого рабочего места и переживают переустановку платформы.
💡 Пользовательские настройки (последний выбранный период, отбор) 1С запоминает и без сохранения варианта. Но при очистке настроек пользователя они пропадут, а сохранённый вариант останется.
Программное сохранение дерева значений для разработчиков
В коде задача распадается на две разные. Первая — получить из дерева файл Excel для человека. Вторая — сохранить сам объект, чтобы потом восстановить его в 1С без потерь.
Откуда берётся дерево в коде
- 🔹
РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)возвращаетДеревоЗначенийс уровнями изИТОГИ ПО. - 🔹 В управляемой форме реквизит типа «Дерево значений» на сервере превращают в объект так:
Дерево = РеквизитФормыВЗначение("ДеревоДанных"), а обратно —ЗначениеВРеквизитФормы(Дерево, "ДеревоДанных").
Дерево значений в Excel через табличный документ
Самый надёжный путь — вывести дерево в ТабличныйДокумент с автогруппировкой строк. Уровень вложенности строки даёт метод Уровень(), и Excel получит ту же структуру, что и в 1С.
&НаСервереБезКонтекста
Функция ДеревоВТабличныйДокумент(Дерево)
ТабДок = Новый ТабличныйДокумент;
КоличествоКолонок = Дерево.Колонки.Количество();
// Шапка
Шаблон = Новый ТабличныйДокумент;
НомерКолонки = 1;
Для Каждого Колонка Из Дерево.Колонки Цикл
Шаблон.Область(1, НомерКолонки, 1, НомерКолонки).Текст =
?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
ТабДок.Вывести(Шаблон.ПолучитьОбласть(1, 1, 1, КоличествоКолонок));
ТабДок.НачатьАвтогруппировкуСтрок();
ВывестиСтрокиДерева(ТабДок, Дерево.Строки, Дерево.Колонки, КоличествоКолонок);
ТабДок.ЗакончитьАвтогруппировкуСтрок();
Возврат ТабДок;
КонецФункции
&НаСервереБезКонтекста
Процедура ВывестиСтрокиДерева(ТабДок, СтрокиДерева, Колонки, КоличествоКолонок)
Для Каждого СтрокаДерева Из СтрокиДерева Цикл
Шаблон = Новый ТабличныйДокумент;
НомерКолонки = 1;
Для Каждого Колонка Из Колонки Цикл
Ячейка = Шаблон.Область(1, НомерКолонки, 1, НомерКолонки);
Значение = СтрокаДерева[Колонка.Имя];
Если ТипЗнч(Значение) = Тип("Число") Тогда
Ячейка.СодержитЗначение = Истина;
Ячейка.ТипЗначения = Новый ОписаниеТипов("Число");
Ячейка.Значение = Значение;
Иначе
Ячейка.Текст = Строка(Значение);
КонецЕсли;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Уровень() у строк первого уровня равен 0
ТабДок.Вывести(Шаблон.ПолучитьОбласть(1, 1, 1, КоличествоКолонок),
СтрокаДерева.Уровень());
ВывестиСтрокиДерева(ТабДок, СтрокаДерева.Строки, Колонки, КоличествоКолонок);
КонецЦикла;
КонецПроцедуры
Числа здесь записываются как значения ячеек, а не как текст. Поэтому в Excel по ним сразу работают суммы и сортировка.
Дальше два варианта:
- Показать пользователю. Верните
ТабДокна клиент и вызовитеТабДок.Показать("Дерево"). Пользователь сохранит его кнопкой, как обычный отчёт. - Записать файл без участия пользователя. На сервере:
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Файл появится на диске сервера 1С. Чтобы отдать его пользователю, прочитайте файл вДвоичныеДанные, поместите их во временное хранилище и получите на клиенте асинхронными методами работы с файлами.
Через COM-объект Excel.Application тоже можно заполнить книгу построчно. Но это работает только на Windows с установленным Excel и заметно медленнее: дерево на 20 000 строк табличный документ записывает за секунды, а построчное заполнение через COM может занять минуты.
Сохранить сам объект и восстановить позже
Когда дерево нужно не человеку, а программе, сохраняйте его целиком — с колонками, типами и вложенностью.
| Способ | Код сохранения | Код восстановления | Когда использовать |
|---|---|---|---|
| Файл во внутреннем формате | ЗначениеВФайл(ИмяФайла, Дерево) | ЗначениеИзФайла(ИмяФайла) | Быстро сохранить между сеансами на одном сервере |
| Строка во внутреннем формате | ЗначениеВСтрокуВнутр(Дерево) | ЗначениеИзСтрокиВнутр(Строка) | Передать через реквизит строкового типа |
| XML через XDTO | СериализаторXDTO.ЗаписатьXML(...) | СериализаторXDTO.ПрочитатьXML(...) | Обмен с другой базой, читаемый формат |
| Хранилище значения | Новый ХранилищеЗначения(Дерево, Новый СжатиеДанных(9)) | Хранилище.Получить() | Хранить в реквизите справочника или регистра |
Пример записи и чтения через XML:
// Запись
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Дерево);
ЗаписьXML.Закрыть();
// Чтение
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Дерево = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Ссылки на объекты базы сериализуются как идентификаторы. Если загрузить такое дерево в другую базу, где этих объектов нет, вместо наименований вы увидите «Объект не найден». Для обмена между разными базами храните в колонках строки или коды, а не ссылки.
Сохранение во внутреннем формате и XDTO доступно на сервере и в толстом клиенте. В тонком и веб-клиенте объект ДеревоЗначений не существует, поэтому весь код выше выполняйте в серверных процедурах.
Почему выгрузка дерева значений в Excel не получилась
Ещё одна неочевидная ситуация — дерево на сотни тысяч строк. Формирование и запись такого табличного документа занимает много памяти рабочего процесса. Если отчёт падает или долго висит, разбейте его отбором по периоду или по группам и сохраните несколько файлов.