16. Внешние отчеты и обработки

Итак, что можно подключить к стандартным конфигурациям?

С точки зрения платформы можно подключать :

    • внешние обработки (файлы с расширением “epf”) ;

    • внешние отчеты (файлы с раширением «erf»).

С точки зрения прикладной области (конфигурации) можно подключать внешние обработки и отчеты с видом*:

  • Дополнительная обработка ("ДополнительнаяОбработка")

      • Просто дополнительная обработка.

  • Дополнительный отчет ("ДополнительныйОтчет")

      • Просто дополнительный отчет

    • Заполнение объекта ("ЗаполнениеОбъекта") В системе не управляемых форм были обработки по заполнению конкретной табличной части, которые прикреплялись системой к системной кнопке "Заполнить", находящейся в меню этой табличной части. В системе управляемых форм такая возможность системой не предоставляется, но обработка заполнения объекта прикрепляется к системной кнопке "Заполнить", находящейся в меню формы.

  • Печатная форма

      • Дополнительная печатная форма (добаляется кнопка «Дополнительные печатные формы»)

  • Отчет

      • Отчет , прикрепляемый к объектам (к справочникам и документам).

  • Создание связанных объектов

      • Свой ввод на основании (в пункт меню «Ввод на основании» добавляется кнопка «Создание связанных объектов…»)

*на примере редакции «Управление небольшой фирмой ред. 1.2»

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

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

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

В одном из мест в модулях видно, что вместо ключа «ВариантЗапуска» (согласно реквизитам табличной части справочника) нужно использовать ключ «Использование»

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

Пример этой функции:

Функция СведенияОВнешнейОбработке() Экспорт РегистрационныеДанные = Новый Структура; РегистрационныеДанные.Вставить("Наименование", "Пример использование внешних обработок 8.2."); РегистрационныеДанные.Вставить("БезопасныйРежим", Истина); РегистрационныеДанные.Вставить("Версия", "1.0"); //ДополнительнаяОбработка //ДополнительныйОтчет //ЗаполнениеОбъекта //Отчет //ПечатнаяФорма //СозданиеСвязанныхОбъектов РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка"); РегистрационныеДанные.Вставить("Информация", "Обработка сделано по новому стандарту подключения внешних обработок 8.2. Пример обработки ""Hello Word"" "); ///////////// команды /////////////////////////

Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

строкаКоманды = Команды.Добавить();

строкаКоманды.Идентификатор = "1"; строкаКоманды.Представление = "Амортизация ОС по адресам"; строкаКоманды.ПоказыватьОповещение = Истина; строкаКоманды.Использование = "ОткрытиеФормы"; строкаКоманды = Команды.Добавить();

строкаКоманды.Идентификатор = "2"; строкаКоманды.Представление = "Амортизация ОС по адресам"; строкаКоманды.ПоказыватьОповещение = Истина; строкаКоманды.Использование = "ВызовКлиентскогоМетода"; строкаКоманды = Команды.Добавить();

строкаКоманды.Идентификатор = "3"; строкаКоманды.Представление = "Амортизация ОС по адресам"; строкаКоманды.ПоказыватьОповещение = Истина; строкаКоманды.Использование = "ВызовСерверногоМетода"; РегистрационныеДанные.Вставить("Команды", Команды);

////////////// назначение (в каких объектах используется) ///////////////////////// //для печ.форм, заполнения, ввода свазанных объектов //МассивНазначений = Новый Массив; //МассивНазначений.Добавить("Документ.*"); // все документы назначаются //МассивНазначений.Добавить("Документ.АвансовыйОтчет"); //МассивНазначений.Добавить("Документ.ЗаказПокупателя"); //РегистрационныеДанные.Вставить("Назначение", МассивНазначений); Возврат РегистрационныеДанные; КонецФункции

Итак как видно функция заполняет структуру РегистрационныеДанные, которая имеет следующие элементы (параметры):

    • Наименование – краткое наименование обработки

    • Версия - информация о версии обработки

    • Безопасный режим – отвечает за то, должна ли обработка выполняться учитывая права пользователя. Если поставить значение «Ложь», то обработка или отчет будут выполняться без учета ограничений прав (как под полными правами). Это возможность появилась именно в 8.2, где при создании внешних обработок и отчетов вторым параметром указывается режим.

    • Вид – вид обработки или отчета. Возможные значения я перечислял вначале статьи, а возможные значения для установки в коде обозначены в комментарии

    • Команды – таблица значений, в которой перечисляются используемые команды. Колонки таблицы значений:

      • Идентификатор – любая строка (идентификатор команды)

      • Представление – описание команды

      • Модификатор - строка (используется для дополнительных печатных форм)

      • ПоказыватьОповещение – окно оповещение будет появляться перед началом и после окончание выполнения (для команд клиентских и серверных без формы)

      • Использование – режим запуска обработки:

        • ОткрытиеФормы – откроется форма обработки

        • ВызовКлиентскогоМетода – вызов клиентского экспортного метода форма. Данный режим обязывает нахождение ключевых экспортных процедур (таких как Печать()) в основной форме. Клиентский метод обработки:

            • Если "ВидыДополнительныхОтчетовИОбработок", "ДополнительныйОтчет" Тогда - ВыполнитьКоманду(Идентификатор) Экспорт

            • Если "СозданиеСвязанныхОбъектов" Тогда - ВыполнитьКоманду(Идентификатор, ОбъектыНазначения, СозданныеОбъекты) Экспорт

            • Если "ПечатнаяФорма" Тогда - Печать(Идентификатор, ОбъектыНазначения) Экспорт

            • Если "ЗаполнениеОбъекта" Тогда - ВыполнитьКоманду(Идентификатор, ОбъектыНазначения) Экспорт

            • Если "Отчет" Тогда - ВыполнитьКоманду(Идентификатор, ОбъектыНазначения) Экспорт

        • ВызовСерверногоМетода – вызов экспортной метода из модуля обработки

В зависимости от вида обработки или отчета, а также от режима запуска команды «Использование» вызываются методы определенные в модуле формы, модуле объекта. Список передаваемых параметров тоже отличается. Примеры вызовов и использования всех видов обработок прилагаю.

При регистрации следует учитывать размещение (1) и права пользователей (2).

Данная команда появится в соответствующих разделах в подразделе "Дополнительные обработки".

    • При обработке

    • #Область СведенияОПечатнойФормеФункция СведенияОВнешнейОбработке() Экспорт ОбъектыНазначенияФормы = Новый Массив; ПараметрыРегистрации = ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы, "Регистрация оплаты в БП 3.0"); ПараметрыРегистрации.Версия = "3.0"; ПараметрыРегистрации.Информация = "Внешняя обработка регистрации оплаты"; ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, "Регистрация оплаты в БП 3.0", // Представление команды в пользовательском интерфейсе "ЗагрузкаоплатыБУХ", // Уникальный идентификатор команды "ОткрытиеФормы", // Использование команды ,Истина); // Показывать оповещение. ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации;КонецФункцииФункция ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы = Неопределено, НаименованиеОбработки = "", Информация = "", Версия = "1.0.0") Если ТипЗнч(ОбъектыНазначенияФормы) = Тип("Строка") Тогда ОбъектНазначенияФормы = ОбъектыНазначенияФормы; ОбъектыНазначенияФормы = Новый Массив; ОбъектыНазначенияФормы.Добавить(ОбъектНазначенияФормы); КонецЕсли; ПараметрыРегистрации = Новый Структура; Если Не ЗначениеЗаполнено(НаименованиеОбработки) Тогда НаименованиеОбработки = ЭтотОбъект.Метаданные().Представление(); КонецЕсли; ПараметрыРегистрации.Вставить("Наименование", НаименованиеОбработки); ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Версия", Версия); ПараметрыРегистрации.Вставить("Назначение", ОбъектыНазначенияФормы); Если Не ЗначениеЗаполнено(Информация) Тогда Информация = ЭтотОбъект.Метаданные().Комментарий; КонецЕсли; ПараметрыРегистрации.Вставить("Информация", Информация); Возврат ПараметрыРегистрации;КонецФункции//Фукнция Получить таблицу команд:Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды;КонецФункции//Процедура добавление команд добавить команду:Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") // Добавляем команду в таблицу команд по переданному описанию. // Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор;КонецПроцедуры#КонецОбласти

    • При отчете

Функция СведенияОВнешнейОбработке() Экспорт РегистрационныеДанные = Новый Структура; РегистрационныеДанные.Вставить("Наименование", "Отчет по реализациям v1"); РегистрационныеДанные.Вставить("БезопасныйРежим", Истина); РегистрационныеДанные.Вставить("Версия", "1.0.3"); //ДополнительнаяОбработка //ДополнительныйОтчет //ЗаполнениеОбъекта //Отчет //ПечатанаяФорма //СозданиеСвязанныхОбъектов РегистрационныеДанные.Вставить("Вид", "ДополнительныйОтчет"); РегистрационныеДанные.Вставить("Информация", "Отчет по реализациям (управляемое приложение) для конфигураций ""Управление торговлей 8.2"" редакция 11"); ///////////// команды ///////////////////////// тзКоманд = Новый ТаблицаЗначений; тзКоманд.Колонки.Добавить("Идентификатор"); тзКоманд.Колонки.Добавить("Представление"); тзКоманд.Колонки.Добавить("Модификатор"); тзКоманд.Колонки.Добавить("ПоказыватьОповещение"); тзКоманд.Колонки.Добавить("Использование"); строкаКоманды = тзКоманд.Добавить(); строкаКоманды.Идентификатор = "ОтчетПоРеализациямV1"; строкаКоманды.Представление = "Отчет по реализациям v1"; строкаКоманды.ПоказыватьОповещение = Истина; строкаКоманды.Модификатор = ""; строкаКоманды.Использование = "ОткрытиеФормы"; РегистрационныеДанные.Вставить("Команды", тзКоманд); ////////////// назначение (в каких объектах используется) ///////////////////////// //для печ.форм, заполнения, ввода свазанных объектов //МассивНазначений = Новый Массив; //МассивНазначений.Добавить("Документ.*"); // все документы назначаются //МассивНазначений.Добавить("Документ.ПоступлениеТоваровУслуг"); //МассивНазначений.Добавить("Документ.ЗаказПокупателя"); //РегистрационныеДанные.Вставить("Назначение", МассивНазначений); Возврат РегистрационныеДанные; КонецФункции