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

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

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

Базовый синтаксис и структура команды

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

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

Рассмотрим простейший пример получения списка номенклатуры. Здесь мы обращаемся к справочнику и выбираем только нужные реквизиты:

ВЫБРАТЬ

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

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

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

ИЗ

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

Использование псевдонимов (в примере это КАК Номенклатура) является хорошей практикой. Оно делает код читаемым и позволяет сократить длину запроса при обращении к полям. Без псевдонима вам пришлось бы писать полное имя объекта метаданных перед каждым полем, что усложняет поддержку кода.

⚠️ Внимание: При написании запроса вручную всегда проверяйте наличие точки с запятой в конце команды. Хотя в некоторых контекстах 1С прощает её отсутствие, явное указание разделителя предотвращает ошибки при объединении нескольких запросов в один пакет.

💡

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

Использование Конструктора запросов

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

Чтобы открыть конструктор в режиме Предприятия, достаточно нажать кнопку "Конструктор запроса" в панели инструментов окна запроса или использовать сочетание клавиш. В режиме Конфигуратора доступ к нему осуществляется через контекстное меню редактора кода. Интерфейс разделен на несколько вкладок, отвечающих за разные части SQL-подобной команды.

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

  • 📁 Вкладка "Поля" позволяет выбирать конкретные реквизиты для вывода в результат.
  • 🔍 Вкладка "Отбор" предназначена для задания условий фильтрации (аналог WHERE).
  • 📊 Вкладка "Упорядочивание" определяет сортировку итоговой выборки.
  • 🔗 Вкладка "Объединение" используется для работы с несколькими источниками (UNION).

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

📊 Каким способом вы чаще всего пишете запросы?
Только вручную
Только конструктором
Сначала конструктор, потом правка руками
Копирую из старых отчетов

Фильтрация данных и работа с условиями

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

Условия могут быть простыми, например, проверка на равенство, или сложными, включающими логические операторы И, ИЛИ, НЕ. Платформа 1С позволяет использовать параметры в запросах, что делает их универсальными и безопасными от SQL-инъекций. Параметры передаются из кода встроенного языка перед выполнением команды.

Рассмотрим пример выборки документов за конкретный период и с определенным статусом проведения. Здесь мы используем параметры &НачалоПериода и &КонецПериода, значения которых будут подставлены из переменных 1С:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Дата

ИЗ

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

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

И РеализацияТоваровУслуг.Проведен = ИСТИНА

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

Особенности работы с NULL

В 1С пустое значение ссылки не равно NULL в понимании SQL. Для проверки на заполненность используйте конструкцию "ЕСТЬ NULL" или функцию "НЕ ЗНАЧЕНИЕЗаполнено()".

Соединение таблиц и работа с подзапросами

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

Левое соединение (LEFT JOIN) является наиболее популярным. Оно возвращает все записи из левой таблицы и соответствующие им записи из правой. Если соответствия нет, поля правой таблицы будут пустыми. Это критически важно при построении отчетов, где нужно показать все объекты, даже если у них нет связанных движений или документов.

Подзапросы позволяют выполнять выборку внутри выборки. Они заключаются в скобки и могут использоваться в секции ВЫБРАТЬ или ИЗ. Подзапросы незаменимы, когда нужно получить агрегированные данные (например, сумму продаж) для каждой строки основного запроса без группировки всего результата.

Тип соединения Описание поведения Когда использовать
Внутреннее Только совпадающие записи из обеих таблиц Когда нужны только связанные данные (например, товары в чеке)
Левое Все из левой + совпадения из правой Отчеты по всем контрагентам, даже без сделок
Полное Все записи из обеих таблиц Сравнение двух независимых списков на различия
Правое Все из правой + совпадения из левой Редко, аналогично левому с перестановкой таблиц

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

⚠️ Внимание: Избегайте использования подзапросов в секции ВЫБРАТЬ для больших выборок. Это может привести к выполнению подзапроса для каждой строки результата, что критически замедляет работу. Лучше использовать соединения или временные таблицы.

Группировка и агрегатные функции

Для формирования итоговых отчетов необходимо уметь группировать данные и вычислять суммы, количества и средние значения. В языке запросов 1С за это отвечает секция СГРУППИРОВАТЬ ПО и набор агрегатных функций.

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

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

ВЫБРАТЬ

Менеджеры.Наименование КАК Менеджер,

СУММА(Продажи.Сумма) КАК ОбщаяВыручка

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Менеджеры

ПО Продажи.Ответственный = Менеджеры.Ссылка

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

Менеджеры.Наименование

Функция ЕСТЬNULL часто используется в сочетании с группировкой, чтобы заменить пустые значения на ноль или дефолтное текстовое значение. Это делает отчеты более презентабельными и удобными для анализа пользователем.

💡

Порядок полей в секции СГРУППИРОВАТЬ ПО не влияет на результат, но для читаемости кода рекомендуется располагать их в том же порядке, в котором они идут в секции ВЫБРАТЬ.

Оптимизация и отладка запросов

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

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

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

  • 🚀 Избегайте функций в условиях отбора (ГДЕ), если они применяются к полям таблицы. Это отключает использование индексов.
  • 📉 Не выбирайте лишние поля. Чем меньше данных передается между сервером и клиентом, тем быстрее работает система.
  • 🔎 Используйте индексирование для полей, по которым часто производится поиск и отбор.

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

⚠️ Внимание: Интерфейс и точные названия функций могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие и используемой СУБД (MS SQL, PostgreSQL, Oracle). Всегда сверяйтесь с официальной документацией для вашей конкретной версии, если сталкиваетесь с неожиданным поведением.

☑️ Чек-лист оптимизации запроса

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

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

Как передать параметр в запрос из кода 1С?

Для передачи параметров используется объект Запрос. Сначала вы создаете объект запроса с текстом команды. Затем методом УстановитьПараметр присваиваете значения именам параметров, указанным в тексте (без знака амперсанда). Пример: Запрос.УстановитьПараметр("НачалоПериода", ДатаНачала);. Только после установки всех параметров вызывается метод Выполнить().

В чем разница между Виртуальными таблицами и обычными?

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

Почему запрос работает медленно на большой базе?

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

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

Теоретически можно подключиться к СУБД (MS SQL, PostgreSQL) сторонним инструментом, но это крайне не рекомендуется. Прямой обход механизма 1С нарушает целостность данных, игнорирует блокировки платформы и виртуальные таблицы. Все взаимодействия должны осуществляться только через встроенный язык 1С.

Как отладить ошибку в тексте запроса?

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