В процессе разработки и администрирования конфигураций на платформе 1С:Предприятие 8 программисты и аналитики часто сталкиваются с необходимостью глубокого понимания того, как система взаимодействует с базой данных. Платформа автоматически транслирует код на языке запросов 1С в нативный SQL-язык конкретной СУБД (MS SQL, PostgreSQL, Oracle). Однако "читать" запросы в 1С — это не просто смотреть на сгенерированный SQL-код, а понимать логику построения выборки, порядок соединений таблиц и использование индексов.

Умение анализировать запросы критически важно для оптимизации производительности. Медленные отчеты, долгие проведения документов и "тормоза" интерфейса часто вызваны некорректно построенными выборками данных. Для диагностики используется встроенный инструмент — Консоль запросов, который позволяет выполнять произвольные запросы к текущей базе данных, просматривать структуру таблиц и анализировать план выполнения.

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

Запуск и настройка Консоли запросов

Основным инструментом для работы с запросами является Консоль запросов. Запустить её можно непосредственно из конфигуратора или в режиме Предприятия, если у пользователя есть соответствующие права. В режиме Предприятия доступ к консоли часто ограничен политиками безопасности, поэтому для глубокого анализа лучше использовать режим отладки или конфигуратор с правами администратора базы данных.

Для запуска в режиме Предприятия необходимо перейти в меню Сервис → Консоль запросов. Если пункт отсутствует, его можно добавить через изменение параметров запуска или использовать внешнюю обработку "Универсальный отчет" с режимом отладки. В конфигураторе консоль вызывается через меню Отладка → Консоль запросов или горячей клавишей Ctrl+Q (в зависимости от настроек).

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

💡

Используйте сочетание клавиш Ctrl+Space в поле ввода запроса для автодополнения имен таблиц и полей. Это ускоряет написание кода и снижает риск опечаток в именах объектов метаданных.

Перед началом работы убедитесь, что вы подключены к нужной базе данных. В заголовке окна консоли обычно отображается имя текущей информационной базы. Если вы работаете в распределенной информационной базе (РИБ), помните, что консоль работает только с тем узлом, к которому вы подключены в данный момент.

⚠️ Внимание: Выполнение тяжелых запросов с выборкой миллионов записей в рабочей базе в рабочее время может привести к блокировке таблиц и остановке работы других пользователей. Всегда проверяйте сложные выборки на копии базы или в нерабочее время.

Синтаксис и структура запроса 1С

Язык запросов 1С имеет свой уникальный синтаксис, который отличается от стандартного SQL, хотя и базируется на тех же принципах. Понимание ключевых конструкций необходимо для правильного "чтения" логики выборки. Запрос всегда начинается с ключевого слова ВЫБРАТЬ, за которым следует перечень полей.

Основная структура запроса включает несколько обязательных и опциональных блоков. Блок ИЗ определяет источник данных. Это может быть физическая таблица, виртуальная таблица или временная таблица, созданная ранее в тексте запроса. Блок ГДЕ содержит условия отбора записей, которые фильтруют данные до их выборки, что критически важно для производительности.

Для объединения данных из разных источников используются конструкции ЛЕВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ и другие. Чтение этих частей запроса требует понимания типов связей между таблицами. Например, левое соединение вернет все записи из левой таблицы, даже если для них нет соответствий в правой, заполняя отсутствующие значения пустыми (NULL).

  • 🔍 ВЫБРАТЬ — определяет список полей, которые будут возвращены в результат выборки.
  • 📂 ИЗ — указывает таблицу или виртуальную таблицу, из которой берутся данные.
  • 🎯 ГДЕ — задает условия фильтрации записей перед группировкой и сортировкой.
  • 📊 СГРУППИРОВАТЬ ПО — используется для агрегации данных (суммы, количества) по определенным измерениям.

Особое внимание при чтении запросов следует уделять псевдонимам. Разработчики часто присваивают таблицам и полям короткие имена для удобства, используя ключевое слово КАК. Например, конструкция Справочник.Номенклатура КАК Номенклатура позволяет далее обращаться к таблице просто как Номенклатура. Это упрощает код, но требует внимательности при анализе, чтобы не перепутать источники данных.

📊 Какой этап анализа запросов вызывает у вас наибольшие трудности?
Чтение условий соединения (JOIN)
Понимание виртуальных таблиц
Анализ плана выполнения
Написание условий отбора (WHERE)

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

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

Временная таблица создается с помощью конструкции ВЫБРАТЬ ... ПОМЕСТИТЬ ИмяТаблицы. После этого к ней можно обращаться в последующих частях запроса как к обычной таблице. Это особенно полезно, когда нужно сначала отфильтровать большой объем данных, а затем выполнить по ним сложные вычисления или соединения.

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

ВЫБРАТЬ

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

Документ.Дата

ПОМЕСТИТЬ ВТ_Документы

ИЗ

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

ГДЕ

Документ.Дата МЕЖДУ &НачДата И &КонДата

;

ВЫБРАТЬ

ВТ_Документы.Ссылка,

ТабличнаяЧасть.Номенклатура

ИЗ

ВТ_Документы КАК ВТ_Документы

ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК ТабличнаяЧасть

ПО ВТ_Документы.Ссылка = ТабличнаяЧасть.Ссылка

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

☑️ Анализ запроса с временными таблицами

Выполнено: 0 / 4

Анализ плана выполнения запроса

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

В Консоли запросов 1С можно получить план выполнения, нажав кнопку "План выполнения" или используя сочетание клавиш. План отображается в виде дерева операций. Чтение плана начинается снизу вверх или слева направо (в зависимости от визуализации), где каждая операция имеет свою стоимость.

Ключевым моментом при чтении плана является поиск операций полного сканирования таблиц (Table Scan или Clustered Index Scan). Если такая операция выполняется над большой таблицей, это часто указывает на проблему. Идеальный план должен использовать поиск по индексу (Index Seek), что позволяет базе данных сразу переходить к нужным записям, не перебирая все подряд.

Операция в плане Описание Влияние на скорость
Index Seek Поиск записей через индекс Высокая скорость (оптимально)
Table Scan Полный перебор всей таблицы Низкая скорость на больших объемах
Hash Match Соединение таблиц через хеширование Средняя/Высокая, зависит от памяти
Sort Сортировка данных в памяти или на диске Может быть ресурсоемкой

Также стоит обращать внимание на операции сортировки. Если запрос содержит конструкцию УПОРЯДОЧИТЬ ПО, а индекс по полям сортировки отсутствует, СУБД будет вынуждена выполнять явную сортировку, что требует дополнительных ресурсов процессора и памяти. Оптимизация часто заключается в добавлении индекса, покрывающего поля сортировки.

⚠️ Внимание: План выполнения может меняться в зависимости от статистики распределения данных в базе. То, что работало быстро на тестовой базе с 100 документами, может работать медленно на рабочей базе с миллионами записей из-за выбора другого плана оптимизатором.

Виртуальные таблицы и их особенности

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

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

Параметры виртуальных таблиц передаются в скобках после имени таблицы. Например, СрезПоследних(Активность = ИСТИНА). Если параметры указаны неверно или отсутствуют, запрос может вернуть некорректные данные или работать медленно, так как система не сможет использовать оптимальный алгоритм выборки.

Почему виртуальные таблицы быстрее ручных запросов?

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

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

Типичные ошибки и методы оптимизации

Чтение запросов часто выявляет типовые ошибки, которые допускают разработчики. Одной из самых распространенных проблем является отсутствие условий отбора по полям, входящим в индекс. Если в блоке ГДЕ нет фильтрации по ключевым полям, индекс не будет использован, и произойдет полное сканирование.

Еще одна частая ошибка — использование функций в условиях отбора. Например, конструкция ГДЕ ГОД(Дата) = 2026 препятствует использованию индекса по полю Дата. Оптимизатор не может применить индекс к результату функции. Правильным подходом будет использование диапазона: ГДЕ Дата МЕЖДУ '2026.01.01' И '2026.12.31'.

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

  • Избегайте функций в левой части условий сравнения (например, ЛЕВЫЙ(Код, 2) = '01').
  • Используйте диапазоны значений для дат и чисел вместо функций извлечения частей значения.
  • 🚀 Проверяйте наличие индексов по полям, участвующим в соединениях (JOIN) и отборе (WHERE).
💡

Главное правило оптимизации: Условия отбора должны быть максимально селективными и использовать индексируемые поля в "чистом" виде, без обертывания в функции.

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

Часто задаваемые вопросы (FAQ)

Как посмотреть SQL-код, который генерирует 1С?

В Консоли запросов после формирования запроса на языке 1С можно переключиться на вкладку или режим просмотра "Текст запроса к СУБД" (зависит от версии платформы и интерфейса). Также можно включить логирование SQL-запросов в настройках сервера 1С или использовать профилировщик SQL Server Profiler для внешней СУБД.

Почему запрос в Консоли работает быстро, а в отчете медленно?

Это может быть связано с правами доступа (RLS), которые применяются в режиме Предприятия, но могут игнорироваться или иначе работать в консоли отладки. Также разница может быть в параметрах запуска: в отчете могут формироваться динамические условия, которые не используются в тестовом запросе консоли.

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

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

Можно ли изменять данные через Консоль запросов?

Нет, язык запросов 1С предназначен только для чтения данных (операция SELECT). Для изменения данных используются механизмы языка программирования 1С (объекты, движения регистров) или прямые SQL-команды через специализированные инструменты администрирования СУБД, что не рекомендуется делать напрямую из-за риска нарушения целостности данных 1С.