Объект конфигурации и таблица СУБД: как найти соответствие в обе стороны

· 9 мин

Содержание

Узнать, какая таблица СУБД хранит объект 1С, проще всего функцией ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает пары «имя в конфигурации — имя в базе»: например, Справочник.Номенклатура ↔ _Reference25, а реквизит Артикул ↔ _Fld1234. Числа в именах у каждой базы свои, поэтому угадать их по префиксу нельзя — только сверить.

Обратная задача встречается чаще. В отчёте SQL Server, в логе блокировок или в технологическом журнале всплывает _AccumRg4512, и нужно понять, какой это регистр. Ниже — способы для режима 1С:Предприятие, Конфигуратора и прямой работы с SQL Server и PostgreSQL.

С чего начать: объект в режиме Предприятия и в Конфигураторе

Сначала нужно точно знать имя объекта метаданных. Пользователь видит синоним («Реализация (акты, накладные, УПД)»), а в коде и в структуре хранения фигурирует имя (РеализацияТоваровУслуг).

Как узнать имя объекта из открытой формы

  1. Откройте список или документ в режиме 1С:Предприятие.
  2. Нажмите Shift+F11 — команда «Получить ссылку».
  3. В навигационной ссылке читайте часть после e1cib/list/ или e1cib/data/: например, e1cib/list/Документ.РеализацияТоваровУслуг.

Первое слово — вид объекта (Справочник, Документ, РегистрСведений), второе — его имя. Этого достаточно, чтобы искать таблицу.

Поиск по синониму через «Все функции»

Если известно только название из интерфейса, откройте главное меню → Все функции. Если пункта нет, включите его: главное меню → Сервис → Параметры → флажок «Отображать команду “Все функции”». В дереве видны синонимы объектов, а при открытии списка по Shift+F11 получите имя.

В Конфигураторе

В дереве метаданных у нижнего края есть строка поиска: она фильтрует объекты по имени. В свойствах объекта (Alt+Enter) видны имя, синоним и подчинённые табличные части. Сам Конфигуратор имена таблиц СУБД не показывает — их даёт только структура хранения.

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

Правила именования таблиц 1С в базе данных

Платформа не использует русские имена в СУБД. Каждая таблица получает служебный префикс и порядковый номер, поле — префикс _Fld и номер.

Устройство имени:

  • 🧱 Префикс — вид объекта: _Reference для справочника, _Document для документа, _InfoRg для регистра сведений.
  • 🔢 Номер — присваивается при создании таблицы в конкретной базе. В копии той же конфигурации номер может быть другим.
  • 📎 Суффикс — вспомогательная таблица: _VT для табличной части, T в _AccumRgT для итогов.

Стандартные реквизиты имеют постоянные имена без номеров:

Поле в СУБДЧто хранит
_IDRRefСсылка (уникальный идентификатор)
_VersionВерсия данных объекта
_MarkedПометка удаления
_Code, _DescriptionКод и наименование справочника
_ParentIDRRefРодитель в иерархии
_OwnerIDRRefВладелец подчинённого справочника
_Number, _Date_Time, _PostedНомер, дата и проведение документа
_Period, _RecorderRRef, _LineNo, _ActiveПериод, регистратор, номер строки и активность записи регистра
_PredefinedIDПризнак предопределённого элемента

Реквизиты составного типа раскладываются на несколько колонок с общим началом: _Fld567_TYPE (тип значения), _Fld567_RTRef (номер таблицы ссылки), _Fld567_RRRef (сама ссылка), _Fld567_N, _Fld567_S, _Fld567_L, _Fld567_T для числа, строки, булева и даты.

Смещение дат в SQL Server

При создании базы на MS SQL Server указывают смещение дат. Если выбрано 2000, дата 01.01.2025 лежит в таблице как 4025-01-01. Значение смещения хранится в служебной таблице _YearOffset. Учитывайте это в любых условиях WHERE по датам.

Функция ПолучитьСтруктуруХраненияБазыДанных

Это главный инструмент. Функция работает на сервере, в толстом клиенте и во внешнем соединении. Возвращает таблицу значений с колонками:

  • ИмяТаблицы — имя в терминах 1С, например РегистрНакопления.ТоварыНаСкладах.Итоги;
  • ИмяТаблицыХранения — имя в базе, например _AccumRgT4520;
  • Назначение — «Основная», «ТабличнаяЧасть», «Итоги», «РегистрацияИзменений» и т. п.;
  • Метаданные — полное имя объекта;
  • Поля — вложенная таблица: ИмяПоляХранения, ИмяПоля, Метаданные;
  • Индексы — индексы таблицы.

Первый параметр — массив объектов метаданных (не указан — вернётся вся база). Второй параметр, Истина, просит имена так, как они записаны в конкретной СУБД. Для PostgreSQL это важно: там имена в нижнем регистре (_reference25).

Таблица по имени объекта

Код для внешней обработки или серверного модуля:

&НаСервере
Процедура ПоказатьТаблицыОбъектаНаСервере()
    Объекты = Новый Массив;
    Объекты.Добавить(Метаданные.Справочники.Номенклатура);
    Структура = ПолучитьСтруктуруХраненияБазыДанных(Объекты, Истина);
    Для Каждого СтрТабл Из Структура Цикл
        Сообщить(СтрТабл.ИмяТаблицы + " -> " + СтрТабл.ИмяТаблицыХранения);
        Для Каждого СтрПоле Из СтрТабл.Поля Цикл
            Сообщить("    " + СтрПоле.ИмяПоля + " -> " + СтрПоле.ИмяПоляХранения);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Объект по имени таблицы

Обратный поиск — по всей структуре, без отбора:

&НаСервере
Процедура НайтиОбъектПоТаблицеНаСервере(ИмяТаблицыСУБД)
    Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
    Для Каждого СтрТабл Из Структура Цикл
        Если НРег(СтрТабл.ИмяТаблицыХранения) = НРег(ИмяТаблицыСУБД) Тогда
            Сообщить(СтрТабл.ИмяТаблицы + " (" + СтрТабл.Назначение + ")");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

НРег() снимает разницу регистра между SQL Server и PostgreSQL. Вызов без отбора по большой конфигурации (ERP, КА) идёт несколько секунд — это нормально.

Запускайте обработку под пользователем с полными правами. Встраивать её в рабочую конфигурацию не нужно: хватит внешней обработки, открытой через Файл → Открыть.

Прямой анализ таблиц в SQL Server и PostgreSQL

Работа на уровне СУБД нужна, когда база тормозит и надо понять, какие таблицы самые тяжёлые, или когда разбираете блокировку из профайлера.

Самые большие таблицы в MS SQL Server

SELECT TOP 20
    t.name AS table_name,
    SUM(a.total_pages) * 8 / 1024 AS size_mb
FROM sys.tables t
JOIN sys.indexes i ON t.object_id = i.object_id
JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY t.name
ORDER BY size_mb DESC;

Самые большие таблицы в PostgreSQL

SELECT relname,
       pg_size_pretty(pg_total_relation_size(relid)) AS size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;

Типичный результат: сверху _InfoRg…, _AccumRg…, _AccRg…, таблицы регистрации изменений. Каждое имя затем прогоняете через обработку из предыдущего раздела.

Поиск всех таблиц одного вида

-- SQL Server
SELECT name FROM sys.tables WHERE name LIKE '[_]AccumRg%' ORDER BY name;

-- PostgreSQL
SELECT tablename FROM pg_tables
WHERE schemaname = 'public' AND tablename LIKE '\_accumrg%'
ORDER BY tablename;

Подчёркивание в LIKE — подстановочный символ, поэтому его экранируют: [_] в SQL Server и \_ в PostgreSQL.

Имена таблиц в технологическом журнале

В событиях DBMSSQL и DBPOSTGRS технологического журнала поле Sql содержит текст запроса с физическими именами: _Document45, _Fld1234, _AccumRgT4520. Выпишите все имена из медленного запроса и расшифруйте их одной обработкой — так видно, какой отчёт или документ создаёт нагрузку.

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

Табличные части, регистры и служебные таблицы

Один объект метаданных почти всегда занимает несколько таблиц.

Табличные части

Имя строится от таблицы владельца: _Document45_VT678. В ней ссылка на документ — поле _Document45_IDRRef, номер строки — _LineNo679. Порядок строк хранит именно это поле, а не порядок записей.

Регистры накопления

  • _AccumRg — сами движения;
  • _AccumRgT — итоги остатков;
  • отдельные таблицы для настроек итогов и агрегатов.

Если _AccumRgT раздулась больше основной таблицы, стоит пересчитать итоги или проверить период их рассчитанности.

Регистры сведений и бухгалтерии

У периодического регистра сведений могут быть таблицы среза последних (_InfoRgSL) и среза первых (_InfoRgSF) — если в свойствах регистра включено их использование. Регистр бухгалтерии хранит проводки в _AccRg, значения субконто — в _AccRgED, итоги — в отдельных таблицах с суффиксом AT.

Служебные таблицы платформы

У них нет номера, и через ПолучитьСтруктуруХраненияБазыДанных их не найти:

ТаблицаНазначение
ConfigОсновная конфигурация базы
ConfigSaveКонфигурация, сохранённая в Конфигураторе, но ещё не применённая
ParamsПараметры базы, в том числе файл DBNames с соответствием имён
DBSchemaОписание структуры базы
FilesСлужебные файлы платформы
v8usersСписок пользователей информационной базы
_YearOffsetСмещение дат (SQL Server)

DBNames хранится в двоичном сжатом виде. Читать его вручную нет смысла: ту же информацию в удобной форме выдаёт функция платформы.

Шпаргалка: объект метаданных → префикс таблицы

Объект в 1СПрефикс основной таблицыСвязанные таблицы
Справочник_Reference_Reference…_VT… (ТЧ), _ReferenceChngR (регистрация изменений)
Документ_Document_Document…_VT…, _DocumentChngR
Журнал документов_DocumentJournal—
Перечисление_Enum—
Константа_Constкаждая константа — отдельная таблица
План видов характеристик_Chrc_Chrc…_VT…
План счетов_Acc_Acc…_ExtDim… (виды субконто)
План видов расчёта_CKinds—
План обмена_Node—
Регистр сведений_InfoRg_InfoRgSL, _InfoRgSF
Регистр накопления_AccumRg_AccumRgT (итоги)
Регистр бухгалтерии_AccRg_AccRgED, _AccRgAT…
Регистр расчёта_CalcRgперерасчёты, фактический период
Бизнес-процесс_BPrточки маршрута
Задача_Task—
Последовательность_Seqграницы последовательности

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

Что у вас на руках?

Ошибки и подводные камни при определении таблиц

  • ❌ Номер взяли из другой базы. Копия той же конфигурации на тестовом сервере может иметь _Reference31 вместо _Reference25. Структуру хранения снимайте с той базы, где разбираете проблему.
  • ❌ Сравнили имена с учётом регистра. В PostgreSQL _reference25, в SQL Server _Reference25. Без НРег() или второго параметра Истина обратный поиск ничего не находит.
  • ❌ Перепутали основную таблицу и итоги. Блокировка на _AccumRgT — это итоги регистра, а не движения. Решения у этих проблем разные.
  • ❌ Структуру сняли до обновления. После реструктуризации таблицы могут получить новые номера, а у новых реквизитов появятся новые поля. Сохранённую раньше выгрузку обновляйте.
  • ❌ Ищут таблицу в файловой базе через SQL. Файловая база лежит в одном файле 1Cv8.1CD, к ней нельзя подключиться SQL-клиентом. Функция ПолучитьСтруктуруХраненияБазыДанных при этом работает и там.
  • ❌ Ждут, что язык запросов 1С увидит _Reference25. Запросы 1С работают только с именами метаданных, обращение к таблице СУБД по физическому имени в них невозможно.

Частые вопросы

Можно ли посмотреть структуру хранения без программирования?
Да. Существуют готовые внешние обработки, которые выводят ту же таблицу значений в форму с поиском. По сути они вызывают ту же функцию платформы.
Изменится ли имя таблицы после обновления конфигурации?
У существующих объектов обычно нет. Новые объекты и реквизиты получают новые номера. Выгрузку структуры после обновления лучше снять заново.
Почему в SQL больше таблиц, чем объектов в конфигурации?
У одного объекта бывает несколько таблиц: основная, табличные части, итоги, регистрация изменений, срезы. Плюс служебные таблицы платформы.
Как узнать, какому реквизиту соответствует _Fld1234?
Найдите таблицу через структуру хранения и просмотрите вложенную таблицу Поля: там пары ИмяПоляХранения и ИмяПоля.
Работает ли функция в веб-клиенте и тонком клиенте?
На клиенте — нет. Вызывайте её в серверной процедуре с директивой &НаСервере, тогда форма в тонком и веб-клиенте покажет результат.