Если вы уже давно работаете с УТ 11 или ERP, то скорее всего не найдете для себя ничего нового в этой статье. Но есть разработчики, которые еще не успели плотно поработать с упомянутыми конфигурациями, возможно для них данная информация покажется полезной.
По поводу добавления комментариев в запросы уже были публикации и вопросы на форумах. Основная проблема, что при добавлении поясняющего текста - он стирается конструктором запросов. А любые способы добавления комментариев в виде дополнительных полей или условий - в основном неудобно применять.
Для себя я нашел решение в типовых конфигурациях не так давно. Суть идеи очень простая - каждую часть запроса писать отдельной функцией.
Пример 1
ТекстЗапроса =
ТекстЦеныИнициализация() + ";" // подготавливаем временные таблицы втПериодыЦен, втДисконтныеКарты, втПорогиСкидок
+ ТекстОписаниеЕжедневныйПрайсЛист()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныНаТоварыВОстатках() // использует ПрошлыеПоступления
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныДоставки()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныУслугСборки()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныТоваровПоРаспродаже()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныНаУцененныеТовары()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныНаАлкогольнуюПродукцию()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныИмпортныхТоваров()
+ "ОБЪЕДИНИТЬ ВСЕ" + ТекстЦеныНаТоварыИзКомбоакций()
+ ТекстИндексы;
МВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ДатаПрайса", Период);
Запрос.УстановитьПараметр("МассивОрганизаций", МассивОрганизаций);
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Выполнить();
Код похож на оглавнение в книге. Текст сложного запроса складывается из элементарных кусочков.
Пример 2
Приведу отрывок кода, где аналогичный прием используется при проведении документов в новых типовых конфигурациях (например, ERP, УТ 11)
Модуль менеджера нашего документа
////////////////////////////////////////////////////////////////////////////
// Создадим запрос инициализации движений
Запрос = Новый Запрос;
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
////////////////////////////////////////////////////////////////////////////
// Сформируем текст запроса
ТекстыЗапроса = Новый СписокЗначений;
ТекстЗапросаТаблицаЗаказыПоставщикам(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаРасчетыСПоставщиками(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвижениеТоваров(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыКПоступлению(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаЦеныНоменклатурыПоставщиков(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказовРаботами(Запрос, ТекстыЗапроса, Регистры);
ПроведениеСервер.ИницализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);
Установка всех параметров вынесена в отдельную процедуру. Далее идет ряд процедур, каждая из которых содержит текст запроса по заполнению одного регистра, указанного в ее названии. В конце вызывается универсальная процедура, которая выполняет сформированные тексты запросов
Плюсы такого подхода:
- понять, что происходит, можно не заглядывая в конструктор запроса
- текст каждого кусочка можно открывать конструктором запроса
- легко добавлять комментарии, которые не удаляются конструктором запроса
- у каждого кусочка собственное имя, по которому можно понять, что он выполняет
- можно именовать кусочки запроса в конструкции "ОБЪЕДИНИТЬ ВСЕ"
- удобно читать, т.к. сначала мы видим имя выборки, а затем можем к ней перейти
- количество кусочков запроса не ограничено, как в подходе со временными таблицами, когда на закладках конструктора при большом количестве временных таблиц их имена не читаются
Минусы:
- труднее поддерживать корректный состав полей между разными запросами
- получить полный текст запроса можно только с использованием точки останова - что не очень удобно
На мой взгляд, плюсы существенно перевешивают минусы, и сложные запросы действительно упрощаются.