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

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

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

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

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

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

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

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

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

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

 

ВЫБРАТЬ

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

ИЗ

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

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

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

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

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

ВЫБРАТЬ

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

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

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

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

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

ИЗ

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

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

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

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

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

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

 

ВЫБРАТЬ

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

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

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

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

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

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

ИЗ

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

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

 

ВЫБРАТЬ

ВЫБОР

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

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

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

ВЫБОР

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

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

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

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

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

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

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

ИЗ

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

ГДЕ

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

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

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

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

Неправильно

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

 
Правильно

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

 

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

 

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

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

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

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

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

 

ВЫБРАТЬ

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

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

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

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

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

ИЗ

(ВЫБРАТЬ

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

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

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

ИЗ

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

ГДЕ

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

 

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

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

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

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

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

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

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

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

ИЗ

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

ГДЕ

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

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

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

 

ВЫБРАТЬ

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

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

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

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

ИЗ

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

ГДЕ

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

 

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

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

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

 

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

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

;

 

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

ВЫБРАТЬ

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

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

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

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

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

ИЗ

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

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

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

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

(ВЫБРАТЬ

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

ИЗ

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор:

См. также

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

сегодня в 11:30    76    e_ivanova    0       

1

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

28.04.2026    263    ebaskakova    0       

1

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

24.04.2026    701    e_ivanova    1       

16

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

23.04.2026    503    ebaskakova    0       

15

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

16.04.2026    843    ZasukhaIV    0       

15

1С остается одной из самых стабильных точек входа в ИТ, но новичку сложно понять, куда идти – в аналитику или разработку. Разбираем различия, требования и варианты роста, чтобы выбрать направление осознанно.

08.04.2026    906    ZasukhaIV    1       

15

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

06.04.2026    611    Alice_Brineva    0       

15

Что должен уметь аналитик 1С, чтобы решать задачи бизнеса без лишних доработок и говорить с разработчиками на одном языке? Разбираем ключевые навыки и типовые запросы клиентов.

02.04.2026    1338    ZasukhaIV    0       

14

Комментарии

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

про запросы всегда обычно так:
"Непавильно" + "Правильно".
и можно менять местами, несколько раз.
смысл не изменится :)
Трактор; +1 Ответить
2. pbelousov 30.04.26 18:07 Сейчас в теме
вот последний пример:
1. чем вам помешал вложенный запрос, конкретно? вернее, чего вы добились, переписав ?
2. что вам даст индексация номенклатуры? как изменится механизм выборки данных, соединения?
3. NeLyubluSKD 30.04.26 18:13 Сейчас в теме
А меня позабавило ВЫБОР КОГДА ... ССЫЛКА ТОГДА ВЫРАЗИТЬ()
Это зачем? Достаточно просто ВЫРАЗИТЬ, а он там сам сообразит, какие таблицы приклеивать
Трактор; +1 Ответить
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х раз.
Ну, предположим что обычно по Код есть индекс, а вот на поле ЦенаПродажи индексы обычно никогда не ставят. Получится что в первом случае будет сканирование один раз всей таблицы. В оптимизированном случае будет выборка по индексу (быстро) и полное сканирование, итого все равно чуть дольше чем варианте без оптимизации.

На одной из конференций я про подобные мифы делал практический мастер класс, видимо авторы его пропустили.
Для отправки сообщения требуется регистрация/авторизация