1с8.2-8.3.Вывод на экран данных запроса с переданными Параметрами из Документа! 8 различных вариантов:от Сообщений, Таблицы и Отчетов до СКД без объекта-отчета

14.01.18

Разработка - СКД

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

Скачать файлы

Наименование Файл Версия Размер
1с8.2-8.3.Вывод на экран данных запроса с переданными Параметрами из Документа! 8 различных вариантов:от Сообщений,Таблицы и Отчетов до СКД без объекта-отчета:
.dt 111,54Kb
7
.dt 111,54Kb 7 Скачать

В ссылке лежит база-черновик, созданная на платформе 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.Вывод программно СКД без объекта-Отчета с Параметром=ВнешняяВременнаяТаблица

А теперь представим, что нам срочно нужно вывести какие-нибудь расчеты, но по непонятным причинам - мы не можем воспользоваться объектом-Отчет))

Здесь просто создаем Обработку, на форму ей скидываем все наши параметры, которые нужны для построения запроса в СКД, потом подтягиваем эти параметры из другой процедуры - и результат выводим в программно созданный табличный документ.

Оставила в этом варианте прикрепленный еще один МакетСКД - возможно кто-то сможет с помощью него пойти по пути передачи параметра,н-р, &Ссылки (у меня в этом вареанте решено через внешнюю врем.таб) - я сколько не пыталась подгрузить в Параметры СКД при режиме отсутствия объекта-Отчета - у меня не пошло...

Но так как рабочим механизмом здесь является программно вызываемый СКД, то в нашей табличке мы можем установить шаблонМакетов - все же красивее смотрится!))

Вот и все!!! Теперь не только начинающие программисты смогут быстренько что-то вывести на экран, а и опытные пользователи смогут разобраться в приведенных примерах и вуа-ля! самой большой сложности отчет готов!!!

С ув.

Отчет объект СКД обработка табличный документ запрос таблицаЗначений Массив Структура Параметры внешняя временная таблица данных

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119959    656    389    

701

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    3893    24    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8034    20    John_d    25    

122

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    4528    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5710    15    kalyaka    5    

85

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6344    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4409    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 3031 14.01.18 22:54 Сейчас в теме
Для вывода отчета в СКД достаточно вызвать ОткрытьФорму("Отчеты.КонтактыКонтрагентаПартнера", Новый Структура("Отбор, СформироватьПриОткрытии", Новый Структура("Контрагент", Контрагент), Истина), ..., ) - должно отработать, если в отчете есть поле "Контрагент". Фактически в СКД достаточно засунуть простой отчет типа "ВЫБРАТЬ Ссылка КАК Контрагент, Вид, Представление ИЗ Справочник.Контрагенты.КонтактнаяИнформация", ну и соединить это с контактной информацией партнера (в партнере есть контрагент, так что запрос будет такой "ВЫБРАТЬ Ссылка.Контрагент КАК Контрагент, Вид, Представление ИЗ Справочник.Партнеры.КонтактнаяИнформация" - вот это можно просто либо объединением в один запрос засунуть, либо два запроса объединить компоновкой. И СКД при открытии формы сам Вам все отберет и покажет...

https://infostart.ru/public/565658/
jan-pechka; +1 Ответить
2. starik-2005 3031 14.01.18 23:16 Сейчас в теме
Вообще, вот как это надо делать:
Команда в справочнике "Контрагенты":
&НаКлиенте
Процедура Контакты(Команда)
	ОткрытьФорму("Отчет.Контакты.ФормаОбъекта", Новый Структура("КлючВарианта, Отбор, СформироватьПриОткрытии", "Основной", Новый Структура("Ссылка", Объект.Ссылка), Истина));
КонецПроцедуры

Отчет прикреплен.
Прикрепленные файлы:
Контакты.erf
jan-pechka; +1 Ответить
3. jan-pechka 402 15.01.18 18:32 Сейчас в теме
(2)
Отчет прикреплен.


Немножко не совсем то что я решала по задачке, но сам смысл-
добавлять в справочник свой вариант отбора-интересен!

п.с.Не знаю пока чего идет ошибка:"Невозможно применить фиксированные настройки. Пересекаются элементы отбора." ...Из Вашей статьи нашла ответ:"Но если Вам нужно отбрать по реквизиту табличной части, то такой метод не подходит"

п.с.2 нужно будет разобраться с Вашим вариантом отбора...что-то в нем есть

Спасибо огромное,Сергей
Прикрепленные файлы:
4. starik-2005 3031 15.01.18 19:04 Сейчас в теме
(3)
Не знаю пока чего идет ошибка:"Невозможно применить фиксированные настройки. Пересекаются элементы отбора."
Удалите отбор из варианта отчета. Из параметра "Отбор" при открытии формы формируется пакет фиксированных настроек, и если она пересекаются с настройками пользователя, то возникает такая вот ошибка.

Как вариант - скопируйте вариант отчета и назовите его, например, "ОтдельныйОтчет", и его уже поместите параметр в "КлючВарианта".
jan-pechka; +1 Ответить
5. jan-pechka 402 15.01.18 19:52 Сейчас в теме
(4)
Удалите отбор из варианта отчета


Работает! Красиво. и быстро! Спасибо!!!

п.с.жаль только что можно передавать отбор по вызвавшему эту Команду объекту-справочнику(и его реквизитам)...
Проще вызвать стандартный КонструкторПечати в справочниках и Доках...

Но вот если такую ссылку на отбор и печать объекта вставить в сложный ПВХ или регистрСведений,например, то очень становится интересно!!!
Прикрепленные файлы:
Оставьте свое сообщение