bdd2

Консоль запросов для УФ с возможностью передачи готовой ТЗ в качестве параметра

Опубликовал Вадим Мориков (vadim1011985) в раздел Программирование - Практика программирования

Небольшая статья о том, как передать готовую таблицу значений в качестве параметра запроса в консоли запросов.

Приветствую всех! 

Долго думал, стоит ли описывать данную тему, и наконец-то решился.  Возможно, это пригодится кому-то в дальнейшем.

Консоль запросов быстро вошла в инструментарий практически любого программиста 1С. Многие к основному ее функционалу добавили множество  различных  и полезных плюшек для упрощения отладки запросов и оптимизации обработки результатов.

Но иногда встречаются ситуации, когда консоль запросов не удается задействовать. Это случается, когда источником таблицы служит ТаблицаЗначений  сформированная программным способом, либо источником служит Табличная часть внешней обработки, например, внешняя обработка по загрузке данных из какого-то файла загружает данные в таб.часть, и дальше уже идет работа с ними. 

Наверно, каждый когда- либо писал такого рода запрос 

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ*
| ПОМЕСТИТЬ ВнешняяТЗ
| ИЗ &ТЗ КАК ТЗ";
....
Запрос.УстановитьПараметр ("ТЗ",ТЗ);

Вопрос - а как же отладить запросы с помощью консоли запросов, которые строятся на основании данных этого запроса ?

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

Теперь стало легче отлаживать запросы, и это плюс, но, как говорится, за удовольствие надо платить,  и плата в данном случае - ручное заполнение таблицы нужными данными. А этих данных может быть очень много.

А мы - программисты, народ ленивый и руками работать не любим. Поговорка  "Лень - двигатель прогресса" это как раз про нас, поэтому необходимо найти способ облегчить себе труд. И, как оказалось, решение лежит на поверхности - передать готовую и заполненную таблицу через ВременноеХранилище. И делается это все в несколько строчек кода. 

Сразу уточню, что все дальнешие действия будут происходить с Консоль запросов (из папки RequestConsoleManaged) с диска ИТС.

Открываем данную консоль в конфигураторе и добавляем новый реквизит "АдресВременногоХранилища" (в принципе, данный реквизит можно и не добавлять, а добавить реквизит формы) .

Далее открываем форму "ТаблицаЗначений" на форму выносим добавленный реквизит и добавляем команду с вызовом сервера. Вот сам код команды:

&НаКлиенте 
Процедура ПолучитьТЗИзВременногоХранилища(Команда) 
   ПолучитьТЗИзВременногоХранилищаНаСервере(); 
КонецПроцедуры 

&НаСервере 
Процедура ПолучитьТЗИзВременногоХранилищаНаСервере() 

  Если ЭтоАдресВременногоХранилища(Объект.АдресВременногоХранилища)Тогда 

       ТЗ = ПолучитьИзВременногоХранилища(Объект.АдресВременногоХранилища); 

          Если ТипЗнч(ТЗ) <> Тип("ТаблицаЗначений") тогда 
               Возврат; 
          КонецЕсли; 

       ТЗНастройки = НастройкиТаблицыЗначений.Выгрузить(); 

       Для каждого Колонка ИЗ ТЗ.Колонки Цикл 
            НовСтрока = ТЗНастройки.Добавить(); 
            НовСтрока.НаименованиеКолонки = Колонка.Имя; 
            НовСтрока.ТипКолонки = Колонка.ТипЗначения; 

            СообщениеСистемы = ""; 
            ИнициализацияКолонкиВТЗСервер("",Колонка.Имя,Колонка.ТипЗначения,СообщениеСистемы); 
      КонецЦикла; 
  
      НастройкиТаблицыЗначений.Загрузить(ТЗНастройки); 
      ТаблицаЗначенийПараметр.Загрузить(ТЗ);
 
  КонецЕсли; 

КонецПроцедуры 

Как видите, код простой и в комментариях не нуждается.  Процедура "ИнициализироватьКолонкиВТЗСервер" уже определена в модуле формы , поэтому описывать ее здесь не имеет смысла. 

Вот в принципе и все. Осталось поместить нужную ТаблицуЗначений во ВременнойХранилище  и получив адрес, загрузить ее в качестве параметра в Консоль Запросов. 

Так же стоит отметить недостатки данного подхода. 

1) Медленная работа Консоли Запросов  при работе с ТЗ в качестве параметра

2) Неоходимость дописания обработок для помещения нужных таблиц во временное хранилище. 

 

Вот пример, как это работает. 

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

В данной обработке я добавил страницу "Отладка" , где указываю нужную таблицу и загружаю ее во временное хранилище 

Далее в консоли добавляю параметр с типом ТаблицаЗначений , перехожу в редактирование таблицы и в поле адрес временного хранилища вставлю полученный ранее адрес и нажимаю кнопку "получить ТЗ из временного хранилища" 

В результате у нас сформировалась описание таблицы и загрузилась сама таблица. Осталось только выполнить сам запрос

 

См. также

Добавить вознаграждение
Комментарии
1. Сергей Старых (tormozit) 4061 11.07.16 23:53 Сейчас в теме
Интересно, в обычных формах такое возможно?
2. Вадим Мориков (vadim1011985) 35 12.07.16 00:14 Сейчас в теме
Не знаю , но думаю что в принципе возможно , надо только иметь возможность указать тип параметра Таблица значений. В стандартно консоли он не доступен , но думаю что никто не мешает его добавить . Вроде я даже видел тут консоль на обычных формах с расширенным типом значений параметров. Можно посмотреть как реализовано на УФ и попробовать перенести данный механизм на обычные формы
3. Сергей Старых (tormozit) 4061 12.07.16 07:26 Сейчас в теме
Дай ссылку на такую консоль. Очень интересно.
4. Вадим Мориков (vadim1011985) 35 12.07.16 09:13 Сейчас в теме
5. Сергей Старых (tormozit) 4061 12.07.16 09:27 Сейчас в теме
Почему же ты тогда пишешь
В консоли запросов (на обычных формах) нельзя было пердавать параметр с типом ТаблицаЗначений
? Получается, что можно все таки.
6. Вадим Мориков (vadim1011985) 35 12.07.16 10:30 Сейчас в теме
(5) tormozit, Согласен , добавить в обычную консоль тип Таблица Значений можно. Просто в написании я подразумевал стандартную консоль запросов где тип Таблица Значений не доступен по умолчанию . Сегодня поправлю этот момент в статье