Пример программной работы с отчетом на основе СКД. Запуск типового перестроенного программно отчета по событию формы

17.03.25

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

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

Поступило задание от заказчика запустить вместо печатной формы типовой отчет с фильтрами по данным объекта.

Необычно, но интересно. Запустил через "Открыть форму".

Потом поступило требование, чтобы отчет имел нужную структуру вместо типовой и сохранил полную функциональность по работе со структурой и фильтрами. Типа некоторые фильтры снять и оценить ситуацию с оставшимися. Запустил через "Получить форму" с установкой своей структуры и установкой отбора.

Потом заказчик захотел, чтобы устанавливаемые отборы отображались на форме отчета. Сделал.

Потом услышал: "Сделай поле заказа жирным шрифтом". Выделил.

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

Потом захотелось поделиться. Специально для публикации набросал обработку для демонстрации примера использования функций.

Для использования достаточно создать новую обработку и поместить приведенный ниже код в модуль формы. Главное - не забыть назначить форме процедуру обработки события "ПриСозданииНаСервере".

Все необходимые для демонстрации элементы формы будут созданы программно при создании формы. Демонстрация должна работать для линейки УТ, КА, ERP и для УНФ. 

Код разрабатывался на платформе 8.3.26.1498.

Тестировался на конфигурациях ERP 2.5.12.167 и УНФ 3.0.7.113.

Запускаем. Получаем так:

ERP:

 

          УНФ:

 

Дважды кликаем по строке. Получаем так:

 

Или так:

 

 

Вот и все. Надеюсь, что кто-то оценит. Библиотечные функции документированы. Код модуля формы ниже. Удачи.

 

Код модуля формы:
 
 

 

См. также

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

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

15500 руб.

02.09.2020    179996    999    403    

954

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

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    8754    ovetgana    50    

80

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

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

24.12.2024    6863    Akcium    13    

43

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    12449    implecs    6    

50

Инструментарий разработчика СКД Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

05.02.2024    8732    64    obmailok    21    

82

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

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

1 стартмани

31.01.2024    3595    6    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    12382    25    John_d    26    

128

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

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

05.12.2023    9949    PROSTO-1C    15    

69
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. quazare 3891 17.03.25 19:43 Сейчас в теме
Все эти выкрутасы достаточно интересны, но с точки зрения учета никакого смысла не имеют

Вот тоже когда-то для чего-то делал - вывод печатной формы с предварительными параметрами

https://infostart.ru/1c/tools/2102971/
6. user1374747 256 18.03.25 10:17 Сейчас в теме
(1) Согласен. Хотя должен заметить из опыта, что все сделанное по требованиям заказчика, вообще не часто имеет отношение к учету. Увы.
2. seperblunt 18.03.25 08:57 Сейчас в теме
из таких выкрутасов и состоит половина автоматизации)
иногда бывает, что подобные выкрутасы из "дурного тона" становятся успешным коммерческим продуктом, например RPA
3. Трактор 1265 18.03.25 09:08 Сейчас в теме
(2)
например RPA

Что за зверь РПА?
4. seperblunt 18.03.25 09:13 Сейчас в теме
(3) ну роботы теперь это называется, типа из вне натыкать кнопок в сторонней программе, получить результат и его забрать в свою стороннюю программу. как бы костыль, но нынче легализованный и даже изрядно оплачиваемый.
в нашем случае это например - выполнить отчет не вникая в суть и слямзить данные прямо с табличного документа в свою обработку )). дурнейший казалось бы тон, но зато дешево и сердито
Трактор; +1 Ответить
5. user1374747 256 18.03.25 10:08 Сейчас в теме
(4) Можно, конечно, посмеяться. Но приходилось такое делать несколько раз. Имеется в виду - пользоваться данными схемы типового отчета, скомпонованными в таблицу значений. Такое было требование. "Сделать как в этом отчете...".
Увы. Мы в этом процессе чаще всего ведомые.

К стати, видел разок как используются данные именно табличного документа.
Еще смешнее. Кто то соорудил самопальную рассылку расчетных листков. Список сотрудников для рассылки получался так: Сначала запускался отчет расчетных листков. А из результирующего табличного документа считывал список сотрудников. Было смешно и очень долго. Но заказчика устравало, потому что это было ему понятно и он был уверен, что рассылается кому надо.
user2105660; seperblunt; +2 Ответить
7. seperblunt 18.03.25 12:31 Сейчас в теме
(5) может через какое то время такой метод обзовется аббревиатурой и станет модным и вполне правильным. ведь то что долго для нас - для юзера нормально, а главное - это надежно, потому что как в отчете. подправили отчет - и все остальное как надо работает.
10. user2105660 21.03.25 07:20 Сейчас в теме
(7) а я вообще делала парсинг табличного документа с целью получить циферки и отправить в Телеграм - ну разве не бред?
11. user1374747 256 21.03.25 11:47 Сейчас в теме
(10) Рад бы посмеяться вместе, Но это нормальная ситуация.

Точно этим я и занимался пару раз.
Передавал данные из стандартного отчета в телеграмный бот. А именно - размер дневной выручки для директора.

Тока в этом случае просто не нужно выгружать результат работы схемы отчета в табличный документ.
Чтобы его потом не парсить.

Нужно использовать ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений
вместо ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.

И получать циферки из таблицы значений.

ИМХО.
12. seperblunt 21.03.25 14:53 Сейчас в теме
(10) мое мнение, что это не бред, а прикладное программирование. когда бизнес цели впереди академической красоты
8. artkor 286 19.03.25 11:24 Сейчас в теме
Недавно нечто подобное ваял - открытие формы списка из расшифровки отчета. Берем типовую формы БСП-шную "ФормаОтчета", в ней вставляем код
&Вместо("ОбработкаРасшифровки")
&НаКлиенте
Процедура add_ОтчетТабличныйДокументОбработкаРасшифровкиВместо(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
	
	Если ИмяФормы = "Отчет.add_ОтчетДанныеССайта.Форма" Тогда  
		add_РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры);
		Возврат
	КонецЕсли;
	
	ПродолжитьВызов(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры);
	
КонецПроцедуры


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

&НаСервере
Функция add_РезультатОбработкаРасшифровкиНаСервере(Расшифровка)   
	
	ОтборДанных = Новый Структура("ИмяПоля,Поставщик,Период", Неопределено, Неопределено, Неопределено);
	
	ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);
	
	ЭлементРасшифровки = ДанныеРасшифровкиОбъект.Элементы[Расшифровка];
	Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда 
		
		Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
			ОтборДанных.ИмяПоля = Поле.Поле;
		КонецЦикла; 
		
		ПолеРодитель = РасшифровкаПолеРодителя(ЭлементРасшифровки);
		Если ПолеРодитель.ИмяПоля = "Период" Тогда
			ОтборДанных.Период = ПолеРодитель.Значение;   
			
			ПолеРодитель2 = РасшифровкаПолеРодителя(ПолеРодитель.ЭлементРасшифровки);
			Если ПолеРодитель2.ИмяПоля = "Поставщик" Тогда
				ОтборДанных.Поставщик = ПолеРодитель2.Значение;  
			КонецЕсли;  
			
		ИначеЕсли ПолеРодитель.ИмяПоля = "Поставщик" Тогда
			ОтборДанных.Поставщик = ПолеРодитель.Значение;
		КонецЕсли;
		
	КонецЕсли; 
	
	Возврат ОтборДанных
КонецФункции  

Функция РасшифровкаПолеРодителя(ЭлементРасшифровки)
	
	ДанныеВозврат = Новый Структура("ИмяПоля,Значение,ЭлементРасшифровки", Неопределено, Неопределено, Неопределено);
	
	Родители1 = ЭлементРасшифровки.ПолучитьРодителей();
	Если Родители1.Количество() = 1 Тогда   
		
		Для каждого Поле Из Родители1[0].ПолучитьПоля() Цикл     
			ДанныеВозврат.ИмяПоля  = Поле.Поле;
			ДанныеВозврат.Значение = Поле.Значение;  
			Родители2 = Родители1[0].ПолучитьРодителей();  
			Если Родители2.Количество() = 1 Тогда    
				ДанныеВозврат.ЭлементРасшифровки = Родители2[0];  
			КонецЕсли;
		КонецЦикла; 
		
	КонецЕсли;  
		
	Возврат ДанныеВозврат
КонецФункции  

Показать
9. user1374747 256 19.03.25 11:45 Сейчас в теме
Достойно, конечно.

Но данная публикация вроде не совсем про это.

Это не справочник по программной работе с СКД. Отнюдь. Программная работа с СКД описана достаточно подробно во многих местах. Я, например, при нужде пользую https://infostart.ru/1c/articles/1179039/ как шпаргалку.

Здесь же приведен пример как быстро запустить типовой отчет в качестве печатной формы, перестроив его на ходу под данные объекта и слегка украсив. Захотел заказчик странного, а у тебя уже библиотечка есть. Раз и готово.

При этом ничего никуда не вставляя для отчета. Ни в конфу, ни в расширение.

Только код вызова по событию формы, с которой работаешь.
Оставьте свое сообщение