В этой статье мы разберем такую тему, как вложенные таблицы в языке запросов 1С.
В полях выборки запроса можно использовать вложенную таблицу источника запроса. Например, у документа «Оказание услуг», есть табличная часть Услуги, так вот, эту табличную часть тоже можно вывести в поле выборки. Сейчас Вы увидите, как это можно реализовать.
В своей учебной базе я запущу консоль запросов, открою конструктор запросов и выберу таблицу «Оказание Услуг».
Раскроем эту таблицу
И в ней мы видим табличную часть «Услуги».
Вот всю эту табличную часть и выберем.
Как видите, вся табличная часть услуги полностью выбралась в поля.
Обращаю Ваше внимание, что табличная часть, по сути, идет как отдельное поле, которое называется «Услуги» и тип которого будет «РезультатЗапроса». Научимся использовать вложенную таблицу в запросе.
Оставим три поля вложенной таблицы и добавим некоторые поля из шапки документа.
Нажмем кнопку ОК в конструкторе, и посмотрим как будет выглядеть наш запрос.
Как видите, в запросе после поля «Услуги» идет точка, а за ней в скобках перечислены выбранные поля.
Выполним запрос.
На рисунке мы видим, что все выбранные поля табличной части документа перечислена через запятую в поле «Услуги». Не во всех консолях запросов бывает такое отображение как на рисунке выше, иногда может просто идти надпись «ТаблицаЗначений«.
Ещё интересный момент, у вложенной таблицы можно вместо полей поставить звездочку, тогда выйдут все поля табличной части. Это нельзя сделать в конструкторе, только вручную в запросе. Запрос приобретет следующий вид:
Посмотрим, как выполнится такой запрос.
Единственно, что эта звездочка у нас не сохранится, если открыть конструктор запроса.
Мы научились делать запрос с вложенной таблицей в консоле, теперь научимся использовать вложенную таблицу в выборке
В действительности не так сложно обратится при обработке запроса к вложенной таблице. Вы просто обращаетесь к выборке по названию вашей таблицы, и получаете переменную с типом «РезультатЗапроса». А потом обрабатываете ее как обычный результат запроса: хотите, получайте выборку, хотите, делайте выгрузку.
Ниже приведу небольшой пример кода, в котором осуществляется работа с вложенной таблицей:
&НаСервере
Процедура ЗаполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| ПродажаТовара.Ссылка,
| ПродажаТовара.Товары.(
| Товар,
| Количество
| )
|ИЗ
| Документ.ПродажаТовара КАК ПродажаТовара»;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ВерхняяСтрокаДерева = ПродажаТоваров.ПолучитьЭлементы();
НоваяСтрока = ВерхняяСтрокаДерева.Добавить();
НоваяСтрока.Ссылка = Выборка.Ссылка;
ТаблТовары = Выборка.Товары;
ВыборкаТоваров = ТаблТовары.Выбрать();
Пока ВыборкаТоваров.Следующий() Цикл
ДочерняяСтрокаДерева = НоваяСтрока.ПолучитьЭлементы();
СтрокаТоваров = ДочерняяСтрокаДерева.Добавить();
СтрокаТоваров.Ссылка = ВыборкаТоваров.Товар;
СтрокаТоваров.Количество = ВыборкаТоваров.Количество;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Разъясню вышеприведенный код.
Первым делом мы получили линейную выборку, и обходим эту выборку в цикле, в котором создаем верхнюю строку дерева значений (оно на форме), и в неё записываем ссылку на наш документ.
А дальше самое интересное, можете даже посмотреть это потом в отладчике самостоятельно, мы обращаемся к полю выборки Товары, и записываем для удобства это поле в отдельную переменную ТаблТовары. Данная переменная имеет тип «РезультатЗапроса». И можно спокойно получить выборку этого результата. Что мы и делаем. Осталось обойти эту выборку с помощью функции следующий и цикла пока.
А внутри этого цикла будем обращаться к полям выборки как к полям вложенной таблицы, и записывать их в дочерние строки дерева с формы.
Вот какой результат будет возвращать этот код
Остались вопросы?
Вы ответите на них сами, когда изучите мой курс «Запросы в 1С для начинающих». Где эти и многие другие вопросы рассматриваются более подробно. Вся информация дается в простой и доступной форме и понятна даже тем, кто особо не знаком с программированием в 1С.
Промо-код на скидку в 20%: hrW0rl9Nnx
Поддержите мой проект перечислив любую сумму
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009