Как отлаживать и составлять запросы в расширениях конфигурации 1С?

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

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

Причина проблемы: Декларативный подход 1С

Прежде всего, проанализируем ситуацию с точки зрения архитектуры платформы. В расширениях 1С реализован принцип строгого декларирования используемых объектов. По задумке разработчиков платформы, расширение должно «знать» только о тех метаданных, которые в него явно добавлены (заимствованы). Это необходимо для того, чтобы:

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

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

Способ 1: Использование консоли запросов в режиме «Предприятие»

Это самый популярный и правильный с точки зрения отладки метод. Вместо того чтобы пытаться запустить запрос в конфигураторе, мы переносим работу в пользовательский режим. Рассмотрим алгоритм действий:

  1. Запустим базу в режиме «1С:Предприятие».
  2. Откроем любую современную Консоль запросов (лучше всего использовать консоли на управляемых формах из состава «Инструментов разработчика»).
  3. В консоли нам доступны абсолютно все объекты метаданных: и основной конфигурации, и всех подключенных расширений.
  4. Напишем и отладим запрос на реальных данных, проверим результат выполнения.
  5. Скопируем готовый текст запроса и вставим его в код модуля в расширении.

Важный нюанс: Если вы копируете запрос из консоли в конфигуратор, вам может потребоваться быстро очистить его от символов переноса строки (вертикальная черта |). В Конфигураторе для этого есть встроенная функция: выделите блок текста, перейдите в меню Текст — Блок — Удалить перенос строки.

Способ 2: Метод «Внешней обработки» (Лайфхак)

Если вам принципиально важно использовать Конструктор запросов, но вы не хотите «раздувать» расширение лишними заимствованными объектами, воспользуйтесь проверенным методом:

Рассмотрим по шагам:

  1. Создадим новую Внешнюю обработку (файл .epf) через меню «Файл — Новый».
  2. В этой обработке создадим временную процедуру и вызовем Конструктор запросов. Поскольку обработка создается в контексте основной конфигурации, конструктор «увидит» все документы и справочники без исключения.
  3. Сформируем текст запроса визуально, выбрав нужные поля и связи.
  4. Нажмем «ОК», скопируем полученный текст из модуля обработки и вставим его в расширение.
  5. Внешнюю обработку можно закрыть без сохранения.

Этот метод позволяет обойти ограничения расширений, сохраняя при этом удобство визуальной разработки.

Способ 3: Минимальное заимствование объектов

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

Работа с типизацией и пустыми ссылками

Частой ошибкой в запросах расширений является использование конструкции ЗНАЧЕНИЕ(...). Выясним причину ошибки: если вы пишете ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка), а справочник «Склады» не заимствован, конструктор выдаст ошибку метаданных.

Чтобы избежать этого, рекомендуем использовать параметры запроса. Рассмотрим пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СвободныеОстатки.Склад КАК Склад,
    |	СвободныеОстатки.В наличииОстаток КАК Остаток
    |ИЗ
    |	РегистрНакопления.СвободныеОстатки.Остатки( , Склад <> &ПараметрПустойСклад) КАК СвободныеОстатки";

// Вместо ЗНАЧЕНИЕ в запросе, передаем пустую ссылку через параметр
Запрос.УстановитьПараметр("ПараметрПустойСклад", Справочники.Склады.ПустаяСсылка());

Этот прием позволяет сделать текст запроса более «универсальным» для расширения, так как проверка типа Справочники.Склады произойдет в рантайме (при выполнении кода), а не при открытии конструктора.

Использование 1C:EDT для упрощения работы

Если ваша команда использует 1C:EDT (Enterprise Development Tools), процесс работы с запросами в расширениях становится значительно проще. Проанализируем преимущества этой среды:

  1. Quick Fix (Быстрые исправления): Если вы напишете текст запроса вручную, и EDT обнаружит, что объекта нет в расширении, она предложит нажать Alt+Enter и автоматически добавит (заимствует) недостающий объект в расширение.
  2. Улучшенная индексация: EDT лучше понимает связи между основной конфой и расширением, предоставляя контекстную подсказку даже для незаимствованных объектов в текстовом редакторе.

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

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

  1. Установите точку останова в коде расширения сразу после формирования текста запроса.
  2. В режиме отладки вычислите выражение Запрос.Текст.
  3. Скопируйте полученную строку в консоль запросов в режиме «Предприятие».
  4. Подставьте значения параметров (их можно посмотреть в коллекции Запрос.Параметры через табло) и выполните запрос.

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

← На главную