1с внешний отчет при компоновке результата

Обновлено: 04.07.2024

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

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

Чтобы вклиниться в процесс формирования отчета вам необходимо программно получить результат отчета. Поэтому постобработка ВСЕГДА связана с программным формированием отчета. Можно конечно на форме сделать специальную кнопку, чтобы пользователь нажимал ее после формирования отчета, но это будет выглядеть нелепо. Поэтому будем считать, что для постработки отчет на 1С СКД формируется программно всегда.

Есть два способа как можно программно выполнить отчет на СКД:

  • Простой. Из формы отчета (нужно чтобы у отчета была форма) вызвать метод СкомпоноватьРезультат. Вы заменяете стандартную кнопку Сформировать собственной командой. В этой команде вызываете указанный выше метод, передав (в случае управляемой формы) режим компоновки – Непосредственно. Затем выполняете постобработку над полученным табличным документом (обычно это реквизит «Результат»). Метод неудобен тем, что нужно добавлять форму (если ее нет), нужно формировать отчет непосредственно, плюс довольно часто для доработки табличного документа нужно переходить на сервер (что не есть хорошо)
  • Чуть сложнее. В модуле отчета в предопределенной процедуре «ПриКомпоновкеРезультата» программно формируете отчет. Стандартный шаблон (код) для этого приведен ниже. После получения табличного документа вы выполняете свой код постобработки. Для этого подхода существует еще один вариант реализации, когда обработка выполняется не после формирования табличного документа, а в процессе. Делается это с помощью поэлементного вывода в табличный документ с помощью методов процессора компоновки данных – НачатьВывод, Следующий, ВывестиЭлемент.

С помощью этого шаблона вы можете программно формировать отчет на СКД:

Теперь рассмотрим конкретные примеры, когда вам может понадобиться постобработка. В этих примерах я не всегда буду приводить полный код решения. Где-то будет достаточно идеи, а где-то ссылки на уже готовый отчет.

Вывод картинок

До недавнего времени только с помощью постобработки в отчетах на СКД можно было вывести картинки в отчете. Начиная с релиза платформы 8.3.14 в СКД 1С:Предприятие 8 появилась возможность вывода картинок без постобработки.

Вот такой кусок кода в ПриКомпоновкеРезультата выводить после программного формирования картинку в колонке прайса:

Отчет прайс лист мы разбирали в нашем курсе по СКД

Нумерация колонок отчета

Здесь мы рассмотрим вариант постобработки из формы отчета

Повторение шапки отчета и вывод колонтитулов

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

Повторение шапки реализуется кодом:

Вывод колонтитулов реализуется через свойство ВерхнийКолонтитул табличного документа:

«Красивые» заголовки для группировок колонок таблицы

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


Вот так чуть лучше:


Настройка для такого варианта (для второй и третей группировок колонок):


И только постобработкой (хотя может быть есть какой-то другой секретный способ) можно сделать так:


Вставить разрыв страницы для группировки

В этой статье на Инфостарте рассматривается способ как с помощью поэлементного вывода отчета можно добавить разрыв страницы для группировки в СКД

Добрый день!
Подскажите, пожалуйста, как выполнить внешний отчет на СКД в привилегированном режиме?

При компоновке результата добавляю
СтандартнаяОбработка = Ложь;
УстановитьПривилегированныйРежим(Истина);

Только добавлять во внешние отчеты и обработки и выполнение в небезопастном режиме (в СведенияОВнешнейОБработке указывается)
Внешние отчёты открываются только в безопасном режиме.
Безопасный режим имеет высший приоритет, нежели установитьПривеллигированныйРежим.
Или писать обёртку, которая будет открывать этот же отчёт через ВнешниеОтчетыМенкджер с безопасный режим = ложь или встраивать в доп отчеты

(1) Не работает.
Кидаю в дополнительные отчеты и обработки.
Вроде бы все классически делаю, ничего лишнего, но не работает. Под админом работает.
А нужно с правами кадровика увидеть суммы по начислениям.

Вот настройка небезопасного режима:

Вот Запрос на СКД:

И вот компоновка результата:

(4) там написано как ты и сказал.
Должно работать, где-то туплю..
ты же не рассказываешь, что конкретно у тебя не работает. если выводятся какие-то колонки, но данных нет - это одно. если колонки вообще не выводятся, то это другое
БезопасныйРежим тут вообще не приделах - на права он никак не действует. это лишь параметр для создания внешней обработки методом Создать
у КомпоновщикМакетаКомпоновкиДанных есть параметр в методе Выполнить - ПроверятьДоступностьПолей. попробуй там передать Ложь. а еще посмотри в Настройки список выбранных полей
(7) даже колонки не выводятся. только установленные параметры
(9) тогда предлагаю посмотреть для начала Настройки.Выбор и много думать

(10) ПроверятьДоступностьПолей выставил - не помогло.

А по поводу Настройки.Выбор не пойму что на них смотреть. Два поля всего вывожу:
Сотрудник и Сумма.

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

а я все-таки предлагаю в отладчике посмотреть что в Настройки.Выбор

(12) Отладчиком я умею смотреть такой отчет только через Файл - открыть.

Под кадровиком там пусто.. Ноль элементов..

Под админом мои две строки.

И что делать-то. Спаси, уважаемый)

(13) уже хорошо. я в (6) уже про это писал.

попробуй вот так

а вот как заставить возвращать метод ПолучитьНастройки настройки без учета прав и ФО - это большой вопрос.

непонятненько почему метод УстановитьПривилегированныйРежим не отрубает в нем проверку прав

есть такая мысль . может быть УстановитьПривилегированныйРежим вызывать в ПриСозданииНаСервере или какой там обрабтчик самым первым срабатывает. чтобы обмануть компоновщик насчет прав.

в самой внешней обработке вроде никак нельзя привилегированный режим
но если опасный режим, то привилегерованный режим в коде КОНФЫ не работает

в самом конце темы - добавить РАЗРЕШЕННЫЕ в запрос. и вроде как должно заработать

1. Разрешенные - не прокатило.
Это если группы физ.лиц какие-то открыты, какие-то закрыты, тогда да сработало бы для открытых.
А тут в регистр расчетов вообще кадровику нос нельзя совать, но нужно

(20) так никто счастья прям сразу и не обещал. про настройки я же написал. настройки нужно получать как-то самому и пользовательские настройки из компоновщика передавать
кстати . есть другой обходной вариант. сделать отчет через набор данных объект. и заполняй в модуле в привил. режиме набор как тебе захочется.
и есть еще (совсем уж извращенческий вариант) - запрос делать по регистру, на который есть права, но опять же в модуле менять текст запроса на нужный регистр (ну и есс-но привил. режим) . такой варинт будет проще с точки зрения передачи параметров и отборов, заданных пользователем

(21) А как передавать-то параметры?

Когда получил МакетКомпоновки в нем уже ничего менять нельзя.

Можно настраивать и параметры и запрос до команды КомпоновщикМакета.Выполнить.
Установил параметры, написал запрос какой хочу, а потом пишу
И поскольку ставлю СхемаКомпоновкиДанных.НастройкиПоУмолчанию, то все параметры обнуляются.
И подсунуть новые параметры позже уже нельзя. Макет скомпонован.

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

Рассмотрим программное формирование результата отчета на примере события ПриКомпоновкеРезультата, которое вызывается по-умолчанию при формировании отчета или при выполнении отчета с помощью метода СкомпоноватьРезультат().

// 1. Установим признак отказа от выполнения стандартной обработки события.
СтандартнаяОбработка = Ложь;

// 2. Получим макет, в котором хранится "шапка" и "подвал" отчета.
МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ДопОформлениеСКД");

// 3. Выведем в табличный документ шапку отчета.
ШапкаОтчета = МакетДопОформление.ПолучитьОбласть("ШапкаОтчета");
ДокументРезультат.Вывести(ШапкаОтчета);

// 4. Получим копию настроек компоновки данных.
НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();

// 5. Установим значение параметра компоновки данных ОтчетнаяДата (Вкладка "Параметры" схемы компоновки данных).
ПараметрОтчетнаяДата = Новый ПараметрКомпоновкиДанных("ОтчетнаяДата");
Если НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрОтчетнаяДата) <> Неопределено Тогда
НастройкиОтчета.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрОтчетнаяДата, ЭтотОбъект.ОтчетнаяДата);
КонецЕсли;

// 6. Загрузим настройки в компоновщик (пользовательские настройки заново заполняются на основе этих настроек).
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);

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

// 8. Создадим объект, выполняющий компоновку данных, и инициализируем его.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

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

// 10. Выведем в табличный документ подвал отчета.
ПодвалОтчета = МакетДопОформление.ПолучитьОбласть("ПодвалОтчета");
ДокументРезультат.Вывести(ПодвалОтчета);

Итоговый код события:

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

СтандартнаяОбработка = Ложь;

МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ДопОформлениеСКД");

// Шапка.
ШапкаОтчета = МакетДопОформление.ПолучитьОбласть("ШапкаОтчета");
ДокументРезультат.Вывести(ШапкаОтчета);

ПараметрОтчетнаяДата = Новый ПараметрКомпоновкиДанных("ОтчетнаяДата");
Если НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрОтчетнаяДата) <> Неопределено Тогда
НастройкиОтчета.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрОтчетнаяДата, ЭтотОбъект.ОтчетнаяДата);
КонецЕсли;

ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);

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

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

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

// Подвал.
ПодвалОтчета = МакетДопОформление.ПолучитьОбласть("ПодвалОтчета");
ДокументРезультат.Вывести(ПодвалОтчета);

КонецПроцедуры

Сначала получаем форму.

Если отчет хранится в базе тогда выполняем на клиенте код:

Далее получаем настройки:

Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.

Загружаем измененные настройки в компоновщик

Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:

Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.

Код выполняется на сервере.

Получение локального макета

Получение макета произвольного отчета

Получение макета во внешней обработке

Получение макета из внешней обработки или отчета

Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:

Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.

Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.

И когда будем формировать

Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .

Объявляем создаем необходимые объекты:

Создаем макет компоновки с помощью компоновщика макета:

Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:

Инициализируем процессор компоновки данных

Создаем процессор вывода:

Для вывода в таблицу значений используется другой процессор вывода:

Запускаем процесс вывода:

Теперь мы можем проводить нужные операции с полученными данными.

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

При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.

Или если с добавлением нового параметра

Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.

Параметры

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

Добавление параметра делается следующим образом

Отбор

У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.

Структура

Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.

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

Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).

Читайте также: