1с постобработка отчета 1с скд
В этой статье я расскажу, что такое постобработка в 1С СКД, какие методы постобработки существуют. Вы узнаете, как программно сформировать отчет в СКД, а также я приведу несколько практических примеров постобработки в СКД.
Итак, что же понимается под постобработкой в СКД. Обычно (если не всегда) такое словосочетание применяется для отчетов, построенных на СКД. В результате выполнения отчета пользователем мы имеем какой-то табличный документ. Не всегда с помощью функционала СКД удается получить необходимую форму табличного документа. Поэтому после (пост) выполнения отчета, с помощью методов объекта ТабличныйДокумент выполняется некоторая доработка результата до приемлемого вида (формы).
Чтобы вклиниться в процесс формирования отчета вам необходимо программно получить результат отчета. Поэтому постобработка ВСЕГДА связана с программным формированием отчета. Можно конечно на форме сделать специальную кнопку, чтобы пользователь нажимал ее после формирования отчета, но это будет выглядеть нелепо. Поэтому будем считать, что для постработки отчет на 1С СКД формируется программно всегда.
Есть два способа как можно программно выполнить отчет на СКД:
- Простой. Из формы отчета (нужно чтобы у отчета была форма) вызвать метод СкомпоноватьРезультат. Вы заменяете стандартную кнопку Сформировать собственной командой. В этой команде вызываете указанный выше метод, передав (в случае управляемой формы) режим компоновки – Непосредственно. Затем выполняете постобработку над полученным табличным документом (обычно это реквизит «Результат»). Метод неудобен тем, что нужно добавлять форму (если ее нет), нужно формировать отчет непосредственно, плюс довольно часто для доработки табличного документа нужно переходить на сервер (что не есть хорошо)
- Чуть сложнее. В модуле отчета в предопределенной процедуре «ПриКомпоновкеРезультата» программно формируете отчет. Стандартный шаблон (код) для этого приведен ниже. После получения табличного документа вы выполняете свой код постобработки. Для этого подхода существует еще один вариант реализации, когда обработка выполняется не после формирования табличного документа, а в процессе. Делается это с помощью поэлементного вывода в табличный документ с помощью методов процессора компоновки данных – НачатьВывод, Следующий, ВывестиЭлемент.
С помощью этого шаблона вы можете программно формировать отчет на СКД:
Теперь рассмотрим конкретные примеры, когда вам может понадобиться постобработка. В этих примерах я не всегда буду приводить полный код решения. Где-то будет достаточно идеи, а где-то ссылки на уже готовый отчет.
Вывод картинок
До недавнего времени только с помощью постобработки в отчетах на СКД можно было вывести картинки в отчете. Начиная с релиза платформы 8.3.14 в СКД 1С:Предприятие 8 появилась возможность вывода картинок без постобработки.
Вот такой кусок кода в ПриКомпоновкеРезультата выводить после программного формирования картинку в колонке прайса:
Отчет прайс лист мы разбирали в нашем курсе по СКД
Нумерация колонок отчета
Здесь мы рассмотрим вариант постобработки из формы отчета
Повторение шапки отчета и вывод колонтитулов
В этой статье на Инфостарте разбирается, как с помощью поэлементного вывода можно повторить шапку отчета на каждой странице и как вывести колонтитулы.
Повторение шапки реализуется кодом:
Вывод колонтитулов реализуется через свойство ВерхнийКолонтитул табличного документа:
«Красивые» заголовки для группировок колонок таблицы
Вот так заголовки выводятся совсем некрасиво:
Вот так чуть лучше:
Настройка для такого варианта (для второй и третей группировок колонок):
И только постобработкой (хотя может быть есть какой-то другой секретный способ) можно сделать так:
Вставить разрыв страницы для группировки
В этой статье на Инфостарте рассматривается способ как с помощью поэлементного вывода отчета можно добавить разрыв страницы для группировки в СКД
Сначала получаем форму.
Если отчет хранится в базе тогда выполняем на клиенте код:
Далее получаем настройки:
Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.
Загружаем измененные настройки в компоновщик
Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:
Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.
Код выполняется на сервере.
Получение локального макета
Получение макета произвольного отчета
Получение макета во внешней обработке
Получение макета из внешней обработки или отчета
Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:
Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.
Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.
И когда будем формировать
Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .
Объявляем создаем необходимые объекты:
Создаем макет компоновки с помощью компоновщика макета:
Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:
Инициализируем процессор компоновки данных
Создаем процессор вывода:
Для вывода в таблицу значений используется другой процессор вывода:
Запускаем процесс вывода:
Теперь мы можем проводить нужные операции с полученными данными.
Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.
При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.
Или если с добавлением нового параметра
Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.
Параметры
Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:
Добавление параметра делается следующим образом
Отбор
У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.
Структура
Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.
Программист может упростить работу пользователя по вводу параметров и отборов если есть некоторая закономерность в них, но они всё таки не фиксированы. К примеру, сравнительный отчет по продажам за этот месяц этого года и аналогичные месяца трех предыдущих годов.
Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).
Прошлая публикация по СКД показала, что тема актуальная, поэтому решил написать еще одну статью с универсальными процедурами для построения отчетов из моей копилки.
1. Работа с расшифровками. Получение значений группировок для текущей ячейки
На данную тему уже есть публикации. Но универсальных процедур на эту тему я не нашел.
Имеем отчет следующего вида
Когда пользователь кликает по ячейке требуется:
- Определить, например, Подразделение, соответствующее текущей ячейке
- Определить значения всех группировок, соответствующих текущей ячейке
Предлагаемые процедуры решают данную задачу за несколько строк, например, так:
При выполнении данного кода получим примерно следующий вывод
Отмечу несколько моментов:
- Данные процедуры получают только значения группировок и не получают значения ресурсов. Например, поле Количество в описанном примере содержит значение NULL
- Поле Уровень в таблице расшифровки рассчитывается от нижней группировки к верхней. Для горизонтальных и вертикальных группировок уровень считается раздельно
2. Получение области шапки в отчете СКД
Существует ряд случаев, когда необходимо получить область шапки в сформированном табличном документе СКД. . Примером могут служить случаи, когда для некоторых ячеек в шапке нельзя задать макет или условное оформление, скажем для заголовка ресурсов или заголовка группы полей.
Рассмотрим типовую задачу. Есть отчет следующего вида.
Требуется все заголовки в шапке выровнять по центру. Данную задачу можно выполнить с помощью макетов СКД. Но в этом случае возникают проблемы, когда пользователь изменяет состав и порядок полей в отчете. Намного проще решить эту задачу при постобработке результата:
3. Печать нескольких табличных документов с различными параметрами.
Предлагаемая процедура помещает массив табличных документов в один файл PDF с использованием объекта ПакетОтображаемыхДокументов. Такой подход удобно использовать, когда, например, нужно несколько отчетов собрать в один файл, причем для каждого необходимо использовать отдельный масштаб
Заключение
Все процедуры тестировались на версии платформы 8.3.
Прикладываю внешний отчет с примерами для обычных и управляемых форм к описанным в данной публикации приемам.
Уточнение
Хочу особо отметить следующее : в этой и предыдущей статье я привел несколько процедур по постобработке табличного документа СКД. НО я также, как и остальные негативно высказавшиеся комментаторы стараюсь и очень рекомендую всем разработчикам ПО МАКСИМУМУ задействовать возможности СКД, и не использовать доработку кодом, если можно обойтись без этого.
Постобработка табличного документа СКД - это зло. ОДНАКО, существуют случаи, когда без нее не обойтись. И тогда постобработка уже становится не "злом", а "крайней мерой". В нашей среде принято ссылаться на популярных авторов, которые описывают возможности СКД. Но при этом упускается из вида, что эти возможности покрывают не все возможные случаи, с которыми приходится сталкиваться на практике. Когда напишешь 30-40 отчетов на СКД для капризных клиентов, понимаешь что у этого инструмента есть ограничения. Так вот эти ограничения НИГДЕ не описаны. Сталкиваясь с ними каждый разработчик начинает придумывать свой велосипед. Я постарался восполнить данный пробел и описал решения таких задач, которые нельзя (или очень трудоемко) решать настройками. Существенным недостатком моих двух публикаций является то, что я предлагаю решение проблемы без ее подробного описания. Из-за этого возникает ряд непониманий со стороны других разработчиков, которые с данными проблемами не сталкивались, или им удавалось их обойти (но не решить)
Поток вопросов по СКД в Мастер-группе не прекращается. Сегодняшняя подборка тому подтверждение. Вопросы связаны и с платформенными изменениями самой системы компоновки данных, и с развитием БСП, и с расширением практик применения СКД в современных типовых решениях.
Вопрос №1: “Почему могут быть не доступны варианты отчетов на СКД в пользовательском режиме?”
Несколько раз сталкивался с тем, что варианты отчета, настроенные в конфигураторе, в пользовательском режиме не видны или виден только Основной вариант. Из этого я даже сделал вывод, что больше одного предопределенного варианта делать не имеет смысла. Судя по всему, вывод мой неправильный, в тестовой базе не воспроизводится. Почему могут быть не видны варианты и как это “лечить”?Ответ
Если такая база базируется на БСП, то тут еще могут влиять механизмы БСП. Например, пользователю по ограничениям доступа недоступен конкретный вариант отчета, поэтому он его и не видит. Также для подсистемы БСП “Варианты отчетов” в общем модуле ВариантыОтчетовПереопределяемый в процедуре НастроитьВариантыОтчетов нужно явно описывать используемые варианты отчетов и запустить приложение с ключом ЗапуститьОбновлениеИнформационнойБазы.
Пример подключения отчетов к подсистеме “Варианты отчетов” есть на странице нашего сайта – Подключение отчетов к подсистеме “Варианты отчетов”. Возможно, в вашем случае какое-то из описанных действий не было выполнено.
Вопрос №2: “Можно ли делать отбор на уровне детальных записей по вычисляемым полям в СКД?”
(нажмите, чтобы увеличить картинку)
Ответ
Ошибка не будет возникать, если для отбора на уровне детальных записей изменить настройку Применение – указать значение “После группировки или для иерархии”:
(нажмите, чтобы увеличить картинку)
Появление ошибки связано с использованием в выражении для вычисляемого поля функции ВычислитьВыражение с указанными параметрами Начало и Конец, которая должна быть вычислена на основании только некоторых записей группировки.
Вопрос №3: “В каком случае можно установить значения параметров в процедуре ПередКомпоновкойМакета модуля менеджера отчета?”
В видео-уроке есть пример, где параметры отчета определяются и устанавливаются в модуле менеджера этого отчета в процедуре ПередКомпоновкойМакета(). Мне непонятно вот что:Ответ
- В этом видеоуроке демонстрируется типовая конфигурация Бухгалтерия предприятия. Она базируется на Библиотеке стандартных подсистем (БСП), которая содержит отдельную подсистему для работы с отчетами. В этой подсистеме реализовано большое количество универсальных методов. Рассмотрим на примере отчета из видеоурока. В модуле отчета есть код, который вызывает метод общего модуля:
А в общем модуле БухгалтерскиеОтчетыВызовСервера есть функция ПодготовитьОтчет, в которой содержится следующий код:
Следовательно, в модуле менеджера отчета можно доработать компоновщик, например, установить значения параметров. Инициируется этот вызов в процедуре ПриКомпоновкеРезультата.
Подобные фрагменты кода есть и в других конфигурациях, основанных на БСП, например, в УТ 11. Получается, что для доработок отчетов на БСП есть универсальные точки входа, где можно размещать свой код. В отчетах для конфигураций не на БСП этот подход работать не будет.
- Это зависит от того, для какой конфигурации разрабатывается отчет. Если конфигурация создается с нуля, то такой метод из модуля менеджера просто некому будет вызвать. Если конфигурация базируется на БСП, то можно “подсмотреть” в типовых отчетах, как они разработаны. Также в документации по БСП, размещенной на сайте ИТС, можно изучить подробное устройство подсистемы Варианты отчетов.
- Да, во внешних отчетах и обработках в принципе не существует модуля менеджера.
Вопрос №4: “Как вывести изображение в колонтитулах отчета на СКД?”
Подскажите, есть ли возможность в колонтитулах отчета выводить изображение (например, логотип фирмы)?Ответ
Да, начиная с платформы 8.3.15 появилась возможность добавить картинку в колонтитул.
В конфигураторе это можно сделать в меню Таблица – Настройки печати – Колонтитулы:
(нажмите, чтобы увеличить картинку)
Вопрос №5: “Каким образом можно программно получать настройки отчета на СКД?”
Насколько я понимаю, чтобы учесть значения, заданные пользователем на форме, нужно получать настройки так:Но во многих видео настройки получаются такой строкой:
И далее по этим настройкам формируется отчет. Почему так? Зачем нам могут быть нужны настройки, которые не содержат значений, заданных пользователем? В каких случаях и каким способом нужно получать настройки?
Ответ
Чтобы решить, какие именно настройки следует использовать, нужно задавать себе вопрос “Отчет с какими настройками мне нужно сформировать для решения поставленной задачи?”
- Чаще всего на практике нужно учитывать пользовательские настройки, значит, используем метод:
В таком случае из компоновщика получаем настройки, которые уже включают в себя и пользовательские, и фиксированные настройки. С этими “результирующими” настройками компонуем отчет. В методе ПриКомпоновкеРезультата в модуле отчетов чаще всего встречается именно этот вариант
- Если нужно взять настройки не из компоновщика, а из схемы компоновки, то воспользуемся настройками по умолчанию:
Такой вариант встречается при компоновке из программного кода, например, когда на форме обработки компоновщик вообще не отображается. В таком случае удобно обратиться к настройкам, описанным непосредственно в схеме компоновки
- СКД часто используется в обработках – для заполнения ТЧ, списка справочников или документов для обработки. Настройки компоновщика размещаются на форме, пользователь может их редактировать – настраивать отборы по своему усмотрению. А пользовательские настройки в таком случае не используются, поскольку мы не отчет разрабатываем, а всего лишь обработку. Значит, можно взять настройки из компоновщика:
Профессиональная разработка отчетов в 1С 8.3 на СКД .
Комментарии / обсуждение (2):
Добрый день!
Подскажите пожалуйста, проблема с округлением Вычисляемого поля в СКД:
Добрый день!
Без данных и конкретного отчета, конечно, трудно определить причину.
Пришла в голову идея, что разные результаты получаются, потому что
Пример.
Предполагаю, что разные числа перемножаются, поэтому и результаты разные.
Читайте также: