Вопрос о том, где хранится структура подчиненности 1С, является фундаментальным для любого архитектора или разработчика, работающего с этой платформой. Ответ на него не так очевиден, как может показаться на первый взгляд, поскольку платформа не предоставляет единую «волшебную» таблицу, куда записываются все связи типа «начальник-подчиненный» в явном виде.
Понимание физического и логического размещения этих данных критически важно для построения эффективных отчетов, настройки прав доступа (RLS) и реализации сложной бизнес-логики. В этой статье мы детально разберем механизмы хранения, используемые типовыми и нетиповыми конфигурациями.
Логическая модель данных в конфигурациях
Прежде чем искать конкретные таблицы в базе данных SQL, необходимо понимать, как структура подчиненности моделируется на уровне метаданных 1С. В подавляющем большинстве современных конфигураций, таких как 1С:Зарплата и управление персоналом или 1С:ERP, эта информация не хранится в виде статического списка.
Основным объектом, определяющим иерархию, является справочник Сотрудники или ФизическиеЛица. Связь между руководителем и подчиненным реализуется через реквизит-ссылку. Обычно это поле с именем Руководитель или Подразделение, которое ссылается на другой элемент того же справочника или на справочник структурных единиц.
Такой подход позволяет строить рекурсивные структуры любой глубины. Однако, для ускорения выборки данных система часто использует дополнительные механизмы кэширования или периодические регистры. В типовых конфигурациях 1С актуальная структура подчиненности часто материализуется в регистре сведений «СтруктураПодчиненности» или аналогичном объекте.
Использование регистров сведений позволяет мгновенно получать список всех подчиненных конкретного руководителя без выполнения тяжелых рекурсивных запросов к базе данных в момент обращения.
Физическое хранение в таблице SQL
При переходе на уровень СУБД (Microsoft SQL Server, PostgreSQL) данные трансформируются из объектов 1С в реляционные таблицы. Имя таблицы зависит от имени объекта метаданных и префикса базы данных.
Если вы используете регистр сведений для хранения структуры, то в базе данных это будет таблица с именем вида _InfoRgСтруктураПодчиненности. В этой таблице обычно присутствуют следующие ключевые поля:
- 📁 _Period — период действия записи (актуальность структуры).
- 👤 _RecorderRRef — документ, который изменил структуру (приказ о переводе).
- 🏢 _Dimension1 — руководитель или подразделение (измерение).
- 👥 _Resource1 — подчиненный сотрудник (ресурс).
Если же в конфигурации не используется отдельный регистр, а связь хранится прямо в справочнике, то данные находятся в таблице _Reference56 (где 56 — ID справочника сотрудников). В этом случае связь «кто кому подчиняется» хранится в колонке, соответствующей реквизиту Руководитель.
Для анализа такой структуры на чистом SQL вам потребуется использовать рекурсивные запросы (CTE — Common Table Expressions), что может существенно нагружать сервер при глубокой иерархии.
⚠️ Внимание: Прямое изменение данных в таблицах SQL в обход платформы 1С может привести к рассинхронизации кэша и нарушению целостности базы данных. Все изменения структуры должны проводиться только через интерфейс 1С или специальные обработки.
Регистры сведений и их роль
Использование регистров сведений является наиболее производительным способом хранения иерархических данных в 1С. Механизм работы прост: при проведении документа «Кадровый перевод» или «Прием на работу» система автоматически обновляет записи в регистре.
Это позволяет отделить оперативный ввод данных от аналитической выборки. Когда пользователю нужно сформировать отчет «Штатное расписание» или рассчитать премию руководителю отдела, система обращается к срезу регистра, а не «бегает» по ссылкам в справочниках.
В конфигурациях на базе БСП (Библиотеки стандартных подсистем) часто используется универсальный механизм хранения оргструктуры. Он может включать в себя не только прямое подчинение, но и функциональное, проектное и матричное управление.
Для разработчика важно понимать, что в таких регистрах часто используется составное измерение. Это значит, что в одной колонке могут храниться ссылки на разные типы объектов: должности, подразделения или конкретные физические лица.
При написании запросов к регистру сведений всегда используйте оператор «КАК ПЕРИОД» или функцию «СрезПоследних», чтобы получить актуальную структуру на конкретную дату, а не всю историю изменений.
Поиск данных через консоль запросов
Для того чтобы точно определить, где в вашей конкретной базе хранится структура подчиненности 1С, лучше всего воспользоваться инструментом Консоль запросов. Этот метод позволяет увидеть реальную картину без необходимости лезть в дебри конфигурации.
Вы можете выполнить универсальный запрос, который попытается найти связи между сотрудниками. Ниже приведен пример кода, который можно адаптировать под вашу конфигурацию:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Наименование КАК ФИО,
Сотрудники.Руководитель КАК РуководительСсылка,
Руководители.Наименование КАК ФИО_Руководителя
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Руководители
ПО Сотрудники.Руководитель = Руководители.Ссылка
ГДЕ
Сотрудники.Руководитель ЕСТЬ НЕ NULL
Если этот запрос вернет пустой результат, значит, связь хранится не в самом справочнике, а в отдельном регистре или документе. В таком случае следует искать объекты метаданных с названиями, содержащими слова «Подчинение», «Структура» или «Иерархия».
Чередование стилей анализа помогает быстрее найти истину: сначала проверьте очевидные справочники, затем регистры, и только потом — документы оперативного учета.
☑️ Диагностика хранения структуры
Особенности хранения в разных конфигурациях
Различные продукты фирмы 1С реализуют хранение оргструктуры по-разному, в зависимости от предметной области. В 1С:Бухгалтерия этот механизм может быть вообще отсутствовать или быть реализован максимально упрощенно через ответственных лиц.
В 1С:ЗУП (Зарплата и управление персоналом) структура подчиненности 1С является центральным элементом для расчета премий и формирования отчетов по кадрам. Здесь данные дублируются в нескольких местах для обеспечения надежности.
В таблице ниже приведено сравнение типовых мест хранения данных в популярных конфигурациях:
| Конфигурация | Основной объект хранения | Дополнительный источник | Особенность |
|---|---|---|---|
| 1С:ЗУП 3.1 | Регистр сведений «СтруктураПодчиненности» | Документ «Кадровый перевод» | Поддерживает несколько видов подчинения |
| 1С:ERP 2.x | Справочник «ОрганизационныеЕдиницы» | Регистр «СоставОрганизационныхЕдиниц» | Сложная матричная структура |
| 1С:КА 2.x | Реквизит «Руководитель» в сотрудниках | Отсутствует | Плоская иерархия |
Знание этих различий позволяет разработчику быстрее ориентироваться в чужом коде и понимать логику работы системы. Всегда сверяйтесь с документацией к конкретной версии платформы, так как архитектура может меняться.
⚠️ Внимание: В конфигурациях с включенной функцией «Расширенная аналитика» структура подчиненности может храниться в специализированных планах видов характеристик, что усложняет прямые SQL-запросы.
Влияние структуры на права доступа (RLS)
Одной из главных причин, по которой вопрос «где хранится структура подчиненности 1С» так важен, является настройка ролевой модели доступа (RLS). Ограничение прав доступа на уровне записей часто строится именно на иерархии сотрудников.
Механизм RLS использует запросы к тем же таблицам, где хранится структура, чтобы динамически фильтровать данные. Например, руководитель отдела должен видеть документы только своих подчиненных. Если структура хранится неоптимально, это может привести к значительному торможению работы системы при открытии журналов документов.
При разработке собственных подсистем безопасности рекомендуется создавать денормализованные таблицы или временные выборки, которые содержат полный список подчиненных для каждого пользователя. Это избавит сервер от необходимости выполнять рекурсивные обходы дерева при каждом обращении к данным.
Также стоит учитывать, что при частой смене руководителей (ротации кадров) механизмы обновления прав доступа должны срабатывать оперативно, чтобы бывший руководитель сразу терял доступ к конфиденциальной информации нового подразделения.
Как оптимизировать RLS при глубокой иерархии?
Для оптимизации прав доступа при глубокой иерархии (более 5-7 уровней) рекомендуется использовать предварительный расчет таблицы «Пользователь-ОбъектДоступа». Эта таблица заполняется регламентным заданием ночью или по событию изменения структуры. В ограничениях RLS используется простое соединение с этой таблицей, что работает в разы быстрее рекурсивных запросов.
Частые ошибки при работе с иерархией
Разработчики часто допускают ошибки, предполагая, что структура подчиненности 1С всегда актуальна в реальном времени. На самом деле, если используются регистры сведений, данные в них могут обновляться с задержкой или только при проведении документов.
Еще одна распространенная проблема — циклические ссылки. Пользователь может случайно назначить руководителем сотрудника, который сам является подчиненным этого сотрудника (или его подчиненного). Платформа 1С не всегда блокирует такие ситуации на уровне интерфейса.
Для предотвращения циклов необходимо писать специальные проверки в модулях объектов или использовать обработчики событий ПередЗаписью. Циклическая зависимость может привести к бесконечному циклу при выполнении рекурсивных запросов и падению сервера 1С.
Также стоит помнить о «вдовствующих» записях. Если сотрудник уволен, но в регистре подчиненности осталась запись, где он числится руководителем, отчеты могут показывать некорректные данные. Необходима регулярная очистка или архивация исторических данных.
Оптимальное хранение структуры подчиненности — это баланс между скоростью выборки (регистры) и актуальностью данных (документы). Для тяжелых отчетов используйте предварительно рассчитанные срезы регистров.
Где именно в базе данных SQL лежит таблица со структурой?
Имя таблицы зависит от конфигурации. Обычно это _InfoRgСтруктураПодчиненности или аналогичное имя для регистра сведений. Если структура хранится в справочнике, ищите таблицу справочника сотрудников (например, _Reference56) и смотрите колонку с реквизитом «Руководитель».
Можно ли изменить структуру подчиненности напрямую через SQL?
Технически можно, но категорически не рекомендуется. Это нарушит кэш 1С, не вызовет необходимые события обновления прав доступа и может привести к ошибкам при следующей работе с базой через клиент 1С. Используйте только интерфейс программы или обработки обмена.
Как найти всех подчиненных руководителя, включая косвенных?
Для этого необходимо использовать рекурсивный запрос. В языке запросов 1С это делается через соединение таблицы с самой собой в цикле или использование временных таблиц для накопления уровней иерархии. В SQL Server используйте конструкцию WITH RECURSIVE (CTE).
Почему отчет показывает старую структуру подчинения?
Скорее всего, документ, изменяющий структуру (например, «Кадровый перевод»), не проведен, либо регистр сведений не обновился из-за ошибки проведения. Проверьте журнал регистрации и наличие ошибок при записи документов.
Влияет ли структура подчиненности на расчет зарплаты?
Да, во многих конфигурациях (например, 1С:ЗУП) от структуры подчиненности зависит расчет премий, надбавок за руководство и формирование сводных отчетов по фонду оплаты труда подразделений.