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