Добавление расшифровки в стандартные и добавленные внешние отчеты со стандартной формой отчета на СКД

27.09.18

Разработка - Универсальные функции

Описан способ добавления расшифровки отчета на СКД как встроенного в систему, так и добавленного внешнего отчета.

Как известно, подключаемый внешний отчет, если не указывать свою форму отчета, будет использовать общую формуОтчета из конфигурации,

Всем она хороша,но вот добавить свою расшифровку в такой отчет как я думал затруднительно, но разработчики позаботились и об этом.

Ниже предоставлен код который можно добавить в расширение либо в сам общий модуль "ОтчетыКлиентПереопределяемый", Он снабжен комментариями поэтому понять сто к чему можно будет из кода.

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

Все тестировалось на 1С ERP 2.2.4

Платформа 8.3.10

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

СКД Расшифровка

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5496    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46600    dimanich70    83    

165

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6890    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57790    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8661    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    22868    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user619273_alevtina 30.12.18 18:18 Сейчас в теме
Воспользуюсь. Спасибо.
2. VitaliyTokarev 222 20.09.19 16:37 Сейчас в теме
3. mrChOP93 99 28.10.19 14:35 Сейчас в теме
Не подскажете, что скрывается здесь "КомпоновкаДанныхКлиент.ОбработкаРасшифровкиСДополнительнымМеню(ЭтаФорма, ПараметрыРасшифровки, СтандартнаяОбработка);"?
4. bmk74 244 05.11.19 17:49 Сейчас в теме
(3)Ну собственно там, идет обработка того что в коде приведено, они ищет в отчете поля, сравнивает с тем что прописали вы, в случае удачного сосоставления он добавляет пункт меню в расшифровку стандартную и обраьотчик

ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
									    ДанныеРасшифровки, 
									    Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
	
    ОбработкаРасшифровки.ПоказатьВыборДействия(
		    ОписаниеОповещения, 
		    Расшифровка,,
		    ДополнительноеМеню)
mrChOP93; +1 Ответить
5. ratinc 23.04.20 20:59 Сейчас в теме
Отличный способ подключить расшифровку.
Но есть нюанс )))
У меня иногда не подхватывает форму внешнего отчета
Ошибка при вызове метода контекста (ОткрытьФорму)
		ОткрытьФорму(ПараметрыОтчета.ИмяОтчета + ".Форма", ПараметрыФормы);
по причине:
Неизвестное имя формы. Имя: 
LomayaZakat; +1 Ответить
6. bmk74 244 24.04.20 15:31 Сейчас в теме
(5)Да есть такое если открываемый отчет тоже внешний "ВнешнийОтчет.", и это не тот же самый отчет, то выдает такую ошибку, при том, если тот же отчет сначала открыть, не через расшифровку , а просто , а потом через расшифровку...то он откроется нормально, с чем это связано... не совсем понятно...
LomayaZakat; +1 Ответить
7. ratinc 26.04.20 23:43 Сейчас в теме
(6) Я тоже заметил что если сначала открыть отчет который используется для расшифровки, то потом вопросов с ним в этом сеансе не возникает.
Необходимо как то победить эту проблему. Пользователи жутко избалованные)))
Не хотят запускать предварительно отчет расшифровки
21. LomayaZakat 10.04.24 10:51 Сейчас в теме
(7)Удалось как то решить проблему?
22. HAMMER_59 256 11.07.24 15:40 Сейчас в теме
(21) Я бы просто добавил отчет для расшифровки в расширение.
Но если не охота про простому, нужно смотреть как стандартно открываются внешние отчеты. Скорее всего через вызов сервера и прочие сложности.
8. Cthulhu 1 17.09.20 16:47 Сейчас в теме
"развести" ч/з обработку ожидания не получится?..
9. Aliya_St 19.04.22 14:46 Сейчас в теме
Подскажите, пожалуйста. Делаю расшифровку отчета. Все процедуры аналогичны (я так понимаю, тут за основу брался типовой механизм). Проблема с полями расшифровки: в одном отчете это "Номенклатура", а в другом "АналитикаНоменклатуры.Номенклатура". Делаю замену реквизитов аналогично другим похожим ситуациям (так же описано и у вас тут), но отчет расшифровка не сопоставляет поля и соответственно не выставляет отбор по номенклатуре, пишет "в отборе используются несуществующие поля". Может где-то что-то я не учла? Никак не могу разобраться с этим.
10. Rollam 08.07.22 17:20 Сейчас в теме
А почему массив МенюДействий остается пустым?
Как добавить своё действие и связать его с отчетом из массива МенюОтчетов?
11. bmk74 244 19.07.22 11:31 Сейчас в теме
(10) Честно уже и забыл что там куда...но вроде как меню действий настраивается для того что бы вы могли например провести или записать документ из отчета, его в принципе не нужно связывать, так как меню отчетов нужно именно для того что бы открыть другой отчет, а меню действий что бы, что то сделать с данными который выводит вам сам отчет...
12. newvideo 03.08.22 12:13 Сейчас в теме
"Как известно, подключаемый внешний отчет, если не указывать свою форму отчета, будет использовать общую формуОтчета из конфигурации"
-мой внешний отчет не использует форму, но никакого подключения общей формы не происходит, общая форма с множеством кнопочек (сумма, дискетка, почта), а у меня простые кнопки "сформировать", "Варианты", "Настройки" и всё

Видимо это зависит от версии БСП.
15. bmk74 244 04.08.22 18:32 Сейчас в теме
(12)Форма настраиваемая.. и она может быть и с кнопочками и без..все зависит от переданных в нее параметров...фантастики не бывает
13. newvideo 03.08.22 13:21 Сейчас в теме
Добавил в отчет форму стандартную, вроде отладчик попал в модуль и в расширение, но дальше вообще темный лес,
Есть в отчете строки организации и ресурсы кол-во человек. В запросе также есть сотрудники, которые не выведены в отчете. Необходимо в отчете расшифровке отобразить сотрудников. По коду много описания и комментариев но ничего не понятно. Добавил код, но при расшифровке отчета по одной организации запускается отчет (вариант2), где выводится список всех сотрудников (т.е. без параметров), а как параметры то передать?
в комментариях написано:
//Указываются поля расшифровки которые могут быть переданы в открываемый отчет как отбор
// В данном массиве указываются параметры текущего отчета которые будут переданы как параметр в
// В выше приведенных структурах нужно указать параметры отчета и поля расшифровки по которым будет анализироваться

ну и как понять где отбор, где параметры, а где структуры параметров, а где параметры отбора структур параметров?
Что в первом блоке указывается? Организация или сотрудники?
Что во втором блоке? Параметры?
Прописал организацию во втором блоке, но никакого отбора по организации не происходит.
16. bmk74 244 04.08.22 18:34 Сейчас в теме
(13)Читайте внимательнее , там конечно мудрено все...но разобраться можно
14. newvideo 03.08.22 14:01 Сейчас в теме
Поля отбора нужно прописывать и в ПоляРасшифровки и в СписокПараметров, тогда отбор по "Организации" отработает, причем нужно следить за регистром наименований - "организация" с маленькой буквой не прокатит.

"ЗаменаПараметров" не понял что это такое.
17. bmk74 244 04.08.22 18:38 Сейчас в теме
(14)Там вроде это и написано...
Я же говорю читайте внимательнее,
Замена, это значит что параметр с именем например Организация( в тек отчете), будет передан в другой отчет с именем( которое вы пропишите в данной структуре)
d4rkmesa; +1 Ответить
18. newvideo 04.08.22 23:06 Сейчас в теме
прочитал внимательно 10 раз, но не могу догадаться, что в параметр нужно передать те же поля, что и в отборы.
Я понимаю под параметрами "Период" или какие-то значения для параметров в запросе. Что отбор является параметром как то не увязывается, на то он и имеет другое название. В третьем блоке комментов написано:
//----------------------------------------Параметры открываемого отчета-----------------------------------------------
// В выше приведенных структурах нужно указать параметры отчета и поля расшифровки по которым будет анализироваться поведение
// расшифровки ( показывать доп меню или нет ), для замены параметров

Но выше по тексту нет никаких структур, есть ниже. Или то что мы вставляем выше в массив и есть структура? Похоже просто на строковый тип. А комментарий со знаками "----------------" оказывается означает закрытие комментария со знаками "+++++++++++++++++++" и не имеет отношение с блоку с заменой параметров, иначе мы имеем третий набор параметров.

Ладно, возможно людям всё понятно, возможно я один такой темный, подскажите пожалуйста, если я хочу передать в отчет расшифровки именно значение параметра, например "период = ТекущаяДата()", как и где это прописать? Период нужно прописать в СписокПараметров или это замена параметра или это замещающий параметр?
19. bmk74 244 06.08.22 19:54 Сейчас в теме
(18)Вы правы в том что параметры СКД. это то что задается в запросе, ну или на закладке параметры, отборы это уже настройки СКД и накладываются они уже после выполнения запроса( как правило, есть там исключение, когда сам запрос правиться СКД ).
Не совсем понял что вы имеете ввиду под "период = ТекущаяДата()"... так вы ничего не передадите, можно передать уже вычисленное значение в текущем отчете
Да и там как раз в примере это есть
СписокПараметров = Новый Массив;
СписокПараметров.Добавить("Период");
СписокПараметров.Добавить("Тип");
ПараметрыОтчета.Вставить("СписокПараметров", СписокПараметров);
Если в открываемом отчете будет параметр Период... то он передаст это значение из текущего отчета
И да в поля расшифровки добавляются именно "Поля текущего отчета(колонки выводимые)", и вот значения из этих полей( по выбранной строке) будут переданы как отбор в открываемый отчет, не как параметр
20. nvs_tomsk 16.01.24 08:59 Сейчас в теме
Решаю аналогичную задачу.
Моя реализация, с дальнейшей возможностью переопределения других событий общей формы отчета:
1. Добавляем в отчет произвольную форму "ОбщаяФормаОтчетаПереопределяемая"

2. В форме пишем процедуру:
&НаКлиенте
Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
	СтандартнаяОбработка = Ложь;
	Сообщить("Расшифровка");
КонецПроцедуры


3. В модуле отчета добавляем 2 процедуры, в результате в общей форме отчета будет 2 реквизита "я_ИмяФормыПереопределенныхСобытий" и "я_ПереопределенныеСобытияФормы":
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры


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


4. дополняем процедуру общего модуля: ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки (проверяем наличие формы с переопределяемыми событиями, проверяем переопределяется ли событие "ОбработкаРасшифровки" и при необходимости вызываем событие уже в самой форме отчета):
Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
	
	//++ НЕ ГОСИС
	ОтчетыУТКлиентПереопределяемый.ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	
	//++ НЕ УТ
	ОтчетыУПКлиентПереопределяемый.ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	//-- НЕ УТ
	
	ОтчетыКлиентЛокализация.ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	
	//+++
	Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ФормаОтчета, "я_ИмяФормыПереопределенныхСобытий")
		И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ФормаОтчета, "я_ПереопределенныеСобытияФормы")
		И ТипЗнч(ФормаОтчета.я_ПереопределенныеСобытияФормы) = Тип("ФиксированныйМассив")
		И ФормаОтчета.я_ПереопределенныеСобытияФормы.Найти("ОбработкаРасшифровки") <> Неопределено Тогда
		
		ПереопределеннаяФорма = ПолучитьФорму(ФормаОтчета.ИмяФормы + "." + ФормаОтчета.я_ИмяФормыПереопределенныхСобытий);
		ПереопределеннаяФорма.ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	КонецЕсли;
	//---
	
	//-- НЕ ГОСИС
	
КонецПроцедуры
Показать


Теперь для любых отчетов, где необходимо переопределить обработку расшифровки - не требуется вмешательство ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки
23. Elucidator7b 17.03.25 16:35 Сейчас в теме
Добрый день! Спасибо за статью.
Может кто знает, как передать конкретное значение, а не поле текущего отчета?
Через замещающие тоже получается учувствуют поля текущего отчета.
У меня в открывающемся отчете есть параметр Назначение с видом сравнение не заполнено, и мне бы как то передать его как Ложь или Истина...

Ну и продолжение конкретных значений, может можно передать и числовые значения? В открываемом есть Заказано остаток, можно ли передать туда просто число на мое усмотрение?
Для отправки сообщения требуется регистрация/авторизация