Запросы 1С для начинающих: выборка, параметры и соединение таблиц

Запросы 1С для начинающих: выборка, параметры и соединение таблиц
Содержание статьи

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

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

Подготовьте учебные данные и проверьте имена

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

ТоварУчебнаяЦенаПроизводитель
Кабель500Учебная фабрика
Клавиатура1500Учебная фабрика
Монитор2400Не заполнен

Создайте производителя «Учебная фабрика» и три товара из таблицы, оставьте пометку удаления выключенной. Сравнивайте имя объекта метаданных с текстом запроса, а не только с названием пункта меню. В своей конфигурации используйте конструктор запроса: он помогает увидеть доступные таблицы, поля и связи.

Первый запрос: ВЫБРАТЬ, ИЗ и ГДЕ

ВЫБРАТЬ
    Товары.Наименование КАК Наименование,
    Товары.УчебнаяЦена КАК Цена
ИЗ
    Справочник.УчебныеТовары КАК Товары
ГДЕ
    Товары.УчебнаяЦена >= &МинимальнаяЦена
    И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
    Цена УБЫВ,
    Наименование

ВЫБРАТЬ определяет поля результата, ИЗ указывает источник, ГДЕ отбирает строки. Слово КАК задаёт псевдоним. Имя Товары сокращает обращения к источнику, а Цена становится именем колонки результата. Условие с ПометкаУдаления исключает помеченные элементы, но не удаляет их из базы.

При параметре 1500 ожидаются две строки: сначала Монитор с ценой 2400, затем Клавиатура с ценой 1500. Кабель не проходит условие. Оператор >= включает границу. Если заменить его на >, Клавиатура исчезнет. Дополнительная сортировка по наименованию делает порядок понятным при одинаковой цене, хотя полностью одинаковые наименования потребуют ещё одного ключа.

Как передать параметр и прочитать результат

Знак & в тексте обозначает параметр, а не переменную встроенного языка. Его значение нужно передать объекту Запрос до выполнения. В серверной процедуре учебной обработки поместите первый запрос в строку ТекстЗапроса, затем выполните:

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("МинимальнаяЦена", 1500);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
    Сообщить(Выборка.Цена);
КонецЦикла;

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

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

Левое соединение: не потерять товар без производителя

Теперь выведем каждый товар вместе с названием производителя. У Монитора ссылка не заполнена. Левое соединение сохраняет строку товара даже при отсутствии подходящей строки справа:

ВЫБРАТЬ
    Товары.Наименование КАК Товар,
    ЕСТЬNULL(Производители.Наименование, "Не указан") КАК Производитель
ИЗ
    Справочник.УчебныеТовары КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчебныеПроизводители КАК Производители
    ПО Товары.Производитель = Производители.Ссылка
ГДЕ
    НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
    Товар

Для Кабеля и Клавиатуры ожидается «Учебная фабрика», для Монитора «Не указан». В этом запросе NULL появляется в правой части, когда соединение не нашло соответствующую строку. Функция ЕСТЬNULL заменяет именно NULL. Пустая строка и пустая ссылка являются другими значениями и автоматически этой функцией не заменяются.

Если заменить соединение на внутреннее, товар без найденного производителя не попадёт в результат. Если после левого соединения добавить в ГДЕ условие по полю правой таблицы, оно тоже может отсеять строки без совпадения. Поэтому заранее решите: вам нужны все товары или только товары с определённым производителем.

Откуда берутся ошибки и повторяющиеся строки

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

Не добавляйте РАЗЛИЧНЫЕ только ради исчезновения повторов. Если товар соединён с несколькими строками регистра, повторение может быть закономерным результатом связи. Сначала определите единицу результата: одна строка на товар, на документ или на движение. Затем выбирайте ключи, период и группировку.

Самопроверка перед переходом к регистрам

  1. Для первой выборки проверьте параметры 0, 1500 и 3000. Объясните, почему получаются три, две и ноль строк.
  2. Поставьте учебному Кабелю пометку удаления и убедитесь, что исключение связано именно с условием запроса. После упражнения верните исходное состояние учебной записи.
  3. Назначьте Монитору производителя и повторите соединение. Число строк должно сохраниться, а подпись «Не указан» смениться названием.
  4. Добавьте второй товар с той же ценой и проверьте дополнительную сортировку.

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

Похожие статьи по данной теме