gifts2017

Трюки и уловки при работе с отчетами на базе СКД (часть 1)

Опубликовал Константин Хрипков (mbreaker) в раздел Программирование - Практика программирования

Система компоновки данных - очень богатый функционально инструмент, который позволяет реализовать очень много отчётов и их настроек, не прибегая к непосредственному программированию. Зачастую разработчики отчётов (особенно начинающие) даже не догадываются, что их кажущаяся сверхсложной задача по выводу данных не только вполне реализуема штатными механизмами СКД, но ещё и делается с помощью простейших операций. А некоторые обычные пользователи находят для себя много неожиданных открытий в задачах, для которых они, как правило, использовали Excel.
Дабы избежать комментариев типа "тоже мне открытие!", оговорюсь сразу: статья рассчитана на неискушённых СКД-разработчиков, тем кто это и так знает не обязательно высказывать своё "фи!", поймите, то что очевидно для вас - не всегда бывает очевидно остальным.

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

Трюк №1. Многоликость правого значения.

Итак, для разогрева начнём с чего-нибудь попроще. В таких механизмах СКД, как "Отбор" или "Условное форматирование" вы наверняка сталкивались с колонками "Поле" (или "Левое значение") и "Значение" (или "Правое значение"). Профессионалы, наверняка знают этот трюк, но начинающим не всегда легко догадаться, что поле компоновки данных можно использовать как слева, так и справа (т.е. сравнивать не только заданные фиксированные значения, но и другие поля СКД в пределах одной строки). Для этого достаточно в поле правого значения зайти в режим редактирования, нажать кнопку очистки значения ("кретик"), затем нажать появившуюся кнопку выбора типа (буква "Т") и выбрать тип "Поле компоновки данных".

Пример.
В качестве примера я не стал изобретать велосипед, а взял самую обычную оборотно-сальдовую ведомость по счету 60 из демо-версии 1С:Бухгалтерии (я использую ред. 2.0.). Кто не знает, начиная с редакции 2.0 этот отчёт сделан на базе СКД.

Итак, зададим прямо в ней отбор для строк с условием "БУ Дт (оборот)" Равно "БУ Кт (оборот)", а также применим к отчёту условное оформление, подсветив жёлтым цветом ячейки строк, где "БУ Кт (кон. сальдо)" Больше "БУ Кт (оборот)". Если кто не знает, как включить панель "Оформление" - найдите кнопку "Параметры панели настроек" справа от надписи "Панель настроек".

Конечный результат должен получиться примерно таким:


Трюк №2. Отбор на группировках.

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

Пример.
Цель примера: отобразить ОСВ, в которой для взаиморасчетных счетов (60,62,76) показать расшифровку по контрагентам, а для затратных (20,23,25,26) - по статьям затрат. 

Сама СКД реализована в виде набора данных, где используется запрос к виртуальной таблице остатков и оборотов регистра бухгалтерии "Хозрасчетный". 
Размещаем вложенные группировки "Организация" и "Счет". В группировке "Счет" параллельно размещаем 2 группировки "Субконто1" и "Субконто2", для которых задаем соответствующие отборы.
Иллюстрацию настройки привожу в скриншоте:


Если в основных настройках отчёта на закладке "Другие настройки" вы не отключали вывод отборов, то это обязательно нужно будет сделать в "других настройках" наших группировок "Субконто1" и "Субконто2"

Трюк №3. Шапка-невидимка

Следующий трюк можно представить, как продолжение предыдущего. Если вы обратили внимание, в получившемся отчёте несмотря на то, что фактически у нас выводится только одно субконто, в шапку попадают оба (и "Субконто1" и "Субконто2"). К сожалению разработчики СКД не предусмотрели возможность регулирования видимостью шапки или использования какого-нибудь служебного символа, при установке которого в качестве заголовка, шапка поля бы не формировалась. Но, как вы уже, наверное, догадались есть трюк, который в какой-то степени поможет обойти данное ограничение.

При разработке схемы в предопределённом макете оформления добавьте макет группировки, с определением по имени группировки "Невидимка" так, как показано на скриншоте. Обратите внимание, что поле "Область" должно остаться пустым!



А затем задайте для группировки "Субконто2" имя "Невидимка":



И вуаля... шапка группировки "Субконто2" исчезает, а отчёт становится вот таким:



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

Да, есть ещё один ньюанс этого трюка: учитывайте, что "шапка-невидимка" накрывает не только эту группировку, но и все нижестоящие! Т.е. если вы назначите имя "Невидимка" группировке "Субконто1", то в шапке не будет видно ни "Субконто1", ни "Субконто2"!

Трюк №4. Называй меня как хочешь

Большинство разработчиков СКД знают, как можно задать заголовок поля запроса. На закладке СКД "Наборы данных", достаточно поставить галочку отмены автозаголовка и внести в поле "Заголовок" необходимый текст. Минус состоит в том, что в пользовательском режиме, этот способ недоступен, а переименовать заголовок хочется не прибегая к помощи конфигуратора. Так вот в настройках вариантов отчёта есть не только способ переименовать заголовки полей, но и "накрыть" их группировочной "шапкой". Для этого на закладке "Выбранные поля" необходимо выделить нужные поля и нажать правую кнопку мыши. Как видно на скриншоте для полей доступны опции "Установить заголовок" и "Сгруппировать поля".
Обратите внимание, что для полей группировок установку заголовка необходимо делать также именно через закладку "Выбранные поля", а не через контекстное меню "Установить имя" в верхней (структурной) части настройки варианта!



После всех настроек вариант отчёта выглядит вот так:



P.S.
Небольшая подсказка для тех, кто будет качать схему. Схема - одна, но все трюки выполнены в виде отдельных вариантов настроек отчёта этой схемы:



Продолжение следует...

Скачать файлы

Наименование Файл Версия Размер
Схема ОСВ с вариантами трюков для 1С:БП8 60
.xml 47,30Kb
27.08.14
60
.xml 47,30Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Марченко (MarSeN) 28.08.14 13:26
"Шапка-невидимка" - примерно то-же самое можно сделать если в условном оформлении этого поля указать максимальную высоту = 1
2. Константин Хрипков (mbreaker) 28.08.14 12:09
(1) MarSeN, к сожалению не могу подтвердить верность утверждения. При попытке воспроизвести у меня всего лишь схлопываются сами группировки, оставляя при этом заголовок и образуя некрасивую толстую линию на стыке. Смысл трюка №3 был как раз-таки в обратном: оставить выводимые группировки в области данных, но скрыть заголовок группировки в области шапки отчета.
3. Станислав Раташнюк (stanru1) 28.08.14 19:11
Спасибо, очень интересно! Хочу больше разных трюков с СКД!
4. Антон Чарушкин (hulio) 29.08.14 05:24
Век живи - век учись, как говорится.
Про вариативную расшифровку понравлось решение. Мне самому не приходило в голову )))
Возьму на вооружение ;)
5. ффф ыыы (zqzq) 29.08.14 08:45
Как вариант для шапки-невидимки - установить заголовок поля пробел (вариант 4). Тогда следующие группировки не пропадут, но будет пустая ячейка в шапке.
6. Константин Хрипков (mbreaker) 29.08.14 06:48
(5) zqzq, да, на текущий момент это единственный вариант для хоть какого-то оформления дублирующихся ресурсов и реквизитов, т.к. иного механизма пока что не найдено, но при таком оформлении действительно остаётся пустая ячейка в шапке.
7. Сергей Ожерельев (Поручик) 29.08.14 10:40
Статья полезная. Даже сам узнал кое-что очевидное, но для меня было открытием. Выводы: век живи, век учись.
8. Николай ~ ~ (kuzyara) 31.08.14 23:07
А я тут недавно узнал что и динамические списки на СКД работают :)
И лучшее средство отладки - консоль компоновки данных (ИР от tormozit) с волшебной кнопкой "Открыть запросы макета компоновки в консоли запросов"
9. Константин Хрипков (mbreaker) 01.09.14 02:36
(8) kuzyara, не совсем понял, что подразумевается под динамическими списками в СКД, но недавно в партнерской конференции коллеге объяснял, как под УФ настроить сложносоставной отбор по реквизиту одного из полей.
А вот с отладкой СКД через консоль запросов я бы посоветовал действовать осторожно. Нисколько не умаляю удобство ИР, но часто бывает, что результаты СКД и запроса сильно разняться. Некоторым особенностям работы СКД планирую посвятить одну из публикаций.
10. Николай ~ ~ (kuzyara) 31.08.14 23:46
(9), Динамический список, это раз.
Консоль запросов != Консоль компоновки, это два.

У меня тоже проблемы с чтением бывают;)

А если попытаться сделать пару отчетов не мышкой, а описать скд с помощью только кода (гилев в помощь), то можно понять объектную модель этой системы, и описанные в статье вещи не будут необычными.
11. Константин Хрипков (mbreaker) 01.09.14 13:17
(10) kuzyara, коллега, с чтением у меня пока всё нормально, так что дело не в этом...
1) Что такое динамический список в УФ я прекрасно знаю, меня смутила фраза "динамические списки на СКД работают", поэтому предположил, что речь идёт об управлении отборами в диалогах выбора, написанных на УФ, т.к. иного варианта, почему работа динамических списков в СКД должна удивлять у меня не нашлось. А вот на тему применения сложных отборов у меня было обсуждение одного из таких случаев с коллегой из Астрахани (ветка "СКД связь полей в отборе по владельцу через промежуточный реквизит" в форуме "Платформа 8.3" партнерской конференции).
2) Замечательный инструментарий Сергея Седых я знаю давно и также давно им активно пользуюсь в своей работе. Поэтому отличить консоль запросов от консоли компоновки данных у меня сложности не составляет. А моя ремарка про соблюдение осторожности относится к упомянутой кнопке "Открыть запросы макета компоновки в консоли запросов". Дело в том, что в последних версиях конфигураций активно используются функциональные опции, а они очень сильно влияют на результат отработки СКД. Но тот же самый запрос набора данных, открытый через "волшебную кнопку" в консоли запросов полностью их (ФО) проигнорирует и выдаст иной результат.
12. Nick (Puk2) 01.09.14 16:46
Трюк №2 можно иногда частично заменять определенным образом построенным запросом, но при этом использовать фишку СКД "Игнорировать NULL". Если в группировке попадается поле со значением NULL, но при этом установлено свойство "Игнорировать NULL", то данная группировка просто не выводится, таким образом получаем "умную" расшифровку по уровню. Плюс по сравнению с трюком №2 заключается в том, что записи будут в естественном порядке, а не так, как "вручную" установлены в группировке с отбором. Хотел бы уточнить, что оба метода жизнеспособны и сам их оба активно применяю.
Так же в качестве трюка СКД можно отметить "левое соединение", которое в плане подсчета итогов не такое "левое", как в запросе. Хотя это правильнее назвать особенностью, а не трюком.
NittenRenegade; wolfsoft; mbreaker; +3 Ответить 2
13. Константин Хрипков (mbreaker) 01.09.14 17:30
(12) Puk2, да, тоже интересный вариант... но с отбором получается чуть более гибче за счет того, что отборами можно регулировать в вариантах отчета, а с "Игнорировать NULL" только на стадии разработки СКД... ну и, честно сказать, я немного недолюбливаю это свойство, т.к. с составными типами пару раз "выстреливало" не так, как рассчитывал (может в версии платформы проблема была, а может особенности СУБД)... но за идею спасибо!
14. Алекс Одинэсник (Alex1Cnic) 03.09.14 09:52
Молодца!!!
Очень интересно и ждем продолжений! респкт!
15. юрий гулидов (gull22) 03.09.14 11:04
Полностью присоединяюсь к комментарию (7) Поручик. Буду ждать продолжения.
16. mikhailovaew (mikhailovaew) 03.09.14 12:25
Отличная статья, полезно, понятно и без снобизма. Пожалуйста, продолжайте!
17. Val Yan (valvit) 03.09.14 11:48
Спасибо, познавательно и согласен без снобизма!
18. Информационно-технического развития Служба (SITR-utyos) 03.09.14 20:39
СКД - эх, сколько про неё можно писать... для новичков это очень полезный материал.
Сам в свое время хотел запутить цикл статей по СКД, но нынешняя система мотивации на инфостарт отбила все желание
В результате меня хватило только на http://infostart.ru/public/267055/
Spacer; Yimaida; +2 Ответить 3
19. Константин Хрипков (mbreaker) 03.09.14 21:50
(18) SITR-utyos, хорошая статья, раскрывающая многие недавно вышедшие в платформе новинки...
а что не так с системой мотивации инфостарта? сколько помню тут всегда был немонетизированный рейтинг...
20. Константин Хрипков (mbreaker) 04.09.14 09:27
(18) SITR-utyos, хотя припоминаю начисление $m за рейтинговые статьи (>100 звёзд) в момент введения $m... как сейчас дела обстоят - даже не знаю...
Я не отношусь к числу тех, кто стремится заработать на этой площадке... Она мне неинтересна с этой точки зрения, а к рейтингу я лично отношусь, как к оценке признания сообщества моих стараний, а не как ко всем-известно-чего-измерительному инструменту. Хотя даже во втором не вижу ничего противоестественного - человеку свойственны поведенческие "лидерские" сценарии.
21. Юрий Муллабакиев (mulla1979) 06.09.14 11:11
Статья отличная! Автору респект!
22. Александр *** (a1ex4ndr) 07.09.14 01:11
Отличная статья, плюсанул. Особенно с шапкой-невидимкой пригодилось))))
23. Alex12345 sdaf (Alex123456) 09.09.14 16:27
Хорошая статья. Спасибо.
24. ффф ыыы (zqzq) 10.09.14 09:40
(18) (19)
Кстати, пользуюсь иногда выводом таблицы в одну ячейку (ВычислитьВыражениеСГруппировкойТаблицаЗначений и т.д.). И что обнаружил - в тонком клиенте 8.2.19.68 при попытке расшивровки/открытия система принудительно валится с ошибкой т.к. недоступна ТаблицаЗначений на клиенте. Приходится изащряться - заключать выражение в СоединитьСтроки(), создавать макет для поля и прописывать расшифровку как Массив().
С массивом нет проблем с расшифровкой, но вывод в одну строку не очень красив.

Ещё момент - ВычислитьВыражениеСГруппировкойТаблицаЗначений("А, Б, С", "А") и ВычислитьВыражениеСГруппировкойТаблицаЗначений("С", "А") по опыту дают одинаковый порядок поля "С", но по справке это не очевидно. Альтернативное выражение очень громоздкое:
ПолучитьЧасть(
    Упорядочить(
        ВычислитьВыражениеСГруппировкойТаблицаЗначений(
            "С, А", 
            "А"
        ),
        "А"
    ), 
    "С"
)
...Показать Скрыть
25. Сергей Старых (tormozit) 11.09.14 08:25
(11) mbreaker, Немного поправлю, я Сергей Старых, а не Седых, хотя согласен близко =)
По поводу функциональных опций кажется, что правильнее всего отлаживать СКД/запрос под нужным пользователем, временно предоставив ему роль ирРазработчик. Для этого в инструменте "Редактор пользователей" есть возможность запустить предприятие под любым пользователем и временно включить ему эту роль.
26. Андрей Логинов (Poplar) 12.09.14 19:42
Хорошая статья. Прекрасное оформление. В продолжении, если можно, поясните, как "Первые", используемые в конструкторе запроса задать в виде параметра в настройках отчета? Если, конечно это возможно. Если нет, то как иначе выводить первые, чтобы установка их количества была доступна пользователю?
27. Константин Хрипков (mbreaker) 13.09.14 10:31
(25) Сергей, извини за ошибку с фамилией, на самом деле тот пост писал с мобильного и возможно просто случайно ткнул в автоподстановку. Относительно ФО - не важно, под каким пользователем работаешь, ФО влияет на всех, просто в конструкторе СКД таблицы, привязанные к ФО доступны для выбора, но уже на стадии настройки связей начинают сказываться значения ФО. Выполнение такой схемы приводит к ошибке, если ФО отключены, а выполнение запроса из схемы пройдёт без проблем.
28. Константин Хрипков (mbreaker) 13.09.14 11:29
(26) Poplar, в ближайшую неделю не смогу проверить (в отпуске сейчас), но навскидку на ум приходит использование системного поля номер строки в отборе.
29. Сергей Старых (tormozit) 13.09.14 12:04
(27) mbreaker, можешь точнее указать, при выполнении какой команды встроенного языка возникает такая ошибка?
30. Андрей Логинов (Poplar) 13.09.14 22:22
(28) mbreaker, Я так пытался в свое время делать но у меня не получилось. Система отказывалась понимать отбор по системному полю. Выкрутился тем, что заказчикам передал три отчета, каждый из которых на разное число строк (топ продаж 10,20,30 позиций номенклатуры).
31. Константин Хрипков (mbreaker) 14.09.14 02:26
(29) tormozit, точнее в ближайшую неделю сказать не смогу по причине отпуска. Легко можешь проверить это поведение, сделав в штатной БП 2.0/3.0 запрос к р/с, участвующих в ЭДО.
32. Константин Хрипков (mbreaker) 14.09.14 11:01
(29) tormozit, точнее в ближайшую неделю сказать не смогу по причине отпуска. Легко можешь проверить это поведение, сделав в штатной БП 2.0/3.0 запрос к р/с, участвующих в ЭДО. Если ФО "Использовать ЭДО" выключена - схема при выполнении будет выдавать ошибку "Не могу найти поле ..."
33. Константин Хрипков (mbreaker) 24.09.14 09:50
(26) Poplar, пока нашёл только один способ ограничения вывода количества строк. При выборе конкретной группировки ("<Детальные записи>" тоже группировка) на закладке "Другие настройки" появляется настройка "Количество записей". В форме отчёта ОФ можно вывести эту настройку программно, в УФ можно определить её, как "пользовательскую настройку", назвать по своему и управлять ею через "Все настройки..."

P.S. К сожалению добиться её вывода в настройках быстрого доступа через штатные средства БСП у меня не получилось.
34. Андрей Логинов (Poplar) 29.09.14 12:17
Спасибо большое, все работает. Без быстрого доступа обойдусь.
35. Константин Хрипков (mbreaker) 30.09.14 10:23
36. Андрей Киреев (FractonKireyev) 09.03.15 18:19
Давно работаю с СКД, и вроде-бы уже всё знаю. А вот трюк №2 (с отбором на группировках) для меня оказался полной неожиданностью.
Беру на вооружение.
37. Amelk Amelk (Amelk) 09.03.15 20:16
(12) Puk2, Спасибо. Очень полезний и не типичний способ
38. Dexter Morgan (DexterMorgan777) 13.03.15 09:48
39. Сергей Маслов (LexSeIch) 16.03.15 04:57
Мир этому дому! Статья отличная и полезная. Радует так же аккуратность оформления иллюстраций. Автору спасибо - ждем продолжения!
40. Наталья Наталья (nata_87) 25.06.15 12:26
Подскажите пожалуйста как в СКД рассчитать итог по Среднему игнорирую пустые значения, т.е. в отчете 10 строк из них только 3 заполнены, как итоговое среднее вывести по этим трем, так как сейчас он при расчете среднего делит на кол-во строк 10
41. Информационно-технического развития Служба (SITR-utyos) 30.06.15 18:02
(40) В ресурсе пишешь выражение:
Сумма(ТвоеПоле) / Сумма (Выбор КОГДА ЗначениеЗаполнено(ТвоеПоле) Тогда 1 Иначе 0 Конец)
42. Наталья Наталья (nata_87) 01.07.15 09:24
43. Alex Steiner (OrsoBear) 27.08.15 12:26
Вот спасибо!
Маялся с группировками, шапки рисовал, а оказалось все гораздо проще решается.
44. Александр Кутин (Aprobator) 10.11.16 13:25
хм, а вот такая проблема. Как в схеме СКД обойти проблему с выводом при расшифровке строк с пустым значением ресурса?
Исходные данные:
Структура вывода таблица. Ресурсов несколько, при расшифровке по определенному ресурсу лезут пустые значения. Насколько я понимаю, это из за того, что в данной группировке (из которой делается расшифровка, причем неважно по какому полю) были другие не пустые значения ресурсов.
45. Константин Хрипков (mbreaker) 11.11.16 14:19
(44) Aprobator, не совсем понятна задача. Что означает "при расшифровке"? Разворот группировки или drill-down отчет? Или что-то иное?
Можно чуть более развернуто и желательно с визуализацией?
46. alina71 (alina71) 02.12.16 13:50
Не подскажете как решить такую задачу: если взять пример из трюка 1, то чтобы в отчет выводились только контрагенты, у которых "Обороты за период" были больше определенной суммы, ну например 100 тыс? То есть ИЛИ дебет ИЛИ кредит были больше этой суммы? Как я понимаю, если через отбор поставить два условия, они выполняются через "И", т.е. выберутся контрагенты, у которых и дебет и кредит больше 100 тыс.
47. alina71 (alina71) 02.12.16 14:56
вернее, отбор вообще не выполнится, отчет будет пустой
48. Константин Хрипков (mbreaker) 03.12.16 06:41
(46) очень просто: добавить в отбор группу типа "ИЛИ". Через кнопку "Добавить", подменю "группу" или выделить условия, нажать правую кнопку мыши и выбрать "Сгруппировать". Группы между собой также можно группировать, формируя сложные комбинации условий отбора.
49. alina71 (alina71) 06.12.16 13:07
Констатин, спасибо большое, сама что-то не догадалась. Все получилось, единственное почему-то пропало сальдо на начало периода((
50. alina71 (alina71) 07.12.16 14:28
Вопрос решен. Поставила отбор не на уровне всего отчета, а на группировке "Контрагенты".
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа