Конструктор запросов 1с 8.2 обучение. Конструктор запросов схемы компоновки данных

Одним из самых мощных инструментов 1С Предприятия 8, без сомнения, является Конструктор запросов. Конструктор является визуальным средством для работы с запросами на языке 1С. Но конструктор имеет один большой недостаток – он не показывает результат выполнения запросов. Данный недостаток особенно ощущается начинающими разработчиками прикладных решений на платформе 1С:Предприятие 8.3 и 8.2.

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

Для всех этих и многих других случаев мы рады вам предложить внешнюю обработку Консоль запросов с возможностью обработки результатов для 1С 8.3 и 1С 8.2 !


Основные возможности Консоли запросов для 1С 8.3 и 1С 8.2 :

Универсальная обработка, запускается на любой конфигурации платформ 1С: Предприятие 8.1 – 8.3;
- запускается в режиме 1С:Предприятие;
- запрос можно писать вручную, а можно вызвать Конструктор запроса;
- показывает результат выполнения запроса;
- можно указывать параметры отчета непосредственно в Консоли запросов;
- умеет сохранять и загружать файлы запросов.

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


Внешняя обработка Консоль запросовповторяет привычный интерфейс и большинство функциональных возможностей стандартного инструментария составления запросов системы 1С:Предприятия 8.3 и 8.2. Она также позволяет получать результаты запросов, пакетных запросов и временных таблиц.

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

ВАЖНО! Конструктор запроса в тонком клиенте не работает, данный пункт меню открытия Конструктора недоступен. В толстом клиенте Конструктор запроса доступен!


В тонком клиенте мы можем только писать запросы руками, все остальные функции работают без изменений.

Конструктор запроса - это один из инструментов разработки. Он позволяет составить текст запроса на языке запросов исключительно визуальными средствами.

С помощью кнопок Далее и Назад можно перемещаться по закладкам конструктора и указывать, какие данные должны присутствовать в результате запроса, как они связаны, сгруппированы, какие итоги следует рассчитать, работать с временными таблицами, редактировать пакет запросов:

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

Кроме этого конструктор запросов позволяет редактировать уже имеющийся в программе текст запроса. Для этого достаточно установить курсор внутри существующего текста запроса и вызвать конструктор. Имеющийся текст запроса будет проанализирован и представлен в конструкторе в виде соответствующих выбранных полей базы данных и набора заданных связей, группировок, условий и т.д.

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

Замечание.

К сожалению, в управляемом приложении в обработке «ЗнакомствоСЗапросом» нельзя пользоваться конструктором запроса. Можно им воспользоваться в этой обработке перейдя в обычный режим, но делать этого не будем.

Создадим обработку «КонструкторЗапроса» и определяем ее в подсистему «ОтчетыИОбработки».

Создадим форму обработки и в ней добавляем реквизит формы «ТабДок» типа «Табличный документ», а так же команду «ВыполнитьЗапрос» с действием «ВыполнитьЗапрос». Далее, перетаскиваем их на форму.

В модуле формы, для работы команды, пишем процедуру:

&НаКлиенте

Процедура ВыполнитьЗапрос(Команда)

ВыполнитьЗапросСервер();

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

&НаСервере

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

Становимся внутри процедуры вызываемой на сервере и из контекстного меню вызываем «Конструктор запроса с обработкой результата» (рисунок 2.65).

Рисунок 2.65 Конструктор запроса с обработкой результата

Ставим тип обработки «Вывод в табличный документ» и нажимаем либо кнопку «Далее», либо закладку «Таблицы и поля».

На закладке «Таблицы и поля» конструктора можно просмотреть существующие на данный момент таблицы в системе (левая часть озаглавленная «База данных») (Рисунок 2.66).

Рисунок 2.67 Конструктор запроса

Таблицы, данные из которых будут получаться запросом, переносятся в область «Таблицы», необходимые запросу поля переносятся в область «Поля». Сделаем это как на рисунке 2.68.

Рис 2.68 Конструктор запроса

Здесь мы убрали, создаваемое по умолчанию, поле представления - «ПРЕДСТАВЛЕНИЕ (ПоступлениеТоваровТовары.Номенклатура)»

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

Можно вручную отредактировать текст запроса, нажав на кнопку «Редактировать» .

Практика. Нажимаем кнопку «ОК» и проверяем нашу обработку в пользовательском режиме. Если проанализировать данные, полученные при выполнении запроса, то можно встретить «повторы» номенклатурных позиций (если у вас это не получилось, то можно скопировать и провести любой документ «ПоступлениеТоваров»).

Возвращаемся в процедуру ВыполнитьЗапросСервер() в обработке «КонструкторЗапроса» и из контекстного меню опять вызываем «Конструктор запроса с обработкой результата» .

Если требуется «свернуть» результат запроса, то для этой цели можно использовать закладку «Группировка» конструктора запроса.

При определении группировок необходимо придерживаться следующего правила: все поля выборки запроса делятся на поля, по которым производится группировка (свертка), поля вложенных таблиц (суммируемые поля относительно тех, по которым ведется группировка) и на агрегатные функции. Определим группировки (Рисунок 2.70).

Рисунок 2.70 Конструктор запроса

Если данные, получаемые запросом должны выбираться по какому-либо условию, то в этом случае может потребоваться задействовать закладку «Условия». Выберем ПоступлениеТоваровТовары.Количество=10 (Рисунок 2.71).

Рисунок 2.71 Условие конструктора запроса.

Обратите внимание на тот факт, что в случае если условие определено таким же образом как на рисунке, то запрос выполняться не будет.

Исправить ситуацию можно двумя способами:

    Переопределив условие, отметив флаг «П...»;

    Воспользовавшись возможностью изменения самого текста запроса (получаемого при нажатии на кнопку «Редактировать Запрос»).

Само изменение вручную будет заключаться в том, что необходимо перед числом «10» убрать символ «&». Этим символом в тексте запроса определяются параметры запроса, в которые в дальнейшем (но перед выполнением запроса) должны быть записаны какие-либо значения. Нажмем на кнопку «РедактироватьЗапрос» и правим (Рисунок 2.72).

Рисунок 2.73 Редактирование запроса

На закладке «Дополнительно» можно отметить ряд флагов (касающихся ключевого слова «Выбрать» языка запросов) и определить состав таблиц предназначенных для изменения запроса (Рисунок 2.74).

Рисунок 2.74 Дополнительные функции запроса

На закладке «Объединения/Псевдонимы» можно изменить имена полей задав «Псевдонимы», но мы этого делать не будем.

На закладке «Порядок» можно определить порядок сортировки записей в результате запроса (Рисунок 2.75).

Рисунок 2.75 Порядок сортировки записей

Обратите внимание на флаг «Автоупорядочивание», он может использоваться для упорядочивания по полям ссылочного типа.

При определении раздела «Итоги» следует быть готовым к тому, что в результате запроса появится «дополнительные» итоговые записи. Вместе с этими записями результат запроса становится иерархическим (Рисунок 2.76).

Рисунок 2.76.Итоги конструктора запроса.

Допустимо указание нескольких типов итогов:

    Элементы (в выборке результата запроса присутствуют итоги по группировкам и детальные записи);

    Иерархия (в выборке результата запроса в общем случае присутствуют итоговые записи по иерархии, итоговые записи по группировке, детальные записи);

    Только иерархия (в выборке результата запроса в общем случае присутствуют итоговые записи по иерархии).

После нажатия на кнопку «Ок» конструктора, будет сформирован «Макет» и в модуле формы пропишется код процедуры ВыполнитьЗапросСервер():

&НаСервере

Процедура ВыполнитьЗапросСервер()

//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Макет = Обработки.КонструкторЗапросов.ПолучитьМакет("Макет");

Запрос = Новый Запрос;

Запрос.Текст =

| ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,

| СУММА(ПоступлениеТоваровТовары.Количество) КАК Количество,

| СУММА(ПоступлениеТоваровТовары.Сумма) КАК Сумма

| Документ.ПоступлениеТоваров.Товары

| КАК ПоступлениеТоваровТовары

| ПоступлениеТоваровТовары.Количество > 1

|СГРУППИРОВАТЬ ПО

| ПоступлениеТоваровТовары.Номенклатура

|УПОРЯДОЧИТЬ ПО

| Количество,

| Сумма УБЫВ

| СУММА(Количество),

| СУММА(Сумма)

| Номенклатура ИЕРАРХИЯ";

Результат = Запрос.Выполнить();

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");

ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");

ОбластьНоменклатураИерархия = Макет.ПолучитьОбласть("НоменклатураИерархия");

ОбластьНоменклатура = Макет.ПолучитьОбласть("Номенклатура");

ТабДок.Очистить();

ТабДок.Вывести(ОбластьЗаголовок);

ТабДок.Вывести(ОбластьШапкаТаблицы);

ТабДок.НачатьАвтогруппировкуСтрок();

ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл

Если ВыборкаНоменклатура.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда

Область = ОбластьНоменклатураИерархия;

Область = ОбластьНоменклатура;

КонецЕсли;

Область.Параметры.Заполнить(ВыборкаНоменклатура);

ТабДок.Вывести(Область, ВыборкаНоменклатура.Уровень());

КонецЦикла;

ТабДок.ЗакончитьАвтогруппировкуСтрок();

ТабДок.Вывести(ОбластьПодвалТаблицы);

ТабДок.Вывести(ОбластьПодвал);

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

Рассмотрим как можно соединить эти две таблицы по полю КодТовара с использованием
конструктора запросов (код по формированию временных таблиц для примера приводить
не буду. Его можно взять по вышеуказанной ссылке).

Открываем окно конструктора, встаем на закладку «Таблицы и поля» , в раздел
«Таблицы» выбираем обе наши таблицы, а в раздел «Поля» -
те поля из обоих таблиц, которые мы хотим видеть в результате выполнения запроса.

Переходим на закладку «Связи» . Добавляем новую строку. В поле Таблица1
из выпадающего списка выбираем таблицу с товарами, а в поле Таблица2 Таблицу
со странами.

Для Таблицы1 устанавливаем флажок Все . Для
Tаблицы2 этот флажок не ставим. Это означает, что из Таблицы1
будут выбраны все записи, а из Таблицы2 только те для которых выполняется
условие соединения, то есть при такой комбинации флажков мы получаем
ЛЕВОЕ СОЕДИНЕНИЕ . Далее необходимо заполнить Условие связи .
Здесь мы выбираем поля таблиц из выпадающих списков и знак сравнения также из выпадающего
списка.

В результате такого соединения получим следующий текст запроса:

ВЫБРАТЬ ВТ_Товар.КодТовара, ВТ_Товар.Наименование, ВТ_Страна.Страна ИЗ ВТ_Товар КАК ВТ_Товар ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Страна КАК ВТ_Страна ПО ВТ_Товар.КодТовара = ВТ_Страна.КодТовара

Теперь рассмотрим подробнее некоторые моменты.
Давайте попробуем поменять местами флажок Все .


Казалось бы в итоге должно получиться ПРАВОЕ СОЕДИНЕНИЕ , но если мы
посмотрим на текст запроса, сформированный конструктором, то увидим, что таблицы
поменялись местами, а соединение все равно осталось левым:

ВЫБРАТЬ ВТ_Товар.КодТовара, ВТ_Товар.Наименование, ВТ_Страна.Страна ИЗ ВТ_Страна КАК ВТ_Страна ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Товар КАК ВТ_Товар ПО ВТ_Товар.КодТовара = ВТ_Страна.КодТовара

Посмотрим, что будет, если снимем оба флажка

В итоге получаем внутреннее соединение.

ВЫБРАТЬ ВТ_Товар.КодТовара, ВТ_Товар.Наименование, ВТ_Страна.Страна ИЗ ВТ_Товар КАК ВТ_Товар ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Страна КАК ВТ_Страна ПО ВТ_Товар.КодТовара = ВТ_Страна.КодТовара

И наконец, если установлены оба флажка


получаем полное соединение

ВЫБРАТЬ ВТ_Товар.КодТовара, ВТ_Товар.Наименование, ВТ_Страна.Страна ИЗ ВТ_Товар КАК ВТ_Товар ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Страна КАК ВТ_Страна ПО ВТ_Товар.КодТовара = ВТ_Страна.КодТовара

Можно задавать несколько строк на закладке Связи . В этом случае несколько
строк соединяются по условию И . Причем строки не обязательно
каждый раз вбивать заново. Их можно копировать с использованием клавиши F9 .
А в новой строке менять только условие соединения. Это существенно ускоряет разработку.
Также в условии связи необязательно использовать только предопределенные поля из
выпадающих списков. Можно использовать произвольное выражение, удовлентворяющее
языку запросов 1С. Для этого необходимо установить флажок Произвольное
и вписать условие непосредственно в поле, либо открыть вспомогательное окно, в
котором можно воспользоваться шаблонами с функциями языка запросов.


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

Итак, начинаем с простого: в конфигураторе создайте Новую обработку,назовите КонсольЗапросов или КонструкторЗапросов,как Вам больше нравится.

Сразу можем добавить в “Данных” табличку для будущих Параметров, которые нам необходимы, чтобы в своей Консоли у нас выполнялся не самый примитивный запрос, а с параметрами и ссылками,например, мы для своей работы будем создавать запрос к периодическим регистрам, а здесь без указания Параметра=&Дата никуда.

Чтобы создать нашу табличку Параметров, на вкладке “Данные” в ее “Табличной части” добавим новую таблицу,назовем ее ПараметрыЗапроса, здесь же добавим колонки этой таблицы:1)ИмяПараметра,тип строка=25символов; ЗначениеПараметра, здесь составной тип данных см.рис:

Поэтому как показано на картинке – выбираем составной тип для колонки ЗначениеПараметра:в открывшемся меню типов ставим галочку “Составной тип”, выбираем число,строка (20символов укажите),дата,булево, и самую нижнюю галочку ставим – ЛюбаяСсылка – она означает что далее, при указании Параметров нашего запроса, мы можем ссылаться на любой объект нашей конфигурации,например,справочники или документы.

Теперь нужно создать форму нашей будущей Консоли запросов. В обработке перейдем на вкладку “Формы” и добавим новую.Входим в эту форму и здесь уже неограниченное поле для творчества – Вы можете расположить созданных только что два реквизита и табличку с параметрами как Вам больше нравится! Для этого Вы можете использовать стандартные элементы формы как Группа или Страница со страницами (если Вам больше нравится переворачивающиеся страницы.

Главное здесь одно: перетащив реквизит “ТекстЗначения” в левое поле редактирования формы – обязательно в его свойствах установите “Вид”=Поле текстового документа.см.рис:

В свойствах реквизита “ТаблицаЗапроса” по желанию можете указать – “ОтображатьСетку”и”ОтображатьЗаголовки”.

Далее в правом окне редактирования формы переходим на вкладку “Команды” и добавляем новую кнопку,при нажатии на которую наша Консоль выполнить определенное действие. Создадим Кнопку “КонструкторЗапросов”, по собственному желанию Вы можете на кнопку добавить пиктограммку, главное – это вынесите саму кнопку в левое окно редактирования формы – чтобы мы смогли ее увидеть.Потом в правом окне редактирования формы нажимаем правый клик мыши на нашу кнопку и выбираем свойства – в свойствах нажимаем на пункт “Действие”,появится модальное окно с вопросом – где именно будет исполняться наш программный код, который мы назначим кнопке – выбирайте “На клиенте”.

Откроется МодульФормы с уже готовой пустой процедурой “Процедура КонструкторЗапроса(Команда)”. Внутри данной процедуры мы и опишем вызов стандартного Конструктора запросов 1с8. Это очень легко: Конструктор=Новый КонструкторЗапроса; Но здесь есть подводные камни – встроенный в платформу КонстукторЗапросов работает в пользовательском режиме ТОЛЬКО под толстым клиентом! Поэтому мы вставим условие инструкции препроцессора #Если, а вот здесь Вы сами решайте, исходя из Вашей платформы, или у Вас обычные формы,тогда выбирайте “ТолстыйКлиентОбычноеПриложение ” или у Вас платформа на управляемых формах, тогда “ТолстыйКлиентУправляемоеПриложение “.см.рис.

Теперь осталось добавить в данную процедуру условие на запись текста запроса, который сформирует нам Конструктор запросов в наш реквизит формы “ТектЗапроса”:

Если Конструктор.ОткрытьМодально()=Истина Тогда Объект.ТекстЗапроса=Конструктор.Текст; КонецЕсли;

Но мы можем что-то вручную поменять в тексте запроса (в пользовательском режиме – в окне реквизита “ТекстЗапроса”), чтобы наши изменения попали в КонструкторЗапросов при его новом вызове – добавим простое условие здесь же:

Если не ПустаяСтрока(Объект.ТекстЗапроса) Тогда Конструктор.Текст=Объект.ТекстЗапроса; КонецЕсли;

Все, мы подключили встроенный в платформу 1с8 КонструкторЗапросов, давайте посмотрим на свои труды. Для этого запустите 1С:Предприятие в режиме толстого клиента одним из указанных способов:1)гл.меню Конфигуратора – Отладка – НачалоОтладки – ТолстыйКлиент; 2) или если у Вас вынесены данные клавиши на панель управления в конфигураторе – просто нажмите кнопку с желтым кружком с толстой точкой см.рис.:

Запускается пользовательский режим 1сПредприятие8, находим нашу обработку, запускаем ее, жмем на нашу кнопку “КонструкторЗапросов” и видим, как открывается встроенный в платформу конструктор. см рис.

Итак, КонструкторЗапросов у нас запускается, можно уже в нем начинать складывать наш будущий запрос, но нам же интересно увидеть, как отработается созданный нами запрос! А для этого нам нужно создать в конфигураторе в редактировании формы нашей консоли еще одну кнопку, назовем ее “ВыполнитьЗапрос”. Нажимаем в свойствах кнопки “ВыполнитьЗапрос” на “Действие”, вновь выпадает меню, в котором нас спрашивают – где будет отрабатываться наш программный код, в данном случае выбираем “И на клиенте и на сервере”, вновь попадаем в МодульФормы.

В процедуре ВыполнитьЗапрос(), которая у нас на клиенте, запишим условие если пользователь не ввел текст запроса,а просит его выполнить:

Если ПустаяСтрока(Объект.ТекстЗапроса) Тогда сообщить("Введите текст запроса!"); КонецЕсли;

Система нам уже автоматически сформировала ссылку на процедуру ВыполнитьЗапросНаСервере(); – вот и хорошо, переходим в эту процедуру, которая исполняется на сервере и напишем здесь код исполнения нашего введенного запроса.

Здесь есть варианты: Вы можете самостоятельно писать все выражения, связанные с построением запросов,т.е. вручную, но есть еще проще вариант – внутри процедуры нажмите правую клавишу мыши и в выпадающем меню выберите пункт “Конструктор запросов с обработкой результатов см.рис.”:

Если Вы нажали на пункт Конструктор запросов с обработкой результатов”, то выпадет модальное окно “Не найден текст запроса.Создать новый?”,нажимайте да.Откроется встроенный конструктор запроса, в котором на его первой вкладке “Обработка результата” – выбираем пункт первый “Обход результата”. Все, больше нам от этого конструктора ничего не нужно, нажимаем на кнопку “Ок” – выпадет модальное окно “В запросе не выбрано ни одного поля, жмем “Ок”.

После этого внутри нашей процедуры ВыполнитьЗапросНаСервере() появится вот такая готовая заготовочка:

Перейдем к построенному конструктором выражению:

Запрос.Текст = "";

Запрос.Текст =Объект.ТекстЗапроса;

Вот так все просто, наша кнопка “ВыполнитьЗапрос” на форме обработки уже практически работоспособна, пока что она может обрабатывать только простые запросы без параметров, но главное что работает! Осталось только вывести визуально в реквизит “ТаблицаЗначений” на форме обработки – результаты нашего запроса. Напомню,что наш реквизит “ТаблицаЗначений” имеет тип “Табличный документ”, потому что иначе никак мы в пользовательском режиме не увидим наши результаты. Выводом табличных данных пользователю всегда занимается или Табличный документ или Макет, мне бы очень хотелось чтобы можно было вывести данные через таблицу значений – так как она очень простая в работе и привычная, но, к сожалению, таблица значений – это лишь инструмент, который нужен разработчику, выдавать данные на экран с помощью нее нельзя…

Рассмотрим подробней, что такое есть Табличный Документ-это как лист Exel – добраться до записи в конкретную ячейку можно только с помощью Ячеек таблицы, здесь они у нас называются область, но мы сами можем выбрать диапазон этой области в одну конкретную Ячейку:

Итак, разобрались, что такое табличный документ, определили для себя, что нам потребуется в конкретную ячейку данного табличного документа определить данные из нашего запроса. Но подумаем: а что такое “РезультатЗапроса”, который конструктор нам так быстро сформировал? Открываем справку – Результат запроса – это таблица, у которой есть соответствующие свойства! см.рис.

И если мы сейчас напишем после выражения РезультатЗапроса = Запрос.Выполнить();(созданного конструктором) вот такой простой цикл для Коллекций:

Для каждого ИмяКолонки Из РезультатЗапроса.Колонки Цикл сообщить(ИмяКолонки.Имя); КонецЦикла;

После этого цикла пока что заремарьте все выражения построенные автоматически конструктором. И запустите 1С:Предприятие8 под толстым клиентом.Создайте любой простенький запрос (Можно Конструктором запросов – он у нас уже работает) и нажмите на кнопку “ВыполнитьЗапрос”:

То Вы увидите внизу окна в сообщения – что в таблице РезультатЗапроса хранятся наименование полей, которые мы только что выбрали, создав простенький запрос.

Теперь выведем эти имена полей наших страданий в Табличный документ:

Для каждого ИмяКолонки Из РезультатЗапроса.Колонки Цикл Ячейка=Объект.ТаблицаЗапроса.Область(1,РезультатЗапроса.Колонки.Индекс(ИмяКолонки)+1); Ячейка.Текст=ИмяКолонки.Имя; КонецЦикла;

Чтобы вывести деталировку по данным запроса – разремарим созданные автоматически конструктором выражения и внутрь цикла перебора “ВыборкаДетальныеЗаписи” самого запроса вставим точно такой же цикл,который мы использовали для вывода наименований колонок, только теперь в текст Ячейки нам нужно передать не данные таблицы”РезультатЗапроса”, а данные самой Выборки, посмотрим в справке, как можно обратиться к полю Детальной выборки запроса:

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл //в первой строке у нас уже записаны имена колонок таблицы,поэтому данные загружаем ниже первой строки НомерСтрокиДок=Объект.ТаблицаЗапроса.ВысотаТаблицы+1; Для каждого ИмяКолонки Из РезультатЗапроса.Колонки Цикл Ячейка=Объект.ТаблицаЗапроса.Область(НомерСтрокиДок,РезультатЗапроса.Колонки.Индекс(ИмяКолонки)+1); Ячейка.Текст=ВыборкаДетальныеЗаписи[ИмяКолонки.Имя]; КонецЦикла; КонецЦикла;

Все, можем проверять, загружаем предприятие под толстым клиентом, вводим простой запрос без параметров, нажимаем на кнопку “ВыполнитьЗапрос” см.рис:

Ура, все работает!!!

Очень удобно, когда при открытии/закрытии нашей Консоли запросов – вновь в поле “ТекстЗапроса” записывается наш текст запроса, с которым мы перед закрытием консоли работали. Для этого просто нужно включить свойство формы = Автосохранение см.рис:

Все, наша консоль работает. Чтобы мы могли писать более сложные запросы с указанием в них параметров – нужно создать еще одну кнопку “НайтиПараметры”, так же как и код кнопки “ВыполнитьЗапрос” – код кнопки “НайтиПараметры” будет выполняться на клиенте и на сервере. Далее в серверной процедуре мы точно так же запускаем запрос с переданным в него текстом из окна “ТекстЗапроса”, с помощью выражения “Запрос.НайтиПараметры()” находим переданные параметры и просто в цикле вносим их в табличную часть формы “ПараметрыЗапроса”. Не забудьте потом из заполненной таблицы параметров передать их в процедуру “ВыполнитьЗапрос”.

Можно еще к нашей Консоли добавить пару кнопок, которые будут очищать в пользовательском режиме окно Параметров и окно Текста запроса.

Наша Консоль запросов готова к использованию, желаю успешных творческих решений с помощью такого простого и мощного инструмента, как Консоль запросов!

Данная обработка написана на платформе 1с8.3 (управляемые формы), запускается под толстым клиентом. Так же ее можно написать и на платформе 1с8.2 как под обычными формами, так и под управляемыми.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Апгрейд Консоли Запросов:

1)Теперь наша самодельная Консоль запросов со встроенным Конструктором запросов будет запускаться под любым клиентом: под толстым клиентом обычных и управляемых форм и под тонким и веб клиентом.

п.с.Форма и вид встроенного Конструктора запроса отличается – в зависимости от того под каким клиентом мы запустили нашу Консоль.(лично мне привычней и удобней форма Конструктора запросов под толстым клиентом)

&НаКлиенте Процедура КонструкторЗапроса(Команда) //вызов стандартного Конструктора запроса возможен только под толстым клиентом #Если ТолстыйКлиентУправляемоеПриложение или ТолстыйКлиентОбычноеПриложение Тогда Конструктор=Новый КонструкторЗапроса; Если не ПустаяСтрока(Объект.ТекстЗапроса) Тогда Конструктор.Текст=Объект.ТекстЗапроса; КонецЕсли; Если Конструктор.ОткрытьМодально()=Истина Тогда Объект.ТекстЗапроса=Конструктор.Текст; КонецЕсли; // #Иначе // Сообщить("Вызов Конструктора запросов возможен только под толстым клиентом"); // Возврат; //# КонецЕсли #Иначе Сообщить("Вы запускаете Конструктор запросов под тонким клиентом - он отличается немного по своей форме и скорости производительности!"); Конструктор = Новый КонструкторЗапроса(); Если не ПустаяСтрока(Объект.ТекстЗапроса) Тогда Конструктор.Текст=Объект.ТекстЗапроса; КонецЕсли; ОповещениеКонструктора = Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияКонструктора", ЭтаФорма); Конструктор.Показать(ОповещениеКонструктора); # КонецЕсли КонецПроцедуры &НаКлиенте Процедура ВыполнитьПослеЗакрытияКонструктора(Результат, ПараметрыКонструктора) Экспорт //Результат=текст,если Конс-р закрыли по кнопке ок Объект.ТекстЗапроса = СокрЛП(Результат); //работает!!! КонецПроцедуры

2)Добавила возможность в нашу простую Консоль запросов вводить сложные запросы с передаваемой в параметры Временной таблицей!!! Механизм получился очень простой и элегантный – без использования XML-кода, как делают в профессиональных консолях.

Сам код и процедуры по механизму передачи в параметры Временных таблиц Вы сможете посмотреть во втором прикрепленном файле. С чего начала разрабатывать свой вариант Временных таблиц в параметрах можно посмотреть по этой ссылке https://forum.infostart.ru/forum9/topic183700/

Теперь как пользоваться Консолью при сложном запросе, когда в его параметры передана временная таблица. Для примера можете взять код вот этого запроса;

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

По образцу и подобию приведенного выше кода запроса – Вы можете создать свой сложный запрос, с учетом Ваших объектов данных.

Итак, в конструкторе запросов мы создали выше приведенный запрос,закрыв Конструктор – текст запроса попадет в наше поле консоли “ТекстЗапроса”,нажимаем на кнопку “НайтиПараметры”, видим, что в таблице Параметров появилась строка = “ВнешниеДанные”,типЗначения=”ТаблицаЗначения”,см.рис.

В данной таблице Параметров – вводим параметр Дата,н-р, сегодняшняя дата, потом нажимаем для попытки редактирования на наш параметр временной таблицы “ВнешниеДанные”, нажимаем в поле с “ТаблицаЗначений” на три точки – появится выбор типов,жмем строка, наш механизм переворачивает нам страницу на форме, где нам необходимо в ручную ввести эту самую временную таблицу.

Здесь отметьте, что при этом на странице “ВремТаблицы” внизу в поле “Имя временной таблицы в параметрах” – появится имя нашей временной таблицы (оно копируется с таблицы Параметров).

Пока что на странице “ВремТаблицы” мы види только одну пустую таблицу – это таблица Типов нашей будущей временной таблицы.С помощью кнопки “Добавить” – добавим наименование реквизита и типа будущей таблицы. Будьте внимательны – наименование и тип должен соответствовать тому, что мы задали в запросе для &ВнешниеДанные:

Теперь нажимаем кнопку “ОбновитьВременнуюТаблицу” – и у нас здесь же появится вторая таблица – в нее мы уже непосредственно будем набивать через кнопку “Добавить” данные временной таблицы.

Все,можем еще раз перепроверить себя ввели ли мы примитивные данные параметров запроса в таблице параметров на 1-й странице обработки, и жмем кнопку “ВыполнитьЗапрос” – все считает,выбирает соответственно с ограничением по данным, переданых в параметре нашей временной таблицы

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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Вот и все, мы можем своими руками создать очень мощный рабочий инструмент, кроме того, наша консоль еще очень шустрая по сравнению с профессиональными – а это очень большой плюс для разработчиков! И,конечно, теперь наша консоль работает под любым клиентом! Удачи в Ваших творческих разработках!!!