Каталог решений - Разбиение текста запроса на функции

Разбиение текста запроса на функции

Разбиение текста запроса на функции

В наличии

Хочу посвятить публикацию одному приему, который я впервые увидел в типовой ерпи. Если честно, описание идеи довольно короткое, и слабо тянет на целую публикацию. Но я намеренно выделил ее в отдельную статью, чтобы акцентировать на ней внимание, т.к. считаю, что данная техника СУЩЕСТВЕННО повышает читаемость, а также заставляет структурировать тексты запросов.

Категория:

Описание

Если вы уже давно работаете с УТ 11 или ERP, то скорее всего не найдете для себя ничего нового в этой статье. Но есть разработчики, которые еще не успели плотно поработать с упомянутыми конфигурациями, возможно для них данная информация покажется полезной.

По поводу добавления комментариев в запросы уже были публикации и вопросы на форумах. Основная проблема, что при добавлении поясняющего текста — он стирается конструктором запросов. А любые способы добавления комментариев в виде дополнительных полей или условий — в основном неудобно применять.

Для себя я нашел решение в типовых конфигурациях не так давно. Суть идеи очень простая — каждую часть запроса писать отдельной функцией.

Пример 1

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

Код похож на оглавнение в книге. Текст сложного запроса складывается из элементарных кусочков.

Пример 2

Приведу отрывок кода, где аналогичный прием используется при проведении документов в новых типовых конфигурациях (например, ERP, УТ 11)

Модуль менеджера нашего документа

////////////////////////////////////////////////////////////////////////////
// Создадим запрос инициализации движений

Запрос = Новый Запрос;
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);

////////////////////////////////////////////////////////////////////////////
// Сформируем текст запроса

ТекстыЗапроса = Новый СписокЗначений;
ТекстЗапросаТаблицаЗаказыПоставщикам(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаРасчетыСПоставщиками(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвижениеТоваров(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыКПоступлению(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаЦеныНоменклатурыПоставщиков(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказовРаботами(Запрос, ТекстыЗапроса, Регистры);

ПроведениеСервер.ИницализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);

Установка всех параметров вынесена в отдельную процедуру. Далее идет ряд процедур, каждая из которых содержит текст запроса по заполнению одного регистра, указанного в ее названии. В конце вызывается универсальная процедура, которая выполняет сформированные тексты запросов

Плюсы такого подхода:

  • понять, что происходит, можно не заглядывая в конструктор запроса
  • текст каждого кусочка можно открывать конструктором запроса
  • легко добавлять комментарии, которые не удаляются конструктором запроса
  • у каждого кусочка собственное имя, по которому можно понять, что он выполняет
  • можно именовать кусочки запроса в конструкции «ОБЪЕДИНИТЬ ВСЕ»
  • удобно читать, т.к. сначала мы видим имя выборки, а затем можем к ней перейти
  • количество кусочков запроса не ограничено, как в подходе со временными таблицами, когда на закладках конструктора при большом количестве временных таблиц их имена не читаются

Минусы:

  • труднее поддерживать корректный состав полей между разными запросами
  • получить полный текст запроса можно только с использованием точки останова — что не очень удобно

На мой взгляд, плюсы существенно перевешивают минусы, и сложные запросы действительно упрощаются.

has been added to your cart:
Оформление заказа