Где искать физическую таблицу объекта 1С: от метода платформы до DBNames

· 10 мин

Содержание

Имя таблицы 1С в базе данных проще всего узнать функцией ПолучитьСтруктуруХраненияБазыДанных(): она возвращает соответствие «объект метаданных → таблица СУБД → поля». Запустить её можно в отладчике через вычисление выражения или во внешней обработке, а в самой СУБД остаётся только найти таблицу по полученному имени.

Частое заблуждение: справочник «Номенклатура» должен лежать в таблице Nomenklatura или хотя бы в чём-то похожем. Нет. Платформа 1С:Предприятие 8.3 называет таблицы по типу объекта и порядковому номеру: _Reference34, _Document512, _AccumRg1290. По имени таблицы в SQL-запросе объект не угадать, его надо сопоставить.

Почему имя таблицы в SQL не похоже на имя в конфигураторе

Конфигуратор показывает метаданные: «Справочник.Контрагенты», реквизит «ИНН». В СУБД этих слов нет. Транслитерации тоже нет: платформа не переводит кириллицу в латиницу, а строит имя из префикса типа и числа.

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

  • 🔢 в двух базах одной конфигурации номера не обязательно совпадают. Если база создана выгрузкой .dt, они те же. Если база собрана загрузкой .cf в пустую, номера раздаются заново;
  • 🔁 если объект удалить и создать заново с тем же именем, у него будет новый номер и новая таблица.

Поэтому SQL-скрипт, написанный под одну базу, перед запуском в другой нужно сверить.

Основные префиксы таблиц

Объект 1СТаблица в СУБДПример
Справочник_Reference + N_Reference34
Табличная часть справочника_Reference + N + _VT + M_Reference34_VT612
Документ_Document + N_Document512
Табличная часть документа_Document + N + _VT + M_Document512_VT530
Перечисление_Enum + N_Enum201
Константа_Const + N_Const77
Регистр сведений_InfoRg + N_InfoRg4100
Регистр накопления (движения)_AccumRg + N_AccumRg1290
Регистр накопления (итоги)_AccumRgT + N_AccumRgT1301
Регистр бухгалтерии_AccRg + N_AccRg890
План счетов_Acc + N_Acc18
План видов характеристик_Chrc + N_Chrc640
План обмена_Node + N_Node1200
Таблица регистрации изменений_ReferenceChngR + N, _DocumentChngR + N_ReferenceChngR1511

Как называются поля

У полей та же логика. Реквизит превращается в _Fld + номер, а дальше идут суффиксы по типу:

  • 🔑 _IDRRef — ссылка объекта, уникальный идентификатор в двоичном виде;
  • 📌 _Fld1234RRef — реквизит ссылочного типа;
  • 🧩 _Fld1234_TYPE, _Fld1234_RTRef, _Fld1234_RRRef — составной тип: тип значения, номер таблицы-типа и сама ссылка;
  • 🏷 _Code, _Description, _Marked, _Version — код, наименование, пометка удаления, версия данных;
  • 📄 у документов _Date_Time, _Number, _Posted;
  • 📊 у регистров _Period, _RecorderRRef, _LineNo, _Active.

Служебные таблицы платформы имён с подчёркиванием и номером не имеют: Config, ConfigSave, Params, Files, DBSchema, IBVersion, v8users.

Способ 1. Функция ПолучитьСтруктуруХраненияБазыДанных в отладчике

Самый быстрый путь, если у вас есть доступ к конфигуратору и права на отладку.

  1. Откройте базу в конфигураторе.
  2. Запустите отладку клавишей F5. Откроется сеанс 1С:Предприятия.
  3. Поставьте точку останова в любой серверной процедуре, которая точно выполнится, например в модуле формы на &НаСервере, и выполните в 1С действие, которое её вызывает.
  4. Когда выполнение остановится, откройте окно вычисления выражения: Shift+F9.
  5. Введите выражение и нажмите «Рассчитать»:
ПолучитьСтруктуруХраненияБазыДанных()

Результат — таблица значений. Её колонки:

  • ИмяТаблицыХранения — физическое имя, например _Reference34;
  • ИмяТаблицы — имя в терминах языка запросов, например Справочник.Номенклатура;
  • Метаданные — полное имя объекта метаданных;
  • Назначение — роль таблицы: основная, табличная часть, итоги, регистрация изменений и т.д.;
  • Поля — вложенная таблица с колонками ИмяПоляХранения, ИмяПоля, Метаданные;
  • Индексы — вложенная таблица индексов.

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

Как получить имена ровно в том виде, что лежат в СУБД

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

Объекты = Новый Массив;
Объекты.Добавить(Метаданные.Справочники.Номенклатура);
ПолучитьСтруктуруХраненияБазыДанных(Объекты, Истина)

В окне вычисления выражения нужна одна строка, поэтому массив удобнее собирать в коде обработки, о которой ниже.

Способ 2. Внешняя обработка: имена таблиц и полей для любого объекта

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

  1. В конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте форму, на неё — реквизит ИмяОбъекта (строка) и команду «Показать».
  3. В модуле формы вставьте код:
&НаКлиенте
Процедура Показать(Команда)
	ПоказатьНаСервере();
КонецПроцедуры

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

В сообщениях появятся основная таблица, табличные части, таблицы итогов и регистрации изменений — со всеми полями.

Обратная задача: по имени таблицы найти объект

Бывает наоборот: администратор СУБД присылает «таблица _InfoRg4100 весит 80 ГБ, что это?». Тогда вызовите функцию без параметров и найдите строку по ИмяТаблицыХранения:

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

Здесь вызов без второго параметра, поэтому имя пишется в «платформенном» регистре: _InfoRg4100. Если ищете имя из PostgreSQL в нижнем регистре, передайте вторым параметром Истина.

Способ 3. Системные каталоги СУБД: SQL Server, PostgreSQL, Oracle

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

Microsoft SQL Server (SSMS)

Таблицы лежат в схеме dbo. Найти, в какой таблице есть поле _Fld1234:

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '_Fld1234%';

Двадцать самых больших по числу строк таблиц:

SELECT TOP 20 t.name AS table_name, SUM(p.rows) AS row_count
FROM sys.tables t
JOIN sys.partitions p ON p.object_id = t.object_id AND p.index_id IN (0, 1)
GROUP BY t.name
ORDER BY row_count DESC;

В LIKE подчёркивание — это шаблон «любой символ». Для поиска строго по имени экранируйте его: LIKE '[_]Fld1234%'.

PostgreSQL

Имена хранятся в нижнем регистре, схема public. Таблицы по размеру с индексами:

SELECT relname AS table_name,
       pg_size_pretty(pg_total_relation_size(oid)) AS total_size
FROM pg_class
WHERE relkind = 'r' AND relnamespace = 'public'::regnamespace
ORDER BY pg_total_relation_size(oid) DESC
LIMIT 20;

Поиск по полю:

SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE column_name LIKE '\_fld1234%';

Ссылки _idrref хранятся как bytea, строки — в типе mvarchar из сборки PostgreSQL для 1С. Поэтому прямое сравнение строк в SQL-запросах ведёт себя не так, как с обычным varchar.

Oracle и IBM Db2

Для этих СУБД правила регистра и кавычек свои. Не угадывайте их вручную: вызовите ПолучитьСтруктуруХраненияБазыДанных(Объекты, Истина) из способа 2. Второй параметр как раз отдаёт имена в форме, принятой у текущей СУБД.

Способ 4. Таблица Params и запись DBNames

Платформа хранит соответствие «объект → номер таблицы» в служебной таблице Params, в записи с FileName = 'DBNames'. Этим пользуются, когда войти в 1С нельзя: база не запускается, а данные нужно достать.

Содержимое поля BinaryData сжато (deflate без заголовка). После распаковки получается текст во внутреннем скобочном формате 1С. В нём пары «идентификатор объекта метаданных — префикс типа — номер», например {a1b2…,"Reference",34}.

Прочитать запись в SQL Server:

SELECT FileName, DATALENGTH(BinaryData) AS size_bytes
FROM dbo.Params
WHERE FileName = 'DBNames';

Распаковать выгруженные байты можно, например, в Python:

import zlib
with open("dbnames.bin", "rb") as f:
    text = zlib.decompress(f.read(), -15).decode("utf-8-sig")
print(text[:500])

Сложность в том, что в DBNames только идентификаторы (GUID), а не имена «Номенклатура» или «Контрагенты». Их нужно ещё сопоставить с описанием конфигурации из таблицы Config. Вручную это долго, поэтому способ стоит держать на крайний случай.

Ничего не записывайте в Params, Config и DBSchema. Ошибка в этих таблицах делает базу незапускаемой.

Способ 5. Поймать SQL-запрос: технологический журнал и профилировщик

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

Технологический журнал

Создайте файл logcfg.xml в каталоге conf платформы на сервере 1С:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="C:\v8log" history="2">
    <event>
      <eq property="name" value="DBMSSQL"/>
    </event>
    <event>
      <eq property="name" value="DBPOSTGRS"/>
    </event>
    <property name="all"/>
  </log>
</config>

Платформа подхватит настройку сама, перезапуск не нужен. Выполните действие в 1С и откройте свежий файл в C:\v8log. Свойство Sql в событиях содержит текст запроса.

Журнал с событиями СУБД на рабочей базе растёт на гигабайты за минуты. Включайте его на короткое время, ограничивайте отбором по базе или пользователю и удаляйте logcfg.xml сразу после замера.

SQL Server Profiler и Extended Events

Если доступ есть только к SQL Server, создайте сеанс Extended Events или трассировку в Profiler с фильтром по базе. Затем выполните действие в 1С. В тексте пакетов будут видны _Document512, _Fld1234RRef и остальные имена.

Сторонние инструменты и файловые базы

Готовые решения экономят время, когда структуру смотрят часто.

  • 🧰 «Инструменты разработчика» — бесплатный набор обработок для 8.3. В нём есть просмотр структуры хранения с поиском в обе стороны: от объекта к таблице и от таблицы к объекту.
  • 📂 Tool_1CD — утилита для файловых баз. Открывает 1Cv8.1CD без запуска 1С и показывает таблицы с теми же именами _Reference, _Document. Полезна, когда файловая база повреждена и в конфигуратор не войти.
  • 📝 Готовые внешние обработки «структура хранения» из открытых каталогов разработчиков делают то же, что код из способа 2, плюс выгружают результат в табличный документ.

Перед запуском чужой обработки в рабочей базе откройте её код в конфигураторе. Обработка с доступом к серверу может сделать что угодно.

Сравнение способов

СпособКогда подходитОграничения
Отладчик, Shift+F9Нужно быстро, есть конфигураторНужны права на отладку
Внешняя обработкаРегулярно, для коллег без конфигуратораНужен запуск 1С:Предприятия
Системные каталоги СУБДПоиск по полю, анализ размераНе говорит, какой это объект
Params / DBNamesБаза не запускаетсяНадо сопоставлять GUID вручную
Техжурнал, ProfilerКакие таблицы трогает операцияНагрузка на сервер, объём логов
Сторонние утилитыЧастая работа со структуройНужно проверить код перед запуском

Частые ошибки при работе с таблицами 1С в SQL

  • ❌ Перенос скрипта между базами без сверки. _Reference34 в одной базе может оказаться другим справочником в соседней.
  • ❌ Запись в таблицы напрямую. UPDATE и DELETE в обход платформы не пересчитывают итоги регистров, не обновляют версию данных и не регистрируют изменения для обмена. Итоги разъезжаются, узлы обмена теряют данные. Читать — можно, менять — только через 1С.
  • ❌ Сравнение ссылки со строкой. _IDRRef — это 16 байт, а не текстовый GUID из 1С. Порядок байтов там другой, поэтому скопированный из 1С идентификатор «как есть» не найдёт запись.
  • ❌ Игнорирование разделителя. В базах с общими реквизитами-разделителями (сервис, области данных) в каждой таблице есть поле разделителя. Запрос без отбора по нему смешивает данные разных областей.

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

Можно ли увидеть имя таблицы прямо в конфигураторе, без кода?
Нет. В свойствах объекта конфигуратор показывает только метаданные. Физическое имя отдаёт функция платформы или сторонний инструмент.
Меняется ли имя таблицы после обновления конфигурации?
Для существующего объекта — нет, даже если в нём добавили реквизиты. Новое имя появляется, если объект удалили и создали заново или добавили новый объект.
Нужны ли права администратора, чтобы смотреть таблицы в SSMS?
Для чтения хватит роли на чтение базы, например db_datareader. Права на запись для анализа структуры не нужны, и выдавать их не стоит.
Почему в PostgreSQL не находится таблица `_Reference34`?
Там имена в нижнем регистре: _reference34. Запрос с именем в кавычках и заглавными буквами ищет другую таблицу.
Как узнать, что лежит в поле `_Fld1234_TYPE`?
Это составной тип. Поле _TYPE хранит вид значения (число, строка, ссылка и т.д.), _RTRef — номер таблицы для ссылки. По этому номеру тип и находят в структуре хранения.