Конструирование запросов, заглушки, поддержка однотипных решений
Написав множество обменов и выгрузок (список в конце статьи) между разными базами через com, я столкнулся с необходимостью поддерживать их все. Более того, я поддерживаю все релизы обменивающихся конфигураций в одной обработке, а, как известно, 1С постоянно добавляет/удаляет/переименовывает объекты и реквизиты. Для упрощения этой задачи, и чтобы мои модули не превратились в сплошные Если ЕстьРеквизитТабЧастиДокумента(«Номенклатура», В8.Метаданные.Документы.РеализацияТоваровУслуг, «ВидыЗапасов») Тогда … и был придуман описанный механизм. Данная методика не претендует на универсальность или суперполезность, однако мне она сильно помогла.
- Описание
- Подробнее
Описание
Цель: свести к минимуму изменения в модуле формы или обработки (т.е. иметь общий шаблон) а большую часть изменений выполнять, не затрагивая структуру обработки (в запросах, конструируемых динамически).
Методика позволяет большинство изменений выполнять в Схеме СКД и в макете, а сами запросы получать одной строчкой:
Запрос=В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 |
Приветствуются комментарии.
