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

Стандартные механизмы обмена данными не всегда покрывают специфические требования бизнеса, когда нужно получить именно файловую структуру папок или специфический формат дерева. В этой статье мы разберем несколько подходов, от использования встроенных объектов до написания собственного кода на встроенном языке.

Вы узнаете, как правильно организовать рекурсивный обход, избежать циклических ссылок и оптимизировать производительность при выгрузке больших объемов данных. Мы рассмотрим как работу с файловой системой, так и формирование XML-документов.

Подготовка данных и выбор метода обхода

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

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

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

⚠️ Внимание: При работе с большими справочниками (более 100 000 элементов) избегайте создания временных таблиц в оперативной памяти без индексов. Это может привести к существенному замедлению работы системы.

📊 Какой формат выгрузки вы используете чаще всего?
XML
JSON
CSV (плоский список)
Файловая структура папок

Использование объекта ДеревоЗначений

Объект ДеревоЗначений является наиболее удобным инструментом для представления иерархических данных внутри кода 1С. Он позволяет легко добавлять строки, указывая родителя, и автоматически выстраивает структуру. Для начала работы создайте новый объект и добавьте в него необходимые колонки.

Заполнение дерева обычно происходит в цикле. Вы можете использовать метод Добавить(), передавая ссылку на родительскую строку. Это критически важно для сохранения связей. Если элемент является корневым, параметр родителя передается как Неопределено.

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

  • 🌳 Удобная навигация по узлам с помощью методов ПолучитьЭлементы().
  • 🔗 Автоматическое поддержание связей между родительскими и дочерними строками.
  • ⚡ Высокая скорость работы при объеме данных до нескольких десятков тысяч строк.
💡

Используйте свойство "Представление" у строк дерева значений, чтобы сразу видеть полный путь к элементу в отладчике. Это упрощает поиск ошибок в логике формирования иерархии.

Рекурсивный обход справочника для выгрузки в файлы

Если ваша цель — создать реальную структуру папок на диске, где каждый элемент справочника станет каталогом, вам потребуется рекурсивная функция. Этот метод подразумевает, что процедура вызывает саму себя для обработки каждого дочернего элемента.

Алгоритм строится следующим образом: вы создаете директорию для текущего элемента, затем получаете список его непосредственных потомков и запускаете процедуру выгрузки для каждого из них. Важно корректно формировать полные пути к файлам, используя системный разделитель путей.

Для реализации используйте объект Файл и ФайловаяСистема. Перед созданием папки обязательно проверяйте её существование, чтобы избежать ошибок при повторном запуске выгрузки. Код должен быть устойчив к ситуациям, когда имена элементов содержат запрещенные символы для файловой системы.

Процедура ВыгрузитьДеревоВФайлы(ТекущийЭлемент, ПутьКПапке)

// Очистка имени от запрещенных символов

ИмяПапки = СтрЗаменить(ТекущийЭлемент.Наименование, ":", "_");

ПолныйПуть = ПутьКПапке + ИмяПапки;

Если Не ФайлСуществует(ПолныйПуть) Тогда

СоздатьКаталог(ПолныйПуть);

КонецЕсли;

// Получаем детей

ВыборкаДетей = Справочники.Номенклатура.ВыбратьДетей(ТекущийЭлемент);

Пока ВыборкаДетей.Следующий() Цикл

ВыгрузитьДеревоВФайлы(ВыборкаДетей.Ссылка, ПолныйПуть + "\" + Символы.ПС);

КонецЦикла;

КонецПроцедуры

Такой подход гарантирует, что структура на диске будет зеркально отражать структуру в базе данных. Однако стоит помнить о лимитах операционной системы на длину пути и количество файлов в одной директории.

☑️ Проверка перед рекурсивной выгрузкой

Выполнено: 0 / 5

Формирование XML-документа с иерархией

Для обмена данными с внешними системами формат XML остается стандартом де-факто. Платформа 1С предоставляет встроенный объект ЗаписьXML, который позволяет формировать валидные документы с сохранением древовидной структуры.

Процесс записи аналогичен рекурсивному обходу, но вместо создания папок вы открываете и закрываете теги. Каждый элемент справочника становится узлом XML, а его реквизиты — атрибутами или вложенными тегами. Важно соблюдать правильную вложенность тегов, иначе файл не сможет быть прочитан парсерами.

При использовании ЗаписьXML не нужно вручную экранировать специальные символы, система делает это автоматически. Тем не менее, кодировку файла следует выбирать внимательно, особенно если в названиях элементов есть национальные символы.

Параметр записи Описание Рекомендуемое значение
ИспользованиеDTD Определяет, писать ли ссылку на DTD Ложь (для упрощения)
Отступ Символ отступа для читаемости Табуляция или 2 пробела
ПереносСтрок Символ перевода строки Символы.ПС
Кодировка Набор символов файла UTF-8

⚠️ Внимание: Интерфейс объекта ЗаписьXML и методы работы с файлами могут отличаться в разных версиях платформы. Всегда сверяйте синтаксис с документацией для вашей конкретной конфигурации 1С:Предприятие.

Экспорт в JSON для веб-интеграций

Современные веб-сервисы и фронтенд-приложения чаще всего используют формат JSON. В отличие от XML, JSON более компактен и легче читается человеком. В последних версиях платформы появилась нативная поддержка записи в JSON через объект ЗаписьJSON.

Чтобы выгрузить иерархию в JSON, удобнее всего сначала сформировать ДеревоЗначений, а затем записать его. Объект записи JSON способен автоматически преобразовывать структуру дерева в массив объектов, сохраняя вложенность.

При настройке ЗаписьJSON можно указать, нужно ли записывать типы данных и как обрабатывать даты. Для веба обычно достаточно записывать только значения, чтобы уменьшить размер итогового файла. Это особенно актуально при передаче данных по сети с низкой пропускной способностью.

Как обработать циклические ссылки в JSON?

Если в ваших данных возможны циклические ссылки (элемент А ссылается на Б, а Б на А), стандартная запись JSON вызовет ошибку переполнения стека. Используйте параметр "ОбработкаЦиклическихСсылок" в настройках ЗаписьJSON или предварительно разорвите циклы в коде.

Оптимизация производительности при больших объемах

Выгрузка тысяч и миллионов записей может занять значительное время и потребовать много ресурсов сервера. Основная проблема заключается в количестве обращений к базе данных внутри циклов. Каждый вызов метода получения потомков — это потенциальный запрос к СУБД.

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

Также стоит отключить обновление интерфейса и регистрацию изменений, если выгрузка происходит в толстом клиенте или в фоновом задании с правами администратора. Использование пакетной записи файлов или буферизация вывода в XML также дают ощутимый прирост скорости.

  • 🚀 Используйте временные таблицы с индексами для хранения промежуточных данных.
  • 📉 Отключите триггеры и регистрацию изменений на время массовой операции.
  • 💾 Применяйте буферизацию при записи в файлы больших объемов текста.
💡

Главное правило оптимизации: минимизируйте количество обращений к базе данных внутри циклов. Загружайте данные одним запросом и обрабатывайте их в памяти.

Часто задаваемые вопросы (FAQ)

Как выгрузить справочник, если в нем есть элементы без родителей?

Элементы без родителей считаются корневыми. При использовании ДеревоЗначений просто добавляйте их с родителем Неопределено. При рекурсивном обходе начните цикл с выборки элементов, у которых свойство Родитель пусто.

Можно ли выгрузить только определенную ветку справочника?

Да, это стандартная практика. В запросе используйте условие ГДЕ Справочник.Ссылка В (&ПараметрВетки) или метод ВыбратьДетей(НачальныйЭлемент) для получения только потомков конкретного узла.

Что делать, если имена элементов содержат запрещенные символы для файлов?

Необходимо выполнить предварительную обработку строки перед созданием файла. Замените символы / \ : * ? " < > | на безопасные аналоги, например, на подчеркивание или дефис, используя функцию СтрЗаменить.

Как сохранить дополнительные реквизиты элемента в выгрузке?

При заполнении ДеревоЗначений или формировании XML-узлов просто добавьте соответствующие колонки или атрибуты. Извлеките данные из объекта справочника (например, Элемент.Артикул) и запишите их в структуру выгрузки.