Где искать физическую таблицу объекта 1С: от метода платформы до DBNames
Содержание
Имя таблицы 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. Функция ПолучитьСтруктуруХраненияБазыДанных в отладчике
Самый быстрый путь, если у вас есть доступ к конфигуратору и права на отладку.
- Откройте базу в конфигураторе.
- Запустите отладку клавишей
F5. Откроется сеанс 1С:Предприятия. - Поставьте точку останова в любой серверной процедуре, которая точно выполнится, например в модуле формы на
&НаСервере, и выполните в 1С действие, которое её вызывает. - Когда выполнение остановится, откройте окно вычисления выражения:
Shift+F9. - Введите выражение и нажмите «Рассчитать»:
ПолучитьСтруктуруХраненияБазыДанных()
Результат — таблица значений. Её колонки:
ИмяТаблицыХранения— физическое имя, например_Reference34;ИмяТаблицы— имя в терминах языка запросов, напримерСправочник.Номенклатура;Метаданные— полное имя объекта метаданных;Назначение— роль таблицы: основная, табличная часть, итоги, регистрация изменений и т.д.;Поля— вложенная таблица с колонкамиИмяПоляХранения,ИмяПоля,Метаданные;Индексы— вложенная таблица индексов.
Вся структура большой конфигурации — это тысячи строк, в окне отладчика неудобно. Передайте в функцию массив нужных объектов, и результат сократится до пары строк.
Как получить имена ровно в том виде, что лежат в СУБД
У функции два параметра. Первый — массив объектов метаданных (или их полных имён). Второй, ИменаБазыДанных, по умолчанию Ложь. Если передать Истина, имена вернутся так, как их хранит конкретная СУБД. Для PostgreSQL это нижний регистр: _reference34, _fld1234rref.
Объекты = Новый Массив;
Объекты.Добавить(Метаданные.Справочники.Номенклатура);
ПолучитьСтруктуруХраненияБазыДанных(Объекты, Истина)
В окне вычисления выражения нужна одна строка, поэтому массив удобнее собирать в коде обработки, о которой ниже.
Способ 2. Внешняя обработка: имена таблиц и полей для любого объекта
Если отладка недоступна или нужно выгрузить структуру для разработчика отчётов на SQL, сделайте маленькую внешнюю обработку .
- В конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте форму, на неё — реквизит
ИмяОбъекта(строка) и команду «Показать». - В модуле формы вставьте код:
&НаКлиенте
Процедура Показать(Команда)
ПоказатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПоказатьНаСервере()
Объект1С = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект1С = Неопределено Тогда
Сообщить("Объект не найден: " + ИмяОбъекта);
Возврат;
КонецЕсли;
Объекты = Новый Массив;
Объекты.Добавить(Объект1С);
Структура = ПолучитьСтруктуруХраненияБазыДанных(Объекты, Истина);
Для Каждого СтрокаТаблицы Из Структура Цикл
Сообщить(СтрокаТаблицы.ИмяТаблицы + " -> " + СтрокаТаблицы.ИмяТаблицыХранения
+ " (" + СтрокаТаблицы.Назначение + ")");
Для Каждого Поле Из СтрокаТаблицы.Поля Цикл
Сообщить(" " + Поле.ИмяПоля + " -> " + Поле.ИмяПоляХранения);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
- Сохраните файл .epf, откройте базу в режиме 1С:Предприятие и запустите обработку через
Файл → Открыть. - В поле введите полное имя, например
Справочник.НоменклатураилиРегистрНакопления.ТоварыНаСкладах, и нажмите «Показать».
В сообщениях появятся основная таблица, табличные части, таблицы итогов и регистрации изменений — со всеми полями.
Обратная задача: по имени таблицы найти объект
Бывает наоборот: администратор СУБД присылает «таблица _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 — номер таблицы для ссылки. По этому номеру тип и находят в структуре хранения.