Конструирование запросов, заглушки, поддержка однотипных решений

Публикация № 606814

Программирование - Практика программирования

Конструирование Запрос Заглушка Динамически поддержка

19
Написав множество обменов и выгрузок (список в конце статьи) между разными базами через com, я столкнулся с необходимостью поддерживать их все. Более того, я поддерживаю все релизы обменивающихся конфигураций в одной обработке, а, как известно, 1С постоянно добавляет/удаляет/переименовывает объекты и реквизиты. Для упрощения этой задачи, и чтобы мои модули не превратились в сплошные Если ЕстьРеквизитТабЧастиДокумента("Номенклатура", В8.Метаданные.Документы.РеализацияТоваровУслуг, "ВидыЗапасов") Тогда … и был придуман описанный механизм. Данная методика не претендует на универсальность или суперполезность, однако мне она сильно помогла.

Цель: свести к минимуму изменения в модуле формы или обработки (т.е. иметь общий шаблон) а большую часть изменений выполнять, не затрагивая структуру обработки (в запросах, конструируемых динамически). 

Методика позволяет большинство изменений выполнять  в Схеме СКД и в макете, а сами запросы получать одной строчкой:

Запрос=В8.NewObject("Запрос");                            
Запрос.Текст=ПолучитьТекстЗапросаИзСКД("ПредварительныйПросмотр",ЭлементСписка.Значение,В8,Запрос);
Если Запрос.Текст="" Тогда
  Продолжить;
КонецЕсли;
УстановитьОбщиеПараметрыЗапроса(Запрос);
Результат = Запрос.Выполнить();

Для хранения запросов и правил их конструирования я выбрал СКД.

 Всё в схеме и макете

В моих обработках есть определённые действия (этапы) «Получение данных», «Предварительный просмотр», «Создание документов». И эти этапы подразделяются на подэтапы. По названию этих этапов и подэтапов обработка будет понимать, какие запросы нужно ей конструировать (т.е. это как бы адрес запроса). Название этапов я расположил в корневых элементах дерева наборов данных с видом «объединение», а подэтапов под ними (по иерархии) с тем же видом. 

Схема

Дальше я создаю элементы с видом «Запрос», такой элемент должен быть либо один без условий, либо несколько, с непересекающимися условиями (т.е. чтобы в итоги выбран был только один подобный элемент в рамках одного этапа и подэтапа).

Условия я записываю в поля и проставляю флаг «Условие».

В тексте запроса я использую конструкции вида Заглушка_ХХХХХХ, такие конструкции при соблюдении определённого условия будут заменены на текст запроса либо на пустую строку (если условие не выполнено). Эти запросы (и условия) записываются ниже (не по иерархии) в элементах  дерева набора данных с видом «Запрос» и названием Заглушка_ ХХХХХХ (Префикс  Заглушка_ обязателен, по нему обработка определяет, что это именно заглушка). Условия для заглушек указываются там же где и условия для запросов (в полях с флагом «условие»). В запросах «Заглушек» могут быть использованы другие «заглушки», тогда их запросы должны бать расположены ниже.

Для хранения условий я использую макет, в котором названия областей состоят из названия этапа и подэтапа (например, ПредварительныйПросмотр_ВыгружатьРеализации)

If

Ещё я использую общие условия (параметры запросов), их я указываю в полях подэтапа с флагом «Группа» чтобы не путать их с условиями которые могут случайно перейти из подчинённых запросов (особенности редактора СКД)

general

Код получения запроса выглядит так (для конфигураций 7.7. немного другая функция)

Функция ПолучитьТекстЗапросаИзСКД(Раздел,Элемент,В8,Запрос)
	ОбработкаОбъект=РеквизитФормыВЗначение("Объект");
	ПараметрыСКД=ПолучитьПараметрыСКД(Раздел,Элемент,В8,ОбработкаОбъект);
	СКД=ОбработкаОбъект.ПолучитьМакет("Запросы");
	СКД_Ветка_1 = СКД.НаборыДанных[Раздел];
	Если СКД_Ветка_1.Элементы.Найти(Элемент)=Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	СКД_Ветка_2=СКД_Ветка_1.Элементы[Элемент];
	Для Каждого ПолеПараметров Из СКД_Ветка_2.Поля Цикл
		Если ПолеПараметров.ОграничениеИспользования.Группировка Тогда	
			Запрос.УстановитьПараметр(ПолеПараметров.ПутьКДанным,Объект[ПолеПараметров.ПутьКДанным]);
			ПараметрыСКД.Вставить(ПолеПараметров.ПутьКДанным,Объект[ПолеПараметров.ПутьКДанным]);
		КонецЕсли;
	КонецЦикла;
	
	
	ТекстЗапроса="";
	Для Каждого ЭлементВетки  Из  СКД_Ветка_2.Элементы  Цикл
		Если ЭлементВетки.Поля.Количество()=0 Тогда
			ТекстЗапроса=ТекстЗапроса+ЭлементВетки.Запрос;
			Продолжить;
		КонецЕсли; 
		ПропуститьЧасть=Ложь;
		Заглушка=Ложь;
		Если Не Найти(ЭлементВетки.Имя,"Заглушка") =0 Тогда
			Заглушка=Истина;
		КонецЕсли;
		
		
		Для Каждого Поле Из ЭлементВетки.Поля Цикл
			Если Не Поле.ОграничениеИспользования.Условие=ПараметрыСКД[Поле.ПутьКДанным] Тогда	
				ПропуститьЧасть=Истина;	
				Если Заглушка Тогда
					ТекстЗапроса=СтрЗаменить(ТекстЗапроса,ЭлементВетки.Имя,"");
				КонецЕсли;
				
				Прервать;
			КонецЕсли;	
		КонецЦикла;
		Если ПропуститьЧасть Тогда
			Продолжить;
		КонецЕсли;
		Если Заглушка Тогда
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,ЭлементВетки.Имя,ЭлементВетки.Запрос);
		Иначе
			ТекстЗапроса=ТекстЗапроса+ЭлементВетки.Запрос;		
		КонецЕсли;
	КонецЦикла;
	Возврат ТекстЗапроса;
КонецФункции

В заключении отмечу, что методика хоть и не универсальна, но при небольших доработках подходит практически для любых задач, где требуется динамически конструировать запросы и/или  необходимо быстро вносить изменения в структуру запросов в зависимости от условий, не меняя интерфейсную часть.

Например, 1С переименовала документ "СписаниеТоваров" в "СписаниеНедостачТоваров", тогда я просто добавляю две заглушки с двумя запросами (как будто у меня одновременно есть и "СписаниеТоваров" и "СписаниеНедостачТоваров")

ex1

 и добавляю два условия в макет. 

ex2

В зависимости от метаданных будет выбран нужный запрос и добавлен к основному (а ненужная заглушка будет заменена на пустую строку). Таким образом, обработка будет работать в обоих релизах.

Ну и список моих обработок, в которых, так или иначе, использована эта методика.

Название/ссылка на разработку

 Версия

  Многофункциональная выгрузка из 1С УТ11 в БП3 (сопоставление номенклатуры, складов, контрагентов)+ Свёртка по НДС

 223

  Многофункциональная выгрузка из 1С УТ11 в БП2 (сопоставление номенклатуры, складов, контрагентов)+ Свёртка по НДС

 166

  Многофункциональная выгрузка из 1С УТ10 в БП3 (сопоставление номенклатуры, складов, контрагентов)+ Свёртка по НДС

 142

  Многофункциональная выгрузка из 1С УТ10 в БП2 (сопоставление номенклатуры, складов, контрагентов)+ Свёртка по НДС

 77

  Многофункциональная выгрузка из 1С Розница2 в БП3 (соответствия товаров, контрагентов, складов,статейДДС)+ Свёртка по НДС   

 42

  Многофункциональная выгрузка из 1С УПП1.3 в БП 2 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС

 38

  Многофункциональная выгрузка из 1С УТ10 в КА 1 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС

 1

  Многофункциональная выгрузка из 1С УНФ в БП 2 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС  

 24

  Многофункциональная выгрузка из 1С УНФ в БП 3 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС  

 51

  Многофункциональная выгрузка из 1С-Рарус: Управление рестораном в БП2  

 1

  Многофункциональная выгрузка из 1С ДАЛИОН УНО в КА 1 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС

 19

  Многофункциональная выгрузка из 1С ТиС и АТБ 3.5 в БП 3 (соответствия товаров, контрагентов, складов, статей ДДС) 

 13

  Многофункциональная выгрузка из 1С УТ11 в КА 2 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС

 16

  Многофункциональная выгрузка из 1С КА1 в БП 3 (соответствия товаров, контрагентов, складов, статей ДДС)  

 23

  Многофункциональная выгрузка из 1С КА2 в БП 3 (соответствия товаров, контрагентов, складов, статей ДДС)  

21

  Многофункциональная выгрузка из 1С АльфаАвто в БП3 (соответствия товаров, контрагентов, складов, статей ДДС)+ Свёртка по НДС

10

Приветствуются комментарии.

19

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Ibrogim 1077 06.04.17 11:55 Сейчас в теме
Жду комментариев и конструктивной критики )
jONES1979; +1 Ответить
2. v3rter 06.04.17 12:48 Сейчас в теме
Отличная идея конструктора условий! ) Может лучше "Подстановка" вместо "Заглушки"?
4. Ibrogim 1077 06.04.17 14:21 Сейчас в теме
(2) Спасибо, Думаю, что не принципиально )
3. haizman 06.04.17 13:07 Сейчас в теме
Предлагаю многофункциональный вариант "Подзаглушка".
Идея отличная ! И еще нужно думать о спасении души.
Оставьте свое сообщение