Работа с таблицами в запросах 1С:Предприятие 8.3 — одна из ключевых задач для разработчиков и администраторов системы. Без правильного обращения к таблицам невозможно построить отчеты, реализовать сложную бизнес-логику или интегрировать данные из разных справочников. Однако синтаксис запросов в имеет свои особенности, которые часто становятся источником ошибок, особенно для новичков.

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

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

1. Базовый синтаксис обращения к таблицам в запросах 1С

Любой запрос в начинается с указания источника данных — таблицы, к которой вы обращаетесь. В отличие от SQL, где таблицы указываются напрямую, в используется специальный синтаксис с ключевым словом ВЫБРАТЬ (или SELECT в англоязычной версии). Рассмотрим основные правила:

Основная конструкция запроса выглядит так:

ВЫБРАТЬ

[Поля]

ИЗ

[ИсточникДанных] КАК [Псевдоним]

Где:

  • 📌 ВЫБРАТЬ — обязательное ключевое слово (аналог SQL-команды SELECT)
  • 📌 [Поля] — список полей, которые нужно получить (можно использовать * для выбора всех полей)
  • 📌 ИЗ — указывает источник данных (аналог FROM в SQL)
  • 📌 [ИсточникДанных] — имя таблицы (справочника, документа, регистра и т.д.)
  • 📌 КАК [Псевдоним] — необязательный псевдоним для удобства обращения

Пример простейшего запроса к справочнику Номенклатура:

ВЫБРАТЬ

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

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

ИЗ

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

⚠️ Внимание: В нельзя использовать сокращенные названия таблиц без указания типа объекта (например, просто Номенклатура вместо Справочник.Номенклатура). Это приведет к ошибке компиляции запроса.

2. Типы таблиц, доступных в запросах 1С

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

Тип таблицы Описание Пример синтаксиса
Справочники Хранят постоянную информацию (товары, контрагенты, сотрудники) Справочник.Контрагенты
Документы Содержат данные о бизнес-событиях (заказы, платежи, поступления) Документ.ЗаказПокупателя
Регистры Хранят данные для аналитики (остатки, обороты, накопления) РегистрНакопления.ТоварыНаСкладах
Виртуальные таблицы Специальные представления данных (остатки, обороты по периодам) РегистрНакопления.ТоварыНаСкладах.Остатки
Временные таблицы Промежуточные данные, создаваемые в процессе выполнения запроса #ВременнаяТаблица

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

ВЫБРАТЬ

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

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

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(

&ДатаОстатков,

Склад = &ТекущийСклад

) КАК ОстаткиТоваров

⚠️ Внимание: Виртуальные таблицы могут значительно нагружать сервер при больших объемах данных. Всегда ограничивайте период выборки параметрами и используйте индексированные поля в условиях отбора.
📊 Какой тип таблиц вы используете чаще всего в запросах 1С?
Справочники
Документы
Регистры
Виртуальные таблицы
Временные таблицы

3. Обращение к полям таблиц: синтаксис и особенности

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

Основные правила:

  • 🔹 Поля указываются через точку после имени таблицы: Таблица.Поле
  • 🔹 Можно использовать псевдонимы для полей с ключевым словом КАК
  • 🔹 Для вычисляемых полей используется ключевое слово ВЫРАЗИТЬ
  • 🔹 Системные поля (например, Ссылка) доступны для всех объектов

Примеры обращения к полям:

-- Простое обращение к полю

ВЫБРАТЬ

Контрагенты.Наименование

-- С псевдонимом

ВЫБРАТЬ

Контрагенты.Наименование КАК НазваниеКонтрагента

-- Вычисляемое поле

ВЫБРАТЬ

ВЫРАЗИТЬ(Документы.СуммаДокумента * 1.2 КАК ЧИСЛО(15,2)) КАК СуммаСНДС

Особенности работы с полями разных типов:

  • 📁 Для справочников доступны поля: Ссылка, Наименование, ПометкаУдаления и пользовательские реквизиты
  • 📄 Для документов дополнительно доступны: Дата, Номер, Проведен
  • 📊 Для регистров поля зависят от структуры регистра (ресурсы, измерения, реквизиты)
💡

Используйте псевдонимы для полей с длинными именами — это сделает запрос более читаемым и упростит дальнейшую работу с результатом выборки.

4. Соединение таблиц в запросах (JOIN)

В реальных задачах часто требуется получить данные из нескольких таблиц одновременно. Для этого в используются соединения (аналог JOIN в SQL). Рассмотрим основные типы соединений и их синтаксис.

Базовый синтаксис соединения:

ВЫБРАТЬ

[Поля]

ИЗ

Таблица1 КАК Т1

[ТипСоединения] Таблица2 КАК Т2

ПО Т1.Поле1 = Т2.Поле2

Типы соединений в :

  • 🔗 ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN) — возвращает все записи из левой таблицы
  • 🔗 ВНУТРЕННЕЕ СОЕДИНЕНИЕ (INNER JOIN) — возвращает только совпадающие записи
  • 🔗 ПОЛНОЕ СОЕДИНЕНИЕ (FULL JOIN) — возвращает все записи из обеих таблиц
  • 🔗 ПРАВОЕ СОЕДИНЕНИЕ (RIGHT JOIN) — возвращает все записи из правой таблицы

Практический пример соединения справочника Номенклатура с документом ПоступлениеТоваров:

ВЫБРАТЬ

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

Поступление.Количество КАК Колво,

Поступление.Цена КАК Цена

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК Поступление

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

ГДЕ

Поступление.Ссылка В (&СписокДокументов)

⚠️ Внимание: При соединении таблиц с большим количеством записей всегда указывайте условия отбора в секции ГДЕ, чтобы избежать полного сканирования таблиц. Это критично для производительности.

Указаны ли условия соединения (ПО)?|Добавлены ли условия отбора (ГДЕ)?|Используются ли индексированные поля в условиях?|Ограничен ли период выборки для временных данных?-->

5. Работа с виртуальными таблицами: остатки, обороты, срезы

Виртуальные таблицы — одно из самых мощных средств для анализа данных. Они позволяют получать агрегированную информацию без написания сложных запросов с группировкой и вычислениями. Рассмотрим основные виды виртуальных таблиц и их применение.

Основные типы виртуальных таблиц:

  • 📈 .Остатки() — остатки на указанную дату
  • 🔄 .Обороты() — обороты за период
  • 📊 .ОстаткиИОбороты() — комбинированные данные
  • 📌 .СрезПоследних() — последние значения по измерениям

Пример получения остатков товаров на складе:

ВЫБРАТЬ

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

ОстаткиТоваров.КоличествоОстаток КАК Остаток,

ОстаткиТоваров.СуммаОстаток КАК Сумма

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(

&ДатаОстатков,

Склад В (&СписокСкладов)

) КАК ОстаткиТоваров

Важно: Виртуальные таблицы .Остатки() и .Обороты() поддерживают параметры для фильтрации данных прямо в вызове таблицы. Это позволяет значительно оптимизировать запрос, так как фильтрация происходит на уровне СУБД, а не в памяти 1С.

Пример с дополнительными параметрами:

ВЫБРАТЬ

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

ОборотыТоваров.КоличествоПриход КАК Приход,

ОборотыТоваров.КоличествоРасход КАК Расход

ИЗ

РегистрНакопления.ТоварыНаСкладах.Обороты(

ДатаНачала = &ДатаНачала,

ДатаОкончания = &ДатаОкончания,

Номенклатура В (&СписокТоваров),

Склад = &ОсновнойСклад

) КАК ОборотыТоваров

Как работают виртуальные таблицы под капотом?

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

6. Временные таблицы: создание и использование

Временные таблицы в позволяют сохранять промежуточные результаты запросов для дальнейшего использования. Это особенно полезно для сложных отчетов, где нужно выполнять несколько этапов обработки данных. Временные таблицы создаются с помощью ключевого слова ВТ (или TEMP TABLE в англоязычной версии).

Пример создания и использования временной таблицы:

// Создание временной таблицы

ВЫБРАТЬ

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

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

ПОМЕСТИТЬ ВТТовары

ИЗ

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

ГДЕ

Номенклатура.ЭтоГруппа = ЛОЖЬ;

// Использование временной таблицы в другом запросе

ВЫБРАТЬ

Товары.Наименование КАК Товар,

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

ИЗ

ВТТовары КАК Товары

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

&ТекущаяДата

) КАК Остатки

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

Особенности работы с временными таблицами:

  • 🕒 Существуют только в течение одного сеанса работы с базой
  • 🔄 Можно использовать в нескольких запросах подряд
  • 🗑️ Автоматически удаляются после завершения транзакции или сеанса
  • 📊 Поддерживают индексы (можно создавать с ключевым словом ИНДЕКСИРОВАТЬ ПО)
💡

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

7. Типичные ошибки при обращении к таблицам и как их избежать

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

Частые ошибки:

  • Неуказанный тип объекта — вместо Справочник.Контрагенты пишут просто Контрагенты
  • Опечатки в именах полей — например, Наименование вместо Наименование
  • Отсутствие условий отбора — запрос возвращает миллионы записей
  • Неправильные соединения — используют ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо ЛЕВОГО
  • Игнорирование типов данных — сравнивают число со строкой

Примеры ошибок и их исправление:

Ошибка Неправильный код Правильный код
Неуказанный тип объекта ВЫБРАТЬ Наименование ИЗ Контрагенты ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты
Опечатка в имени поля ВЫБРАТЬ Контрагенты.Наименование ВЫБРАТЬ Контрагенты.Наименование
Отсутствие условий отбора ВЫБРАТЬ * ИЗ Документ.ЗаказПокупателя ВЫБРАТЬ * ИЗ Документ.ЗаказПокупателя ГДЕ Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
⚠️ Внимание: При работе с виртуальными таблицами обязательно указывайте параметры отбора (дату, склад, номенклатуру и т.д.). Виртуальная таблица без параметров может попытаться обработать все движения за всю историю, что приведет к зависанию сервера.

8. Оптимизация запросов с таблицами

Производительность запросов в напрямую зависит от того, как вы обращаетесь к таблицам. Следующие рекомендации помогут ускорить выполнение запросов и снизить нагрузку на сервер:

Основные правила оптимизации:

  • ⚡ Используйте индексированные поля в условиях ГДЕ и ПО
  • ⚡ Ограничивайте период выборки для виртуальных таблиц
  • ⚡ Избегайте ВЫБРАТЬ * — указывайте только необходимые поля
  • ⚡ Используйте временные таблицы для сложных отчетов
  • ⚡ Применяйте РАЗЛИЧНЫЕ для устранения дублей
  • ⚡ Разбивайте сложные запросы на несколько простых

Пример оптимизированного запроса:

ВЫБРАТЬ РАЗЛИЧНЫЕ

Заказы.Контрагент КАК Контрагент,

СУММА(Заказы.СуммаДокумента) КАК Итого

ИЗ

Документ.ЗаказПокупателя КАК Заказы

ГДЕ

Заказы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

И Заказы.Склад = &ОсновнойСклад

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

Заказы.Контрагент

Для анализа производительности запросов в можно использовать:

  • 🔍 План выполнения запроса (доступен в консоли запросов)
  • 🔍 Технологический журнал (для анализа долгих операций)
  • 🔍 Монитор производительности (встроенный в платформу)
💡

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

FAQ: Частые вопросы по работе с таблицами в запросах 1С

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

Для обращения к табличной части документа используйте синтаксис: Документ.ИмяДокумента.ИмяТабличнойЧасти. Например, для табличной части "Товары" в документе "ПоступлениеТоваров":

ВЫБРАТЬ

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

ПоступлениеТовары.Количество

ИЗ

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

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

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

ВЫБРАТЬ

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

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

Обороты.КоличествоПриход КАК ПриходЗаПериод

ИЗ

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

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

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

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

Список доступных полей зависит от структуры регистра. Чтобы увидеть все поля виртуальной таблицы:

  1. Откройте консоль запросов (Ctrl+Shift+Q)
  2. Начните вводить имя виртуальной таблицы — система покажет доступные поля
  3. Или выполните запрос ВЫБРАТЬ ПЕРВЫЕ 0 * ИЗ РегистрНакопления.ИмяРегистра.Остатки() — в сообщении об ошибке будет список полей
Почему запрос к виртуальной таблице выполняется очень долго?

Основные причины медленной работы:

  • 🐢 Слишком большой период выборки (не указаны даты или указан слишком большой интервал)
  • 🐢 Отсутствуют условия отбора по измерениям регистра
  • 🐢 Виртуальная таблица рассчитывается для всех складов/номенклатуры без фильтра
  • 🐢 Недостаточно индексов на полях, используемых в условиях

Решение: всегда ограничивайте период и добавляйте условия отбора. Например:

РегистрНакопления.Товары.Остатки(

&ТекущаяДата,

Склад = &НужныйСклад,

Номенклатура В (&СписокТоваров)

)

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

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

ВЫБРАТЬ

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

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

ПОМЕСТИТЬ ВТТовары

ИНДЕКСИРОВАТЬ ПО

Ссылка,

Артикул

ИЗ

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

Индексы особенно полезны, если вы планируете соединять временную таблицу с другими таблицами по индексированным полям.