Шаблон типового отчета (СКД) в привилегированном режиме

26.03.18

Разработка - Инструментарий разработчика

Шаблон типового отчета СКД (https://its.1c.ru/db/metod8dev#content:3048:hdoc), формирование отчета перенесено в привилегированный модуль. Для конфигураций, где есть общий модуль ТиповыеОтчеты.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Шаблона типового отчета (СКД) в привилегированном режиме:
.7z 33,64Kb
35 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Появилось несколько задач сделать внешние отчеты без ограничения прав, обычные формы, клиент- сервер, УПП 1.3.

Дано: пользователь с ролями "Пользователь ", "Вывод информации", надо сделать для него отчет, например, по Основным средствам.

При этом:

1. Роли добавить пользователю нельзя;

2. УстановитьПривилегированныйРежим(Истина) - во внешних отчетах на обычных формах не работает;

3. Сделать отчет на управляемых формах и встроить отчет в конфигурацию - заказчик против, т.к. у него уже настроен доступ ко внешним отчетам и обработкам через RLS.

в остается формирование отчета в привилегированном модуле.

За основу взят "Шаблон типового отчета СКД" https://its.1c.ru/db/metod8dev#content:3048:hdoc, формирование результата вынесено в привилегированный модуль.

Реализация такая:

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

2. В отчете, как обычно, в основной схеме компоновки добавляем набор данных - Запрос, делаем настройки. При запуске отчета создается программно еще одна схема - но с набором данных - Объект. Копируются все поля, параметры и ресурсы. Эта схема используется в отчете для инициализации компоновщика настроек и пользователь может настроить структуру без красных крестиков на полях.

Настройки, которые установил пользователь передаются на сервер, загружаются в настройки компоновщика основной схемы

Отчет по основной схеме формируется на сервере в общем модуле ДоработкиПривилегированный, возвращается назад уже готовый результат - Табличный документ.

Расшифровку полностью победить не удалось, оставила только одно действие - ОткрытьЗначение. Если  у пользователя есть права на объект - при двойном клике по объекту - откроется значение, если прав нет, выводится стандартное сообщение "У пользователя недостаточно прав для исполнение операции над базой данных".

Очень важно!!! В основной схеме компоновки данных в наборах данных обязательно должны быть указаны типы значений полей.

Функция СформироватьОтчет из модуля отчета:

Функция СформироватьОтчет(Результат = Неопределено, ДанныеРасшифровки = Неопределено, ВыводВФормуОтчета = Истина) Экспорт
	
	//ЗначениеПанелипользователя = ТиповыеОтчеты.ПолучитьЗначенияНастроекПанелиПользователяОбъекта(ЭтотОбъект);
	НастрокаПоУмолчанию        = КомпоновщикНастроек.ПолучитьНастройки();
	ТиповыеОтчеты.ПолучитьПримененуюНастройку(ЭтотОбъект);
	
        //++начало
	Результат.Очистить();        
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	ТиповыеОтчеты.ДоработатьТиповойОтчетПередВыводом(ЭтотОбъект);
	ТиповыеОтчеты.ВыводЗаголовкаТиповогоОтчета(ЭтотОбъект, ТабличныйДокумент);	
	
	ДоработатьКомпоновщикПередВыводом();  
			
	СтруктураОтчета = Новый Структура("Схема, ДанныеРасшифровки, НастройкиКомпоновщика, ТабличныйДокумент", ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"), ДанныеРасшифровки, Новый ХранилищеЗначения(КомпоновщикНастроек.Настройки), ТабличныйДокумент);
	АдресСтруктураОтчета = ПоместитьВоВременноеХранилище(СтруктураОтчета, Новый УникальныйИдентификатор);

	АдресРезультат = ДоработкиПривилегированный.СформироватьОтчетПривРежТабличныйДокумент(АдресСтруктураОтчета);
	РезультатСтруктура = ПолучитьИзВременногоХранилища(АдресРезультат);
	
	РезультатТабличныйДокумент = РезультатСтруктура.ТабличныйДокумент;         
	ДанныеРасшифровки = РезультатСтруктура.ДанныеРасшифровки;
	ДанныеРасшифровки.Настройки = КомпоновщикНастроек.Настройки;
	
	Результат.Вывести(РезультатТабличныйДокумент);
	
	Результат.ФиксацияСверху 			= РезультатТабличныйДокумент.ФиксацияСверху;

	Результат.Показать();	
        
        УдалитьИзВременногоХранилища(АдресСтруктураОтчета);
	УдалитьИзВременногоХранилища(АдресРезультат);
        //--конец

	//ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета);
	КомпоновщикНастроек.ЗагрузитьНастройки(НастрокаПоУмолчанию);
	
КонецФункции     

Функция из модуля отчета, которая создает схему с набором данных Объект:

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

В процедуре ПрименитьНастройку модуля отчета:

Процедура ПрименитьНастройку() Экспорт
	
	//СхемаДляНастройки = ТиповыеОтчеты.ПолучитьСхемуКомпоновкиОбъекта(ЭтотОбъект);
	//++начало
	Схема = ПолучитьСхемуДляНастройки();
	//--конец
	
	// Считываение структуры настроек отчета
 	Если Не СохраненнаяНастройка.Пустая() Тогда
		
		СтруктураНастроек = СохраненнаяНастройка.ХранилищеНастроек.Получить();
		Если Не СтруктураНастроек = Неопределено Тогда
			КомпоновщикНастроек.ЗагрузитьНастройки(СтруктураНастроек.НастройкиКомпоновщика);
			ЗаполнитьЗначенияСвойств(ЭтотОбъект, СтруктураНастроек);
		Иначе
			КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
		КонецЕсли;
		
	Иначе
		КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
	КонецЕсли;

КонецПроцедуры

В модуле отчета основную схему компоновки данных подменяем на созданную нами схему:

СхемаКомпоновкиДанных = ПолучитьСхемуДляНастройки();

Функция в общем модуле ДоработкиПривилегированный (почти копия ТиповыеОтчеты.УниверсальныйМеханизмФормированияОтчета)

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

	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, НастройкиКомпоновщика, ДанныеРасшифровки);
	ТиповыеОтчеты.ДополнитьМакетыМакетаКомпоновкиРасшифровкойРесурсов(МакетКомпоновки, КомпоновщикНастроек);
	
	//Создадим и инициализируем процессор компоновки
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	Если ВнешниеНаборыДанных = Неопределено Тогда
		ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	Иначе
		ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
	КонецЕсли;

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
		
	//Обозначим начало вывода
	ПроцессорВывода.НачатьВывод();
	ТаблицаЗафиксирована = Ложь;
	
	ТабличныйДокумент.ФиксацияСверху = 0;
	
	//определим нужна ли фиксация в отчете. Если элементов структуры больше 2-х
	КолВоВключеныхЭлементов = 0;
	Для каждого ЭлементСтруктуры из НастройкиКомпоновщика.Структура Цикл
		Если ЭлементСтруктуры.Использование тогда 
			КолВоВключеныхЭлементов = КолВоВключеныхЭлементов + 1;
		КонецЕсли;
		
		Если КолВоВключеныхЭлементов > 1 тогда
			ТаблицаЗафиксирована = истина;
		КонецЕсли;
	КонецЦикла;
	
	//Основной цикл вывода отчета
	Пока Истина Цикл
		
		//Получим следующий элемент результата компоновки
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
		
		Если ЭлементРезультата = Неопределено Тогда
			//Следующий элемент не получен - заканчиваем цикл вывода
			Прервать;
			
		Иначе
			
			Если  Не ТаблицаЗафиксирована 
				И ЭлементРезультата.ЗначенияПараметров.Количество() > 0 
				И ТипЗнч(НастройкиКомпоновщика.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда
				
				ТаблицаЗафиксирована = Истина;
				ТабличныйДокумент.ФиксацияСверху = ТабличныйДокумент.ВысотаТаблицы;
				ОбластьШапки = ТабличныйДокумент.Область(3, ,ТабличныйДокумент.ВысотаТаблицы, );
				ТабличныйДокумент.ПовторятьПриПечатиСтроки = ОбластьШапки;

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

В архиве внешний отчет и текст для общего модуля. Тестировался на Управление производственным предприятием, редакция 1.3 (1.3.82.1). Не проверяла на сложных схемах с произвольными макетами, вложенными схемами.

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

Отчет СКД привилегированный режим

См. также

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

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

15500 руб.

02.09.2020    222206    1211    415    

1062

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

14400 руб.

20.08.2024    45572    250    129    

231

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Библиотека стандартных подсистем Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    28396    76    30    

101

Инструментарий разработчика Нейросети Платные (руб)

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

9900 руб.

25.08.2025    18324    35    7    

45

Инструментарий разработчика Программист 1С v8.3 Платные (руб)

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

9500 руб.

17.05.2024    40442    148    57    

184

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

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

16000 руб.

10.11.2023    20079    77    39    

92

Инструментарий разработчика WEB-интеграция 1С v8.3 1C v8.2 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Инструмент для генерации OpenApi (Swagger) спецификаций на основании файлов конфигураций 1С. Это консольное и десктопное приложение на языке Rust с полноценным редактором кода, содержащим автозамену и подсвечивание ошибок для быстрого и безошибочного написания документирующего комментария.

18000 руб.

22.11.2024    2799    2    0    

8
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. NoRazum 30 02.11.17 12:08 Сейчас в теме
Если отчет встраивать в конфу нельзя. То почему общие модули можно?

За код спасибо. Но полезность сомнительна.
2. user660938_zerkalo242 22.05.18 12:57 Сейчас в теме
Спасибо автору. Только такой подход сработал. Много времени потратил на поиск решения проблемы в интернет.
Student1C; +1 Ответить
3. sergathome 4 22.05.18 13:14 Сейчас в теме
вызываемые функции будут всёравно в безопасном режиме вызываться, интересно, или нет ?
4. Lusha_28 51 24.05.18 07:34 Сейчас в теме
(3) У всех пользователей, которые пользуются этими отчетами стоит галка "Защита от опасных действий", на ошибки никто не жалуется.
5. sergathome 4 24.05.18 09:18 Сейчас в теме
(4) а это фиолетово. все внешние функции, вызываемые при компоновке, ранее вызывались в безопасном режиме несмотря вообще ни на что, даже если они располагались в модуле прив. режима... если можете проверить - проверьте, очень интересно.
6. Student1C 61 05.09.19 13:55 Сейчас в теме
Подскажите, этот шаблон поможет при ошибке
{(5, 53)}: Поле не найдено "ОсновныеНачисленияРаботниковОрганизации.ВидРасчета.Наименование"
ОсновныеНачисленияРаботниковОрганизации.ВидРасчета.<<?>>Наименование КАК ИмяВидаРасчета,

при открытии отчета под пользователем без полных прав.
8. Lusha_28 51 05.09.19 14:51 Сейчас в теме
(6)не знаю, должно помочь, проверьте сами.
Прикрепленные файлы:
Шаблон СКД привилегированный режим.7z
9. Student1C 61 19.09.19 08:04 Сейчас в теме
(8)Спасибо, работает, только не рассчитывается пару параметров, которые зависят от НачалоПериода и КонецПериода. Из-за чего это может быть?
10. Lusha_28 51 20.09.19 02:36 Сейчас в теме
(9)Я думаю надо из оригинального отчета перенести код процедуры ДоработатьКомпоновщикПередВыводом. Обычно там устанавливаются дополнительные параметры.
11. Student1C 61 20.09.19 11:47 Сейчас в теме
(10)
ДоработатьКомпоновщикПередВыводом
, не, в типовом тоже пустая процедура... Я примерно так и подумал что в этой процедуре надо что-то доработать...
12. Student1C 61 20.09.19 12:51 Сейчас в теме
(11) все дело в премудростях СКД, указал в запросе в параметрах в таком виде {(&КонецПериодОС)}, и все появилось )
Я так понимаю СКД не видел это параметр без {}...
7. Lusha_28 51 05.09.19 14:50 Сейчас в теме
13. Danila7Zz 18 06.11.20 19:38 Сейчас в теме
2. УстановитьПривилегированныйРежим(Истина) - во внешних отчетах на обычных формах не работает;


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

Функция СведенияОВнешнейОбработке() Экспорт

ДанныеДляРег = Новый Структура();
ДанныеДляРег.Вставить("БезопасныйРежим", Ложь);  // проверяем эту строку
Возврат ДанныеДляРег;

КонецФункции
user1109162; +1 Ответить
14. GAlexis 5 07.04.22 11:02 Сейчас в теме
(13) Не совсем правильно.
Можно оставить "БезопасныйРежим"
Функция СведенияОВнешнейОбработке() Экспорт

ДанныеДляРег = Новый Структура();
ДанныеДляРег.Вставить("Разрешения", Новый Массив);  // проверяем эту строку
ДанныеДляРег.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима());
Возврат ДанныеДляРег;

КонецФункции
Показать
15. Aleksandr 244 30.08.22 03:39 Сейчас в теме
Если отчет сформировать программно то помогает это:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)	
	
	СтандартнаяОбработка = Ложь;
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина, Ложь); 

	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки); 	
		
КонецПроцедуры
Показать


ПроцессорКомпоновки.Инициализировать() 5 параметр ОграничиватьПолучениеПолейПоСсылкамПоПравуПросмотр = Ложь
atomskxs; +1 Ответить
16. amiralnar 9 20.04.24 09:19 Сейчас в теме
(15)
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();


Все равно вы не получите настройки с недоступными полями
Для отправки сообщения требуется регистрация/авторизация