gifts2017

Подсистема для работы с запросами во времени исполнения

Опубликовал Денис Лазарев (irreal) в раздел Программирование - Инструментарий

Уже является фактом, что некоторые типовые конфигурации фирмы 1С архитектурно изначально ориентированы на интенсивное использование встроенного варианта SQL в качестве основного средства как получения, так и обработки данных, например, Зарплата и управление персоналом. В то же время, сама платформа предоставляет не очень много средств разработки. Позвольте представить разработку, могущую увеличить эффективность работы в несколько раз.

Конструктор запросов, консоль запросов - замечательные средства. Но они "статические", офф-лайновые. Суть идеи состоит в возможности вызова консоли запросов в режиме исполнения. Неприметные, на первый взгляд, бонусы, состоят в следующем:

  • в отлаживаемом запросе уже выставлены все, порой многочисленные, параметры, причем именно так, как это делает реальный код. Исключаются досадные ошибки установки параметров при офф-лайновой отладке;
  • часто SQL-запрос генерируется динамически. В режиме исполнения обработка предоставляет именно исполняемый запрос, не прибегая к остановке в точке создания текста запроса;
  • в некоторых случаях, например, в транзакции поведения, сами данные в базе существуют только в этой транзакции, например, временно записанные наборы записей регистров расчета. Естественно, ситуация может быть смоделирована в офф-лайне, но это лишние затраты времени;
  • громоздкие пакеты автоматически разлагаются на отдельные запросы, удобно располагаясь в дереве консоли, под каждым генерируются запросы на выборку из временных таблиц и их уничтожение, так что можно быстро найти проблему, просто смотря на получаемые промежуточные данные и играть этими данными.
  • незначительная модификация кода типовых конфигураций позволяет наблюдать работу громоздких запросов непосредственно при обнаружении проблемных ситуаций. Так, я знаю, что в 36 релизе УПП в 2-НДФЛ косо работал запрос по вычетам из-за неправильного отбора по обособленному подразделению (в 37 исправили); я знаю, что расчет НДФЛ до сих пор косит в отношении обособленных подразделений, в частности, может проставлять подразделения "чужой" организации; я знаю, что в 4-ФСС нового образца игнорируется настройка обложения ФСС НС и ПЗ. И множество подобных ситуаций.
  • сохранненный в конфигурации отладочный код не мешает обычной работе пользователя, но позволяет быстро выяснить причины обнаруженной им проблемы.

Реализация идеи состоит в подмене объекта Запрос обработкой ПСГ_ОберткаЗапроса, имеющей сходные свойства и методы (увы, кроме метода Выполнить()). В обычном режиме эта обработка исполняет запрос как обычно, но в определенном режиме выводит запросы в консоль запросов.

К сожалению, для использования такого механизма в типовых конфигурациях в настоящее время приходится модифицировать код в части создания объекта "Запрос" и в местах вызова метода "Выполнить()", подменяя объект "Запрос" обработкой-оберткой. Остается мечтой маленькая платформенная модификация объекта "Обработка" - добавление метода "Выполнить()" (вот беда, именно его нельзя добавить просто так из-за наличия одноименной функции языка) и генерация этим методом события "ПриВыполнении", которые позволили бы избежать модификаций кода в местах вызова исполнения запросов. Впрочем, если уж смотреть глобально, можно изменить поведение самого объекта "Запрос", добавить в него генерацию событий "ПриВыполнении", "ПриУстановкеТекста", "ПриУстановкеПараметра" соответствущими подписками. Или же реализовать возможность отладки запросов в самом этом объекте Запрос.

Альтернативно, вероятно, можно было бы написать com-компоненту, имеющую-таки метод "Выполнить()" и способной генерировать нужные синхронные события.

Состав объектов для работы с запросами описан подсистемой ПСГ_РаботаСЗапросами.

Активация режима отладки производится обработкой "Управление спецрежимами". Фактически, она управляет содержимым строкового параметра сеанса "ПСГ_Параметры". Обертка запроса при выполнении проверяет это параметр на наличие подстроки, сигнализирующей о необходимости отладки (по умолчанию "/debug").
При наличии параметра "/ДиспетчерЗапросов" открывается собственная форма обертки запросов, полезная возможностью выводить занные в таблицы и сводные таблицы.

В демонстрационной базе решается модельная задача: найти периоды постоянства надбавки по штатному расписанию для всех работников.
Для этого включена обработка "Пример использования обертки запроса".

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Демонстрационная база (dt).
.dt 134,73Kb
31.07.11
142
.dt 134,73Kb 142 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Роман Осадченко (cleaner_it) 01.08.11 05:21
(0) Договаривайся с Орефковым тут, чтобы он в Снегопат вставил возможность переопределения объектов "Запрос" твоей оберткой в рантайм-режиме. А в чем именно сложность реализации метода "Выполнить()"?
2. Денис Лазарев (irreal) 01.08.11 08:57
Спасибо за контакты!
Добавить метод Выполнить к обработке невозможно, т.к. существует функция языка Выполнить(Код1С).
3. Герман (German) 01.08.11 10:20
Суть идеи состоит в возможности вызова консоли запросов в режиме исполнения

А вот тут промашка почти все консоли имеют возможность отладки
В отладчике
ВнешниеОбработки.Создать("C:\Program Files\Enterprise Integrator\EI.epf").Отладка(Запрос)

подробности тут
Rustig; ldma1979; +2 Ответить 1
4. Денис Лазарев (irreal) 01.08.11 11:11
German пишет:
почти все консоли имеют возможность отладки
1. Типовые - не имеют, хотя пристраивается легко. О данной разработке не знал, спасибо.
2. Есть такое отличие. ПСГ_ОберткаЗапроса, по сути, таблица запросов, накапливающая их по мере вызова метода _Выполнить(). В случае, когда постороение системы временных таблиц производится несколькими запросами, обработка предоставит все. Отладка() в Вашей разработке придется вызывать несколько раз, попутно матерясь, что уже не помнится, что там было в таблице "ВТБаза". Раньше я пользовался похожим методом, приклеенным к консоли запросов из данной демо-базы:

// Процедура вызывает КонсольЗапросов (ex) в рантайме для передаваемого
// ей объекта Запрос, ПостроительЗапроса, ПостроительОтчета или СхемаКомпоновки
// Используется для отладки и декомпозиции сложных запросов
// В отсутствие ПараметрыСеанса.Отладка безвредна и может оставляться в коде.
// После отладки изменяет переданный текст запроса
Функция   ОтладкаЗапроса(Запрос,Параметр="/debug",Комментарий="",ДеревоЗапросов=неопределено) Экспорт
	#Если Клиент Тогда
		Если Отладить(Запрос,Параметр) Тогда
			Если ТипЗнч(Запрос) = Тип("Запрос") Тогда	
				Форма = Обработки.КонсольЗапросов.ПолучитьФорму("Форма");
				Форма.ЗагрузитьЗапрос(Запрос,Комментарий,ДеревоЗапросов);
			ИначеЕсли ТипЗнч(Запрос) = Тип("ПостроительОтчета") Тогда		
				
				Запрос1 = Запрос.ПолучитьЗапрос();
				ОтладитьЗапрос(Запрос1,Комментарий);
				
			ИначеЕсли ТипЗнч(Запрос) = Тип("МакетКомпоновкиДанных") Тогда	
				Запрос1 = Новый Запрос();
				Для каждого Парам из Запрос.ЗначенияПараметров Цикл
					Запрос1.УстановитьПараметр(Парам.Имя,Парам.Значение);
				КонецЦикла;	
				Для каждого Набор из Запрос.НаборыДанных Цикл
					Если ТипЗнч(Набор) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
						Запрос1.Текст = Набор.Запрос;
						ОтладитьЗапрос(Запрос1,Комментарий+"; "+Набор.Имя);
					ИначеЕсли ТипЗнч(Набор) = Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных") Тогда
						Для каждого Элемент из Набор.Элементы Цикл
							Запрос1.Текст = Элемент.Запрос;
							ОтладитьЗапрос(Запрос1,Комментарий);
						КонецЦикла;	
					КонецЕсли;	
				КонецЦикла;	
			КонецЕсли;	
			Возврат Истина;
		КонецЕсли;
	#Иначе	
	#КонецЕсли
	Возврат Ложь;
КонецФункции

// используется процедурой ОтладкаЗапроса
Процедура ОтладитьЗапрос(Запрос,Комментарий="") 
	#Если Клиент Тогда
		Если ТипЗнч(Запрос) = Тип("Запрос") Тогда	
			Форма = Обработки.КонсольЗапросов.ПолучитьФорму("Форма");
			Форма.ЗагрузитьЗапрос(Запрос,Комментарий);
		ИначеЕсли ТипЗнч(Запрос) = Тип("ПостроительОтчета") Тогда		
			Запрос1 = Новый Запрос(Запрос.Текст);
			Для каждого Парам из Запрос.Параметры Цикл
				Запрос1.УстановитьПараметр(Парам.Ключ,Парам.Значение);
			КонецЦикла;	
			ОтладитьЗапрос(Запрос1,Комментарий);
		КонецЕсли;	
	#КонецЕсли
КонецПроцедуры	
...Показать Скрыть
5. Герман (German) 01.08.11 11:32
irreal пишет:
попутно матерясь, что уже не помнится, что там было в таблице "ВТБаза"


В Ei МенеджерВременныхТаблиц тоже передается из отлаживаемого запроса
поэтому всегда можно сделать
ВЫБРАТЬ * ИЗ ВТБаза
6. Денис Лазарев (irreal) 01.08.11 11:36
German пишет:
В Ei МенеджерВременныхТаблиц тоже передается из отлаживаемого запроса
ясно, да это решает проблему. ну только запроса на созданеи ВТБаза уже не видно..., ну это мелочи.
7. Андрей Акулов (DrAku1a) 02.11.13 03:18
(3отладчике запросов реализован аналогичный вызов из конфигуратора (Функция "Открыть из отладчика") + обертка в режиме предприятия, т.е. у меня отладчик закинут в справочник "Внешние обработки", я его открываю - обработка сохраняется в кэш. Тогда вызываю в форме Файл -> Открыть из отладчика.

Внизу появляется код, который нужно выполнить в Shift-F9 уже в отладчике. Этого вполне хватает.

Для пакетного запроса, разбитого на отдельные куски с несколькими Запрос.Выполнить() - там же "Файл -> Загрузить пакет запросов" (в описании нету, но вроде работает... на практике такой изврат редко встречаю).
8. Денис Лазарев (irreal) 04.11.13 21:35
Вообще говоря, мне хотелось, что бы отладка запросов была доступна без конфигуратора и поиска места точки останова. Ведь язык SQL столь свойственен платформе, почему бы его не вывести в удобный вид. Моя система не требует конфигуратора и может быть активизирована прямо на проблемном пользователе. Конечно, остается негасимое желание, чтобы это поддерживала сама платформа, это просто ее обязанность...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа