Разработка и Конфигурация · 12 мин
Как обратиться к таблице в запросе 1С
Как правильно обратиться к таблице в запросе 1С: синтаксис для справочников, документов, регистров и виртуальных таблиц, примеры кода и типичные ошибки.
Обращение к таблице — первое действие в любом запросе 1С: в конструкции ИЗ (FROM) указывается источник данных, откуда будут выбираться записи. От того, как именно названа таблица и какие параметры ей переданы, зависит и корректность результата, и скорость выполнения запроса.
В языке запросов 1С имена таблиц строятся по строгому шаблону: тип объекта метаданных, точка, имя объекта так, как оно задано в конфигураторе. Например, Справочник.Номенклатура или Документ.РеализацияТоваровУслуг. Ошибка в имени — самая частая причина сообщения «Таблица не найдена».
Кроме физических таблиц объектов, в запросах доступны виртуальные таблицы регистров — остатки, обороты, срезы последних. Они требуют передачи параметров (период, условия) и при неправильном использовании дают либо пустой результат, либо тяжёлые запросы по всей таблице движений.
Как устроено имя таблицы в языке запросов 1С
Имя таблицы состоит из двух частей, разделённых точкой. Первая часть — тип объекта метаданных: Справочник, Документ, РегистрСведений, РегистрНакопления, РегистрБухгалтерии, РегистрРасчета, Перечисление, ПланВидовХарактеристик и другие. Вторая часть — имя объекта в точности так, как оно указано в дереве конфигурации, без пробелов и без синонима.
Типичный пример простого запроса к таблице справочника:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
Конструкция КАК Номенклатура задаёт псевдоним таблицы. Он не обязателен, но сильно упрощает чтение запроса, особенно когда в нём несколько таблиц. Через псевдоним далее обращаются к полям: Псевдоним.Поле.
Важно помнить: в запросе используется имя объекта, а не его синоним (представление). Если справочник в конфигураторе называется Номенклатура, а синоним у него «Товары», обращаться нужно именно как Справочник.Номенклатура. Узнать точное имя можно в конфигураторе через свойства объекта или в консоли запросов через конструктор.
Обращение к таблицам справочников и документов
Таблицы справочников и документов — физические таблицы, которые читаются напрямую. У справочника доступны реквизиты, табличные части и стандартные поля: Ссылка, Код, Наименование, Владелец, Родитель, ПометкаУдаления, Предопределенный. У документа — Ссылка, Номер, Дата, Проведен и реквизиты шапки.
Если нужен отбор по конкретному элементу, условие выносится в ГДЕ через параметр запроса:
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Номер,
Реализация.Дата,
Реализация.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Контрагент = &Контрагент
И Реализация.Проведен
Параметр &Контрагент перед выполнением заполняется методом Запрос.УстановитьПараметр("Контрагент", Значение). Прямая подстановка значений в текст запроса конкатенацией строк — плохая практика: она ломает кэширование планов запроса и создаёт риск ошибок при нестроковых типах.
Обращение к табличным частям документов и справочников
Табличная часть — отдельная таблица, имя которой строится по шаблону: ТипОбъекта.ИмяОбъекта.ИмяТабличнойЧасти. Например, таблица товаров документа реализации:
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка = &Документ
В табличной части всегда есть поле Ссылка — связь с шапкой документа или справочника, и поле НомерСтроки. Именно через Ссылка выполняется соединение табличной части с шапкой, если нужны реквизиты документа:
ВЫБРАТЬ
Товары.Номенклатура,
Товары.Ссылка.Дата КАК ДатаДокумента
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
Обращение «через точку» к полям ссылки (Товары.Ссылка.Дата) удобно, но при большом числе таких разыменований запрос замедляется: платформа неявно соединяет таблицы. Если разыменований много, лучше явно соединить табличную часть с таблицей документа через ЛЕВОЕ СОЕДИНЕНИЕ.
Обращение к таблицам регистров и виртуальным таблицам
Регистры имеют физическую таблицу движений и набор виртуальных таблиц. Физическая таблица регистра накопления — РегистрНакопления.ТоварыНаСкладах — содержит все записи: даты, виды движения, измерения, ресурсы. Читать её напрямую имеет смысл только для анализа отдельных движений.
Для получения итогов используются виртуальные таблицы. У регистра накопления с видом «Остатки» это Остатки, у регистра с видом «Обороты» — Обороты, у обоих — ОстаткиИОбороты. Параметры виртуальной таблицы передаются в скобках сразу после имени:
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.Склад,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки
Первый параметр — период, на который рассчитываются остатки. Второй — условие отбора по измерениям. Условие внутри параметров виртуальной таблицы работает быстрее, чем то же условие в ГДЕ, потому что отбор применяется до расчёта итогов, а не после.
У регистра сведений доступны виртуальные таблицы СрезПервых и СрезПоследних (для периодических регистров). Например, получение цен на дату:
ВЫБРАТЬ
Цены.Номенклатура,
Цены.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены
Соединение нескольких таблиц в одном запросе
Реальные запросы почти всегда обращаются к нескольким таблицам. Соединение описывается в предложении ИЗ через ЛЕВОЕ, ПРАВОЕ, ВНУТРЕННЕЕ или ПОЛНОЕ СОЕДИНЕНИЕ с условием связи в ПО:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование,
ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки
ПО Номенклатура.Ссылка = Остатки.Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
Левое соединение оставляет все строки справочника, даже если остатков по позиции нет — тогда поле остатка будет NULL, поэтому используется функция ЕСТЬNULL. Внутреннее соединение вернёт только позиции, для которых остатки есть. Выбор типа соединения — это выбор логики отчёта, а не вопрос синтаксиса.
Сравнение вариантов
Все записи левой таблицы плюс совпадения справа. Подходит для списков справочника с остатками; требует ЕСТЬNULL для полей правой таблицы.
Только строки, где связь есть в обеих таблицах. Быстрее, но «теряет» позиции без движений.
Короткая запись вида Поле.Ссылка.Реквизит. Удобно для одного-двух полей; при массовом использовании замедляет запрос из-за неявных соединений.
Обращение к таблице через временные таблицы и вложенные запросы
Сложная выборка часто строится по шагам: сначала данные помещаются во временную таблицу, затем к ней обращаются как к обычной таблице по имени. Временная таблица создаётся конструкцией ПОМЕСТИТЬ:
ВЫБРАТЬ
Товары.Номенклатура,
СУММА(Товары.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка.Дата МЕЖДУ &Начало И &Конец
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
;
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество
ИЗ
ВТ_Продажи КАК Продажи
Обращение к временной таблице идёт просто по её имени — без префикса типа объекта. Временные таблицы живут в рамках одного пакета запроса и требуют менеджера временных таблиц, если создаются из кода. После использования их рекомендуется уничтожать конструкцией УНИЧТОЖИТЬ ВТ_Продажи, чтобы не держать память сервера.
Альтернатива — вложенный запрос в скобках в предложении ИЗ. Он подходит для разовой логики, но хуже читается и не может использоваться повторно в том же пакете, в отличие от временной таблицы.
- 1Откройте консоль запросов или конструктор запроса в конфигураторе.
- 2Определите источник: справочник, документ, табличная часть или виртуальная таблица регистра.
- 3Напишите предложение ИЗ с точным именем таблицы и псевдонимом.
- 4Для виртуальной таблицы укажите параметры периода и отбора в скобках.
- 5Добавьте условия в ГДЕ через параметры &Имя и установите их перед выполнением.
- 6Выполните запрос и проверьте результат на тестовых данных с известными значениями.
Типичные ошибки и как проверить результат
Ошибка «Таблица не найдена» почти всегда означает опечатку в имени объекта или неверный тип: например, обращение Справочник.Товары, когда объект называется Номенклатура, или попытка прочитать документ как справочник. Проверяется это сверкой с деревом конфигурации.
Вторая группа ошибок — пустой результат при синтаксически верном запросе. Причины: не установлен параметр запроса (остался NULL), неверный период виртуальной таблицы, лишнее условие отбора, отбор по непроведённым документам там, где движения делают только проведённые. Диагностика — убирать условия по одному и смотреть, на каком шаге данные появляются.
Третья группа — задвоение строк при соединениях. Если соединить шапку документа с табличной частью по ссылке и не сгруппировать, каждая строка товаров умножит шапку. Это не ошибка платформы, а нормальное поведение соединения «один ко многим» — агрегировать нужно осознанно через СГРУППИРОВАТЬ ПО.
Как проверить результат
Совпадает с ожидаемым числом объектов или строк
Строк больше, чем объектов — признак задвоения при соединении
Бьются с данными стандартного отчёта по регистру
Расхождения — проверить период и отборы виртуальной таблицы
Запрос отрабатывает за секунды на рабочем объёме
Минуты ожидания — нет отборов в параметрах виртуальной таблицы или сканирование большой таблицы
FAQ
Как узнать точное имя таблицы для запроса?
Откройте конфигуратор, найдите объект в дереве метаданных и посмотрите его свойство «Имя» — именно оно используется в запросе, а не синоним. Быстрый способ без конфигуратора — конструктор запроса в консоли запросов: он показывает список доступных таблиц с правильными именами.
Чем виртуальная таблица отличается от физической?
Физическая таблица хранит записи как есть — например, все движения регистра. Виртуальная таблица (Остатки, Обороты, СрезПоследних) — это расчётный запрос платформы поверх физических данных, который возвращает готовые итоги. Она не хранится в базе и требует параметров периода и отбора.
Можно ли обратиться к таблице другой информационной базы?
В одном запросе — нет, язык запросов работает только с метаданными текущей базы. Для обращения к данным другой базы используют COM-соединение, веб-сервисы, HTTP-запросы или механизмы обмена, а полученные данные при необходимости загружают во временную таблицу.
Почему запрос к табличной части возвращает NULL в полях шапки?
Скорее всего, использовано левое соединение, и для части строк не нашлось соответствия, либо разыменование идёт по пустой ссылке. Проверьте заполненность поля связи и оберните поля правой таблицы в ЕСТЬNULL с подходящим значением по умолчанию.
Как обратиться к таблице внешнего источника данных?
Внешние источники данных регистрируются в конфигурации как отдельный объект, после чего их таблицы доступны в запросе по шаблону ВнешнийИсточникДанных.ИмяИсточника.Таблица.ИмяТаблицы. Учитывайте, что запросы к внешним источникам обычно медленнее и зависят от доступности внешней системы.
Что быстрее: вложенный запрос или временная таблица?
Для одноразовой простой выборки разница несущественна. Временная таблица выигрывает, когда её результат используется в нескольких местах пакета, и позволяет индексировать данные конструкцией ИНДЕКСИРОВАТЬ ПО. Вложенный запрос пересчитывается при каждом обращении в рамках своего оператора.
Что важно запомнить
Обращение к таблице в запросе 1С строится по шаблону ТипОбъекта.ИмяОбъекта с псевдонимом через КАК. Табличные части адресуются тройным именем, виртуальные таблицы регистров требуют параметров периода и отбора в скобках. Параметры передаются через &Имя и УстановитьПараметр, а результат всегда проверяется на задвоения, NULL и расхождения со стандартными отчётами.