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

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

Как обратиться к таблице в запросе 1С

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

Обращение к таблице — первое действие в любом запросе 1С: в конструкции ИЗ (FROM) указывается источник данных, откуда будут выбираться записи. От того, как именно названа таблица и какие параметры ей переданы, зависит и корректность результата, и скорость выполнения запроса.

В языке запросов 1С имена таблиц строятся по строгому шаблону: тип объекта метаданных, точка, имя объекта так, как оно задано в конфигураторе. Например, Справочник.Номенклатура или Документ.РеализацияТоваровУслуг. Ошибка в имени — самая частая причина сообщения «Таблица не найдена».

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

Как устроено имя таблицы в языке запросов 1С

Имя таблицы состоит из двух частей, разделённых точкой. Первая часть — тип объекта метаданных: Справочник, Документ, РегистрСведений, РегистрНакопления, РегистрБухгалтерии, РегистрРасчета, Перечисление, ПланВидовХарактеристик и другие. Вторая часть — имя объекта в точности так, как оно указано в дереве конфигурации, без пробелов и без синонима.

Типичный пример простого запроса к таблице справочника:

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование,

Номенклатура.Артикул

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

НЕ Номенклатура.ПометкаУдаления

Конструкция КАК Номенклатура задаёт псевдоним таблицы. Он не обязателен, но сильно упрощает чтение запроса, особенно когда в нём несколько таблиц. Через псевдоним далее обращаются к полям: Псевдоним.Поле.

Важно помнить: в запросе используется имя объекта, а не его синоним (представление). Если справочник в конфигураторе называется Номенклатура, а синоним у него «Товары», обращаться нужно именно как Справочник.Номенклатура. Узнать точное имя можно в конфигураторе через свойства объекта или в консоли запросов через конструктор.

Обращение к таблицам справочников и документов

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

Если нужен отбор по конкретному элементу, условие выносится в ГДЕ через параметр запроса:

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.Номер,

Реализация.Дата,

Реализация.СуммаДокумента

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Контрагент = &Контрагент

И Реализация.Проведен

Параметр &Контрагент перед выполнением заполняется методом Запрос.УстановитьПараметр("Контрагент", Значение). Прямая подстановка значений в текст запроса конкатенацией строк — плохая практика: она ломает кэширование планов запроса и создаёт риск ошибок при нестроковых типах.

Обращение к табличным частям документов и справочников

Табличная часть — отдельная таблица, имя которой строится по шаблону: ТипОбъекта.ИмяОбъекта.ИмяТабличнойЧасти. Например, таблица товаров документа реализации:

ВЫБРАТЬ

Товары.Ссылка КАК Документ,

Товары.Номенклатура,

Товары.Количество,

Товары.Сумма

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка = &Документ

В табличной части всегда есть поле Ссылка — связь с шапкой документа или справочника, и поле НомерСтроки. Именно через Ссылка выполняется соединение табличной части с шапкой, если нужны реквизиты документа:

ВЫБРАТЬ

Товары.Номенклатура,

Товары.Ссылка.Дата КАК ДатаДокумента

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

Обращение «через точку» к полям ссылки (Товары.Ссылка.Дата) удобно, но при большом числе таких разыменований запрос замедляется: платформа неявно соединяет таблицы. Если разыменований много, лучше явно соединить табличную часть с таблицей документа через ЛЕВОЕ СОЕДИНЕНИЕ.

Обращение к таблицам регистров и виртуальным таблицам

Регистры имеют физическую таблицу движений и набор виртуальных таблиц. Физическая таблица регистра накопления — РегистрНакопления.ТоварыНаСкладах — содержит все записи: даты, виды движения, измерения, ресурсы. Читать её напрямую имеет смысл только для анализа отдельных движений.

Для получения итогов используются виртуальные таблицы. У регистра накопления с видом «Остатки» это Остатки, у регистра с видом «Обороты» — Обороты, у обоих — ОстаткиИОбороты. Параметры виртуальной таблицы передаются в скобках сразу после имени:

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.Склад,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки

Первый параметр — период, на который рассчитываются остатки. Второй — условие отбора по измерениям. Условие внутри параметров виртуальной таблицы работает быстрее, чем то же условие в ГДЕ, потому что отбор применяется до расчёта итогов, а не после.

У регистра сведений доступны виртуальные таблицы СрезПервых и СрезПоследних (для периодических регистров). Например, получение цен на дату:

ВЫБРАТЬ

Цены.Номенклатура,

Цены.Цена

ИЗ

РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены

Соединение нескольких таблиц в одном запросе

Реальные запросы почти всегда обращаются к нескольким таблицам. Соединение описывается в предложении ИЗ через ЛЕВОЕ, ПРАВОЕ, ВНУТРЕННЕЕ или ПОЛНОЕ СОЕДИНЕНИЕ с условием связи в ПО:

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование,

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки

ПО Номенклатура.Ссылка = Остатки.Номенклатура

ГДЕ

НЕ Номенклатура.ПометкаУдаления

Левое соединение оставляет все строки справочника, даже если остатков по позиции нет — тогда поле остатка будет NULL, поэтому используется функция ЕСТЬNULL. Внутреннее соединение вернёт только позиции, для которых остатки есть. Выбор типа соединения — это выбор логики отчёта, а не вопрос синтаксиса.

Сравнение вариантов

ЛЕВОЕ СОЕДИНЕНИЕ

Все записи левой таблицы плюс совпадения справа. Подходит для списков справочника с остатками; требует ЕСТЬNULL для полей правой таблицы.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

Только строки, где связь есть в обеих таблицах. Быстрее, но «теряет» позиции без движений.

Разыменование через точку

Короткая запись вида Поле.Ссылка.Реквизит. Удобно для одного-двух полей; при массовом использовании замедляет запрос из-за неявных соединений.

Обращение к таблице через временные таблицы и вложенные запросы

Сложная выборка часто строится по шагам: сначала данные помещаются во временную таблицу, затем к ней обращаются как к обычной таблице по имени. Временная таблица создаётся конструкцией ПОМЕСТИТЬ:

ВЫБРАТЬ

Товары.Номенклатура,

СУММА(Товары.Количество) КАК Количество

ПОМЕСТИТЬ ВТ_Продажи

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка.Дата МЕЖДУ &Начало И &Конец

СГРУППИРОВАТЬ ПО

Товары.Номенклатура

;

ВЫБРАТЬ

Продажи.Номенклатура,

Продажи.Количество

ИЗ

ВТ_Продажи КАК Продажи

Обращение к временной таблице идёт просто по её имени — без префикса типа объекта. Временные таблицы живут в рамках одного пакета запроса и требуют менеджера временных таблиц, если создаются из кода. После использования их рекомендуется уничтожать конструкцией УНИЧТОЖИТЬ ВТ_Продажи, чтобы не держать память сервера.

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

Порядок действий при построении запроса
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе.
  2. 2
    Определите источник: справочник, документ, табличная часть или виртуальная таблица регистра.
  3. 3
    Напишите предложение ИЗ с точным именем таблицы и псевдонимом.
  4. 4
    Для виртуальной таблицы укажите параметры периода и отбора в скобках.
  5. 5
    Добавьте условия в ГДЕ через параметры &Имя и установите их перед выполнением.
  6. 6
    Выполните запрос и проверьте результат на тестовых данных с известными значениями.

Типичные ошибки и как проверить результат

Ошибка «Таблица не найдена» почти всегда означает опечатку в имени объекта или неверный тип: например, обращение Справочник.Товары, когда объект называется Номенклатура, или попытка прочитать документ как справочник. Проверяется это сверкой с деревом конфигурации.

Вторая группа ошибок — пустой результат при синтаксически верном запросе. Причины: не установлен параметр запроса (остался NULL), неверный период виртуальной таблицы, лишнее условие отбора, отбор по непроведённым документам там, где движения делают только проведённые. Диагностика — убирать условия по одному и смотреть, на каком шаге данные появляются.

Третья группа — задвоение строк при соединениях. Если соединить шапку документа с табличной частью по ссылке и не сгруппировать, каждая строка товаров умножит шапку. Это не ошибка платформы, а нормальное поведение соединения «один ко многим» — агрегировать нужно осознанно через СГРУППИРОВАТЬ ПО.

Типичные ошибки
01
Использование синонима вместо имени объекта — запрос падает с ошибкой «таблица не найдена».
02
Отбор по измерениям в ГДЕ вместо параметров виртуальной таблицы — резкое замедление на больших регистрах.
03
Отсутствие ЕСТЬNULL после левого соединения — NULL в итоговых колонках и ошибки при вычислениях.
04
Забытый УстановитьПараметр перед Выполнить() — пустой результат без сообщения об ошибке.
05
Соединение без проверки дублей — задвоенные суммы в отчёте.
Контрольные точки

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

Количество строк результата
Норма

Совпадает с ожидаемым числом объектов или строк

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

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

Суммы и остатки
Норма

Бьются с данными стандартного отчёта по регистру

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

Расхождения — проверить период и отборы виртуальной таблицы

Время выполнения
Норма

Запрос отрабатывает за секунды на рабочем объёме

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

Минуты ожидания — нет отборов в параметрах виртуальной таблицы или сканирование большой таблицы

FAQ

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

Откройте конфигуратор, найдите объект в дереве метаданных и посмотрите его свойство «Имя» — именно оно используется в запросе, а не синоним. Быстрый способ без конфигуратора — конструктор запроса в консоли запросов: он показывает список доступных таблиц с правильными именами.

Чем виртуальная таблица отличается от физической?

Физическая таблица хранит записи как есть — например, все движения регистра. Виртуальная таблица (Остатки, Обороты, СрезПоследних) — это расчётный запрос платформы поверх физических данных, который возвращает готовые итоги. Она не хранится в базе и требует параметров периода и отбора.

Можно ли обратиться к таблице другой информационной базы?

В одном запросе — нет, язык запросов работает только с метаданными текущей базы. Для обращения к данным другой базы используют COM-соединение, веб-сервисы, HTTP-запросы или механизмы обмена, а полученные данные при необходимости загружают во временную таблицу.

Почему запрос к табличной части возвращает NULL в полях шапки?

Скорее всего, использовано левое соединение, и для части строк не нашлось соответствия, либо разыменование идёт по пустой ссылке. Проверьте заполненность поля связи и оберните поля правой таблицы в ЕСТЬNULL с подходящим значением по умолчанию.

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

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

Что быстрее: вложенный запрос или временная таблица?

Для одноразовой простой выборки разница несущественна. Временная таблица выигрывает, когда её результат используется в нескольких местах пакета, и позволяет индексировать данные конструкцией ИНДЕКСИРОВАТЬ ПО. Вложенный запрос пересчитывается при каждом обращении в рамках своего оператора.

Итог

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

Обращение к таблице в запросе 1С строится по шаблону ТипОбъекта.ИмяОбъекта с псевдонимом через КАК. Табличные части адресуются тройным именем, виртуальные таблицы регистров требуют параметров периода и отбора в скобках. Параметры передаются через &Имя и УстановитьПараметр, а результат всегда проверяется на задвоения, NULL и расхождения со стандартными отчётами.