таблица значений как параметр запроса 1с
Запрос к таблице значений в 1С 8.2 и 8.3
Многие начинающие программисты не знают, как поместить таблицу значений в запрос 1С 8. Очень часто это порождает распространенную ошибку — запрос в цикле. То есть разработчик не умеет включать таблицу значений в запрос и поэтому начинает обходить её в цикле и делать на каждую итерацию свой запрос. Рассмотрим на простом примере, как это сделать.
Пример
В качестве примера размещения таблицы значения в запросе 1С 8.3 возьмем простую ситуацию — есть таблица значений, в которой содержится список номенклатуры. Необходимо получить данные по остаткам на складах по каждой номенклатурной позиции.
Может быть две ситуации, как создана таблица значений, — программно и уже получена откуда-то (например, ТЧ документа). Если таблица создана программно, необходимо установить тип колонки, сделать это несложно
Т.е. при добавление колонки необходимо вторым параметром указать типы данных с помощью конструктора объекта «ОписаниеТипов».
Перейдем к построению запроса. Таблицу значений можно передать в запрос простым &Параметром.
Обязательный нюанс — созданную таблицу необходимо поместить результат во временную таблицу, в противном случае система выдаст сообщение: «Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу».
Таким образом, мы помещаем первый запрос во временную таблицу, а потом соединяем её с регистром остатков номенклатуры.
Вот и всё, проблема решена.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
1С 8.3 Параметры в запросе
&НаСервере
Процедура ПередачаПараметровПростыхТиповВЗапросе ()
// Создание отбора по поступлению материала за 2020 год
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.ПоступлениеМатериалов
|ГДЕ
| Дата МЕЖДУ &НачДата И &КонДата
|УПОРЯДОЧИТЬ ПО
| Дата ВОЗР» );
&НаСервере
Процедура ПередачаПараметровСсылочныхТиповВЗапросе ()
// Создание отбора по материалам с единицей измерения «Куб.см.»
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Наименование,
| ЕдиницаИзмерения
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЕдиницаИзмерения = &ЕдинИзмер» );
&НаСервере
Процедура ПередачаПараметровСписочногоТипаВЗапросе ()
// Создание отбора по материалам, единицы измерения входят в переданный список
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Наименование,
| ЕдиницаИзмерения
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЕдиницаИзмерения В (&СписокЕдиницИзмерения)» );
&НаСервере
Процедура ПередачаПараметраВВидеТаблицыЗначенийВЗапросе ()
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Наименование,
| СрокИспользования,
| Производитель
|ИЗ
| Справочник.Материалы
|ГДЕ
| (СрокИспользования, Производитель) В (&СписокСочетаний)» );
&НаСервере
Процедура ИспользованиеТаблицыЗначенийПереданнойВЗапросКакПараметр ()
// Сперва выбираем данные во временную таблицу, а потом работаем как с обычной таблицей
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Название,
| РынЦена
|ПОМЕСТИТЬ
| ВременнаяТаблица
|ИЗ
| &ТаблицаДрагМеталлов КАК ДрагМеталлы
|;
|ВЫБРАТЬ
| Название,
| РынЦена
|ИЗ
| ВременнаяТаблица
|УПОРЯДОЧИТЬ ПО
| РынЦена УБЫВ» );
Таблица значений в запросе
Подскажите как правильно использовать ТЗ в запросе?
Параметры ввожу тут:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КонецДня = Параметры.НаКакуюДату;
РеквТЗ.Параметры.УстановитьЗначениеПараметра(«НаДату», КонецДня);
РеквТЗ.Параметры.УстановитьЗначениеПараметра(«НаСкладе», Параметры.СодержитСклад);
РеквТЗ.Параметры.УстановитьЗначениеПараметра(«ТЗУчета», Параметры.ТЗУчета);
КонецПроцедуры
Выбрать
* Поместить ТЗУчета
ИЗ &ТЗУчета КАК ТЗУчета; //Тут ошибку выдает у &ТЗУчета
ВЫБРАТЬ
РегМатериалы.МестоХранения КАК МестоХранения,
РегМатериалы.МПЗ КАК Материал,
ЕСТЬNULL(РегМатериалы.КоличествоОстаток, 0) КАК Остаток,
ЕСТЬNULL(РегМатериалы.СуммаОстаток, 0) КАК СуммаВРегистре,
0 КАК О,
0 КАК Количество
ИЗ
РегистрНакопления.Материалы.Остатки(&НаДату, ) КАК РегМатериалы
ГДЕ
РегМатериалы.МестоХранения = &НаСкладе
Запрос в динамическом списке, ТЗ получаю выгрузив табличную часть.
Вот так попробовал
Процедура ПриОткрытии(Отказ)
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = «ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ»;
Запрос.УстановитьПараметр(«ТЗ», Параметры.ТЗУчета);
Запрос.Выполнить();
КонецПроцедуры
Но выдает ошибку:
<ОбщаяФорма.ПодборМатериалов1.Форма(89)>: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить().Выбрать();
по причине:
<(7, 2)>: Таблица не найдена «ТЗ»
>ТЗ
Такой взял пример:
Можно ли в запросе, в качестве источника данных, использовать таблицу значений?
Да. Это можно сделать с помощью временных таблиц:
// Сначала помещаем ТЗ во временную таблицу
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = «ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ»;
Запрос.УстановитьПараметр(«ТЗ», ТЗ);
Запрос.Выполнить();
// Теперь ТЗ можно использовать в запросе:
Запрос.Текст = »
|ВЫБРАТЬ
| ТЗ.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрНакопления.ТоварыНаСкладах.Остатки() КАК Остатки
| ПО
| ТЗ.Номенклатура=Остатки.Номенклатура»;
Но что то у меня не катит.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = «ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ»;
Запрос.УстановитьПараметр(«ТЗ», ТЗ);
Запрос.Выполнить();
// Теперь ТЗ можно использовать в запросе:
Запрос.Текст = »
|ВЫБРАТЬ
| ТЗ.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрНакопления.ТоварыНаСкладах.Остатки() КАК Остатки
| ПО
| ТЗ.Номенклатура=Остатки.Номенклатура»;
ТипизированнаяТЗ = Новый ТаблицаЗначений;
Для й=1 По Тз.Количество() Цикл ТипизированнаяТЗ.Добавить(); //Создаем строки
КонецЦикла;
ДЗТипов = Новый ДеревоЗначений;
ДЗТипов.Колонки.Добавить(«ИмяКолонки»);
ДЗТипов.Колонки.Добавить(«ТипЗначений»);
Для Каждого Колонка из Тз.Колонки Цикл
СтрокаКолонки = ДЗТипов.Строки.Добавить();
СтрокаКолонки.ИмяКолонки = Колонка.Имя;
ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
ТекСТрокаТипа.ИмяКолонки = Колонка.Имя; //Заполняется для красоты
ТекСТрокаТипа.ТипЗначений = ТипЗнч(тз[0][Колонка.Имя]);
Для Каждого СтокаТЗ из Тз Цикл
ТекТип = ТипЗнч(СтокаТЗ[Колонка.Имя]);
Если НЕ ТекТип = ТекСТрокаТипа.ТипЗначений Тогда
Если СтрокаКолонки.Строки.Найти(ТекТип, «ТипЗначений»)=Неопределено Тогда
ТекСТрокаТипа = СтрокаКолонки.Строки.Добавить();
ТекСТрокаТипа.ИмяКолонки = Колонка.Имя;//Заполняется для красоты
ТекСТрокаТипа.ТипЗначений = ТекТип;
КонецЕслИ;
КонецЕслИ;
КонецЦикла;
МассивТипов = СтрокаКолонки.Строки.ВыгрузитьКолонку(«ТипЗначений»);
ТипизированнаяТЗ.Колонки.Добавить(Колонка.Имя, Новый ОписаниеТипов(МассивТипов),Колонка.Заголовок);
ТипизированнаяТЗ.ЗагрузитьКолонку(Тз.ВыгрузитьКолонку(Колонка),Колонка.Имя);
КонецЦикла;
Запрос к таблице значений 1С 8.3
Чтобы в 1C 8 поместить таблицу значений в запрос и использовать ее в качестве источника данных нужно:
1. Передать ее в параметр запроса
Пусть у нас есть таблица значений с именем ТЗ и полями: Договор, Количество, Сумма.
2. В конструкторе запроса задать структуру таблицы
Для этого вызываем конструктор запросов 1С 8, создаем новый запрос и жмем кнопку Создать описание временной таблицы.
В имени таблицы указываем переданный параметр, в поля заносим имена полей таблицы. Создание структуры временной таблицы:
Далее на закладке Дополнительно нужно указать, что мы создаем временную таблицу.
3. Использование созданной временной таблицы в запросе
Получите понятные самоучители по 1С бесплатно:
После того, как мы передали таблицу в запрос, ее можно использовать. Создаем новый пакет запросов на соответствующей закладке, переходим в него и видим, что в таблицах и полях появилась ветка Временные таблицы. Теперь можно делать с созданной таблицей все, что угодно: ставить условия, группировать, соединять с другими таблицами и т.п.
Вот пример простенького запроса с группировкой и условием:
Следует заметить, что в запрос можно передавать только таблицы значений с типизированными полями.