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

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

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

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

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

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

Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

55 Comments

  1. bulpi

    Все хорошо, но у Вас 2 раза вызывается

    МакетКомпоновки = КомпоновщикМакета.Выполнить…

    Один раз лишний. Перепишите для красоты.

    Reply
  2. tusv

    (1)Нет Второй не лишний. Первый раз, чтобы получить значения ДанныеРасшифровки и тело. Второй раз уже к выводу отчета расшифровки относиться

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

    В общем, то что я в статье назвал обманом девочки по имени Расшифровка

    Reply
  3. John_d

    Надо запомнить. Пригодится.

    Reply
  4. sergathome

    Албанский прям какой-то. Ничего не понял. Особенно понравилась конструкция

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

    (4)Албанский не албанский, но работает при минимуме строчек кода.

    А Вы думаете проверять расшифровку через Тело лучше

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

    Если расшифровка Количество отборов больше нуля

    Все просто

    Reply
  6. Darklight

    Интересное решение — надо будет попробовать

    Reply
  7. sergathome

    (5)

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

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

    Это, вообще, чья процедура рассматривается — основного отчета или отчета-расшифровки ?

    Reply
  8. Bazil

    (7) А чем это

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

    лучше чем это?

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

    (7) (8)Статья о чем? О Лени + СКД:). Переключится на английский, и написать лишние 2 символа, потом переключится обратно.Это жеж непосильный труд, когда 1С числовые значения понимает как булево.

    Я исчо в запросах пишу Значение(Справочник.Контрагенты.). А почему бы нет, если ПустаяССылка писать не надо

    Reply
  10. tusv

    (7)

    Это, вообще, чья процедура рассматривается — основного отчета или отчета-расшифровки ?

    Основного отчета

    Reply
  11. Glebis

    Мне было лень прочитать эту статью. Тема Лени не раскрыта.Пишу комментарий, потому — что лень работать. Если дочитал мой комментарий и статью до конца — ты трудоголик:).

    З.Ы. Мне лень дописывать этот комме

    Reply
  12. sergathome

    (8) адназначна лучше. Те, кто не только на 1С пишет, сразу о такое спотыкаются. Потому как операторные скобки. Автоматически запускается ненужный вспоминатор — а как 1С разбирает логические выражения….

    Reply
  13. sergathome

    (10) Тогда я не понимаю, как это работает. Допустим, есть ячейка со ссылкой. При клике на неё будет вызвана ПриКомпоновкеРезультата? Да ладно ?!

    Reply
  14. Bazil

    (12) Вкусовщина.

    Reply
  15. sergathome

    (14) стандартизация

    Reply
  16. Bazil

    (15) Ссылка на стандарт?

    Reply
  17. tusv

    (13)Ячейку со ссылкой откроет. Но вычисляемое поле, которое я добавил — строка. Вот оно и ползет в ПриКомпоновкеРезультата.

    Ну а так то можно через вычисляемое поле принудительно и ссылку отправить на выполнение расшифровки. Пример на скрине

    Reply
  18. tusv

    (11)

    ты трудоголик:)

    Ес ай эм. Ленивый трудоголик:)

    Reply
  19. HAMMER_59

    Где бы мне такую лень найти, чтобы писать так статьи кратко и ясно.

    Reply
  20. sergathome

    (17) Я всегда думал, что ПриКомпоновкеРезультата запускается один раз и после заполнения результата больше не вызывается. Я не прав ? Ну давно я в это не ковырялся, не помню уже, а интересно…

    Reply
  21. tusv

    (20)

    ПриКомпоновкеРезультата запускается один раз и после заполнения результата больш

    Это правда. Вызывается один раз. Но вывод расшифровки это как бэ новый отчет, следовательно идет в ПриКомпоновкеРезультата с заполненными ДанныеРасшифровки. Собственно на этом метод и построен

    Reply
  22. sergathome

    (21) Блин, ну не вкуриваю я тада, почему оно пойдёт в свой же ПриКомпоновке при попытке расшифровки. Там своё событие было на форме типа ПриРасшифровке или что-то в этом духе.

    Reply
  23. tusv

    (22)Событие формы ОбработкаРасшифровки, если СтандартнаяОбработка = Истина Пойдет в ПриКомпоновкеРезультата.

    Reply
  24. FesenkoA

    (11)

    Reply
  25. sergathome

    (23) Спасибо за ликбез.

    Reply
  26. veri123

    (4) а мне нравится

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

    (7)

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

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

    Вместо этого

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

    написать это

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

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

    Reply
  28. tusv

    (27)

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

    «Не» забыли иначе будер расшифровывать основной отчет:) В статье так для наглядности

    Reply
  29. tusv

    (19)Э брат. Мне бы научиться у юзера этого сайта по нику dhurricane, четкостью мысли и правильным ответа Цены мнеб не было:)

    Reply
  30. sergathome

    (27) Когда-то, давным-давно, был такой контупер БК-0010. И был у него «вильнюсский бейсик». И была у этого бейсика особенность — операторы идентифицировались по 2-3 первым символам, что позволяло экономить ОЗУ, которого там было аж 16 килобайт… Оправдано было, ага. Чего не скажешь про сабж…

    Reply
  31. stas1976

    (9)О Великий !!! я даже не знал что так можно .

    Reply
  32. tusv

    (30)Когда то, давным — давно, еще на первых Семерках, после обновления, перестало работать «<>», а вот Не Блабала =0, работало. В общем какая разница, если и то и другое возвращает булево

    Reply
  33. A_Max

    (30) Аж всплакнул. Перетыкание пзу с фокал на бэйсик и изучение устройства телевизора на 3усцт для подключения rgb

    Reply
  34. user598128_able123

    а как сделать расшифровку по значению?

    Чтобы при нажатии на значение, значение расшифровалось например по номенклатуре и по складу.

    До расшифровки:

    Склад Номенклатура 12 11 10

    После расшифровки

    10Дт — 60Кт Склад Номенклатура.3

    10Дт — 60Кт Склад Номенклатура.8

    Reply
  35. tusv

    (34)Так Склад и номенклатура должны сидеть в ДанныеРасшифровки.Настройки.Отбор. Вы просто переносите нужные значения из расшифровки в Настройки.Отбор

    Reply
  36. user598128_able123

    Когда нажимаю на значение при расшифровке. Открывается форма выбора поля(см. рис.) можно ли как то его обойти чтобы он не вызывался или вызывался только с одним значением в списке?

    Reply
  37. tusv

    (36)Вы не внимательно прочитали статью. Чтобы не попадало лишнее в поля Выбора расшифровки

    Идем на закладку «Наборы данный» и ставим ограничение поля на «Не доступно для группировки».

    Чтобы вообще не выходил Диалог выбора, без использования обработчика формы Выбор, победить не удалось. Задавал вопрос на этом форуме. Ни кто не знает

    Reply
  38. user598128_able123

    Возможно ли расшифровать на СКД по значению колонки?

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

    Нажали на значение колонки Приход расшифровался по определенным проводкам

    Нажали на значение колонки Расход расшифровался по определенным проводкам.

    Reply
  39. tusv

    (38)Проверил. Добавил Два Вычисляемых поля, Я назвал их Дебет и Кредит, Выражение — «», Ограничение по группировке — Истина(Чтобы не показывало в выборе расшифровки)

    Добавил макет поля: Заполнение — Параметр, Параметр — ИмяПоля, Параметр расшифровки(от балды) — П1

    Заполнил выражения параметров макета:

    И в список расшифровки добавил Дебет и Кредит, Выражения «10,41»; «60,79,76»

    В общем В отбор расшифровки попадает, как надо

    Reply
  40. Xershi

    Про штаны и лень можно было бы и убрать. А так сплошная вода и бесовщина, за сленг минус. По коду надо проверять.

    Reply
  41. tusv

    (40)

    По коду надо проверять

    Щаз было обидно.

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

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

    Reply
  42. Xershi

    (41) кто будет искать код его сложно будет найти по такому тексту заголовка и описания. А затем прочитать чтобы понять, что имел автор! Поработайте над описанием!

    Reply
  43. tusv

    (42)Не ну Максим. Шесть лет назад мой сленг тебе охотно нравился. Кто тебя по конвертации то гонял. Забыл?

    Ну и ребята. моя статья абсолютно бесплатная

    А так. Этой статьи в запросе у яндекса я не нашел. Приму к сведению. Но тут дело не стиле, а в ключевых словах.

    ЗЫ: Попробуешь код на зуб — спасибо скажешь ибо он легок и быстр и ему наплевать, есть форма или нет

    Reply
  44. Xershi

    (43) так об этом и речь. Воду убрать оставить только то что по теме.

    Смысл отсебятину кидать. В статье важен смысл и простота понимания. Ты же не как Белокаменцев рассказы о жизни пилишь, а что-то в массы!

    Reply
  45. tusv

    (44)Все дело в ключевых полях. Проверил. Моя статья на первом месте

    Reply
  46. Xershi

    (45) поиск да. А смысл статьи?

    Я конечно тоже иногда читаю между строк. Но блин поработать же можно над текстом?

    Reply
  47. tusv

    (46)Смысл? Мало я тебя 6 лет назад гонял:) Зырь не в инструкцию, а в код. Формы нет, а расшифровка есть, причём, как мне вздумается. Код минимален и он рабочий

    И ваще нормальный человек смотрит в RTFM, когда все сломано)))

    Reply
  48. Xershi

    (47) вопросов по коду нету, написал еще в (40).

    Reply
  49. tusv

    (48)Ну так покупай проверяй. Я дарую этот код «бездвоздмездно, то есть дадом»:)

    Reply
  50. Xershi

    (49) повторяю еще раз вопрос в том что это уровень статьи. А у вас это статья уровня комментарий на форуме. Мне кажется разница есть?

    Reply
  51. tusv

    (50)Разница, Максим большущая. И я и ты на форуме особо высоким языком не блещем:) Я только не понимаю, что в заголовке то не так?.»Без использования обработчиков формы. Только макет компоновки и модуль отчета. »

    Лень убрать? Так люди точки останова перестануть ставить и Нас раздербанят на вопросы почему.

    Не трогай мой стиль. Меня по нему узнают плюсы и минусы ставят.

    Радоваться люди должны, что я за Них догадался, что так все просто.

    Не нравиться стиль, да божеж мой, пользуйся, что я придумал, не нравиться пройди мимо. Но код читать обязательно

    Reply
  52. user598128_able123

    (39)

    В макете СКД добавил макет поля.

    <Приход БУ>.

    В параметре расшифровки указал Номенклатура и склад.

    При формировании СКД выдает ошибку, «Поле «Склад» не может быть использовано в группировке «Номенклатура»»

    В настройках стоит группировка сначала по номенклатуре, далее группировка по складу.

    Вопрос, как такую ошибку можно обойти?

    Чтобы при расшифровке брал значение еще и склада.

    (39)

    Reply
  53. tusv

    (52)Составной группировкой. Номенклатура, Склад

    Reply
  54. Casey1984

    Привет!

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

    У меня этот код выдает Истина, если добавляю отбор в пользовательском режиме. Заменил на:

    ЭтоРасшифровка = ДанныеРасшифровки.Настройки.Структура[0].Имя = «Расшифровка»;

    Reply
  55. tusv

    (54)А устарело.

    Достаточно

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    ЭтоРасшифровка =  Настройки.Структура.Количество() и Настройки.Структура[0].Имя =»Расшифровка»
    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *