Почему код запроса из книги Хрусталевой выдает ошибку в Консоли запросов 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Начинающие разработчики часто сталкиваются с трудностями при изучении книги Е.Ю. Хрусталевой «Язык запросов "1С:Предприятие 8"». Типичная ситуация: вы копируете пример из листинга (например, вывод наименований товаров), вставляете его в Консоль запросов, но система выдает ошибку "Ожидается выражение ВЫБРАТЬ" или "Ошибка при вызове метода контекста (НайтиПараметры)". В этой статье мы подробно разберем, почему так происходит, и научимся правильно разделять текст запроса и программный код.

Разбор причины ошибки: Текст запроса vs Программный код

Проанализируем ситуацию. В системе 1С существует два принципиально разных уровня работы с данными. Первый — это Встроенный язык 1С (объектно-ориентированный код), а второй — собственно Язык запросов (декларативный SQL-подобный язык). Ошибка возникает из-за того, что в Консоль запросов пытаются вставить фрагмент кода на Встроенном языке.

Рассмотрим листинг, который часто вызывает затруднения:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
    Наименование
ИЗ
    Справочник.Товары";
    
РезультатЗапроса = Запрос.Выполнить();
ВыборкаЗапроса = РезультатЗапроса.Выбрать();
Пока ВыборкаЗапроса.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ВыборкаЗапроса.Наименование;
    Сообщение.Сообщить();
КонецЦикла;

Выясним причину неудачи. Когда вы используете инструмент Консоль запросов, вы работаете в среде, которая уже "знает", как создать объект Запрос и как его выполнить. Консоль ожидает от вас только текст запроса. Поэтому, если вы копируете туда весь код, платформа видит строку Запрос = Новый Запрос; и не понимает её, так как на уровне языка запросов ожидаются только инструкции ВЫБРАТЬ, ИЗ, ГДЕ и так далее.

Как правильно работать в Консоли запросов

Разберем по шагам, что именно нужно вставлять в Консоль запросов из примеров книги. Из всего программного кода нам нужен только тот фрагмент, который находится внутри кавычек в свойстве Запрос.Текст.

Для корректной работы в консоли ваш текст должен выглядеть так:


ВЫБРАТЬ
    Наименование
ИЗ
    Справочник.Товары

Обратите внимание на важные моменты форматирования при переносе кода из конфигуратора в консоль:

  1. Удалите кавычки: В программном коде текст запроса всегда заключается в кавычки, так как он является строковой переменной. В консоли кавычки не нужны.
  2. Удалите символы переноса: В Конфигураторе для многострочных строк часто используется вертикальная черта |. В консоли её быть не должно.
  3. Забудьте про обвязку: Команды Запрос.Выполнить(), ВыборкаЗапроса.Следующий() и создание объекта СообщениеПользователю — это инструкции для процессора встроенного языка, консоль их не воспринимает.

Где и как выполнять полноценный программный код

Рассмотрим ситуацию, если вам нужно проверить именно весь листинг целиком, включая вывод сообщений. Программный код, использующий объект Запрос, нельзя просто запустить в консоли. Его нужно поместить в контекст исполнения 1С. Самый безопасный и удобный способ для новичка — создание внешней обработки.

Выполним следующие действия:

  1. Откройте Конфигуратор.
  2. Выберите меню Файл — Новый — Внешняя обработка.
  3. На вкладке "Формы" создайте новую форму (управляемую).
  4. Добавьте на форму кнопку и создайте для неё командный обработчик на сервере. Запросы в 1С 8.3 выполняются только на стороне сервера.
  5. Вставьте ваш листинг в процедуру на сервере.

Пример структуры кода во внешней обработке:


&НаСервере
Процедура ВыполнитьЗапросНаСервере()
    // Создаем объект запроса
    Запрос = Новый Запрос;
    
    // Присваиваем текст запроса (здесь уже нужны кавычки и правильный синтаксис 1С)
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Товары.Наименование КАК Наименование
        |ИЗ
        |	Справочник.Товары КАК Товары";
    
    // Выполняем и обходим результат
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаЗапроса = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаЗапроса.Следующий() Цикл
        // Выводим данные пользователю
        Сообщить(ВыборкаЗапроса.Наименование);
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыполнить(Команда)
    ВыполнитьЗапросНаСервере();
КонецПроцедуры

Инструменты, облегчающие жизнь новичку

Проанализируем, как профессионалы избегают ошибок при написании текстов запросов. Писать Запрос.Текст = "..." вручную — долго и чревато опечатками. Для этого существует Конструктор запроса.

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

Также стоит помнить о двуязычности. Хотя в книге Хрусталевой используется русский синтаксис (ВЫБРАТЬ, ИЗ), платформа прекрасно понимает и английский (SELECT, FROM). Это полезно знать, если вы ранее имели опыт работы с SQL.

Важные рекомендации по производительности

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

Ключевое правило: фильтры для виртуальных таблиц всегда передавайте в их параметры (в скобках после имени таблицы), а не в секцию ГДЕ. Это критично для скорости работы системы в реальных базах данных.

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

← На главную