Использование дополнительных реквизитов и сведений в отчетах

05.04.23

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

Формирование отчётов с помощью дополнительных реквизитов и сведений. Дополнительные реквизиты как инструмент настройки отчётов. Тестировалось на платформе 8.3.22.1709, ОС Linux-Mint.

Скачать исходный код

Наименование Файл Версия Размер
Шаблон обработки для заполнения дополнительных реквизитов и сведений
.epf 8,12Kb
2
.epf 8,12Kb 2 Скачать

Использование дополнительных реквизитов и сведений в отчётах

Коротко о доп. реквизитах

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

Хотя между ними и есть отличия – причём, в ряде случаев довольно существенные – но поговорим мы об этом чуть позже.

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

Вместо этого здесь мы бы хотели показать немного нестандартный сценарий использования доп. реквизитов при работе с отчётами.

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

Создаём реквизит, и он появляется в документах. Если нужно, заполняем его. Если нужно, показываем в отчётах.

Здесь мы обсуждаем противоположный подход. Первичная цель – отчёт. Чтобы его получить, используется реквизит, созданный специально для отчёта.

Что бывает обычно: отчёт нужен для того, чтобы показать реквизит.
Что предлагаем мы: реквизит нужен для того, чтобы получить отчёт.

Пример

Для начала пример (а после устроим разбор полётов).

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

Долги ли, коротко ли, но, как и следовало ожидать, программисту прилетела задача: добавить этот самый знак зодиака в отчёт по продажам. Маркетолог на предыдущей работе уже видел 1С, поэтому даже смог сформулировать свой запрос примерно в таких терминах, что это «должна быть группировка верхнего уровня».

Что делать программисту? Это же типовой отчёт. Не убирать же замочек! Конечно, можно подправить запрос с помощью расширений, но это как-то уж совсем через чур… Из пушки по воробьям. Да и маркетолог непонятно, надолго ли с нами. В общем, на скорую руку программист решил создать в отчёте новое пользовательское поле. И вычислять знак там. Осталось правильно написать функцию. Гугл с Яндексом пришли на помощь (в процессе поисков даже оказалось, что на ИС есть похожие отчёты для БП и ЗУПа!) и в результате получилось примерно так:

Функции для СКД

Выбор

                Когда Месяц([Дата рождения]) = 12 И День([Дата рождения]) >= 22 Или Месяц([Дата рождения]) = 1 И День([Дата рождения])

                                Тогда "Козерог"

                Когда Месяц([Дата рождения]) = 11 И День([Дата рождения]) >= 23 Или Месяц([Дата рождения]) = 12 И День([Дата рождения])

                                Тогда "Стрелец"

                Когда Месяц([Дата рождения]) = 10 И День([Дата рождения]) >= 24 Или Месяц([Дата рождения]) = 11 И День([Дата рождения])

                                Тогда "Скорпион"

                Когда Месяц([Дата рождения]) = 9 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 10 И День([Дата рождения])

                                Тогда "Весы"

                Когда Месяц([Дата рождения]) = 8 И День([Дата рождения]) >= 22 Или Месяц([Дата рождения]) = 9 И День([Дата рождения])

                                Тогда "Дева"

                Когда Месяц([Дата рождения]) = 7 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 8 И День([Дата рождения])

                                Тогда "Лев"

                Когда Месяц([Дата рождения]) = 6 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 7 И День([Дата рождения])

                                Тогда "Рак"

                Когда Месяц([Дата рождения]) = 5 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 6 И День([Дата рождения])

                                Тогда "Близнецы"

                Когда Месяц([Дата рождения]) = 4 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 5 И День([Дата рождения])

                                Тогда "Телец"

                Когда Месяц([Дата рождения]) = 3 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 4 И День([Дата рождения])

                                Тогда "Овен"

                Когда Месяц([Дата рождения]) = 2 И День([Дата рождения]) >= 20 Или Месяц([Дата рождения]) = 3 И День([Дата рождения])

                                Тогда "Рыбы"

                Когда Месяц([Дата рождения]) = 1 И День([Дата рождения]) >= 21 Или Месяц([Дата рождения]) = 2 И День([Дата рождения])

                                Тогда "Водолей"

                Иначе "-----"

Конец

Взято отсюда: //infostart.ru/1c/articles/70403/

Программист немного подправил логику и ещё учёл, что это поле для типового отчёт «Валовая прибыль» (там нет поля Дата рождения, но есть поле Менеджер). Теперь получилось как-то так:

Выбор
    Когда ГОД([Менеджер.Физическое лицо.Дата рождения]) = 1
        Тогда "Не указано"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 1 + 20
        Тогда "Козерог"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 2 + 19
        Тогда "Водолей"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 3 + 20
        Тогда "Рыбы"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 4 + 20
        Тогда "Овен"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 5 + 21
        Тогда "Телец"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 6 + 21
        Тогда "Близнецы"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 7 + 22
        Тогда "Рак"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 8 + 21
        Тогда "Лев"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 9 + 23
        Тогда "Дева"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 10 + 23
        Тогда "Весы"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 11 + 22
        Тогда "Скорпион"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 12 + 22
        Тогда "Стрелец"
    Когда 31 * МЕСЯЦ([Менеджер.Физическое лицо.Дата рождения]) + ДЕНЬ([Менеджер.Физическое лицо.Дата рождения]) <= 31 * 12 + 31
        Тогда "Козерог"
    Иначе "Не указано"
Конец

В любом случае первое впечатление – много букв (причём, одинаковых). Работает, конечно, но как-то всё громоздко. Неэлегантно. Программист задумался и решил пойти другим путём. Он создал свойство Знак зодиака, общее у справочников ФизЛица и Пользователи и написал меленькую обработку, которая его заполняет. Функция собственно определения знака получилось примерно такая: 

Функция ЗнакЗодиакаПоДате(Дата)
    
    НазванияСтрока  = "Козерог,Водолей,Рыбы,Овен,Телец,Близнецы,Рак,Лев,Дева,Весы,Скорпион,Стрелец,Козерог";
    ДниМесяцаСтрока = "20,     19,     20,  20,  21,   21,      22, 21, 23,  23,  22,      22";

    Названия  = СтрРазделить(НазванияСтрока, ",");
    ДниМесяца = СтрРазделить(ДниМесяцаСтрока, ",");

    МесяцДаты = Месяц(Дата);
    ДеньДаты  = День(Дата);
    
    ДеньГраницыЗнака = Число(ДниМесяца[МесяцДаты - 1]);
    
    Если ДеньДаты <= ДеньГраницыЗнака Тогда
        Название = Названия[МесяцДаты - 1];
    Иначе
        Название = Названия[МесяцДаты];
    КонецЕсли;
    
    Возврат Название;
    
КонецФункции  

Букв теперь гораздо меньше. Это приятно. И никаких потенциальных проблем с доступом к персональным сведениям. А в отчёт – и кстати, кайф в том, что это может быть вообще любой типовой отчёт, в котором есть ФизЛицо или Пользователь – нужно всего лишь добавить новое поле. Благо, в СКД даже есть конструктор формул. И всё!

Плюсы от использования доп. реквизитов

Итак, что полезного мы видим.

1. Очевидный, самый главный плюс: резко упрощаются настройки. Это работает везде, где можно использовать доп. реквизиты: поля, структура, отборы...

2. В отчёт можно вывести данные, которые этим отчётом получить не просто сложно, а невозможно в принципе. Например, нужно добавить в отчёт по продажам (привет от нашего маркетолога) стаж работы менеджера. Если в ERP ещё как-то можно написать отдельный специальный отчёт, то, например, в УТ, где нет кадровых данных, совсем никак.

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

4. Один и тот же доп. реквизит можно использовать в разных отчётах с разными задачами. В типовых отчётах на СКД с точки зрения пользовательских настроек это такой же реквизит, как и все остальные. Если в типовом отчёте есть сам реквизит, то и его «вложенные» (дополнительные в том числе) реквизиты есть тоже.

Выбор: реквизиты или сведения

Сейчас, как и говорили в самом начале, немного о том, чем отличаются дополнительные реквизиты и сведения.

Что именно использовать, одной стороны, дело вкуса, с другой – вопрос принципиальный. 

Перечислим некоторые факты, которые мы знаем про механизм(ы).

Реквизиты хранятся в самом объекте, а именно в табличной части ДополнительныеРеквизиты.
Сведения хранятся в специальном регистре ДополнительныеСведения.

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

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

Обобщим сказанное.

То, что реквизиты хранятся в самом объекте, конечно, однозначно минус с точки зрения производительности при записи: сравните соответствующие обработчики в регистре и, например, в справочнике Номенклатура.

На реквизиты распространяются ограничения, которые есть у объекта. Например, дата запрета редактирования. Вообще, это может и плюсом и минусом. Зависит от ситуации. Если важно, чтобы реквизит оставался таким, каким он был при проведении документа, это плюс. Если реквизит согласно бизнес логике может изменяться задним числом, это минус. Однако здесь мы говорим о том сценарии, когда реквизиты заполняются независимо от документа. В конце дня, в конце месяца… но не при оформлении документа. В данном случае ограничения объекта будут мешать.

Реквизиты находятся на форме объекта. Если войти во вкус и насоздавать их штук, скажем, 10-20-30, только представьте, во что превратится форма объекта!

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

Напоследок мнение. Просто личное мнение, ничего больше. Мы считаем, что не следует создавать новые реквизиты программно. Только вручную. Так процесс получается более осознанным. Иначе велик шанс наплодить – например, в случае ошибок в логике – ненужных реквизитов.


Обработка для обновления доп. реквизитов

Важное замечание. 

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

Прикладываем шаблон обработки, в которой реализована следующая упрощённая ситуация: у справочника ФизЛица есть дополнительное сведение Наименование. Обработка просто копирует туда наименование элемента. Опционально можно вставить перед наименованием первую букву этого наименования (это чтобы хоть как-то усложнить задачу!)

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

Модуль обработки можно скопировать отсюда:

 

дополнительные реквизиты сведения отчеты

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124624    681    389    

732

Infostart PrintWizard

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

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7723    24    6    

42

Infostart УДиФ: Управление данными и формами

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

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

10000 руб.

10.11.2023    4239    12    2    

36

SALE! %

PowerTools

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

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

3600 2280 руб.

14.01.2013    178573    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99583    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

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

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18357    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

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

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

2400 руб.

24.09.2019    23844    16    15    

33

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28299    3    10    

15
Внимание! Тема сдана в архив