Иерархическая структура справочников в 1С:Предприятие — полезный инструмент для организации данных, но иногда она становится помехой. Например, при миграции данных из старой системы, где иерархия не использовалась, или когда бизнес-процессы требуют плоской структуры без подчинения элементов. Удаление иерархии может понадобиться и для оптимизации производительности при работе с большими объемами данных, где рекурсивные запросы к иерархическим справочникам замедляют систему.

В этой статье мы разберём три основных способа убрать иерархию в 1С: через конфигуратор, программно на встроенном языке и с помощью внешних обработок. Особое внимание уделим скрытым последствиям, которые возникают после удаления иерархии — от нарушения ссылочной целостности до проблем с отчётами, построенными на основе иерархических данных. Также приведём актуальные примеры кода для последних версий платформы 1С:Предприятие 8.3 (включая 8.3.23 и новее).

1. Когда действительно нужно убирать иерархию в 1С

Прежде чем приступать к изменениям, важно понять, действительно ли иерархия мешает работе или её можно адаптировать под текущие задачи. Вот типичные случаи, когда удаление оправдано:

  • 📊 Миграция данных из систем, где справочники не имели иерархии (например, из Excel или устаревших версий 1С). В таких случаях принудительная иерархия создаёт "мусорные" уровни с единственным элементом.
  • Производительность: при выборках по иерархическим справочникам с миллионами записей (например, номенклатура в крупных торговых сетях) время выполнения запросов может увеличиваться в 5–10 раз.
  • 🔄 Изменение бизнес-логики, когда подчинение элементов больше не актуально (например, переход от территориальной структуры к функциональной).
  • 🛠️ Ошибки в наследственных связях, когда иерархия была настроена неправильно и приводит к дублированию данных или циклическим ссылкам.

Однако есть и ложные причины, которые часто путают с необходимостью удалять иерархию. Например, если пользователи жалуются на неудобство навигации по дереву справочника, проблему можно решить настройкой отображения (скрытие уровней, фильтры) или обучением работе с иерархией. Другой распространённый миф — что иерархия "замедляет" систему сама по себе. На практике тормоза возникают только при неправильно составленных запросах или отсутствии индексов.

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

2. Способ 1: Удаление иерархии через конфигуратор (без программирования)

Самый простой метод — изменить свойства справочника непосредственно в конфигураторе. Этот способ подходит для неиспользуемых справочников или когда вы готовы к потере данных о подчинении. Вот пошаговая инструкция:

  1. Откройте конфигуратор в режиме 1С:Предприятие (с правами администратора).
  2. Перейдите в ветку Объекты → Справочники и выберите нужный справочник.
  3. В палитре свойств найдите параметр Иерархический и снимите галочку.
  4. Сохраните конфигурацию (Ctrl + S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

После этого все элементы справочника станут элементами верхнего уровня, а данные о подчинении будут безвозвратно утеряны. Если справочник используется в документах или отчётах, может потребоваться доработка этих объектов.

Сделать резервную копию базы данных

Проверить, не используется ли справочник в отчётах с группировкой по иерархии

Убедиться, что нет ссылок на подчинённые элементы в бизнес-логике

Предупредить пользователей о временной блокировке справочника-->

⚠️ Внимание: Если справочник имеет подчинённые объекты (например, документы или регистры сведений), после удаления иерархии может нарушиться ссылочная целостность. Перед изменением проверьте зависимости через Конфигурация → Анализ зависимостей.

3. Способ 2: Программное удаление иерархии (с сохранением данных)

Когда нужно сохранить элементы справочника, но убрать их подчинение, используют программный метод. Этот подход требует знания встроенного языка 1С и аккуратности при работе с данными. Ниже приведён универсальный код, который переносит все элементы на верхний уровень, сохраняя их свойства:

Процедура УбратьИерархиюИзСправочника(ИмяСправочника)

Справочник = Метаданные.Справочники[ИмяСправочника];

Если НЕ Справочник.Иерархический Тогда

Возврат;

КонецЕсли;

НачатьТранзакцию();

Попытка

Выборка = Справочник.ВыбратьИерархически();

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

Если Выборка.ЭтоГруппа Тогда

Элемент = Выборка.Ссылка.ПолучитьОбъект();

Элемент.Родитель = Справочник.ПустаяСсылка();

Элемент.Записать();

КонецЕсли;

КонецЦикла;

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение;

КонецПопытки;

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

Этот код:

  • 🔍 Проходит по всем элементам справочника иерархически (включая группы).
  • 🔄 Для каждого элемента сбрасывает ссылку на родителя (Родитель = Справочник.ПустаяСсылка()).
  • 💾 Сохраняет изменения в транзакции, чтобы избежать частичного обновления при ошибках.

Для вызова процедуры используйте:

УбратьИерархиюИзСправочника("Номенклатура"); // Замените на имя вашего справочника
⚠️ Внимание: Если в справочнике используются предопределённые элементы (например, "Прочее" или "Разное"), их родительские связи также будут сброшены. Это может повлиять на логику работы типовой конфигурации. Перед выполнением проверьте, не являются ли эти элементы системными.
💡

Перед массовым изменением данных экспортируйте справочник в XML или Excel через Все функции → Выгрузить данные. Это позволит откатиться, если что-то пойдёт не так.

4. Способ 3: Использование внешних обработок для сложных случаев

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

  • 📈 Обрабатывают данные пакетами (например, по 1000 записей за раз), избегая блокировок.
  • 🔧 Предлагают гибкие настройки (например, сохранение истории изменений).
  • 📊 Визуализируют процесс с прогресс-баром и логами ошибок.

Одна из популярных обработок — "Универсальный редактор иерархии для 1С" (доступна на Инфостарт и других площадках). Она позволяет:

Функция Описание Пример использования
Перенос на верхний уровень Сбрасывает родительские ссылки для выбранных элементов Убрать иерархию у всех групп в справочнике "Контрагенты"
Замена родителя Массово меняет родительский элемент Перенести все подгруппы из "Услуги" в "Товары"
Экспорт/импорт структуры Сохраняет текущую иерархию в файл и восстанавливает её Резервное копирование перед изменениями
Поиск циклических ссылок Находит элементы, которые ссылаются сами на себя Диагностика ошибок при обновлении конфигурации

Преимущество внешних обработок — безопасность: они обычно содержат механизмы отката и ведение журнала операций. Однако перед использованием проверьте совместимость обработки с вашей версией платформы (особенно если у вас 1С:Предприятие 8.3.20+, где изменился механизм работы с метаданными).

Что делать если обработка не работает с новой версией 1С?

Если внешняя обработка выдаёт ошибку типа "Не найден метод объекта" или "Неверный формат данных", скорее всего, она написана для старой версии платформы. В этом случае:

1. Проверьте, есть ли на Инфостарт или у разработчика обновлённая версия.

2. Откройте код обработки в конфигураторе и найдите места, где используются устаревшие методы (например, ПолучитьФорму() вместо ПолучитьФормуДокумента()).

3. Если не уверены в своих силах, обратитесь к специалисту — переделка обработки под новую версию обычно занимает 1–2 часа.

5. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при удалении иерархии. Вот наиболее распространённые ошибки и способы их предотвращения:

  • 🔗 Нарушение ссылочной целостности: Если на элементы справочника ссылаются документы или регистры, их может "порвать" после изменения структуры. Всегда проверяйте зависимости через Конфигурация → Анализ зависимостей.
  • 📉 Потеря данных о группировке: При программном удалении иерархии теряется информация о том, какие элементы относились к какой группе. Если она может понадобиться позже, экспортируйте структуру заранее.
  • 🔄 Циклические ссылки: Если в справочнике есть элементы, ссылающиеся сами на себя (например, группа A является родителем для группы B, а группа B — для группы A), стандартные методы удаления иерархии завершатся ошибкой. Используйте обработки с проверкой циклов.
  • 📊 Проблемы с отчётами: Многие отчёты (например, "Анализ субконто" или "Обороты между субконто") используют иерархию для группировки. После её удаления придётся переделывать макеты отчётов.

Одна из самых коварных ошибок — невидимые зависимости. Например, если справочник используется в бизнес-процессах или задачах, изменение его структуры может привести к остановке этих процессов. Чтобы избежать сюрпризов:

  1. Запустите тестовое изменение на копии базы.
  2. Проверьте журнал регистрации (Администрирование → Журнал регистрации) на ошибки после обновления.
  3. Используйте отчёт "Полнотекстовый поиск", чтобы найти все упоминания справочника в конфигурации.
💡

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

6. Альтернативные подходы: когда удалять иерархию не нужно

В некоторых случаях целесообразнее не удалять иерархию, а адаптировать её под текущие задачи. Рассмотрим альтернативные решения:

  • 📌 Скрытие уровней в интерфейсе: Настройте права доступа или формы так, чтобы пользователи не видели ненужные уровни иерархии. Например, в форме справочника можно отключить отображение колонки "Родитель".
  • 🔍 Фильтрация по уровню: В запросах и отчётах используйте конструкцию ГДЕ Уровень = 1, чтобы работать только с элементами верхнего уровня, игнорируя подчинённые.
  • 🔄 Дублирование справочника: Создайте новый неиерархический справочник и перенесите в него данные через обработку. Старый справочник оставьте для совместимости.
  • 📊 Витрины данных: Если иерархия нужна только для отчётов, создайте витрину (например, в 1С:Аналитике), где данные будут представлены в удобном виде без изменения исходной структуры.

Один из самых эффективных приёмов — использование отбора по реквизиту. Например, если в справочнике "Номенклатура" иерархия используется для классификации товаров, но в некоторых отчётах она мешает, можно добавить реквизит "ИспользоватьВОтчётах" (булево) и фильтровать данные по нему. Это позволит гибко управлять отображением без изменения структуры.

Ещё один полезный инструмент — динамические списки. С их помощью можно создавать представления справочников с произвольной структурой, не затрагивая исходные данные. Например:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Справочник.Ссылка КАК Ссылка,

| Справочник.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Справочник

|ГДЕ

| НЕ Справочник.ЭтоГруппа

|УПОРЯДОЧИТЬ ПО

| Наименование";

Результат = Запрос.Выполнить();

ДинамическийСписок = Результат.Выгрузить();

7. Проверка результатов и оптимизация

После удаления иерархии необходимо проверить:

  1. Целостность данных: Убедитесь, что все элементы справочника доступны и не имеют битых ссылок. Для этого выполните тестовый запрос:
    ВЫБРАТЬ РАЗЛИЧНЫЕ Ссылка ИЗ Справочник.ВашСправочник

    Если запрос возвращает ошибку, значит, есть повреждённые записи.

  2. Производительность: Замерьте время выполнения типовых операций (открытие формы справочника, поиск элементов) до и после изменений. Используйте План обмена или Тестирование и исправление для диагностики.
  3. Совместимость с отчётами: Проверьте все отчёты, где использовался этот справочник. Особое внимание уделите отчётам с группировкой по иерархии (например, "Анализ субконто" в бухгалтерских конфигурациях).
  4. Права доступа: Если в правах пользователей были ограничения по уровням иерархии (например, "видеть только свою группу"), их придётся перенастроить.

Для оптимизации работы со справочником после удаления иерархии:

  • 📈 Переиндексируйте таблицы базы данных (в SQL-версии это можно сделать через DBCC REINDEX или аналогичные команды).
  • 🔧 Обновите статистику выполнения запросов (в это делается автоматически, но после массовых изменений лучше запустить вручную через Тестирование и исправление → Пересчёт итогов).
  • 📊 Настройте кэширование часто используемых справочников (параметр КэшированиеПриЧтении в свойствах справочника).
⚠️ Внимание: В управляемых формах (начиная с версии 8.2) после изменения структуры справочника может потребоваться обновить формы вручную через Конфигурация → Обновить форму объекта. Иначе пользователи увидят устаревшие поля или ошибки при открытии.

FAQ: Частые вопросы по удалению иерархии в 1С

Можно ли убрать иерархию только у части элементов справочника?

Да, но это требует программного подхода. Например, можно написать обработку, которая сбросит родительские ссылки только для элементов, соответствующих определённому условию (например, с определённым префиксом в наименовании или значением реквизита). Пример кода:

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

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

Если Лев(Выборка.Наименование, 3) = "Тов" Тогда

Элемент = Выборка.ПолучитьОбъект();

Элемент.Родитель = Справочники.Номенклатура.ПустаяСсылка();

Элемент.Записать();

КонецЕсли;

КонецЦикла;

Обратите внимание, что после такого изменения могут остаться "пустые" группы (без подчинённых элементов). Их придётся удалять отдельно.

Что будет с документами, которые ссылаются на подчинённые элементы?

Ссылки на элементы справочника останутся работоспособными, но логика работы может измениться. Например:

  • Если в документе была ссылка на элемент, который раньше был подчинён группе "Услуги", а теперь стал элементом верхнего уровня, сама ссылка не сломается.
  • Однако если в конфигурации есть бизнес-логика, проверяющая принадлежность элемента к определённой группе (например, Если Элемент.Родитель = Справочники.Номенклатура.Услуги Тогда...), она перестанет работать корректно.
  • В отчётах, где использовалась группировка по иерархии, элементы теперь будут отображаться без группировки (каждый отдельно).

Рекомендуем после изменения структуры запустить Проверку ссылочной целостности (Администрирование → Тестирование и исправление) и проанализировать логи бизнес-процессов.

Как вернуть иерархию обратно, если что-то пошло не так?

Если вы удалили иерархию через конфигуратор (сняли галочку Иерархический), вернуть её можно только:

  1. Восстановив базу из резервной копии.
  2. Или создав новый иерархический справочник и перенеся в него данные с восстановлением структуры (если у вас сохранилась информация о прежней иерархии).

Если иерархию убирали программно (сбрасывали родительские ссылки), можно написать обратную обработку, которая восстановит связи на основе сохранённых данных. Например, если перед изменением вы экспортировали структуру в XML, используйте её для восстановления:

// Пример псевдокода для восстановления иерархии

ДанныеОИерархии = ЗагрузитьИзXML("структура_справочника.xml");

Для Каждого Запись Из ДанныеОИерархии Цикл

Элемент = Запись.Ссылка.ПолучитьОбъект();

Элемент.Родитель = Запись.Родитель;

Элемент.Записать();

КонецЦикла;

Можно ли убрать иерархию в типовой конфигурации (например, в 1С:Бухгалтерии)?

В типовых конфигурациях (например, 1С:Бухгалтерия 3.0, 1С:УТ 11, 1С:ЗУП 3.1) большинству справочников иерархия нужна для корректной работы отчётов и регламентных операций. Удаление иерархии может привести к:

  • Ошибкам при формировании регламентных отчётов (например, "Анализ субконто" в бухгалтерии).
  • Нарушению работы типовой функциональности (например, распределение затрат по подразделениям в ЗУП).
  • Проблемам при обновлении конфигурации (типовые обработки могут ожидать иерархическую структуру).

Если вам действительно нужно убрать иерархию в типовой конфигурации:

  1. Создайте расширение конфигурации и перенесите в него изменённый справочник.
  2. Проверьте все зависимости через Анализ зависимостей и адаптируйте отчёты/обработки.
  3. Будьте готовы к тому, что при следующем обновлении типовой конфигурации может потребоваться повторная доработка.

В большинстве случаев целесообразнее не удалять иерархию, а настроить отображение и фильтрацию под свои задачи.

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

Если справочник участвует в обмене данными (например, через Универсальный формат обмена или EnterpriseData), его структура должна быть одинаковой на всех узлах обмена. Удаление иерархии на одном узле приведёт к ошибкам синхронизации. В этом случае:

  1. Приостановите обмен данными на всех узлах.
  2. Удалите иерархию на всех базах, участвующих в обмене.
  3. Обновите правила обмена, чтобы они не ожидали иерархическую структуру.
  4. Выполните полную синхронизацию данных.

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

⚠️ Внимание: В распределённых информационных базах (РИБ) изменение структуры справочников может привести к невозможности дальнейшей синхронизации. Перед изменениями обязательно протестируйте процесс на копии РИБ.