Консоль запросов своими руками 1с8

1. jan-pechka 408 21.12.17 21:41 Сейчас в теме
Своими руками мы теперь можем создать Консоль запросов со встроенным в него Конструктором запросов.
см.публикацию https://infostart.ru/public/719293/

Но хочу усложнить задачку - чтобы можно было в параметры запроса передавать не только ссылки на текущие объекты конфигурации, но и на временные таблицы. Пока мысль крутится, но решающей идеи нету...может кто подскажет мысль.Заранее спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. jan-pechka 408 23.12.17 21:19 Сейчас в теме
Пока никто ничего не ответил,а жаль....
Копаюсь в коде профессиональных Консолей запросов (My Webpage) - как они создают временные таблицы для передачи параметров в сложные запросы....это просто ужас!!!

Они дважды конвертируют очень сложно созданную ими таблицуЗначений в XML-код,чтобы потом в строке передать все параметры. Я пока еще не доросла даже до азов XML,куда мне с помощью него что-то конвертировать?

Но передавать временные таблицы в виде параметров в свои запросы мне нужно...
Итак, тянем-потянем за ниточку:

1.Возьмем мою простенькую Консоль запросов, которую теперь каждый может сделать сам (My Webpage) и просто создадим небольшой запрос, который потребует от нас параметры в виде таблицы.

Это,например,будет запрос к регистру остатков товаров, но нужно чтобы не все остатки по всем товарам из базы нам вытягивал запрос, а только по конкретным товарам, например из табличной части любого документа. Табличную часть документа мы можем выгрузить в любой момент в нужной нам процедуре, поэтому, составляя подобный запрос, мы в Конструкторе запросов просто рисуем таблицу,н-р,"ВнешниеДанные" с двумя колонками:Товар и Количество, а на саму таблицу ставим амперсант &ВнешниеДанные,т.е.обозначаем ее как параметр запроса. см.рис.1и2

ВЫБРАТЬ
	ВнешниеДанные.Товар,
	ВнешниеДанные.Количество
ПОМЕСТИТЬ ВнешниеДанные
ИЗ
	&ВнешниеДанные КАК ВнешниеДанные


Теперь ничего нам не стоит в Конструкторе запросов на выбранную таблицу регистров остатков - наложить фильтр по ВнешниеДанные, а именно по полю Товар из нашей временной таблицы "ВнешниеДанные".Связь двух пакетов запроса устанавливаем по Товар. см.рис.3и4

Здесь еще для результата нашего будущего запроса можем указать рассчетное поле-КоличествоОстатка-Количество (сколько мы хотим списать по документу)=Осталось товара столько-то, но это пока неважно, мы работаем сейчас над самим процессом создания Временных таблиц как Параметров запроса, посчитать и потом можем,когда заработает)) проверку на Nullы тоже можно указать...

В результате получаем вот такой скромненький запрос, но у которого в параметрах передана временная таблица:

ВЫБРАТЬ
	ВнешниеДанные.Товар,
	ВнешниеДанные.Количество
ПОМЕСТИТЬ ВнешниеДанные
ИЗ
	&ВнешниеДанные КАК ВнешниеДанные
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВнешниеДанные.Товар,
	ВнешниеДанные.Количество,
	ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК Поле1,
	ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) - ВнешниеДанные.Количество КАК Осталось
ИЗ
	ВнешниеДанные КАК ВнешниеДанные
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
				&Дата,
				Товар В
					(ВЫБРАТЬ
						ВнешниеДанные.Товар
					ИЗ
						ВнешниеДанные КАК ВнешниеДанные)) КАК ОстаткиТоваровОстатки
		ПО ВнешниеДанные.Товар = ОстаткиТоваровОстатки.Товар
Показать


Основу мы создали, теперь давайте мучаться с созданием в Консоли запросов механизм Временных Таблиц.
Прикрепленные файлы:
3. jan-pechka 408 23.12.17 21:31 Сейчас в теме
Так...а вот теперь в моей простенькой Консольке запросов есть уже текст запроса с передаваемым параметром -временная таблица.

Нажимаем на кнопку "НайтиПараметры" см.рис.

Мы видим, что механизм запроса распознал нашу Временную таблицу - как ТаблицаЗначений!!! ура,уже хоть от чего-то можно отталкиваться,чтобы создать механизм Параметров с временными таблицами.
Прикрепленные файлы:
4. jan-pechka 408 23.12.17 22:25 Сейчас в теме
Чтобы удостовериться, что запрос нам точно в нашу таблицу параметров (та,что на форме) передает ТаблицуЗначений, когда мы Нажимаем на кнопку "НайтиПараметры", просто в реквизите формы ЗначениеПараметра (это имя колонки таблицы Параметров,к-я у нас есть на форме) - вписываем любое событие,н-р, при НачалеВыбора:

&НаКлиенте
Процедура ПараметрыЗапросаЗначениеПараметраНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	Если Элемент.Родитель.ТекущиеДанные.ЗначениеПараметра="ТаблицаЗначений" Тогда
	        Сообщить("В Параметрах передана ТаблицаЗначений");
	КонецЕсли;
КонецПроцедуры


Это стандартные процедуры и параметры у них как бы предопределенные, поэтому поставим Точку остановы на наше условие и увидим, что в поле "ЗначениеПараметра" получена действительно ТаблицаЗначентий!!!....но с типом строка...см.рис1

Что ж так не везет-то,а???????? Уже так обрадовалась, что где-то в дебрях Амазонки,т.е.внутри скрытых механизмов 1с8 уже лежит и ждет меня сундук сокровищ с готовой ТаблицейЗначения, в к-й вся наша ВременнаяТаблица Параметров запихнута...ан,нет!)))

Хорошо, полезла в код проф.Консоли, делаю те же действия - может у них уже сразу есть эта самая Виртуальная Таблица параметров, просто я ее не вижу??? см.рис.2

Нет,ничего подобного...наши профессионалы создали специальное хранилище значений, куда просто дали ссылку, она у них называется "ХранилищеТаблицы" - и тоже при начальном определении Параметров запроса - она ПУСТАЯ и тип у нее строка (см.еще раз рис.2)....Видно всем не везет сразу найти грааль)).

Хорошо, перевожу точку останову ниже, чтобы хоть чем-то заполнилась пустая строка наших данных - вуаля! у проф.Консоли строчное значение ХранилищеТаблицы забивается XML-кодом!!!!!! см.рис.3

Вот потянула я за эту веревочку, сильно не напрягаясь над смыслом механизма XML - все должно быть проще и это однозначно!

Но у профи все слишком не проще оказалось, а так запутанно, то никаких сил не хватит разобраться)))...
Прикрепленные файлы:
5. jan-pechka 408 23.12.17 22:56 Сейчас в теме
"Не Боги горшки обжигают", решила я и пошла самым простым путем, чтобы все-таки создать хотя бы самый примитивный механизм ВременнаяТаблица как ПараметрыЗапроса.

Итак, в данных формы обработки добавила еще одну таб.часть "ВремТаблица",добавила ей пару колонок:1)ИмяПараметра,тип стр.=20символов;2)ЗначениеПараметра,тип составной см.рис1.

На самой форме я эту табличку на вторую страничку моей формы расположила.см.рис2

А теперь,называется вспомнить все)) Мы выше определили, что никакие даже наши суперпрофессионалы не создают автоматически ВременнуюТаблицу для Параметров запроса - ее приходится в любом случае набирать в ручную!!!!!!

Вот и наберем ее в ручную (рис.3), главное - это чтобы при нажатии в обработке на кнопку "ВыполнитьЗапрос" - наша "ручная" таблица подхватилась и выполнилась....Да, вот с этим пунктом я намучалась честно! Пока нашла каким же образом запихать в наименование колонок Тип = Справочники.МоиТовары!!!!

В результате получился вот такой код для кнопки "ВыполнитьЗапрос":

&НаСервере
Процедура ВыполнитьЗапросНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = Объект.ТекстЗапроса;
	
	ВнешниеДанные=Новый ТаблицаЗначений;
	ВнешниеДанные.Колонки.Добавить("Товар",Новый ОписаниеТипов("СправочникСсылка.МоиТовары"));
	ВнешниеДанные.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число"));

	Если Объект.ВремТаблица.Количество()>0 Тогда
	
		Для каждого Строка Из Объект.ВремТаблица Цикл
		
			стр=ВнешниеДанные.Добавить();
			стр.Товар=Строка.ЗначениеПараметра;
		    стр.Количество=0;
		КонецЦикла; 
	
	КонецЕсли; 
	
		табПарам= Объект.ПараметрыЗапроса;
		//Заполним Параметры запроса из Таблицы параметров,к-я есть на форме
		Для каждого ТекПараметр Из табПарам Цикл
			Если ТекПараметр.ЗначениеПараметра="ТаблицаЗначений" Тогда
				Если  ВнешниеДанные.Количество()>0 Тогда
					//Для каждого Строки Из табВрем	Цикл
						Запрос.УстановитьПараметр("ВнешниеДанные",ВнешниеДанные);
					//КонецЦикла;
					//Продолжить;
				Иначе 
					сообщить("В параметрах запроса указана временная таблица,заполните ее,пожалуйста");
					прервать;
				КонецЕсли;
			Иначе
				Запрос.УстановитьПараметр(ТекПараметр.ИмяПараметра,ТекПараметр.ЗначениеПараметра);
			КонецЕсли; 
		КонецЦикла; 
	
	РезультатЗапроса = Запрос.Выполнить();
Показать


Ура!!! Это Чудо - заработало!!!! см.рис4.

п.с.теперь беру помощь зала))
А как мне созданную в проц.ВыполнитьЗапрос таблицу "ВнешниеДанные" сделать автоматической? Ведь имя временной таблицы может быть любым...как и имена колонок...даже их количество может быть больше двух!!!!
Прикрепленные файлы:
6. jan-pechka 408 24.12.17 18:34 Сейчас в теме
Ура!!!!!!!!!!!!!!!! Заработала моя временная таблица! Без единой строчки xml !!!!!!!!!!!!!!!

см.скрин 1 и 2

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

п.с.чуть позже в публикацию выложу сам апгрейд Консоли запросов - она теперь универсальная - запускается вместе с встроенным Конструктором запросов под любым клиентом (и толстым обычные/управляемые формы и под веб/тонким клиентом), да и к тому же теперь в ней можно создавать сложные запросы с передаваемыми Параметрами Временных таблиц!!! Кроме того, моя консолька легкая - она шустро работает!!! И самое главное - на ее основе любой начинающий программист может создать такую же себе подходящую Консоль, этим самым сделать себе хороший СВОЙ инструмент и получить хороший экспириентс в программировании на языке 1с8!!!!

п.с.2.Продолжаю ждать Ваши предложения по усовершенствованию Врем.Таб,возможно, что у Вас будет еще более простая и элегантная идея!!!Спасибо.
Прикрепленные файлы:
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот