В современных конфигурациях 1С, таких как 1С:ERP Управление предприятием или 1С:Комплексная автоматизация 2 (КА), разработчики часто сталкиваются с ситуацией, когда стандартный конструктор запросов отказывается открывать типовой код. При попытке вызвать конструктор система выдает ошибки типа «Поле не найдено» или вовсе закрывается с уведомлением о невозможности разбора текста. Рассмотрим подробнее, почему это происходит и как мы можем эффективно работать с такими «кусочными» запросами.
Стандартный конструктор запроса 1С является статическим анализатором. Это означает, что он пытается понять структуру данных, просто читая текст, который вы ему передали. В типовых печатных формах (например, ТОРГ-12) современные конфигурации используют три механизма, которые «ослепляют» конструктор:
СтрЗаменить для вставки фрагментов запроса (например, &ТекстЗапросаКоэффициентУпаковки). Конструктор не может выполнить код 1С, чтобы узнать, какой SQL-подобный текст окажется на месте этой переменной.ПродажиСервер.ПоместитьВременнуюТаблицу...), а используются в других. Когда вы открываете запрос в конструкторе, он «не видит» контекста и не знает о существовании этих таблиц в памяти.Таблица.Ссылка.ХозяйственнаяОперация, конструктор часто теряет тип этой ссылки и не может найти реквизиты объекта.Первое, что мы должны сделать — это получить «чистый» текст запроса, в котором уже произведены все программные замены. Разберем этот процесс по шагам:
ПолучитьДанныеДляПечатнойФормыТОРГ12 непосредственно перед выполнением запроса (на строке Запрос.Выполнить() или Запрос.ВыполнитьПакет()).Запрос.Текст.&ТекстЗапроса....Проанализируем ситуацию: даже после получения текста конструктор может выдать ошибку, так как временные таблицы в МенеджерВременныхТаблиц все еще пусты для него. Нам нужно «обмануть» конструктор, предоставив ему описания этих таблиц.
Если нам нужно во что бы то ни стало использовать стандартный конструктор, мы можем временно добавить в начало запроса пакеты, которые имитируют структуру недостающих таблиц. Рассмотрим пример для таблицы РеализацияТоваровУслугТаблицаТоваров:
ВЫБРАТЬ
ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) КАК Ссылка,
0 КАК НомерСтроки,
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
1 КАК Количество,
1 КАК КоличествоУпаковок,
ЛОЖЬ КАК ЭтоТовар
ПОМЕСТИТЬ РеализацияТоваровУслугТаблицаТоваров
;
////////////////////////////////////////////////////////////////////////////////
// Далее идет ваш основной запрос
После добавления такого «заголовочного» пакета конструктор увидит поля Ссылка, Номенклатура и другие. Как только вы завершите правку основного запроса, обязательно удалите фиктивный пакет перед сохранением кода в модуле, иначе программа выдаст ошибку о дублировании имен временных таблиц при выполнении.
Как советуют опытные специалисты, в мире «кусочных» запросов лучше всего пользоваться специализированными инструментами. Одним из самых мощных является «Инструментарий разработчика» (ИР) Сергея Старых.
Рассмотрим, как это работает через консоль запросов ИР:
Запрос целиком, включая его МенеджерВременныхТаблиц.Если ошибка возникает на полях типа ХозяйственнаяОперация или НаименованиеПолное, это верный признак того, что 1С не смогла однозначно определить тип ссылки во временной таблице. Чтобы помочь системе (и конструктору), используем оператор ВЫРАЗИТЬ.
Посмотрим на пример корректировки кода:
// Вместо простой выборки:
ДанныеДокументов.Ссылка КАК Ссылка
// Используем типизацию:
ВЫРАЗИТЬ(ДанныеДокументов.Ссылка КАК Документ.РеализацияТоваровУслуг) КАК Ссылка
Проанализируем этот подход: явное приведение типов гарантирует, что при обращении к Ссылка.ХозяйственнаяОперация в последующих пакетах запроса, оптимизатор и конструктор будут точно знать, из какой таблицы брать данные. Это критически важно для временных таблиц, которые индексируются и соединяются с другими источниками.
При создании внешней печатной формы на базе типовой в КА/ERP, старайтесь придерживаться следующей стратегии:
Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки возвращают готовые куски кода. Если вы измените псевдонимы таблиц (например, вместо ТаблицаТоваров назовете ее Т_Товары), эти функции перестанут работать, так как они ищут конкретные имена полей в тексте.Подводя итог, можно сказать, что невозможность открыть запрос конструктором — это не ошибка программы, а особенность архитектуры крупных решений 1С. Сочетание ручной типизации полей, отладки текста и использования продвинутых консолей запросов позволит вам эффективно модифицировать даже самые сложные типовые механизмы.