Администрирование · 12 мин
Как узнать название таблицы 1С в SQL
Как определить имя физической таблицы 1С в базе SQL Server или PostgreSQL: структура хранения, запросы к Params, типовые префиксы таблиц и типичные ошибки.
Клиент-серверная 1С хранит данные в СУБД (MS SQL Server, PostgreSQL, Oracle, IBM DB2), но имена физических таблиц не совпадают с именами объектов конфигурации. Справочник «Контрагенты» в базе SQL превращается во что-то вроде _Reference123, а документ «Реализация товаров» — в _Document456. Чтобы писать прямые запросы, строить отчёты в BI-системах или разбираться с блокировками, нужно уметь сопоставлять метаданные конфигурации с реальными именами таблиц.
Сопоставление хранится прямо в базе данных — в служебной таблице Params, а также доступно через штатные инструменты платформы: функцию «ПолучитьСтруктуруХраненияБазыДанных» и утилиту выгрузки структуры. Ниже разобраны все рабочие способы, типовые префиксы таблиц и ограничения, о которых нужно помнить перед работой с SQL напрямую.
Как 1С хранит данные в SQL и почему имена не совпадают
Платформа 1С:Предприятие при создании информационной базы на сервере СУБД генерирует физические таблицы с техническими именами. Имя состоит из префикса, обозначающего тип объекта метаданных, и порядкового номера, который присваивается в момент создания объекта. Например, первый созданный справочник получит таблицу _Reference1, а сотый документ — _Document100.
Такой подход избавляет платформу от зависимости от переименований в конфигурации: разработчик может сколько угодно менять имя справочника в метаданных, а физическая таблица и все данные в ней останутся нетронутыми. Обратная сторона — по имени таблицы в SQL невозможно понять, что это за объект, без таблицы соответствия.
Важно понимать, что соответствие «имя метаданных — имя таблицы» индивидуально для каждой базы. Один и тот же справочник «Номенклатура» в рабочей и тестовой базах может иметь разные физические имена, если объекты создавались в разном порядке. Поэтому скрипты с жёстко прописанными именами таблиц нельзя без проверки переносить между базами.
Способ 1: функция ПолучитьСтруктуруХраненияБазыДанных
Самый надёжный и безопасный способ — штатная функция платформы ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает таблицу значений со всеми объектами метаданных и соответствующими им физическими таблицами и полями. Функция работает на любой поддерживаемой СУБД и не требует прямого доступа к SQL-серверу.
Чтобы получить структуру, откройте конфигуратор или внешнюю обработку и выполните код, который выводит соответствия. Проще всего сделать это через небольшую внешнюю обработку или консоль кода:
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Строка Из СтруктураХранения Цикл
Если Строка.Метаданные = "Справочник.Контрагенты" Тогда
Сообщить(Строка.ИмяТаблицыХранения);
КонецЕсли;
КонецЦикла;
В результате получите имя вида _Reference123. Если нужны имена полей (например, как называется реквизит «ИНН» в SQL), та же таблица содержит колонки с именами полей хранения — обычно это _Fld с номером, например _Fld4567.
- 1Откройте конфигуратор или консоль кода с правами администратора
- 2Выполните ПолучитьСтруктуруХраненияБазыДанных() и сохраните результат в таблицу значений
- 3Найдите строку с нужным объектом по колонке Метаданные
- 4Снимите имя физической таблицы из колонки ИмяТаблицыХранения
- 5При необходимости выпишите имена полей хранения для нужных реквизитов
Способ 2: запрос к служебной таблице Params в SQL
Если доступа к конфигуратору нет, но есть доступ к SQL-серверу, соответствие можно получить напрямую из базы. Платформа хранит сериализованное описание структуры в служебной таблице Params. В ней есть запись, содержащая структуру хранения в формате, похожем на DBF-данные в бинарном виде.
Запрос к Params выглядит так:
SELECT FileName, BinaryData
FROM Params
WHERE FileName = 'DBNames';
Поле BinaryData содержит упакованные данные, которые платформа преобразует в таблицу соответствий. Читать его «в лоб» неудобно — для расшифровки используют готовые обработки и скрипты, которые распаковывают структуру и выводят её в читаемом виде. Альтернатива — просмотр списка всех таблиц базы и определение нужной по косвенным признакам: количеству строк, составу индексов, характерным полям.
Например, список всех таблиц с количеством строк в MS SQL Server можно получить так:
SELECT t.name AS TableName, p.rows AS RowCount
FROM sys.tables t
JOIN sys.partitions p ON t.object_id = p.object_id
WHERE p.index_id IN (0,1)
ORDER BY p.rows DESC;
Таблица с миллионами строк и префиксом _AccumRg почти наверняка окажется регистром накопления по продажам или остаткам — это помогает сузить поиск, когда полной расшифровки структуры нет.
Типовые префиксы таблиц 1С в SQL
Даже без расшифровки структуры хранения по префиксу таблицы можно определить тип объекта. Это удобно при анализе блокировок, оценке размеров таблиц и поиске «тяжёлых» объектов.
| Префикс | Тип объекта метаданных | Пример |
|---|---|---|
_Reference | Справочник | _Reference123 |
_Document | Документ | _Document456 |
_DocumentVT | Табличная часть документа | _Document456_VT789 |
_InfoRg | Регистр сведений | _InfoRg234 |
_AccumRg | Регистр накопления | _AccumRg567 |
_AccRg | Регистр бухгалтерии | _AccRg890 |
_Enum | Перечисление | _Enum12 |
_Consts | Константы | _Consts |
_Sequence | Последовательность документов | _Sequence34 |
У регистров накопления и сведений есть дополнительные таблицы: итоги (_AccumRgTotals), срезы первых и последних (_InfoRgSL, _InfoRgSSR для режимов среза), таблицы изменений для планов обмена (_AccumRg_ChangeRec). При анализе производительности важно не перепутать основную таблицу движений с таблицей итогов — они различаются и по структуре, и по размеру.
Способ 3: поиск по данным внутри таблицы
Когда структура хранения недоступна, а найти нужно конкретный объект, работает метод поиска по известному значению. Например, чтобы найти таблицу справочника «Контрагенты», ищите таблицу с префиксом _Reference, в которой есть текстовое поле с известным наименованием контрагента.
Практический приём для MS SQL Server — перебрать кандидатов динамическим SQL. Сначала отбираются таблицы нужного префикса, затем в каждой ищется характерное значение. Это медленнее прямого чтения структуры, но работает даже с минимальными правами.
Дополнительные признаки помогают сузить круг: у таблицы документа всегда есть поля _IDRRef (ссылка), _Number (номер), _Date_Time (дата); у справочника — _Code и _Description; у регистра сведений — поля измерений и ресурсов без системного номера. Состав полей смотрят через sys.columns или в представлении INFORMATION_SCHEMA.COLUMNS.
Как выбрать способ
Типичные ошибки и ограничения
Самая частая ошибка — использование имён таблиц, подсмотренных в одной базе, в запросах к другой. После переноса конфигурации через DT или реструктуризации номера таблиц меняются, и запрос либо падает с ошибкой, либо, что хуже, молча читает не ту таблицу.
Вторая группа ошибок связана с непониманием служебных полей. Поле _Version у документов, признаки пометки удаления _Marked, поля предопределённости _PredefinedID — всё это платформа обновляет сама. Запросы на чтение должны учитывать _Marked = 0, иначе в выборку попадут помеченные на удаление объекты.
Отдельно стоит сказать про PostgreSQL: там имена таблиц приводятся к нижнему регистру, а в запросах без кавычек регистр не учитывается. Скрипты, написанные под MS SQL Server, часто требуют адаптации синтаксиса — TOP заменяется на LIMIT, функции работы с датами отличаются.
Проверка результата и безопасная практика
После того как имя таблицы определено, проверьте его перед использованием в запросах. Самая простая проверка — выполнить выборку первых строк и сверить содержимое с данными, видимыми в 1С: откройте элемент справочника или документ в пользовательском режиме и сравните значения полей.
SELECT TOP 10 _IDRRef, _Code, _Description, _Marked
FROM _Reference123;
Если наименования и коды совпадают с тем, что показывает 1С, таблица определена верно. Для документов дополнительно сверьте дату и номер: поле _Date_Time должно совпадать с датой документа в интерфейсе.
Для регулярной работы полезно зафиксировать соответствия в отдельном документе или таблице маппинга и обновлять его после каждого обновления конфигурации с реструктуризацией. Это избавит от повторных поисков и защитит от ошибок при срочном анализе данных.
Как проверить результат
Коды, наименования и даты совпадают с данными в интерфейсе 1С
Поля пустые, содержат непонятные значения или данные другого объекта
Порядок чисел соответствует количеству элементов в 1С
Различия на порядки — вероятно, найдена табличная часть или другой объект
Отбор по _Marked = 0 исключает удалённые элементы
В выборке присутствуют элементы, отсутствующие в списках 1С
Частые вопросы
Можно ли переименовать таблицу 1С в SQL в понятное имя?
Нет. Имена физических таблиц генерируются платформой, и ручное переименование в СУБД приведёт к тому, что 1С перестанет находить свои данные — база станет неработоспособной. Если нужны понятные имена для отчётов, создайте в SQL представления (VIEW) с читаемыми алиасами поверх физических таблиц.
Где в SQL хранятся табличные части документов?
Каждая табличная часть хранится в отдельной таблице с префиксом _DocumentVT или в формате «таблица документа + суффикс», в зависимости от версии платформы. Связь с шапкой документа — по полю ссылки _DocumentIDRRef. Список табличных частей и их имена видны в той же структуре хранения базы данных.
Чем отличается _Fld в именах полей от обычных имён?
Реквизиты объектов в SQL получают технические имена вида _Fld4567 по тому же принципу, что и таблицы. Системные поля имеют фиксированные имена: _IDRRef (ссылка), _Code, _Description, _Date_Time, _Posted. Соответствие реквизитов и полей смотрят в структуре хранения.
Безопасно ли читать данные 1С напрямую из SQL?
Чтение через SELECT безопасно, если не использовать хинты, влияющие на блокировки, без понимания последствий. Для тяжёлых аналитических запросов лучше использовать NOLOCK (с учётом возможного чтения незафиксированных данных) или выносить аналитику в отдельную копию базы. Запись в таблицы 1С напрямую недопустима.
Почему после обновления конфигурации мой SQL-запрос перестал работать?
При реструктуризации платформа может пересоздать таблицы с новыми номерами, особенно если менялась структура реквизитов. После каждого обновления конфигурации с изменением структуры данных заново получайте структуру хранения и сверяйте имена таблиц в своих запросах.
Как узнать имя таблицы для регистра сведений с режимом «Подчинение регистратору»?
Такие регистры хранятся в таблицах с тем же префиксом _InfoRg, но дополнительно содержат поле регистратора _RecorderRRef и поле периода. Имя конкретной таблицы определяется через структуру хранения — по префиксу отличить подчинённый регистр от независимого нельзя.
Что важно запомнить
Имена таблиц 1С в SQL состоят из префикса типа объекта и номера. Точное соответствие даёт функция ПолучитьСтруктуруХраненияБазыДанных() или служебная таблица Params. Номера таблиц различаются между базами и меняются при реструктуризации. Работайте с SQL только на чтение и проверяйте найденную таблицу сверкой с данными в интерфейсе 1С.