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