


Запрос в 1С позволяет получить из базы нужные строки и поля по заданным условиям. Начинать удобнее с небольшой известной таблицы: выбрать товары, ограничить цену параметром, затем добавить сведения о производителе. Такой порядок помогает отличить ошибку синтаксиса от неверного условия.
В практикуме Mentoring.digital используются специально названные учебные справочники. Это не универсальная структура любой конфигурации 1С. Примеры сверены с документацией языка и механизма запросов; запуск в конкретной информационной базе не заявляется.
Работайте в отдельной учебной базе. Создайте неиерархический справочник УчебныеПроизводители со стандартным Наименованием и неиерархический справочник УчебныеТовары. У второго нужны реквизиты УчебнаяЦена типа Число с двумя знаками после запятой и Производитель типа СправочникСсылка.УчебныеПроизводители. Название «УчебнаяЦена» подчёркивает условность модели: реальные цены могут храниться в регистрах сведений.
| Товар | УчебнаяЦена | Производитель |
|---|---|---|
| Кабель | 500 | Учебная фабрика |
| Клавиатура | 1500 | Учебная фабрика |
| Монитор | 2400 | Не заполнен |
Создайте производителя «Учебная фабрика» и три товара из таблицы, оставьте пометку удаления выключенной. Сравнивайте имя объекта метаданных с текстом запроса, а не только с названием пункта меню. В своей конфигурации используйте конструктор запроса: он помогает увидеть доступные таблицы, поля и связи.
ВЫБРАТЬ
Товары.Наименование КАК Наименование,
Товары.УчебнаяЦена КАК Цена
ИЗ
Справочник.УчебныеТовары КАК Товары
ГДЕ
Товары.УчебнаяЦена >= &МинимальнаяЦена
И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Цена УБЫВ,
Наименование
ВЫБРАТЬ определяет поля результата, ИЗ указывает источник, ГДЕ отбирает строки. Слово КАК задаёт псевдоним. Имя Товары сокращает обращения к источнику, а Цена становится именем колонки результата. Условие с ПометкаУдаления исключает помеченные элементы, но не удаляет их из базы.
При параметре 1500 ожидаются две строки: сначала Монитор с ценой 2400, затем Клавиатура с ценой 1500. Кабель не проходит условие. Оператор >= включает границу. Если заменить его на >, Клавиатура исчезнет. Дополнительная сортировка по наименованию делает порядок понятным при одинаковой цене, хотя полностью одинаковые наименования потребуют ещё одного ключа.
Знак & в тексте обозначает параметр, а не переменную встроенного языка. Его значение нужно передать объекту Запрос до выполнения. В серверной процедуре учебной обработки поместите первый запрос в строку ТекстЗапроса, затем выполните:
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("МинимальнаяЦена", 1500);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
Сообщить(Выборка.Цена);
КонецЦикла;
В имени параметра при вызове УстановитьПараметр амперсанд не пишется. В учебном примере передаётся число, а не строка «1500». Если фильтр должен сравнивать ссылки справочника, передавайте ссылку соответствующего типа. Не собирайте значения пользователя конкатенацией в текст запроса.
Выполнить() возвращает результат запроса, а Выбрать() создаёт выборку для обхода. Получение результата ещё не означает, что он содержит строки. Пустая выборка допустима, например при минимальной цене 3000.
Теперь выведем каждый товар вместе с названием производителя. У Монитора ссылка не заполнена. Левое соединение сохраняет строку товара даже при отсутствии подходящей строки справа:
ВЫБРАТЬ
Товары.Наименование КАК Товар,
ЕСТЬNULL(Производители.Наименование, "Не указан") КАК Производитель
ИЗ
Справочник.УчебныеТовары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчебныеПроизводители КАК Производители
ПО Товары.Производитель = Производители.Ссылка
ГДЕ
НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Товар
Для Кабеля и Клавиатуры ожидается «Учебная фабрика», для Монитора «Не указан». В этом запросе NULL появляется в правой части, когда соединение не нашло соответствующую строку. Функция ЕСТЬNULL заменяет именно NULL. Пустая строка и пустая ссылка являются другими значениями и автоматически этой функцией не заменяются.
Если заменить соединение на внутреннее, товар без найденного производителя не попадёт в результат. Если после левого соединения добавить в ГДЕ условие по полю правой таблицы, оно тоже может отсеять строки без совпадения. Поэтому заранее решите: вам нужны все товары или только товары с определённым производителем.
| Симптом | Что проверить |
|---|---|
| Таблица или поле не найдены | Имена объектов и реквизитов в метаданных |
| Параметр не задан | Совпадение имени и вызов УстановитьПараметр до Выполнить |
| Результат пуст | Учебные данные, тип параметра, границу и пометку удаления |
| Один товар повторяется | Сколько строк справа совпадает с одной строкой слева |
| Товар без производителя пропал | Вид соединения и условия по правой таблице в ГДЕ |
Не добавляйте РАЗЛИЧНЫЕ только ради исчезновения повторов. Если товар соединён с несколькими строками регистра, повторение может быть закономерным результатом связи. Сначала определите единицу результата: одна строка на товар, на документ или на движение. Затем выбирайте ключи, период и группировку.
Когда результат каждой проверки понятен, можно переходить к регистраторам, периодам и виртуальным таблицам регистров. На курсах программирования 1С стоит согласовать практику под вашу конфигурацию. Для разбора конкретного запроса выберите наставника по 1С и подготовьте обезличенную структуру данных, текст запроса и ожидаемый результат.