Цель: свести к минимуму изменения в модуле формы или обработки (т.е. иметь общий шаблон) а большую часть изменений выполнять, не затрагивая структуру обработки (в запросах, конструируемых динамически).
Методика позволяет большинство изменений выполнять в Схеме СКД и в макете, а сами запросы получать одной строчкой:
Запрос=В8.NewObject("Запрос");
Запрос.Текст=ПолучитьТекстЗапросаИзСКД("ПредварительныйПросмотр",ЭлементСписка.Значение,В8,Запрос);
Если Запрос.Текст="" Тогда
Продолжить;
КонецЕсли;
УстановитьОбщиеПараметрыЗапроса(Запрос);
Результат = Запрос.Выполнить();
Для хранения запросов и правил их конструирования я выбрал СКД.
В моих обработках есть определённые действия (этапы) «Получение данных», «Предварительный просмотр», «Создание документов». И эти этапы подразделяются на подэтапы. По названию этих этапов и подэтапов обработка будет понимать, какие запросы нужно ей конструировать (т.е. это как бы адрес запроса). Название этапов я расположил в корневых элементах дерева наборов данных с видом «объединение», а подэтапов под ними (по иерархии) с тем же видом.
Дальше я создаю элементы с видом «Запрос», такой элемент должен быть либо один без условий, либо несколько, с непересекающимися условиями (т.е. чтобы в итоги выбран был только один подобный элемент в рамках одного этапа и подэтапа).
Условия я записываю в поля и проставляю флаг «Условие».
В тексте запроса я использую конструкции вида Заглушка_ХХХХХХ, такие конструкции при соблюдении определённого условия будут заменены на текст запроса либо на пустую строку (если условие не выполнено). Эти запросы (и условия) записываются ниже (не по иерархии) в элементах дерева набора данных с видом «Запрос» и названием Заглушка_ ХХХХХХ (Префикс Заглушка_ обязателен, по нему обработка определяет, что это именно заглушка). Условия для заглушек указываются там же где и условия для запросов (в полях с флагом «условие»). В запросах «Заглушек» могут быть использованы другие «заглушки», тогда их запросы должны бать расположены ниже.
Для хранения условий я использую макет, в котором названия областей состоят из названия этапа и подэтапа (например, ПредварительныйПросмотр_ВыгружатьРеализации)
Ещё я использую общие условия (параметры запросов), их я указываю в полях подэтапа с флагом «Группа» чтобы не путать их с условиями которые могут случайно перейти из подчинённых запросов (особенности редактора СКД)
Код получения запроса выглядит так (для конфигураций 7.7. немного другая функция)
Функция ПолучитьТекстЗапросаИзСКД(Раздел,Элемент,В8,Запрос)
ОбработкаОбъект=РеквизитФормыВЗначение("Объект");
ПараметрыСКД=ПолучитьПараметрыСКД(Раздел,Элемент,В8,ОбработкаОбъект);
СКД=ОбработкаОбъект.ПолучитьМакет("Запросы");
СКД_Ветка_1 = СКД.НаборыДанных[Раздел];
Если СКД_Ветка_1.Элементы.Найти(Элемент)=Неопределено Тогда
Возврат "";
КонецЕсли;
СКД_Ветка_2=СКД_Ветка_1.Элементы[Элемент];
Для Каждого ПолеПараметров Из СКД_Ветка_2.Поля Цикл
Если ПолеПараметров.ОграничениеИспользования.Группировка Тогда
Запрос.УстановитьПараметр(ПолеПараметров.ПутьКДанным,Объект[ПолеПараметров.ПутьКДанным]);
ПараметрыСКД.Вставить(ПолеПараметров.ПутьКДанным,Объект[ПолеПараметров.ПутьКДанным]);
КонецЕсли;
КонецЦикла;
ТекстЗапроса="";
Для Каждого ЭлементВетки Из СКД_Ветка_2.Элементы Цикл
Если ЭлементВетки.Поля.Количество()=0 Тогда
ТекстЗапроса=ТекстЗапроса+ЭлементВетки.Запрос;
Продолжить;
КонецЕсли;
ПропуститьЧасть=Ложь;
Заглушка=Ложь;
Если Не Найти(ЭлементВетки.Имя,"Заглушка") =0 Тогда
Заглушка=Истина;
КонецЕсли;
Для Каждого Поле Из ЭлементВетки.Поля Цикл
Если Не Поле.ОграничениеИспользования.Условие=ПараметрыСКД[Поле.ПутьКДанным] Тогда
ПропуститьЧасть=Истина;
Если Заглушка Тогда
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,ЭлементВетки.Имя,"");
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПропуститьЧасть Тогда
Продолжить;
КонецЕсли;
Если Заглушка Тогда
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,ЭлементВетки.Имя,ЭлементВетки.Запрос);
Иначе
ТекстЗапроса=ТекстЗапроса+ЭлементВетки.Запрос;
КонецЕсли;
КонецЦикла;
Возврат ТекстЗапроса;
КонецФункции
В заключении отмечу, что методика хоть и не универсальна, но при небольших доработках подходит практически для любых задач, где требуется динамически конструировать запросы и/или необходимо быстро вносить изменения в структуру запросов в зависимости от условий, не меняя интерфейсную часть.
Например, 1С переименовала документ "СписаниеТоваров" в "СписаниеНедостачТоваров", тогда я просто добавляю две заглушки с двумя запросами (как будто у меня одновременно есть и "СписаниеТоваров" и "СписаниеНедостачТоваров")
и добавляю два условия в макет.
В зависимости от метаданных будет выбран нужный запрос и добавлен к основному (а ненужная заглушка будет заменена на пустую строку). Таким образом, обработка будет работать в обоих релизах.
Ну и список моих обработок, в которых, так или иначе, использована эта методика.
Название/ссылка на разработку |
Версия |
223 |
|
166 |
|
142 |
|
77 |
|
42 |
|
38 |
|
Многофункциональная выгрузка из 1С УТ10 в КА 1 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС |
1 |
24 |
|
51 |
|
Многофункциональная выгрузка из 1С-Рарус: Управление рестораном в БП2 |
1 |
Многофункциональная выгрузка из 1С ДАЛИОН УНО в КА 1 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС |
19 |
13 |
|
Многофункциональная выгрузка из 1С УТ11 в КА 2 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС |
16 |
23 |
|
21 |
|
Многофункциональная выгрузка из 1С АльфаАвто в БП3 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС |
10 |
Приветствуются комментарии.