В качестве параметров запроса 1С может выступать таблица значений и табличные части документа, очень полезный инструмент на мой взгляд. Итак таблица значений будет выступать в роли внешнего источника данных, сразу проясним несколько моментов все колонки в таблие значений должны быть строго типизированы иначе на выходе получим сообщение об ошибке "Тип не может быть выбран в запросе!". Типизируем колонки нашей ТЗ,
можно в коде:
ТЗВЗапрос = ДанныеФормыВЗначение(ТабДок,Тип("ТаблицаЗначений"));
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| Источник.Номенклатура КАК Номенклатура,
| Источник.Количество КАК Остаток
|ПОМЕСТИТЬ Товары
|ИЗ
| &ВнешнийИсточник КАК Источник";
Запрос.УстановитьПараметр("ВнешнийИсточник",ТЗВЗапрос);
Запрос.Выполнить();
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Остаток
|ИЗ
| Товары КАК Товары";
ВыборкаЗапроса = Запрос2.Выполнить().Выбрать();
Пока ВыборкаЗапроса.Следующий() Цикл
Сообщить(ВыборкаЗапроса.Номенклатура);
Сообщить(ВыборкаЗапроса.Остаток);
КонецЦикла;
КонецПроцедуры
можно в коде:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура",ОписаниеТиповС);
ТЗ.Колонки.Добавить("Количество",ОписаниеТиповЧ);
Можно добавить на форму реквизит с типом "ТаблицаЗначений", добавить колонки и там же их типизировать.
Для понимания сути сделал небольшую обработку пример:
&НаКлиенте
Процедура ПередатьВЗапрос(Команда)
ПередатьВЗапросНаСервере(ТЗ);
КонецПроцедуры
Процедура ПередатьВЗапрос(Команда)
ПередатьВЗапросНаСервере(ТЗ);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПередатьВЗапросНаСервере(ТабДок)
Процедура ПередатьВЗапросНаСервере(ТабДок)
ТЗВЗапрос = ДанныеФормыВЗначение(ТабДок,Тип("ТаблицаЗначений"));
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ
| Источник.Номенклатура КАК Номенклатура,
| Источник.Количество КАК Остаток
|ПОМЕСТИТЬ Товары
|ИЗ
| &ВнешнийИсточник КАК Источник";
Запрос.УстановитьПараметр("ВнешнийИсточник",ТЗВЗапрос);
Запрос.Выполнить();
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Остаток
|ИЗ
| Товары КАК Товары";
ВыборкаЗапроса = Запрос2.Выполнить().Выбрать();
Пока ВыборкаЗапроса.Следующий() Цикл
Сообщить(ВыборкаЗапроса.Номенклатура);
Сообщить(ВыборкаЗапроса.Остаток);
КонецЦикла;
КонецПроцедуры
Здесь в качестве таблицы значений использовал размещенный на форме реквизит. Процедурой ДанныеФормыВЗначение приводим нашу таблицу к типу "ТаблицаЗначений". Обязательно указываем в запросе менеджер временных таблиц т.к. планирую использовать ее в другом запросе, поскольку 1С устанавливает некоторые ограничения на внешние источники данных, нельзя использовать операции группировки, объединения и соединения и др. В теле первого запроса вывожу поля из внешнего источника и помещаю их в виртуальную таблицу "Товары". Второму запросу присваиваем менеджер таблиц и в запросе выбираем из него поля. Вот так обработали всю таблицу.
Комментариев нет:
Отправить комментарий