К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить имена таблиц в 1С

Как получить имена таблиц в 1С: через метаданные, запрос ВЫБРАТЬ, консоль запросов и на уровне СУБД. Примеры кода, типичные ошибки и ответы на вопросы.

Под «именами таблиц» в 1С обычно понимают два разных объекта: логические таблицы прикладного решения (справочники, документы, регистры), с которыми работает язык запросов, и физические таблицы в базе данных SQL Server, PostgreSQL или Oracle, куда платформа реально сохраняет данные. Способ получения имён зависит от того, какой из этих уровней вам нужен.

На уровне конфигурации имена таблиц доступны через коллекцию метаданных и используются в запросах вида ВЫБРАТЬ ... ИЗ Справочник.Номенклатура. На уровне СУБД физические таблицы имеют технические имена вроде _Reference123 или _Document456, и их сопоставление с объектами конфигурации требует отдельного подхода.

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

Что считать именем таблицы в 1С

В терминах языка запросов 1С таблица — это источник данных, указываемый после ключевого слова ИЗ. Полное имя такой таблицы строится по шаблону: тип объекта, точка, имя объекта в конфигурации. Например: Справочник.Контрагенты, Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах.

У регистров есть дополнительные виртуальные таблицы — остатки, обороты, срез первых или последних. Их имена формируются добавлением суффикса: РегистрНакопления.ТоварыНаСкладах.Остатки, РегистрСведений.КурсыВалют.СрезПоследних. Виртуальные таблицы не хранятся физически, платформа вычисляет их при выполнении запроса.

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

Как получить список таблиц через метаданные

Самый прямой способ узнать, какие таблицы существуют в конфигурации, — перебрать коллекции объекта Метаданные. Каждый тип объекта имеет свою коллекцию: Метаданные.Справочники, Метаданные.Документы, Метаданные.РегистрыСведений, Метаданные.РегистрыНакопления, Метаданные.РегистрыБухгалтерии, Метаданные.РегистрыРасчета, Метаданные.Перечисления, Метаданные.ПланыОбмена и другие.

Пример кода, выводящего имена всех справочников и документов:

Для Каждого ОбъектМД Из Метаданные.Справочники Цикл

Сообщить("Справочник." + ОбъектМД.Имя);

КонецЦикла;

Для Каждого ОбъектМД Из Метаданные.Документы Цикл

Сообщить("Документ." + ОбъектМД.Имя);

КонецЦикла;

У каждого элемента коллекции доступны свойства Имя (внутреннее имя, используемое в запросах и коде) и Синоним (представление для пользователя). Для построения запросов нужен именно Имя — синоним в операторе ИЗ не работает.

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

bsl
Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
    Сообщить("РегистрНакопления." + Регистр.Имя);
КонецЦикла;

Как узнать имена таблиц через консоль запросов и конфигуратор

Если программный код писать не требуется, имена таблиц видны прямо в интерфейсе. В конфигураторе дерево объектов (меню «Конфигурация» → «Открыть конфигурацию») показывает все объекты по веткам: «Справочники», «Документы», «Регистры» и так далее. Имя объекта в дереве — это и есть имя таблицы для запроса.

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

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

Как найти имя таблицы в конфигураторе
  1. 1
    Откройте конфигуратор и команду «Конфигурация» → «Открыть конфигурацию»
  2. 2
    Раскройте нужную ветку: Справочники, Документы или Регистры
  3. 3
    Найдите объект — его имя в дереве и есть имя таблицы
  4. 4
    Для проверки создайте запрос вида ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ <полное имя таблицы> и выполните его

Как получить физические имена таблиц в СУБД

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

Пример вызова:

СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();

Для Каждого Строка Из СтруктураХранения Цикл

Сообщить(Строка.ИмяТаблицыХранения + " <- " + Строка.Метаданные);

КонецЦикла;

Колонка ИмяТаблицыХранения содержит физическое имя (например, _Reference123), а колонка Метаданные — полное имя объекта конфигурации. Обратная функция ПолучитьСтруктуруХраненияБазыДанных() с параметром отбора позволяет получить данные по конкретному объекту.

Альтернатива — запрос к системным представлениям самой СУБД: sys.tables в SQL Server, information_schema.tables в PostgreSQL. Но такие запросы покажут только технические имена без привязки к конфигурации, поэтому без структуры хранения они малоинформативны.

Как проверить существование таблицы перед запросом

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

Проверка выполняется через метод Метаданные.НайтиПоПолномуИмени(). Он возвращает объект метаданных или Неопределено, если объект не найден:

Если Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура") <> Неопределено Тогда

// таблица существует, можно строить запрос

КонецЕсли;

Дополнительно проверяйте тип объекта: имя может существовать, но принадлежать другому типу (например, вместо справочника оказаться документом). Свойство типа объекта метаданных помогает отсечь такие случаи до выполнения запроса.

Контрольные точки

Как проверить результат

Имя таблицы в запросе
Норма

Запрос выполняется без ошибки «Таблица не найдена»

Тревожный признак

Ошибка компиляции запроса — проверьте тип объекта и точность имени

Соответствие физической таблицы
Норма

Имя из структуры хранения есть в списке таблиц СУБД

Тревожный признак

Таблицы нет в СУБД — возможно, объект не имеет хранения (например, перечисление)

Полнота списка метаданных
Норма

Список совпадает с деревом конфигурации

Тревожный признак

Часть объектов отсутствует — проверьте, что перебраны все коллекции

Типичные ошибки и ограничения

Наиболее распространённая ошибка — использование синонима вместо имени. Синоним может содержать пробелы и русские слова в произвольной форме («Товары на складах»), но запрос примет только точное внутреннее имя (ТоварыНаСкладах).

Вторая группа ошибок связана с виртуальными таблицами: попытка обратиться к виртуальной таблице, которой нет у данного типа регистра. Например, у регистра сведений, не подчинённого регистратору, нет таблицы СрезПервых в некоторых режимах, а у регистра накопления с видом «Обороты» нет таблицы Остатки. Перед использованием виртуальной таблицы сверяйтесь с её наличием в конструкторе запросов.

Третья ошибка — поиск физических имён «вручную» по шаблону. Нумерация таблиц в СУБД нестабильна: после реструктуризации или обновления конфигурации имена могут измениться. Всегда получайте актуальное сопоставление через структуру хранения, а не зашивайте имена вроде _Reference123 в скрипты.

Типичные ошибки
01
Использование синонима объекта в запросе вместо внутреннего имени — ошибка «Таблица не найдена»
02
Обращение к несуществующей виртуальной таблице регистра — ошибка компиляции запроса
03
Жёсткое прописывание физических имён таблиц СУБД в скриптах — после реструктуризации скрипты ломаются
04
Перебор только одной коллекции метаданных — в список не попадают регистры и другие типы объектов

Какой способ выбрать под свою задачу

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

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

Перебор метаданных

Подходит для построения запросов и динамических алгоритмов. Не даёт физических имён таблиц СУБД

Конфигуратор и консоль запросов

Быстрый ручной способ узнать имя. Не подходит для автоматизации и массового получения

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

Единственный штатный способ сопоставить объекты конфигурации с физическими таблицами СУБД

Системные представления СУБД

Дают только технические имена без привязки к конфигурации; применять только для чтения и диагностики

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

Итог

Что важно запомнить

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

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

Можно ли получить имена таблиц одним запросом на языке 1С?

Нет, язык запросов 1С не имеет аналога information_schema: он работает только с конкретными таблицами, указанными в операторе ИЗ. Список таблиц получают перебором метаданных встроенным языком, а не запросом.

Как узнать имя таблицы для табличной части документа?

Табличная часть адресуется через имя владельца: Документ.РеализацияТоваровУслуг.Товары. Программно имена табличных частей перебираются через коллекцию ТабличныеЧасти объекта метаданных документа.

Почему ПолучитьСтруктуруХраненияБазыДанных() возвращает не все объекты?

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

Безопасно ли читать данные напрямую из таблиц SQL?

Чтение (SELECT) не повреждает данные, но результаты могут быть неполными: итоги регистров, служебные поля и разделители требуют понимания структуры хранения. Для прикладной логики всегда надёжнее запросы средствами платформы.

Как получить имена таблиц внешнего источника данных?

Таблицы внешних источников перебираются через Метаданные.ВнешниеИсточникиДанных и вложенную коллекцию Таблицы. Полное имя в запросе выглядит как ВнешнийИсточникДанных.ИмяИсточника.Таблица.ИмяТаблицы.

Изменятся ли физические имена таблиц после обновления конфигурации?

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