Работа с данными является фундаментом любой конфигурации на платформе 1С Предприятие. Понимание того, как сделать запросы в 1С, разделяет простого пользователя и квалифицированного разработчика, способного создавать сложные отчеты и обработки. Язык запросов 1С — это мощный инструмент, синтаксис которого напоминает SQL, но имеет свои уникальные особенности, адаптированные под объектную модель платформы.
В отличие от стандартного SQL, где вы работаете напрямую с таблицами базы данных, в 1С вы обращаетесь к метаобъектам конфигурации. Это означает, что вам не нужно знать физическую структуру таблиц в СУБД, достаточно понимать логическую структуру метаданных. Правильно составленный запрос гарантирует не только получение верных данных, но и высокую производительность системы даже при работе с миллионами записей.
Основы синтаксиса и структура запроса
Любой запрос начинается с ключевого слова ВЫБРАТЬ, за которым следует перечень полей, которые необходимо получить. Далее указывается источник данных с помощью ключевого слова ИЗ. Это помогает избежать конфликтов с зарезервированными словами системы.
Для фильтрации результатов используется блок ГДЕ, который позволяет накладывать условия на отбираемые записи. Вы можете комбинировать условия с помощью логических операторов И, ИЛИ и НЕ. Также часто возникает необходимость в сортировке данных, которая реализуется через конструкцию УПОРЯДОЧИТЬ ПО. Без явного указания сортировки порядок записей в выборке не гарантируется и зависит от индексов базы данных.
Рассмотрим базовую структуру простейшего выборочного запроса к справочнику номенклатуры:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
УПОРЯДОЧИТЬ ПО
Номенклатура.Наименование
В данном примере мы обращаемся к виртуальной таблице справочника. Обратите внимание на псевдоним КАК Номенклатура, который упрощает дальнейшее написание кода. Использование псевдонимов обязательно, если вы работаете с несколькими таблицами или если имя таблицы слишком длинное. Синтаксический анализатор платформы автоматически проверяет корректность написания таких конструкций перед выполнением.
⚠️ Внимание: Имена полей в запросе должны точно совпадать с именами полей в конфигураторе. Если вы переименуете поле в метаданных, но забудете обновить текст запроса, система выдаст ошибку компиляции.
Использование конструктора запросов
Для тех, кто только начинает осваивать платформу или хочет ускорить процесс написания кода, встроенный конструктор запросов является незаменимым помощником. Он позволяет визуально формировать структуру запроса, выбирать поля из дерева метаданных и настраивать соединения без ручного ввода текста. Это существенно снижает риск возникновения опечаток в именах полей.
Чтобы открыть конструктор, достаточно нажать комбинацию клавиш Ctrl+Shift+Q в модуле объекта или в окне запроса. Интерфейс разделен на несколько вкладок: выбор полей, настройка соединений, условия отбора и сортировка. Вкладка "Поля" позволяет перетаскивать необходимые атрибуты из левой панели в правую, формируя список выборки. Система автоматически подставляет необходимые псевдонимы и имена таблиц.
Используйте кнопку "Проверить" в конструкторе запросов перед вставкой кода в модуль. Это позволит отловить синтаксические ошибки и убедиться, что все поля доступны в текущей версии конфигурации.
Особое внимание следует уделить вкладке "Соединения". Именно здесь настраиваются связи между таблицами. Конструктор автоматически предлагает возможные связи на основе настроек метаданных, но разработчик должен понимать их логический смысл. Неправильно выбранное соединение может привести к потере данных или, наоборот, к их дублированию в результирующей выборке.
- 🔍 Визуализация связей: Конструктор наглядно показывает линии соединений между таблицами, что упрощает понимание логики выборки.
- ⚡ Автогенерация кода: После настройки всех параметров инструмент генерирует готовый текст запроса, который можно сразу скопировать в код.
- 🛠 Работа с виртуальными таблицами: Инструмент корректно обрабатывает параметры виртуальных таблиц регистров, предлагая ввести необходимые значения.
Несмотря на удобство конструктора, опытные разработчики часто редактируют текст запроса вручную для тонкой оптимизации. Конструктор может добавлять избыточные поля или использовать не самые эффективные типы соединений по умолчанию. Поэтому знание ручного синтаксиса остается обязательным навыком.
Работа с соединениями таблиц
Одной из самых сложных тем для новичков является правильное построение соединений (ЛЕВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ). Выбор типа соединения напрямую влияет на количество строк в результате. Внутреннее соединение оставляет только те записи, для которых есть соответствие в обеих таблицах. Если в правой таблице нет matching записи, строка из левой таблицы будет исключена из результата.
В отличие от него, левое соединение сохраняет все записи из левой таблицы, даже если для них нет соответствия в правой. В полях правой таблицы в таком случае будут значения NULL (или ЕСТЬNULL). Это критически важно при построении отчетов, где нужно показать все документы, даже если к ним не привязаны какие-либо дополнительные данные, например, комментарии или файлы.
Рассмотрим пример соединения документа "Реализация" со справочником "Контрагенты". Нам нужно вывести все реализации, даже если карточка контрагента по каким-то причинам не найдена (хотя в 1С это редкость из-за жестких ссылок, но в аналитических разрезах бывает полезно):
ВЫБРАТЬ
Реализации.Ссылка КАК Документ,
Реализации.Дата,
Контрагенты.Наименование КАК Партнер
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализации
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Реализации.Контрагент = Контрагенты.Ссылка
При использовании нескольких соединений порядок их следования имеет значение для читаемости, но оптимизатор 1С старается выстроить их наиболее эффективным способом. Однако в сложных случаях с большим количеством таблиц рекомендуется явно указывать порядок через скобки или использовать временные таблицы для промежуточных результатов.
| Тип соединения | Описание поведения | Когда использовать |
|---|---|---|
| ВНУТРЕННЕЕ | Только совпадающие записи из обеих таблиц | Когда нужны только полные данные (например, товары с ценами) |
| ЛЕВОЕ | Все записи левой таблицы + совпадения правой | Когда нужно показать все документы, даже без доп. информации |
| ПРАВОЕ | Все записи правой таблицы + совпадения левой | Редко используется, обычно заменяется на ЛЕВОЕ с перестановкой таблиц |
| ПОЛНОЕ | Все записи из обеих таблиц | Для сравнения двух списков и поиска различий |
⚠️ Внимание: При использовании соединений убедитесь, что поля, по которым идет соединение (
ПО), проиндексированы. Отсутствие индекса на полях соединения может привести к полному сканированию таблиц и сильному торможению системы.
Параметризация и временные таблицы
В реальных задачах редко когда требуется выгрузить абсолютно все данные из базы. Чаще всего запрос должен быть гибким и реагировать на ввод пользователя. Для этого используются параметры запроса. Они обозначаются символом & перед именем параметра. Значения параметрам присваиваются через объект Запрос.УстановитьПараметр перед выполнением.
Параметризация не только делает код универсальным, но и повышает производительность. План выполнения запроса с параметрами может кэшироваться сервером, что ускоряет повторные запуски с новыми значениями. Кроме того, это защищает от ошибок, связанных с экранированием специальных символов в строках.
Как передать структуру в параметр?
Вы можете передать в параметр запроса не только простые типы (Число, Строка, Дата), но и сложные объекты, например, Массив или Таблицу Значений. Это позволяет использовать оператор "В" со списком значений, переданных из кода 1С.
Если логика выборки становится слишком сложной для одного запроса, или если требуется многократное использование промежуточного результата, применяются временные таблицы. Они создаются с помощью слова ПОМЕСТИТЬ в начале запроса. Временная таблица существует только в рамках текущей сессии пользователя и автоматически удаляется после завершения сеанса или явного удаления.
Использование временных таблиц позволяет разбить сложный запрос на этапы. На первом этапе вы отбираете и агрегируете данные, помещая их во временную таблицу. На втором этапе вы работаете уже с этой таблицей, выполняя соединения и группировки. Это часто ускоряет работу, так как объем данных для последующих операций уменьшается.
- 📉 Снижение нагрузки: Промежуточная фильтрация данных уменьшает объем информации, участвующей в тяжелых соединениях.
- 🔄 Многократное использование: Результат первого этапа можно использовать в нескольких последующих запросах без повторного обращения к основным таблицам.
- 🧩 Упрощение отладки: Легче проверить корректность данных на каждом этапе сложной обработки отдельно.
Пример создания временной таблицы с отбором по периоду:
ПОМЕСТИТЬ ВТ_Продажи
ВЫБРАТЬ
Продажи.Номенклатура,
СУММА(Продажи.Количество) КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода,,) КАК Продажи
ГДЕ
Продажи.КоличествоОборот > 0
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура
Агрегация данных и группировка
Для построения отчетов и сводных данных необходимо уметь агрегировать информацию. В языке запросов 1С для этого используются специальные функции: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ. Применение этих функций требует обязательного использования конструкции СГРУППИРОВАТЬ ПО, в которой перечисляются все поля выборки, не являющиеся агрегатными.
Например, если вы хотите получить общую сумму продаж по каждому менеджеру, вы должны сгруппировать данные по полю "Менеджер", а сумму посчитать через функцию СУММА. Попытка выбрать поле "Дата" без включения его в группировку или без применения агрегатной функции приведет к ошибке выполнения запроса.
Оператор "ИТОГЫ" позволяет получать промежуточные и общие итоги прямо на уровне запроса, без необходимости дополнительной обработки в коде 1С. Это особенно полезно для отчетов с иерархической структурой, где нужно видеть подытоги по группам номенклатуры или подразделениям.
При работе с агрегацией важно учитывать тип данных. Суммирование стрковых полей невозможно, а попытка усреднить дату может дать непредсказуемый результат. Всегда проверяйте типы полей в конфигураторе перед написанием формул агрегации.
Использование оператора "ИТОГЫ" с указанием полей группировки позволяет получить дерево итогов (подитоги) за один проход по данным, что значительно быстрее, чем вычислять их в цикле на клиенте.
Оптимизация и частые ошибки
Написание работающего запроса — это только половина дела. Запрос должен работать быстро. Главная причина медленной работы — отсутствие индексов на полях, используемых в условиях отбора (ГДЕ) и соединения (ПО). Если вы фильтруете по полю, которое не индексировано, 1С будет вынуждена перебирать все записи таблицы, что при больших объемах данных приводит к зависанию системы.
Еще одна распространенная ошибка — использование функций в условиях отбора. Например, конструкция ГДЕ ГОД(Дата) = 2026 является неоптимальной, так как функция применяется к каждой строке, что отключает использование индекса по дате. Правильнее писать диапазон дат: ГДЕ Дата >= НачалоГода(2026) И Дата < НачалоГода(2026).
Также стоит избегать выборки лишних полей. Конструкция ВЫБРАТЬ * (хотя в 1С это выглядит как перечисление всех полей) загружает в память больше данных, чем требуется. Если вам нужно только наименование и цена, не выбирайте реквизиты, комментарии и картинки. Это увеличивает трафик между сервером и клиентом.
⚠️ Внимание: Интерфейс и возможности конструктора запросов могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие (8.3, 8.4 и новее). Всегда сверяйтесь с синтаксическим помощником вашей конкретной версии для уточнения новых функций.
☑️ Чек-лист оптимизации запроса
FAQ: Часто задаваемые вопросы
Как сделать запрос к регистру сведений с периодическим срезом?
Для получения актуальных данных на конкретную дату из периодического регистра сведений используйте виртуальную таблицу СрезПоследних. В запросе это записывается как РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата) КАК Цены. Вы также можете передать дополнительные отборы прямо в параметры виртуальной таблицы.
Можно ли выполнить запрос из внешнего источника данных?
Да, платформа 1С поддерживает подключение к внешним источникам данных (ODBC, OLEDB, MS SQL и др.). Для этого используется объект ПодключениеВнешнегоИсточникаДанных. Однако синтаксис запроса в этом случае будет зависеть от типа внешней СУБД, а не от языка запросов 1С.
Почему запрос возвращает пустую выборку, хотя данные есть?
Наиболее частая причина — несовпадение типов данных в условии соединения или отбора. Например, попытка сравнить ссылку на элемент справочника с UUID в строковом формате без приведения типов. Также проверьте права доступа пользователя: возможно, у него нет прав на чтение данной таблицы.
Как передать список значений в параметр запроса?
Создайте объект ТаблицаЗначений или Массив в коде 1С, заполните его и передайте в параметр запроса. В тексте запроса используйте конструкцию ГДЕ Поле В (&ПараметрСписка). Это эффективнее, чем формировать длинную строку с перечислением значений через запятую.