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

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

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

Основы синтаксиса и структура запроса

Любой запрос в 1С начинается с ключевого слова ВЫБРАТЬ. Это обязательное условие, без которого система не сможет интерпретировать ваш код. После этого слова перечисляются поля, которые необходимо получить. Синтаксис требует, чтобы каждое поле было явно указано, использование звездочки (*) для выбора всех полей недопустимо в языке запросов 1С, в отличие от стандартного SQL.

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

⚠️ Внимание: Имена полей и таблиц в запросе чувствительны к регистру только в том случае, если они содержат кириллические символы в специфических кодировках, но лучшим правилом тона считается соблюдение регистра, принятого в конфигураторе. Всегда проверяйте имена полей через автоподстановку (Ctrl+Space).

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

💡

Используйте автоподстановку полей (Ctrl+Пробел) прямо в тексте запроса. Это не только ускоряет написание кода, но и гарантирует, что вы не ошибетесь в имени поля или таблицы.

Работа с псевдонимами и именами полей

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

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

☑️ Проверка имен в запросе

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

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

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

Операторы фильтрации и группировки данных

Блок ГДЕ является сердцем любого аналитического запроса. Именно здесь происходит отсечение лишнего шума. Помимо стандартных операторов сравнения (=, <, >, <>), в 1С активно используются операторы В, ПОДОБНО и МЕЖДУ. Оператор ПОДОБНО позволяет искать строки по маске, где символ % заменяет любую последовательность символов, а _ — ровно один символ.

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

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

Разница между ГДЕ и ИМЕЮЩИЕ

Оператор ГДЕ фильтрует строки до группировки, используя индексы базы данных, что работает быстро. Оператор ИМЕЮЩИЕ фильтрует уже сгруппированные результаты в памяти, что может быть медленнее на больших объемах, но необходимо для условий по суммам и количествам.

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

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

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ возвращает только те записи, для которых нашлось совпадение в обеих таблицах. Если вы используете его, будьте осторожны: records без связанных данных будут полностью исключены из выборки. Это частая причина, почему пользователи не видят некоторые документы в отчетах — просто у них не заполнено связанное поле.

Тип соединения Левая таблица Правая таблица Результат при отсутствии совпадения
ЛЕВОЕ Все строки Только совпадающие Строка есть, поля правой таблицы пустые
ВНУТРЕННЕЕ Только совпадающие Только совпадающие Строка исключается из результата
ПОЛНОЕ Все строки Все строки Строка есть, поля отсутствующей стороны пустые
💡

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

Объединение результатов и временные таблицы

Когда необходимо собрать данные из разных источников в один результат, используется оператор ОБЪЕДИНИТЬ. Он работает аналогично SQL UNION. Система автоматически приведет типы к общим, но явное приведение типов через функцию ЕСТЬNULL или ВЫБОР часто бывает необходимым для избежания ошибок.

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

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

⚠️ Внимание: Не создавайте временные таблицы внутри циклов программы. Это приведет к резкому падению производительности. Формируйте выборку одним запросом или используйте пакетное выполнение запросов.

📊 Какой тип соединения вы используете чаще всего?
ЛЕВОЕ СОЕДИНЕНИЕ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ПОЛНОЕ СОЕДИНЕНИЕ
ПРАВОЕ СОЕДИНЕНИЕ

Оптимизация и типичные ошибки

Написание рабочего запроса — это только половина дела. Запрос должен работать быстро. Главным врагом производительности является выборка лишних полей. Никогда не выбирайте поля, которые не будут использованы в отчете или обработке. Каждое лишнее поле увеличивает объем передаваемых данных и нагрузку на сеть.

Еще одна критическая ошибка — использование функций в условиях блока ГДЕ над полями, по которым построены индексы. Например, условие ГДЕ ЛЕВЫЙ(Номенклатура.Код, 3) = "001" не сможет использовать индекс по полю Код. База данных будет вынуждена просканировать всю таблицу. Правильнее использовать диапазон: ГДЕ Номенклатура.Код НАЧАЛОСЬ("001").

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

Почему запрос тормозит?

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

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

Можно ли использовать переменные в запросе 1С?

Да, в тексте запроса можно использовать параметры, которые передаются из кода 1С. Они обозначаются знаком & (амперсанд), например, &ДатаНачала. В коде вы создаете объект ПараметрыЗапроса, присваиваете значения и передаете их методу Выполнить().

В чем разница между ВЫБРАТЬ РАЗЛИЧНЫЕ и обычным ВЫБРАТЬ?

Ключевое слово РАЗЛИЧНЫЕ убирает дубликаты строк из результата запроса. Это аналог DISTINCT в SQL. Используйте его, если в результате соединения или объединения появились повторяющиеся записи, которые нужно исключить.

Как обработать пустые значения (NULL) в запросе?

Для работы с пустыми значениями используйте функцию ЕСТЬNULL(Значение, Замена). Она проверяет, является ли значение пустым, и если да, то подставляет указанное значение замены. Это удобно для вывода "0" вместо пустой ячейки в отчетах.

Что такое виртуальные таблицы в 1С?

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