Еще один способ нестандартной расшифровки отчета. Без использования обработчиков формы. Для ленивых

Публикация № 1058110

Программирование - Практика программирования

Пожелания bulpi о красоте. Добавил Область

78
Лень+ СКД. Еще один нестандартный способ расшифровки отчета. Без использования обработчиков формы. Только макет компоновки и модуль отчета. Весь исходный текст в статье.

   Статью написать сподвиг вопрос Слишком сложно для меня по уже стандартно нестандартной расшифровке. В свое время тоже требовалось оное и естественно набрел на Это. Все здорово. Но! Статья то о СКД + Лень. Последняя пылала пожаром и отказывалась нажимать последовательность cntr+C, alt+Tab, cntr+V многократно.

Я её уговаривал, грамотно же статья написана. Нет, отвечает Лень. Там нужна форма, а в БСП это Общая форма и она может измениться со следующим релизом, будет тебе лишняя головная боль при обновлении. В общем, Лень странная девочка. Когда творческий поиск, сложный запрос - ядерным взрывом не разбудишь, а тут бунт и в условиях цейтнота.

   Пришлось идти на поводу у Матери всея прогресса. Спросил у Яндекса, тот мне честно: “Ты б еще у Гугела идиот спросил”. Пришлось включать творческий процесс и метод “Научного тыка”. Чем научный от ненаучного знаете, чем отличается? Ставишь точку останова и смотришь в табло. Не нужное само отметается, а нужное обязательно найдется. А где ее ставить как не в  ПриКомпоновкеРезультата.  В уже стандартных строчках:

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

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

И вот ОНО. Нужное! После строчки: 

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

Под пытками, ЕЁ Величества Точки останова, ДанныеРасшифровки сознаются в своих параметрах, отборах и остальных "грехах". Остается только проверить, а расшифровка ли это

ЭтоРасшифровка = Не ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество()= 0;

Накидываем седло с уздечкой на коня и вуаля. Шорты превращаются в брюки:

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

Вроде бы просто. Но не тут то было. Моя Лень требует большего. Шорты не превращаются в брюки.  При выборе поля расшифровки нет строчки. "Остатки товаров", а есть другие поля, которые мне абсолютно не нужны. С ненужными полями все просто. Идем на закладку "Наборы данный" и ставим ограничение поля  на "Не доступно для группировки". Но и с выводом нужной мне строки в диалоге выбора поля, тоже банально. Добавляем в вычисляемые поля "ОтчетОстаткиТоваров" с заголовком "Остатки товаров" и в диалоге выбора поля уже ее наблюдаем. Остается только обработать в процедуре ПриКомпоновкеРезультата именно её:

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

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

Тестировалось на платформах 8.3.10 и 8.3.13. Но думаю будет работать и на более ранних релизах.

78

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. bulpi 148 16.05.19 11:35 Сейчас в теме
Все хорошо, но у Вас 2 раза вызывается
МакетКомпоновки = КомпоновщикМакета.Выполнить...
Один раз лишний. Перепишите для красоты.
2. tusv 148 16.05.19 11:48 Сейчас в теме
(1)Нет Второй не лишний. Первый раз, чтобы получить значения ДанныеРасшифровки и тело. Второй раз уже к выводу отчета расшифровки относиться
МакетКомпоновки = КомпоновщикМакета.Выполнить(Отчет.СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
В общем, то что я в статье назвал обманом девочки по имени Расшифровка
3. John_d 532 16.05.19 14:17 Сейчас в теме
Надо запомнить. Пригодится.
4. sergathome 16.05.19 15:00 Сейчас в теме
Албанский прям какой-то. Ничего не понял. Особенно понравилась конструкция
ЭтоРасшифровка = Не ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество()= 0;
5. tusv 148 16.05.19 15:20 Сейчас в теме
(4)Албанский не албанский, но работает при минимуме строчек кода.
А Вы думаете проверять расшифровку через Тело лучше
Если формируется отчет у ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество() =0.
Если расшифровка Количество отборов больше нуля
Все просто
7. sergathome 16.05.19 15:46 Сейчас в теме
(5)
ЭтоРасшифровка = ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество() > 0;

Не, религия не позволяет ? ж))

Это, вообще, чья процедура рассматривается - основного отчета или отчета-расшифровки ?
8. Bazil 413 16.05.19 15:54 Сейчас в теме
(7) А чем это
 ЭтоРасшифровка = ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество() > 0;

лучше чем это?
ЭтоРасшифровка = Не ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество()= 0;
kentavr27; tusv; +2 Ответить
12. sergathome 16.05.19 17:01 Сейчас в теме
(8) адназначна лучше. Те, кто не только на 1С пишет, сразу о такое спотыкаются. Потому как операторные скобки. Автоматически запускается ненужный вспоминатор - а как 1С разбирает логические выражения....
14. Bazil 413 16.05.19 17:08 Сейчас в теме
15. sergathome 16.05.19 17:11 Сейчас в теме
16. Bazil 413 16.05.19 17:13 Сейчас в теме
9. tusv 148 16.05.19 15:59 Сейчас в теме
(7) (8)Статья о чем? О Лени + СКД:). Переключится на английский, и написать лишние 2 символа, потом переключится обратно.Это жеж непосильный труд, когда 1С числовые значения понимает как булево.
Я исчо в запросах пишу Значение(Справочник.Контрагенты.). А почему бы нет, если ПустаяССылка писать не надо
stas1976; ben19791010; starik-2005; +3 Ответить
31. stas1976 14 20.05.19 11:17 Сейчас в теме
(9)О Великий !!! я даже не знал что так можно .
10. tusv 148 16.05.19 16:32 Сейчас в теме
(7)
Это, вообще, чья процедура рассматривается - основного отчета или отчета-расшифровки ?

Основного отчета
13. sergathome 16.05.19 17:07 Сейчас в теме
(10) Тогда я не понимаю, как это работает. Допустим, есть ячейка со ссылкой. При клике на неё будет вызвана ПриКомпоновкеРезультата? Да ладно ?!
17. tusv 148 16.05.19 17:26 Сейчас в теме
(13)Ячейку со ссылкой откроет. Но вычисляемое поле, которое я добавил - строка. Вот оно и ползет в ПриКомпоновкеРезультата.
Ну а так то можно через вычисляемое поле принудительно и ссылку отправить на выполнение расшифровки. Пример на скрине
Прикрепленные файлы:
20. sergathome 17.05.19 10:00 Сейчас в теме
(17) Я всегда думал, что ПриКомпоновкеРезультата запускается один раз и после заполнения результата больше не вызывается. Я не прав ? Ну давно я в это не ковырялся, не помню уже, а интересно...
21. tusv 148 17.05.19 10:08 Сейчас в теме
(20)
ПриКомпоновкеРезультата запускается один раз и после заполнения результата больш

Это правда. Вызывается один раз. Но вывод расшифровки это как бэ новый отчет, следовательно идет в ПриКомпоновкеРезультата с заполненными ДанныеРасшифровки. Собственно на этом метод и построен
22. sergathome 17.05.19 10:28 Сейчас в теме
(21) Блин, ну не вкуриваю я тада, почему оно пойдёт в свой же ПриКомпоновке при попытке расшифровки. Там своё событие было на форме типа ПриРасшифровке или что-то в этом духе.
23. tusv 148 17.05.19 10:35 Сейчас в теме
(22)Событие формы ОбработкаРасшифровки, если СтандартнаяОбработка = Истина Пойдет в ПриКомпоновкеРезультата.
sergathome; +1 Ответить
25. sergathome 17.05.19 10:40 Сейчас в теме
27. deGreese 18.05.19 14:48 Сейчас в теме
(7)
ЭтоРасшифровка = ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество() > 0;


Ну строго говоря сократить нужно можно вообще так.

Вместо этого

	ЭтоРасшифровка = Не ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество()= 0;

	Если ЭтоРасшифровка Тогда		


написать это

	
	Если ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество() Тогда


Однако у одинэсников откуда-то дичайшая любовь создавать тонны лишних переменных.
28. tusv 148 18.05.19 14:55 Сейчас в теме
(27)
Если ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество() Тогда

"Не" забыли иначе будер расшифровывать основной отчет:) В статье так для наглядности
30. sergathome 20.05.19 10:13 Сейчас в теме
(27) Когда-то, давным-давно, был такой контупер БК-0010. И был у него "вильнюсский бейсик". И была у этого бейсика особенность - операторы идентифицировались по 2-3 первым символам, что позволяло экономить ОЗУ, которого там было аж 16 килобайт... Оправдано было, ага. Чего не скажешь про сабж...
32. tusv 148 20.05.19 11:26 Сейчас в теме
(30)Когда то, давным - давно, еще на первых Семерках, после обновления, перестало работать "<>", а вот Не Блабала =0, работало. В общем какая разница, если и то и другое возвращает булево
33. A_Max 16 20.05.19 18:11 Сейчас в теме
(30) Аж всплакнул. Перетыкание пзу с фокал на бэйсик и изучение устройства телевизора на 3усцт для подключения rgb
26. veri123 17.05.19 14:10 Сейчас в теме
(4) а мне нравится
Если  ДанныеРасшифровки.Настройки.Отбор.Элементы.Количество()Тогда
deGreese; +1 Ответить
6. Darklight 17 16.05.19 15:44 Сейчас в теме
Интересное решение - надо будет попробовать
11. Glebis 11 16.05.19 16:40 Сейчас в теме
Мне было лень прочитать эту статью. Тема Лени не раскрыта.Пишу комментарий, потому - что лень работать. Если дочитал мой комментарий и статью до конца - ты трудоголик:).
З.Ы. Мне лень дописывать этот комме
mark_oilbass; CratosX; gubanoff; Sergant; FesenkoA; Lazio; pbabincev; maxopik2; sergathome; +9 Ответить
18. tusv 148 16.05.19 17:43 Сейчас в теме
(11)
ты трудоголик:)

Ес ай эм. Ленивый трудоголик:)
24. FesenkoA 36 17.05.19 10:37 Сейчас в теме
19. HAMMER_59 77 17.05.19 07:05 Сейчас в теме
Где бы мне такую лень найти, чтобы писать так статьи кратко и ясно.
29. tusv 148 18.05.19 21:13 Сейчас в теме
(19)Э брат. Мне бы научиться у юзера этого сайта по нику dhurricane, четкостью мысли и правильным ответа Цены мнеб не было:)
34. user598128_able123 23.05.19 02:41 Сейчас в теме
а как сделать расшифровку по значению?
Чтобы при нажатии на значение, значение расшифровалось например по номенклатуре и по складу.

До расшифровки:
Склад Номенклатура 12 11 10


После расшифровки
10Дт - 60Кт Склад Номенклатура.3
10Дт - 60Кт Склад Номенклатура.8
35. tusv 148 23.05.19 04:11 Сейчас в теме
(34)Так Склад и номенклатура должны сидеть в ДанныеРасшифровки.Настройки.Отбор. Вы просто переносите нужные значения из расшифровки в Настройки.Отбор
36. user598128_able123 23.05.19 07:46 Сейчас в теме
Когда нажимаю на значение при расшифровке. Открывается форма выбора поля(см. рис.) можно ли как то его обойти чтобы он не вызывался или вызывался только с одним значением в списке?
Прикрепленные файлы:
37. tusv 148 23.05.19 09:58 Сейчас в теме
(36)Вы не внимательно прочитали статью. Чтобы не попадало лишнее в поля Выбора расшифровки
Идем на закладку "Наборы данный" и ставим ограничение поля на "Не доступно для группировки".
Чтобы вообще не выходил Диалог выбора, без использования обработчика формы Выбор, победить не удалось. Задавал вопрос на этом форуме. Ни кто не знает
38. user598128_able123 24.05.19 09:07 Сейчас в теме
Возможно ли расшифровать на СКД по значению колонки?

Склад Номенклатура Приход Расход

Нажали на значение колонки Приход расшифровался по определенным проводкам
Нажали на значение колонки Расход расшифровался по определенным проводкам.
39. tusv 148 26.05.19 02:53 Сейчас в теме
(38)Проверил. Добавил Два Вычисляемых поля, Я назвал их Дебет и Кредит, Выражение - "", Ограничение по группировке - Истина(Чтобы не показывало в выборе расшифровки)
Добавил макет поля: Заполнение - Параметр, Параметр - ИмяПоля, Параметр расшифровки(от балды) - П1
Заполнил выражения параметров макета:
И в список расшифровки добавил Дебет и Кредит, Выражения "10,41"; "60,79,76"
В общем В отбор расшифровки попадает, как надо
Прикрепленные файлы:
Оставьте свое сообщение