Язык запросов 1С: 5 приемов, которые оптимизируют работу с данными

Язык запросов 1С: 5 приемов, которые оптимизируют работу с данными
30.04.2026
5217

Как эффективно использовать данные в 1С и составлять высокопроизводительные запросы? Несколько рабочих приемов рассмотрим в этом материале, а еще больше нюансов работы с языком запросов – в курсе Инфостарт Обучения.

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

Рассмотрим 5 эффективных приемов использования языка запросов 1С.

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

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

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

Неправильно (условие на склад в секции ГДЕ, поэтому сначала происходит выборка всех записей и только затем фильтрация записей по заданному условию)

 

ВЫБРАТЬ

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

ИЗ

РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, ) КАК Остатки

ГДЕ

Остатки.Склад = &Склад

 
Правильно (условие на склад в параметрах виртуальной таблицы, поэтому фильтрация записей по заданному условию происходит «сразу», т.е. в момент сборки виртуальной таблицы)

 

ВЫБРАТЬ

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

ИЗ

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

Минимизация количества полей, получаемых «через точку»

В рамках языка запросов, помимо прямого доступа к полям, указанным в секции ИЗ, допускается обращение к полям связанных таблиц. Эта возможность реализуется для полей, обладающих ссылочным типом путем обращения к нужному полю «через точку» (ИмяСсылочногоПоля.ИмяСвязанногоПоля). Такая конструкция подразумевает автоматическое выполнение операции соединения с соответствующими таблицами для извлечения требуемых данных.

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

Количество полей, получаемых в запросе «через точку», необходимо минимизировать и не добавлять в запрос лишние поля, что называется, про запас. Не допускается при обращении к ссылочному полю использовать конструкции Ссылка.Ссылка

ВЫБРАТЬ

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

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

ОстаткиТоваров.Номенклатура.Ссылка КАК Номенклатура2, // неправильно

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

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

ИЗ

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

Разыменование ссылочных полей составного типа

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

Например, в конфигурации для регистра ОстаткиТоваров определены три документа-регистратора – ПоступлениеТоваров, ПродажаТоваров и ПеремещениеТоваров. Необходимо получить из регистра только те данные, которые связаны с документами ПоступлениеТоваров. Запрос, приведенный ниже, обращается к реквизитам поля составного типа Регистратор, которое может содержать ссылки на документы трех различных видов. В запросе это неявно реализуется посредством трех левых соединений с соответствующими таблицами документов.

Такая структура запроса может существенно снизить производительность. Ускорить работу запроса, уменьшив количество соединений, позволяет использование оператора ВЫРАЗИТЬ.

Неправильно (компактно, но не оптимально – происходит соединение со всеми тремя таблицами документов-регистраторов)

 

ВЫБРАТЬ

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

ОстаткиТоваров.Регистратор.Дата КАК ДатаДокумента,

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

ОстаткиТоваров.Склад КАК Склад,

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

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

ИЗ

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

 
Правильно (происходит соединение только с одной таблицей ПоступлениеТоваров)

 

ВЫБРАТЬ

ВЫБОР

КОГДА ОстаткиТоваров.Регистратор ССЫЛКА Документ.ПоступлениеТоваров

ТОГДА ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Номер

КОНЕЦ КАК НомерДокумента,

ВЫБОР

КОГДА ОстаткиТоваров.Регистратор ССЫЛКА Документ.ПоступлениеТоваров

ТОГДА ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Дата

КОНЕЦ КАК ДатаДокумента,

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

ОстаткиТоваров.Склад КАК Склад,

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

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

ИЗ

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

ГДЕ

ОстаткиТоваров.Регистратор ССЫЛКА Документ.ПоступлениеТоваров

Несмотря на то, что запрос с применением оператора ВЫРАЗИТЬ является более объемным, такой запрос будет работать значительно быстрее, т.к. здесь использовано всего одно соединение таблиц, а не три. 

Использование логического ИЛИ в условиях

Не рекомендуется использование логического ИЛИ в секции ГДЕ, так как это может стать причиной снижения производительности. Применение логического ИЛИ часто препятствует эффективному использованию индексов таблиц системой управления базами данных, что приводит к полному сканированию таблиц. Результатом данного действия становится увеличение времени выполнения запроса и повышенный риск возникновения блокировок. Вместо этого рекомендуется разделять сложные запросы на более простые и объединять их результаты.

Неправильно

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Номенклатура.Код = 1

ИЛИ Номенклатура.ЦенаПродажи > 300

 
Правильно

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Номенклатура.Код = 1

 

ОБЪЕДИНИТЬ ВСЕ

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

Соединения с вложенными запросами

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

Это правило применимо независимо от того, с какой стороны соединения находится вложенный запрос, за исключением случаев, когда вложенный запрос обрабатывает очень небольшой объем данных. Если в запросе используются соединения с вложенными запросами, это приводит к медленной и крайне нестабильной работе запроса – замедление может быть катастрофическим, снижая скорость в разы.

Использование временных таблиц в большинстве случаев обеспечивает лучшую производительность и стабильную работу запроса.

Неправильно (используется соединение с вложенным запросом)

 

ВЫБРАТЬ

ТабДокВлож.Номенклатура КАК Номенклатура,

ТабДокВлож.НоменклатураПредставление КАК НоменклатураПредставление,

ТабДокВлож.Количество КАК КоличествоВДокументе,

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

ТабРег.СтоимостьОстаток КАК Себестоимость

ИЗ

(ВЫБРАТЬ

ПродажаТовараТовары.Номенклатура КАК Номенклатура,

ПродажаТовараТовары.Номенклатура.Представление КАК НоменклатураПредставление,

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

ИЗ

Документ.ПродажаТовара.Товары КАК ПродажаТовараТовары

ГДЕ

ПродажаТовараТовары.Ссылка = &Ссылка

 

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

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

ПродажаТовараТовары.Номенклатура.Представление) КАК ТабДокВлож

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

&МоментВремени,

Номенклатура В

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

ПродажаТовараТовары.Номенклатура КАК Номенклатура

ИЗ

Документ.ПродажаТовара.Товары КАК ПродажаТовараТовары

ГДЕ

ПродажаТовараТовары.Ссылка = &Ссылка)) КАК ТабРег

ПО (ТабДокВлож.Номенклатура = ТабРег.Номенклатура)

 
Правильно (в пакетном запросе создана временная таблица ТабДокВрем, далее выполняется соединение с этой временной таблицей)

 

ВЫБРАТЬ

ПродажаТовараТовары.Номенклатура КАК Номенклатура,

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

ПродажаТовараТовары.Номенклатура.Представление КАК НоменклатураПредставление

ПОМЕСТИТЬ ТабДокВрем

ИЗ

Документ.ПродажаТовара.Товары КАК ПродажаТовараТовары

ГДЕ

ПродажаТовараТовары.Ссылка = &Ссылка

 

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

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

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

 

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

Номенклатура

;

 

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

ТабДокВрем.Номенклатура КАК Номенклатура,

ТабДокВрем.НоменклатураПредставление КАК НоменклатураПредставление,

ТабДокВрем.Количество КАК КоличествоВДокументе,

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

ТабРег.СтоимостьОстаток КАК Себестоимость

ИЗ

ТабДокВрем КАК ТабДокВрем

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

&МоментВремени,

Номенклатура В

(ВЫБРАТЬ

ТабДокВрем.Номенклатура КАК Номенклатура

ИЗ

ТабДокВрем КАК ТабДокВрем)) КАК ТабРег

ПО ТабДокВрем.Номенклатура = ТабРег.Номенклатура

 

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

Подробнее о работе с запросами – на курсе

Перечисленные приемы использования языка запросов 1С были составлены на основе типовых ошибок, которые совершают слушатели курсов Инфостарт Обучения при решении различных прикладных задач.

Освоить на практике  один из ключевых инструментов платформы «1С:Предприятие» – язык запросов – можно на онлайн-курсе «Язык запросов 1С: эффективное управление данными». За 20 академических часов слушатели пройдут путь от базового синтаксиса до оптимизации сложных выборок и работы с производительностью.

Программа курса

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

Обучение проходит в онлайн-формате с поддержкой преподавателя и возможностью задавать вопросы в процессе. Доступ к материалам сохраняется 90 дней, что позволяет пройти курс в комфортном темпе.

Кого ждем на курсе

Обучение подойдет:

  • Разработчикам 1С – освоите написание сложных и оптимизированных запросов, работу с виртуальными, вложенными и временными таблицами;
  • Внедренцам и консультантам 1С – получите инструмент для глубокого анализа данных и решения задач клиентов;
  • Аналитикам и бизнес-пользователям 1С – научитесь получать данные для управленческих решений. Освоите создание отчетов и дашбордов внутри конфигурации без постоянного привлечения разработчиков.

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

Дата: 5 мая 2026 года.

Записаться на курс

Если вам удобнее смотреть новости в телеграме, то вот наша группа – ИНФОСТАРТ.

Автор:

См. также

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

19.05.2026    237    ZasukhaIV    0       

2

Корректно настроенный обмен данными влияет на скорость работы и эффективность бизнес-процессов. Разбираем основные виды интеграций в 1С, особенности обменов между конфигурациями и внешними сервисов, а как реализовать их на практике – научим на курсе.

14.05.2026    542    ZasukhaIV    0       

3

В мае запускаются курсы по управлению требованиями в проектах автоматизации и программированию на 1С. Участников научат выстраивать работу с бизнес-процессами и разрабатывать решения на платформе 1С. Присоединяйтесь к потокам.

05.05.2026    733    Alice_Brineva    0       

1

Почему проекты «расползаются» по требованиям и как этого избежать? Разбираем пошаговый переход от бизнес-требований к системным через призму процессов. Еще больше о нюансах работы аналитика – на бесплатном мастер-классе 7 мая, присоединяйтесь!

30.04.2026    897    e_ivanova    0       

15

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

28.04.2026    709    ebaskakova    0       

16

Сегодня рассматриваем виды бизнес-требований, их взаимосвязи и подход, который помогает удерживать контур проекта и фокусироваться на целях. Еще больше о нюансах работы аналитика – на бесплатном мастер-классе 7 мая, присоединяйтесь!

24.04.2026    1140    e_ivanova    1       

17

Инфостарт открыл набор на новую волну обучения для 1С-специалистов. 5 мая начнутся потоки по 11 практическим онлайн-курсам – от вводных программ для начинающих до курсов по мобильной разработке, интеграциям и аналитике.

23.04.2026    734    ebaskakova    0       

15

Когда от заказчика звучит фраза «Мы хотим отчет», все по привычке бегут к программистам, чтобы они оперативно разработали отчет для заказчика. Но неужели нельзя обойтись без разработчиков, когда речь идет об отчете? Попробуем ответить на этот вопрос.

16.04.2026    1042    ZasukhaIV    0       

15

Комментарии

Инфостарт бот
1. pbelousov 30.04.26 17:59 Сейчас в теме
ну как обычно, ещё одна статья,
как причина похоливарить.
и сразу не поймёшь, и не сразу поймёшь,
кто прав, кто заблуждается.

про запросы всегда обычно так:
"Непавильно" + "Правильно".
и можно менять местами, несколько раз.
смысл не изменится :)
GrandGCH; thornhiven; Трактор; +3 Ответить
2. pbelousov 30.04.26 18:07 Сейчас в теме
вот последний пример:
1. чем вам помешал вложенный запрос, конкретно? вернее, чего вы добились, переписав ?
2. что вам даст индексация номенклатуры? как изменится механизм выборки данных, соединения?
5. siamagic 01.05.26 06:00 Сейчас в теме
(2)потратит время на индексирование уникальных значений ))))
3. NeLyubluSKD 30.04.26 18:13 Сейчас в теме
А меня позабавило ВЫБОР КОГДА ... ССЫЛКА ТОГДА ВЫРАЗИТЬ()
Это зачем? Достаточно просто ВЫРАЗИТЬ, а он там сам сообразит, какие таблицы приклеивать
papche; Трактор; +2 Ответить
9. triviumfan 02.05.26 10:14 Сейчас в теме
(3) вероятно, это общий пример для нескольких регистраторов.
12. fan_club_chelsea 06.05.26 06:31 Сейчас в теме
(9) в условиях есть ограничение на тип ссылки, поэтому достаточно просто "Выразить()"
4. ivanov660 30.04.26 20:32 Сейчас в теме
Вот почему до сих пор используются некие мифы? Знаменитый совет про использование ИЛИ тут звучит так - если есть "или", то разбейте на части и соедините через "объединить" и будет вам счастье. Но это не всегда верно и даже иногда вредно.
1. Самое страшное что результат запросов может быть не одинаков. Если в выборке есть повторяющиеся записи, то результаты будут отличаться, а это моветон.
Например
1 Кофе А (Код 1,ЦенаПродажи 1000)
2 Кофе Б (Код 1,ЦенаПродажи 1200)
3 Кофе В (Код 2,ЦенаПродажи 200)
Результат первого запроса: 1,2
Результат второго запроса: 1,2,1,2
т.е. использовать надо ОБЪЕДИНИТЬ вместо "ОБЪЕДИНИТЬ ВСЕ", а это уже на уровне СУБД дополнительная операция по выборке различных.
2. Если у вас нет индексов по всем полям в условии, то в первом случае СУБД один раз просканирует таблицу. А во втором она выполнит эту операцию 2 раза и еще будет объединять записи. т.е. оптимизация может быть медленнее исходно до 2х раз.
Ну, предположим что обычно по Код есть индекс, а вот на поле ЦенаПродажи индексы обычно никогда не ставят. Получится что в первом случае будет сканирование один раз всей таблицы. В оптимизированном случае будет выборка по индексу (быстро) и полное сканирование, итого все равно чуть дольше чем варианте без оптимизации.

На одной из конференций я про подобные мифы делал практический мастер класс, видимо авторы его пропустили.
Cmapnep; fan_club_chelsea; qwinter; advice_fox; triviumfan; ktb; dhurricane; sapervodichka; papche; tormozit; +10 Ответить
6. sapervodichka 01.05.26 13:54 Сейчас в теме
Курс "про высокопроизводительные запросы", а примеры приведены на уровне джунов, да ещё и не совсем правильные.
Я думаю не только, я один минус поставил.
7. gybson 01.05.26 21:08 Сейчас в теме
Можно еще вот так написать, если ИЛИ претит

ГДЕ Истина В (Номенклатура.Код = 1, Номенклатура.ЦенаПродажи > 300)
8. spyke 01.05.26 22:41 Сейчас в теме
Пункт 5 очень спорный, с точки зрения экзамена на спец по платформе и рекомендации 1с, утверждение верно. С точки зрения расходов СУБД на создание таблицы в tempdb далеко не всегда оправдано, индексировать вт тоже нужно далеко не всегда. Tempdb не редко становится узким горлышком
10. GrandGCH 02.05.26 10:56 Сейчас в теме
Вместо Выразить, ещё можно использовать явное внутреннее соединение с нужной таблицей.
Минус - это всё ещё внутреннее соединение с, потенциально, большой таблицей. Катит только для одной таблицы, для большего количества нужны объединения, что не всегда оптимально.
Плюс - секция Где перетекает в условие соединения. Поля сразу же можно брать из присоединенной таблицы без "выразить", с меньшим визуальным мусором.
11. titanium2008 03.05.26 13:50 Сейчас в теме
Очередной баян для новичков
13. fan_club_chelsea 06.05.26 06:45 Сейчас в теме
На сайте уже была статья на эту тему Правила запроса. Выдержки из книги "Настольная книга 1С:Эксперта по технологическим вопросам"
В крайнем случае, почитайте книгу.
Для отправки сообщения требуется регистрация/авторизация