1с8.2-8.3.Вывод на экран данных запроса с переданными Параметрами из Документа! 8 различных вариантов:от Сообщений, Таблицы и Отчетов до СКД без объекта-отчета
Самый важный аспект 1С — это быстро получить данные из базы.
Например, по результату набранного в КонсолиЗапросов запроса вывести этот результат на экран.
А еще лучше, когда мы вызываем выборку данных из конкретного документа и, конечно, желаем, чтобы параметры по этому документу тоже были переданы в выборку.
Здесь мы будем выводить данные на экран по нажатию кнопки в документе, обязательно с получением в параметрах значений из документа.
Рассмотрим 8 вариантов вывода подобной информации на экран: 1.Вывод результатов запроса командой Сообщить() из ТаблицыЗначений; 2.Вывод результатов запроса — просто в табличный документ; 3.Вывод результатов запроса с помощью ДвумерногоМассива; 4.Вывод результатов запроса с помощью МассиваСтруктур (с двумя вариантами); 5.Вывод обычным объект-Отчетом без СКД; 6.Вывод объект-Отчетом-СКД+УстановкаПараметров; 7.Вывод объект-Отчетом-СКД+ВнешняяВременнаяТаблица; 8.Вывод программно СКД без объекта-Отчета с Параметром=ВнешняяВременнаяТаблица.
- Описание
- Подробнее
Описание
В ссылке лежит база-черновик, созданная на платформе 1С8.3 управляемые формы. У меня настроен безМодальный режим, его всегда можно изменить на модальный:правой клавишей мыши на саму конфигурацию Черновик-Свойства-вкладка Совместимость-режимы модальности(2 поля) см.рис1

В базе-Черновике создан пример Документа и необходимых для него справочников,все данные выдуманные. Эта база создавалась больше как напоминалка — как быстенько сделать тот или иной отчет (или др.способом вывести данные на экран). В реальной жизни — параметры,передающиеся из документа могут быть в разы сложнее,но разобравшись с азами вывода данных,-потом любой сложности отчет не составит труда сделать.
Начнем.
1.Вывод результатов запроса командой Сообщить() из ТаблицыЗначений
Допустим, у нас есть задача: выбрать данные из пары справочников (справочники организованы с табличной частью),но не все данные этих справочников нам нужны,а только те,которые соответствуют открытому на данный момент документу.
Для этого — мы на форму документа вывели кнопку "КонтактыКлиентов", в модуле формы данного документа — у нас есть исполняющая клиентская процедура КонтактыКлиента(Команда), вот здесь и начнем писать первый код.

Код уже в базе написан,просто ставьте/снимайте ремарки с нужного варианта нашего вывода данных на экран:
В данном варианте мы создаем Структуру,записываем в нее данные по Контрагентам и Партнерам из текущего открытого документа.А далее передаем управление в серверную процедуру КонтактыКлиентаНаСервере(Структура,ТабДок). Эта серверная процедура вызывает расчетную экспортную функцию сервера из ОбщегоМодуля.
Прежде чем идти дальше — поясню алгоритм что мы делаем: у нас есть два справочника из которых нам нужны данные,но только те, которые у нас присутствуют в текущем открытом документе. Самым простым и быстрым способом мы можем получить такую выборку,если в пользовательском режиме 1С откроем КонсольЗапросов, а в ней и составим сложный запрос,параметром которого будет временная таблица — именно в нее мы и передаем значения из документа,и именно она и будет являться фильтром-отбором в нашем запросе:

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

2.Вывод результатов запроса — просто в табличный документ
Востановите ремарки в расчетной серверной процедуре из ОбщегоМодуля, снимите ремарку в модуле формы документа ТабДок.Показать();
Запускайте вновь пользовательский режим 1С, после нажатия на кнопку "КонтактыКлиентов" — мы получаем вывод нашей выборки в обычный ТабличныйДокумент:
3.Вывод результатов запроса с помощью ДвумерногоМассива
Заремарьте в модуле формы в проц.КонтактыКлиента(Команда) код с 1-2 вариантов вывода данных на экран.
Разремарьте тут же 3-й вариант
//3.Рабочий вариант с Двумерным массивом
Структура=Новый Структура("Партнеры,Контрагенты",Объект.Партнер,Объект.Контрагент);
ДвумерныйМассив=ОбщийМодульКонтакты.КонтактыКлиентаНаСервереМодульОбщийМассив(Структура);
н=0;
Для каждого СтрокаМассива Из ДвумерныйМассив Цикл
Сообщить("" + ДвумерныйМассив[н][0]+ДвумерныйМассив[н][1]);
н=н+1;
КонецЦикла;
Здесь и в 4-м варианте реализована прежде всего суть всех страданий 1.8.3: их работой в клиент-серверном режиме)).
Так как нельзя между клиентом и сервером перегонять таблицу значений, а нам,допустим, ну очень нужно итоговые данные из расчетной процедуры видеть на клиенте, то варианта два — передавать между клиентом и сервером Структуру или Массив!
В этом примере — мы так же с помощью нашего сложного запроса считаем все данные в серверной процедуре в ОбщемМодуле, результаты запроса по этим расчетам — выгружаем в двумерный Массив и отправляем его на клиента,где пока все просто выводится сообщениями.
4.Вывод результатов запроса с помощью МассиваСтруктур (с двумя вариантами)
точно такой же подход,как в примере выше,только мы не просто загоняем данные из результата запроса в определенного размера Массив, а загружаем их в МассивСтруктур — очень интересный способ, его мне подсказал Алексей (Alexey_) (в этой теме https://forum.infostart.ru/forum9/topic184275/).Спасибо.
5.Вывод обычным объект-Отчетом без СКД
Это все тот же запрос, просто в данном варианте — он находится в модуле формы объекта-Отчета.Все так же считает. Результат выводится через табличный документ в МакетОтчета, который сама как придумала,так и нарисовала:
п.с.Это самый стандартный способ вывода данных — через обычный объект-Отчет с обычным Макетом, без всяких СКД….и запрос для него очень быстро набрать в КонсолиЗапросов можно…Не знаю, мне больше всего нравится именно этот вариант, но как говорят -каждому на свой вкус и цвет…
6.Вывод объект-Отчетом-СКД+УстановкаПараметров
Начинается СКД — Схема Компановки Данных…
Сам отчет получился очень простой — в нем нет практически кода, всю работу выполняет СКД!
Но вот с составлением запросов в данном СКД — пришлось повозиться…Здесь нет никакой внешней временной таблицы — связь идет через Параметр документа &Ссылка. А вот как передать ее в СКД — я голову поломала немножко)) Потом просто пришлось использовать дополнительный реквизит на форме — в него загружать Параметр ссылки при процедуре ПриСозданииНаСервере,а потом из процедуры ПриКомпоновкеРезультата — выхватывать этот параметр с реквизита формы и устанавливать его стандартными настройками установки параметров для объекта-Отчета.
На идею — попробывать создать сложные запросы без внешней временной таблицы натолкнул Sergey Andreev (starik-2005).Спасибо.
Вот такая красота в итоге:
7.Вывод объект-Отчетом-СКД+ВнешняяВременнаяТаблица
В этом варианте у нас как и раньше (кроме п.6) фильтр по отбираемым данным справочникам идет с помощью внешней временной таблицы, в которую мы загружаем данные из документа.
Только здесь так же пришлось переработать запросы в СКД, а так же изменить структуру самой временной таблицы Параметров. Чтобы связать временную таблицу в СКД с выборкой из справочника — данную таблицу пришлось превратить в однуколоночную, но с составным типом данных! ссылки на сайты,где я нашла как сделать составной тип данных есть вот в этой теме https://forum.infostart.ru/forum9/topic184320/#message1911641
ВнешниеДанные=Новый ТаблицаЗначений;
СписокТипов = Новый Массив;
СписокТипов.Добавить("СправочникСсылка.Партнеры");
СписокТипов.Добавить("СправочникСсылка.Контрагенты");
ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов);
ВнешниеДанные.Колонки.Добавить("Ссылка",ОписаниеСоставногоТипа);
вот такой вид имеет этот вариант:

8.Вывод программно СКД без объекта-Отчета с Параметром=ВнешняяВременнаяТаблица
А теперь представим, что нам срочно нужно вывести какие-нибудь расчеты, но по непонятным причинам — мы не можем воспользоваться объектом-Отчет))
Здесь просто создаем Обработку, на форму ей скидываем все наши параметры, которые нужны для построения запроса в СКД, потом подтягиваем эти параметры из другой процедуры — и результат выводим в программно созданный табличный документ.
Оставила в этом варианте прикрепленный еще один МакетСКД — возможно кто-то сможет с помощью него пойти по пути передачи параметра,н-р, &Ссылки (у меня в этом вареанте решено через внешнюю врем.таб) — я сколько не пыталась подгрузить в Параметры СКД при режиме отсутствия объекта-Отчета — у меня не пошло…
Но так как рабочим механизмом здесь является программно вызываемый СКД, то в нашей табличке мы можем установить шаблонМакетов — все же красивее смотрится!))
Вот и все!!! Теперь не только начинающие программисты смогут быстренько что-то вывести на экран, а и опытные пользователи смогут разобраться в приведенных примерах и вуа-ля! самой большой сложности отчет готов!!!
С ув.

