Разработка в расширениях 1С имеет свои специфические особенности, одной из которых является ограничение работы штатного Конструктора запросов. Часто разработчики сталкиваются с ситуацией: при попытке открыть запрос в расширении система выдает ошибку о том, что объект (документ, справочник или регистр) не найден, хотя в основной конфигурации он существует. Разберем подробно, почему так происходит и какие существуют эффективные способы решения этой проблемы.
Прежде всего, проанализируем ситуацию с точки зрения архитектуры платформы. В расширениях 1С реализован принцип строгого декларирования используемых объектов. По задумке разработчиков платформы, расширение должно «знать» только о тех метаданных, которые в него явно добавлены (заимствованы). Это необходимо для того, чтобы:
Однако на практике это создает неудобства: если ваш запрос обращается к десяти таблицам, вам придется добавить их все в расширение только ради того, чтобы открылся Конструктор запросов.
Это самый популярный и правильный с точки зрения отладки метод. Вместо того чтобы пытаться запустить запрос в конфигураторе, мы переносим работу в пользовательский режим. Рассмотрим алгоритм действий:
Важный нюанс: Если вы копируете запрос из консоли в конфигуратор, вам может потребоваться быстро очистить его от символов переноса строки (вертикальная черта |). В Конфигураторе для этого есть встроенная функция: выделите блок текста, перейдите в меню Текст — Блок — Удалить перенос строки.
Если вам принципиально важно использовать Конструктор запросов, но вы не хотите «раздувать» расширение лишними заимствованными объектами, воспользуйтесь проверенным методом:
Рассмотрим по шагам:
Конструктор запросов. Поскольку обработка создается в контексте основной конфигурации, конструктор «увидит» все документы и справочники без исключения.Этот метод позволяет обойти ограничения расширений, сохраняя при этом удобство визуальной разработки.
Проанализируем ситуацию, когда заимствование объектов все же необходимо. Если вы решили добавить объекты в расширение для работы конструктора, помните о правилах оптимизации:
Документ.РеализацияТоваровУслуг) и только те поля, которые непосредственно участвуют в запросе.ОстаткиИОбороты регистров накопления), система часто требует заимствования не только регистра, но и всех измерений, которые входят в его структуру, особенно если они используются в параметрах или условиях.Продажи.Номенклатура.ВидНоменклатуры), то в расширении должны присутствовать и справочник «Номенклатура», и поле «ВидНоменклатуры».Частой ошибкой в запросах расширений является использование конструкции ЗНАЧЕНИЕ(...). Выясним причину ошибки: если вы пишете ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка), а справочник «Склады» не заимствован, конструктор выдаст ошибку метаданных.
Чтобы избежать этого, рекомендуем использовать параметры запроса. Рассмотрим пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СвободныеОстатки.Склад КАК Склад,
| СвободныеОстатки.В наличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.СвободныеОстатки.Остатки( , Склад <> &ПараметрПустойСклад) КАК СвободныеОстатки";
// Вместо ЗНАЧЕНИЕ в запросе, передаем пустую ссылку через параметр
Запрос.УстановитьПараметр("ПараметрПустойСклад", Справочники.Склады.ПустаяСсылка());
Этот прием позволяет сделать текст запроса более «универсальным» для расширения, так как проверка типа Справочники.Склады произойдет в рантайме (при выполнении кода), а не при открытии конструктора.
Если ваша команда использует 1C:EDT (Enterprise Development Tools), процесс работы с запросами в расширениях становится значительно проще. Проанализируем преимущества этой среды:
Alt+Enter и автоматически добавит (заимствует) недостающий объект в расширение.Когда запрос генерируется программно (сборка строк в цикле или использование условий Если...Тогда), отлаживать его в конфигураторе практически невозможно. В таких случаях используйте следующий алгоритм:
Запрос.Текст.Запрос.Параметры через табло) и выполните запрос.Помните: Платформа 1С в последних версиях (8.3.20+) постепенно упрощает работу с расширениями, но фундаментальное требование наличия метаданных в файле расширения для работы штатного конструктора остается неизменным. Использование внешних инструментов — наиболее эффективный путь для профессионального разработчика.