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

06.04.17

Разработка - Запросы

Написав множество обменов и выгрузок (список в конце статьи) между разными базами через 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

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

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

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122178    670    389    

714

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5746    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6286    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

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

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5388    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16186    skovpin_sa    14    

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