1с внешний отчет при компоновке результата
Для вывода результата компоновки в таблицу или дерево значений используется объект:
- ОтображатьПроцентВывода – Содержит признак отображения индикатора с процентом вывода отчета.
- Вывести – Выводит весь результат в объект. При этом автоматически исполняется метод НачатьВывод, перебираются все элементы процессора компоновки и выводятся в результат. После чего исполняется метод ЗакончитьВывод, результат которого возвращается данным методом.
- ВывестиЭлемент – Выводит элемент результата компоновки отчета в документ.
- ЗакончитьВывод – Указание объекту о том, что вывод результата завершен и возвращает объект ( табличный документ или дерево значений ), в который был осуществлен вывод.
- НачатьВывод – Указывает объекту о необходимости подготовиться к выводу.
- УстановитьОбъект – Устанавливает таблицу или дерево значений, в которые нужно выводить.
Важно! В параметрах метода выполнть компоновщика макета при выводе результата в колекцию значений нужно указать тип генератора макета компоновки данных ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений
иначе: используется значение по умолчанию ГенераторМакетаКомпоновкиДанных , предназначенное для вывода резуьтата в табличный документ
Вывод результата компоновки в табличный документ
Для вывода результата компоновки в табличный документ используется объект:
Объект имеет аналогичные свойства и методы как у объекта для вывода результата в таблицу значений. Только в этом случае, для установки документа, который нужно выводить называется используется метод УстановитьДокумент
Пример вывода отчета из встроенного языка
Используя схему и настройки, при помощи компоновщика макета компоновки данных создается макет компоновки данных:
Полученный макет компоновки можно предать процессору компоновки данных, для того, чтобы тот выполнил компоновку в соответствии с макетом:
Для того, чтобы вывести результат компоновки данных в табличный документ воспользуемся процессором вывода результата компоновки в табличный документ:
Довольно часто на различных тематических форумах задается вопрос, можно ли использовать в отчете/обработке несколько схем компоновки данных, подменяя одну другой по мере надобности? При этом желательно, чтобы и пользовательские настройки при смене схемы менялись соответственно.
Толкового полного ответа на этот вопрос мне не встречалось: кто-то советует создавать элементы для настроек на форме вручную и программно их устанавливать, кто-то предлагает программно модифицировать и генерить сами схемы. Создается впечатление, что это очень сложная и громоздкая задача, а между тем, если разобраться, выяснится, что все на самом деле не так страшно и сложно. Правильный ответ - да, можно! И прочитав эту статью, вы узнаете как.
Для написания примеров отчета и обработки я воспользовался типовой конфигурацией "Библиотека Стандартных Подсистем (демо)" версии 3.0.3.341 (платформа 8.3.13.1472). Итак, поехали! Начнем с простого.
1. Подмена схемы компоновки данных в отчете.
Создадим новый внешний отчет, назовем его, скажем "_СКДОтчетЗаменаСхемы". Добавим в макеты две простеньких схемы компоновки данных (для примера этого вполне достаточно): Номенклатура и ДоговорыКонтрагентов.
ВЫБРАТЬ
_ДемоНоменклатура.Родитель КАК Родитель,
_ДемоНоменклатура.Ссылка КАК Ссылка,
_ДемоНоменклатура.Артикул КАК Артикул,
_ДемоНоменклатура.Штрихкод КАК Штрихкод,
_ДемоНоменклатура.Цена КАК Цена
ИЗ
Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
Для номенклатуры настроим группировки и добавим отбор по реквизиту "Родитель", который включим в пользовательские настройки:
ВЫБРАТЬ
ДоговорыКонтрагентов.Владелец КАК Контрагент,
ДоговорыКонтрагентов.Ссылка КАК Ссылка,
ДоговорыКонтрагентов.ДатаДоговора КАК ДатаДоговора,
ДоговорыКонтрагентов.НомерДоговора КАК НомерДоговора,
ДоговорыКонтрагентов.Организация КАК Организация
ИЗ
Справочник._ДемоДоговорыКонтрагентов КАК ДоговорыКонтрагентов
Для договоров настроим группировки и добавим отборы по реквизитам "Контрагент" и "Организация", которые также включим в пользовательские настройки:
Теперь одну из схем установим основной (это нужно нам, чтобы сгенерилась начальная форма отчета) и добавим форму отчета, после чего очистим реквизит "Основная схема компоновки данных".
Добавим также реквизит "АдресСхемы" типа Строка неограниченной длины (он нам пригодится позже).
Открываем форму, и переходим к ее настройке. Добавим реквизит формы "ИмяОтчета" типа Строка, вынесем его на форму и включим свойство КнопкаВыпадающегоСписка:
Добавляем для реквизита "ИмяОтчета" событие "ПриИзменении" и переходим в модуль формы. Здесь добавляем событие "ПриСозданииНаСервере" из которого вызываем процедуру ЗаполнитьСписокОтчетов():
А из события "ИмяОтчетаПриИзменении" вызовем процедуру УстановитьМакетОтчета()
Процедура ЗаполнитьСписокОтчетов() принципиальной роли не играет, а вот на процедуре УстановитьМакетОтчета() остановимся подробнее:
Сохраняем, запускаем обработку и смотрим, что получилось. Меняем имя отчета и смотрим, как соответственно меняются пользовательские настройки:
То что нужно! Нажимаем "Сформировать" иииии. получаем ошибку:
Да, мы загрузили настройки в компоновщик, но отчет все равно не знает, какую схему использовать. Если бы мы оставили схему по умолчанию, то использовалась бы она, и в случае использования ее настроек отчет бы сформировался, а вот случае использования настроек другой схемы мы получили бы ошибку "Такое-то поле не найдено".
Не беда! Идем в модуль отчета и создаем обработчик события "ПриКомпоновкеРезультата" где и присваиваем нужную схему(вот для чего нужен был реквизит "АдресСхемы"):
Запускаем отчет и наслаждаемся результатом:
Как видим, схемы меняются, отчеты строятся, отборы работают. И всего-то потребовалось 5 ключевых строчек кода.
Теперь давайте немного усложним задачу.
2. Использование нескольких схем компоновки данных в обработках.
Допустим, у нас есть какая-нибудь навороченная обработка, типа панели функций или монитора руководителя в которую нам, кроме всего, также нужно выводить несколько отчетов. При реализации подмены СКД в отчете нам помог предопределенный компоновщик настроек и наличие события "ПриКомпоновкеРезультата" в модуле объекта. В обработке всего этого нет - и придётся генерить наши отчеты вручную, но как быть с настройками? И здесь на помощь нам спешит тип данных "КомпоновщикНастроекКомпоновкиДанных".
Создадим новую внешнюю обработку "_СКДЗаменаСхемы". Чтобы не повторятся, закинем в нее схемы компоновки из нашего предыдущего отчета.
Создадим форму отчета и добавим следующие реквизиты формы:
"ИмяОтчета" - тип Строка, аналогично одноименному реквизиту в отчете.
"АдресСхемы" - тип Строка, как и в отчете, но нам больше не нужно будет использовать его в модуле объекта, поэтому из реквизитов объекта он перекочевал в реквизиты формы.
"Результат" - тип ТабличныйДокумент, в который мы будем выводить наши отчеты.
"КомпоновщикНастроек" – тип КомпоновщикНастроекКомпоновкиДанных.
Также добавим команду "СформироватьОтчет" и обработчики для нее на клиенте и на сервере.
А теперь, внимание, очень важный момент, делаем "КомпоновщикНастроек" основным реквизитом формы:
Это откроет нам доступ к расширению управляемой формы для компоновщика настроек и позволит использовать метод СоздатьЭлементыФормыПользовательскихНастроек().
Теперь, добавим группу без отображения "ГруппаПользовательскиеНастройкиОтчеты" и переходим в модуль формы.
По аналогии с отчетом, добавим события "ИмяОтчетаПриИзменении" и "ПриСозданииНаСервере", с соответствующими вызовами процедур ЗаполнитьСписокОтчетов() и УстановитьМакетОтчета(). Только теперь в процедуре УстановитьМакетОтчета() добавляется вызов метода СоздатьЭлементыФормыПользовательскихНастроек():
В качестве первого параметра метода СоздатьЭлементыФормыПользовательскихНастроек() мы указываем элемент формы, в котором будут генерироваться пользовательские настройки. Второй параметр указывает, какие настройки будут добавлены: все или только быстрые. И третий параметр показывает количество настроек выводимых в одном ряду.
Теперь осталось добавить обработчики команды "Сформировать" и механизм динамической замены СКД в обработке готов:
Сохраняем, запускаем, наслаждаемся:
Как видим, задача оказалась не намного сложнее, чем подмена СКД в отчете. Ключевым моментом возможности использования автоматической генерации пользовательских настроек является установка реквизита "КомпоновщикНастроек" основным реквизитом формы, что открывает доступ к соответствующему расширению формы.
Ну и чтоб совсем все было красиво, осталось добавить обработчик расшифровки.
Добавим реквизит формы "АдресДанныхРасшифровки" тип Строка.
В конце процедуры СформироватьОтчетНаСервере() добавим строку:
Добавим обработчик "ОбработкаРасшифровки" для элемента формы Результат:
Теперь при клике на ячейку нашего отчета будет открываться не окошко с непонятной цифрой, а соответствующий объект.
Как видим, все оказалось достаточно просто.
Свойства и методы объекта отчета можно посмотреть в синнктакс – помощник конфигуратора:
Объект отчета используется для доступа к реквизитам и табличным частям, формам и макетам отчета. Он создается с помощью следующей конструкции:
ОтчетОбъект содержит реквизиты отчета и табличные части оичета . Доступ к значению осуществляется по имени, как оно задано в Конфигураторе, например
Отметим, реквизиты могут использоваться для чтения и записи. Однако, табличная часть доступно только на чтение.
Для редактирования настроек отчета используется свойство КомпоновщикНастроек.
Свойство СхемаКомпоновкиДанных дает доступ к схеме компоновки, на основании которой будет выполняться отчет
Для выполнения компоновки данных используется метод СкомпоноватьРезультат
Параметр , в который будет выводиться результат является обязательным параметром . Однако, переменная , в которую будет записана информация расшифровки необязательна. Расшифровка заполняться не будет если не указана переменная
Одна из особенностей метода СкомпоноватьРезультат заключается в том, что при выполнении метода генерируется событие ПриКомпоновкеРезультата. Обработчик данного события доступен в модуле объекта отчета
Параметры обработчика ПриКомпоновкиРезультата:
- – Документ, в который выводится результат и переданный из метода СкомпоноввтьРезультат
- – Переменная, в которую необходимо поместить данные расшифровки. Если данный параметр имеет значение Null, то данные расшифровки создавать не нужно.
- СтандартнаяОбработка> – В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет. Значение по умолчанию: Истина.
Примеры использования обработчика ПриКомпоновкеРезультата
Пример№1 Передача Внешних Наборов Данных в СКД .
Для перерадчи внешних наборов данных в СКД используется метод Инициализировать процессора копмоновки :
Пример №2 Передача параметров данных
Для передачи параметры данных используется метод УстановитьЗаначениеПараметра . В следующем примере , нужно передать в СКД документ – основание выбранного документа- регистратора в установленных параметрах. Следовательно, сначала находим регистратор, а затем передаем основание:
Добрый день!
Подскажите, пожалуйста, как выполнить внешний отчет на СКД в привилегированном режиме?
При компоновке результата добавляю
СтандартнаяОбработка = Ложь;
УстановитьПривилегированныйРежим(Истина);
Только добавлять во внешние отчеты и обработки и выполнение в небезопастном режиме (в СведенияОВнешнейОБработке указывается)
Внешние отчёты открываются только в безопасном режиме.
Безопасный режим имеет высший приоритет, нежели установитьПривеллигированныйРежим.
Или писать обёртку, которая будет открывать этот же отчёт через ВнешниеОтчетыМенкджер с безопасный режим = ложь или встраивать в доп отчеты
(1) Не работает.
Кидаю в дополнительные отчеты и обработки.
Вроде бы все классически делаю, ничего лишнего, но не работает. Под админом работает.
А нужно с правами кадровика увидеть суммы по начислениям.
Вот настройка небезопасного режима:
Вот Запрос на СКД:
И вот компоновка результата:
ты же не рассказываешь, что конкретно у тебя не работает. если выводятся какие-то колонки, но данных нет - это одно. если колонки вообще не выводятся, то это другое
БезопасныйРежим тут вообще не приделах - на права он никак не действует. это лишь параметр для создания внешней обработки методом Создать
у КомпоновщикМакетаКомпоновкиДанных есть параметр в методе Выполнить - ПроверятьДоступностьПолей. попробуй там передать Ложь. а еще посмотри в Настройки список выбранных полей
(10) ПроверятьДоступностьПолей выставил - не помогло.
А по поводу Настройки.Выбор не пойму что на них смотреть. Два поля всего вывожу:
Сотрудник и Сумма.
Если вместо Регистра расчета Начисления, подставить например Регистр накопления Фактические отпуска, то все работает при тех же условиях, без изменений в коде.
(12) Отладчиком я умею смотреть такой отчет только через Файл - открыть.
Под кадровиком там пусто.. Ноль элементов..
Под админом мои две строки.
И что делать-то. Спаси, уважаемый)
(13) уже хорошо. я в (6) уже про это писал.
попробуй вот так
а вот как заставить возвращать метод ПолучитьНастройки настройки без учета прав и ФО - это большой вопрос.
непонятненько почему метод УстановитьПривилегированныйРежим не отрубает в нем проверку прав
есть такая мысль . может быть УстановитьПривилегированныйРежим вызывать в ПриСозданииНаСервере или какой там обрабтчик самым первым срабатывает. чтобы обмануть компоновщик насчет прав.
в самом конце темы - добавить РАЗРЕШЕННЫЕ в запрос. и вроде как должно заработать
1. Разрешенные - не прокатило.
Это если группы физ.лиц какие-то открыты, какие-то закрыты, тогда да сработало бы для открытых.
А тут в регистр расчетов вообще кадровику нос нельзя совать, но нужно
(20) так никто счастья прям сразу и не обещал. про настройки я же написал. настройки нужно получать как-то самому и пользовательские настройки из компоновщика передавать
кстати . есть другой обходной вариант. сделать отчет через набор данных объект. и заполняй в модуле в привил. режиме набор как тебе захочется.
и есть еще (совсем уж извращенческий вариант) - запрос делать по регистру, на который есть права, но опять же в модуле менять текст запроса на нужный регистр (ну и есс-но привил. режим) . такой варинт будет проще с точки зрения передачи параметров и отборов, заданных пользователем
(21) А как передавать-то параметры?
Когда получил МакетКомпоновки в нем уже ничего менять нельзя.
Можно настраивать и параметры и запрос до команды КомпоновщикМакета.Выполнить.
Установил параметры, написал запрос какой хочу, а потом пишу
И поскольку ставлю СхемаКомпоновкиДанных.НастройкиПоУмолчанию, то все параметры обнуляются.
И подсунуть новые параметры позже уже нельзя. Макет скомпонован.
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию,ДанныеРасшифровки. Ложь)
"А как передавать-то параметры?" слишком много вопросов :) - а рабочий день уже подошел к концу. направление движения указано. если будет время, может сделаю тестовый пример
(26) Что мешает запустить формирование табличного документа компоновщиком в модуле с привилегированным режимом? а потом вывести его в твоем отчете?
Рассмотрим программное формирование результата отчета на примере события ПриКомпоновкеРезультата, которое вызывается по-умолчанию при формировании отчета или при выполнении отчета с помощью метода СкомпоноватьРезультат().
// 1. Установим признак отказа от выполнения стандартной обработки события.
СтандартнаяОбработка = Ложь;
// 2. Получим макет, в котором хранится "шапка" и "подвал" отчета.
МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ДопОформлениеСКД");
// 3. Выведем в табличный документ шапку отчета.
ШапкаОтчета = МакетДопОформление.ПолучитьОбласть("ШапкаОтчета");
ДокументРезультат.Вывести(ШапкаОтчета);
// 4. Получим копию настроек компоновки данных.
НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// 5. Установим значение параметра компоновки данных ОтчетнаяДата (Вкладка "Параметры" схемы компоновки данных).
ПараметрОтчетнаяДата = Новый ПараметрКомпоновкиДанных("ОтчетнаяДата");
Если НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрОтчетнаяДата) <> Неопределено Тогда
НастройкиОтчета.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрОтчетнаяДата, ЭтотОбъект.ОтчетнаяДата);
КонецЕсли;
// 6. Загрузим настройки в компоновщик (пользовательские настройки заново заполняются на основе этих настроек).
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
// 7. Создадим объект для компоновки макета и выполним компоновку макета.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ЭтотОбъект.СхемаКомпоновкиДанных,
ЭтотОбъект.КомпоновщикНастроек.Настройки,
ДанныеРасшифровки);
// 8. Создадим объект, выполняющий компоновку данных, и инициализируем его.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
// 9. Создадим объект для вывода результата компоновки в табличный документ, установим табличный документ, в который нужно вывести результат и выведем весь результат в установленный табличный документ.
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// 10. Выведем в табличный документ подвал отчета.
ПодвалОтчета = МакетДопОформление.ПолучитьОбласть("ПодвалОтчета");
ДокументРезультат.Вывести(ПодвалОтчета);
Итоговый код события:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МакетДопОформление = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ДопОформлениеСКД");
// Шапка.
ШапкаОтчета = МакетДопОформление.ПолучитьОбласть("ШапкаОтчета");
ДокументРезультат.Вывести(ШапкаОтчета);
ПараметрОтчетнаяДата = Новый ПараметрКомпоновкиДанных("ОтчетнаяДата");
Если НастройкиОтчета.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрОтчетнаяДата) <> Неопределено Тогда
НастройкиОтчета.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрОтчетнаяДата, ЭтотОбъект.ОтчетнаяДата);
КонецЕсли;
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
// СКД.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ЭтотОбъект.СхемаКомпоновкиДанных,
ЭтотОбъект.КомпоновщикНастроек.Настройки,
ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Подвал.
ПодвалОтчета = МакетДопОформление.ПолучитьОбласть("ПодвалОтчета");
ДокументРезультат.Вывести(ПодвалОтчета);
КонецПроцедуры
Читайте также: