Таблицу значений в запрос
Часто в при реализации тех или иных алгоритмов нам приходится сталкиваться с тем, что нам в запрос необходимо передать таблицу значений. Опытный программист с этим справится без проблем, а вот ‘Джуниор 1с’ с этим с первого раза иногда справится не может. Итак, сделаем заметку о том, как быстро и правильно можно передать таблицу значений в запрос.
Для начала, перед тем как переходить к практической части, стоит усвоить для себя несколько важных нюансов:
- Если мы передаем в запрос таблицу значений, которую мы лично создаем через конструктор, то необходимо описать типы её колонок! В противном случае мы получим ошибку выполнения запроса ‘Тип не может быть выбран в запросе’! Но к примеру если мы ранее получили это таблицу из другого запроса, то по умолчанию у колонок задан уже тип и описывать ничего не нужно!
- Нельзя в запросе из переданной в неё таблицы значений сразу сделать выборку данных или какие-либо соединения с ней. В этом случае мы получим ошибку: ‘Содержимое объекта данных может быть выбрано только во временную таблицу’. Следовательно, нужно сделать так, как нам советует программа: с начала выбираем данные во временную таблицу, а уже затем делаем с ней что хотим!
Теперь практика! Давайте создадим таблицу значений, укажем типы колонок и затем передадим её в запрос в качестве самого обычного параметра (1-ый способ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТЗ_ВЗапрос = Новый ТаблицаЗначений; ТЗ_ВЗапрос.Колонки.Добавить("Сайт", Новый ОписаниеТипов("Строка")); ТЗ_ВЗапрос.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка._ДемоНоменклатура")); ТЗ_ВЗапрос.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число" , Новый КвалификаторыЧисла(18, 2))); НС = ТЗ_ВЗапрос.Добавить(); НС.Сайт = "www.craft1c.ru"; НС.Номенклатура = Справочники._ДемоНоменклатура.НайтиПоКоду("00-000037"); НС.Цена = 1500000; НС = ТЗ_ВЗапрос.Добавить(); НС.Сайт = "www.craft1c.ru"; НС.Номенклатура = Справочники._ДемоНоменклатура.НайтиПоКоду("00-000038"); НС.Цена = 152; НС = ТЗ_ВЗапрос.Добавить(); НС.Сайт = "www.craft1c.ru"; НС.Номенклатура = Справочники._ДемоНоменклатура.НайтиПоКоду("00-000039"); НС.Цена = 2; //1-ый вариант Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВременнаяТаблица.Сайт КАК Сайт, | ВременнаяТаблица.Номенклатура КАК Номенклатура, | ВременнаяТаблица.Цена КАК Цена |ПОМЕСТИТЬ вт_НашаТаблицаЗначений |ИЗ | &ВременнаяТаблица КАК ВременнаяТаблица |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | вт_НашаТаблицаЗначений.Сайт КАК Сайт, | вт_НашаТаблицаЗначений.Номенклатура КАК Номенклатура, | вт_НашаТаблицаЗначений.Цена КАК Цена |ИЗ | вт_НашаТаблицаЗначений КАК вт_НашаТаблицаЗначений"; Запрос.УстановитьПараметр("ВременнаяТаблица", ТЗ_ВЗапрос); РезультатЗапросаВВидеТЗ = Запрос.Выполнить().Выгрузить(); КонецПроцедуры |
Как видим ничего сложного нет! Для удобства описания таких источников данных в конструкторе запроса предусмотрен специальный помощник ввода данных:
Поскольку таблица значений, которая идет в запрос, всегда ‘конвертируется’ во временную таблицу, то мы можем использовать ‘МенеджерВременныхТаблиц‘ (2-ой способ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТЗ_ВЗапрос = Новый ТаблицаЗначений; ТЗ_ВЗапрос.Колонки.Добавить("Сайт", Новый ОписаниеТипов("Строка")); ТЗ_ВЗапрос.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка._ДемоНоменклатура")); ТЗ_ВЗапрос.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число" , Новый КвалификаторыЧисла(18, 2))); НС = ТЗ_ВЗапрос.Добавить(); НС.Сайт = "www.craft1c.ru"; НС.Номенклатура = Справочники._ДемоНоменклатура.НайтиПоКоду("00-000037"); НС.Цена = 1500000; НС = ТЗ_ВЗапрос.Добавить(); НС.Сайт = "www.craft1c.ru"; НС.Номенклатура = Справочники._ДемоНоменклатура.НайтиПоКоду("00-000038"); НС.Цена = 152; НС = ТЗ_ВЗапрос.Добавить(); НС.Сайт = "www.craft1c.ru"; НС.Номенклатура = Справочники._ДемоНоменклатура.НайтиПоКоду("00-000039"); НС.Цена = 2; //2-ой вариант Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ВременнаяТаблица.Сайт КАК Сайт, | ВременнаяТаблица.Номенклатура КАК Номенклатура, | ВременнаяТаблица.Цена КАК Цена |ПОМЕСТИТЬ вт_НашаТаблица |ИЗ | &ВременнаяТаблица КАК ВременнаяТаблица"; Запрос.УстановитьПараметр("ВременнаяТаблица", ТЗ_ВЗапрос); Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ | вт_НашаТаблица.Сайт КАК Сайт, | вт_НашаТаблица.Номенклатура КАК Номенклатура, | вт_НашаТаблица.Цена КАК Цена |ИЗ | вт_НашаТаблица КАК вт_НашаТаблица"; РезультатЗапросаВВидеТЗ = Запрос.Выполнить().Выгрузить(); КонецПроцедуры |
Вот такими не хитрыми способами можно передавать таблицу значений в запрос! Так же таблицу значений можно передавать в запрос системы компоновки данных – в этой статье можете ознакомиться с этим механизмом!