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

17.03.25

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ERP:

 

          УНФ:

 

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

 

Или так:

 

 

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

 

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

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

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

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

16500 руб.

02.09.2020    246481    1353    419    

1131

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    5084    286    shapa_pro    25    

66

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    15819    ovetgana    112    

105

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    9221    krasnoshchekovpavel    5    

67

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8405    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

27.02.2025    15560    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13131    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    9611    AlexeyPROSTO_1C    1    

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

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

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

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

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

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

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

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

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

ИМХО.
12. seperblunt 53 21.03.25 14:53 Сейчас в теме
(10) мое мнение, что это не бред, а прикладное программирование. когда бизнес цели впереди академической красоты
unknown181538; mrsmrv; +2 Ответить
8. artkor 290 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 283 19.03.25 11:45 Сейчас в теме
Достойно, конечно.

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

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

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

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

Только код вызова по событию формы, с которой работаешь.
Для отправки сообщения требуется регистрация/авторизация