Перейти к основному содержимому

Дополнительные отчеты и обработки в 1С: Предприятие

Оглавление

  1. Введение
  2. Виды дополнительных отчетов и обработок
  3. Функция СведенияОВнешнейОбработке()
  4. Типы команд в дополнительных обработках
  5. Примеры реализации разных видов дополнительных обработок
  6. Дополнительные возможности
  7. Заключение

Введение

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

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

Виды дополнительных отчетов и обработок

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

1. Глобальные

  • ДополнительнаяОбработка - общая обработка, доступная из командного интерфейса (меню) программы
  • ДополнительныйОтчет - общий отчет, доступный из командного интерфейса (меню) программы

2. Назначаемые (контекстные)

  • ПечатнаяФорма - добавляет новые печатные формы к объектам конфигурации
  • ЗаполнениеОбъекта - позволяет автоматически заполнять данные в объектах
  • СозданиеСвязанныхОбъектов - создает связанные объекты на основании существующих
  • Отчет - контекстный отчет по данным конкретного объекта
  • ШаблонСообщения - шаблон для создания сообщений

Функция СведенияОВнешнейОбработке()

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

Общий вид функции

// Возвращает сведения о внешней обработке.
//
// Возвращаемое значение:
// Структура - сведения о внешней обработке.
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");

// Заполнение параметров
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Информация = НСтр("ru = 'Описание обработки'");
ПараметрыРегистрации.Версия = "1.0.0.1";
ПараметрыРегистрации.БезопасныйРежим = Истина;

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

Возврат ПараметрыРегистрации;
КонецФункции

Параметры функции

Разберем подробно структуру, которую должна возвращать функция СведенияОВнешнейОбработке():

Основные параметры

ПараметрТипОписание
ВидСтрокаВид обработки или отчета. Один из следующих: "ДополнительнаяОбработка", "ДополнительныйОтчет", "ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов", "ШаблонСообщения"
НазначениеМассивМассив строк имен объектов метаданных в формате "ИмяКлассаОбъектаМетаданного.ИмяОбъектаМетаданных", которым назначается обработка
НаименованиеСтрокаНаименование обработки для администратора
ВерсияСтрокаВерсия обработки в формате "МажорнаяВерсия.МинорнаяВерсия" (например, "1.0")
БезопасныйРежимБулевоТребуется ли устанавливать безопасный режим при исполнении. Если Истина - обработка запускается в безопасном режиме
ИнформацияСтрокаКраткая информация по обработке, её описание
ВерсияБСПСтрокаМинимальная версия БСП, с которой совместима обработка в формате "РР.ПП.ВВ.СС"
РазрешенияМассивМассив разрешений при использовании безопасного режима
ОпределитьНастройкиФормыБулевоИспользуется для дополнительных отчетов, подключенных к подсистеме Варианты отчетов
НазначениеВариантаОтчетаПеречислениеСсылкаНазначение варианта дополнительного отчета

Команды

Таблица значений с колонками:

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

Использование программного интерфейса

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

ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");

Где "2.3.1.73" - версия БСП, с которой совместима обработка.

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

// Глобальные
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка()
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет()

// Назначаемые
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов()
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет()
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиШаблонСообщения()

Типы команд в дополнительных обработках

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

1. ТипКомандыВызовСерверногоМетода

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

  • Для глобальных обработок:

    // Обработчик серверных команд.
    //
    // Параметры:
    // ИдентификаторКоманды - Строка - имя команды.
    // ПараметрыВыполнения - Структура - контекст выполнения команды.
    // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка обработки.
    // * РезультатВыполнения - Структура - результат выполнения команды.
    //
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
    // Реализация логики команды.
    КонецПроцедуры
  • Для печатных форм:

    // Обработчик печати.
    //
    // Параметры:
    // МассивОбъектов - Массив - ссылки на объекты, которые нужно распечатать.
    // КоллекцияПечатныхФорм - ТаблицаЗначений - информация о табличных документах.
    // ОбъектыПечати - СписокЗначений - соответствие между объектами и областями печати.
    // ПараметрыВывода - Структура - дополнительные параметры.
    // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка обработки.
    //
    Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Реализация логики печати.
    КонецПроцедуры
  • Для обработок создания связанных объектов:

    // Обработчик серверных команд.
    //
    // Параметры:
    // ИдентификаторКоманды - Строка - имя команды.
    // ОбъектыНазначения - Массив - ссылки объектов, для которых вызвана команда.
    // СозданныеОбъекты - Массив - ссылки новых объектов, созданных в результате выполнения.
    // ПараметрыВыполнения - Структура - контекст выполнения команды.
    // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка обработки.
    // * РезультатВыполнения - Структура - результат выполнения команды.
    //
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) Экспорт
    // Реализация логики команды.
    КонецПроцедуры
  • Для обработок заполнения объекта:

    // Обработчик серверных команд.
    //
    // Параметры:
    // ИдентификаторКоманды - Строка - имя команды.
    // ОбъектыНазначения - Массив - ссылки объектов, для которых вызвана команда.
    // ПараметрыВыполнения - Структура - контекст выполнения команды.
    // * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка обработки.
    // * РезультатВыполнения - Структура - результат выполнения команды.
    //
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
    // Реализация логики команды.
    КонецПроцедуры

2. ТипКомандыВызовКлиентскогоМетода

Вызывает клиентский метод основной формы внешнего объекта. Требуется реализовать:

  • Для глобальных обработок:

    &НаКлиенте
    Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
    // Реализация логики команды.
    КонецПроцедуры
  • Для печатных форм:

    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    // Реализация логики команды.
    КонецПроцедуры
  • Для обработок создания связанных объектов:

    &НаКлиенте
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт
    // Реализация логики команды.
    КонецПроцедуры
  • Для обработок заполнения и контекстных отчетов:

    &НаКлиенте
    Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    // Реализация логики команды.
    КонецПроцедуры

3. ТипКомандыОткрытиеФормы

Открывает основную форму внешнего объекта. При открытии формы передаются параметры:

  • Основные параметры:

    • ИдентификаторКоманды - идентификатор команды
    • ДополнительнаяОбработкаСсылка - ссылка на элемент справочника
    • ИмяФормы - имя формы-владельца, из которой вызвана команда
  • Дополнительные параметры (для назначаемых обработок):

    • ОбъектыНазначения - массив ссылок на объекты, для которых вызвана команда

4. ТипКомандыЗаполнениеФормы

Специальный тип команды для заполнения данных формы без записи объекта. Доступен только для обработок вида "ЗаполнениеОбъекта". Требуется реализовать:

// Обработчик серверных команд.
//
// Параметры:
// ИдентификаторКоманды - Строка - имя команды.
// ОбъектыНазначения - Массив - ссылки объектов (Неопределено для ЗаполнениеФормы).
// ПараметрыВыполнения - Структура - контекст выполнения команды.
// * ЭтаФорма - ФормаКлиентскогоПриложения - заполняемая форма.
// * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки.
//
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
// Реализация логики команды.
КонецПроцедуры

5. ТипКомандыЗагрузкаДанныхИзФайла

Доступен только для глобальных обработок (Вид = "ДополнительнаяОбработка") при наличии подсистемы "ЗагрузкаДанныхИзФайла". Требуется реализовать:

// Определяет параметры загрузки данных из файла.
//
// Параметры:
// ИдентификаторКоманды - Строка - имя команды.
// ПараметрыЗагрузки - Структура - настройки загрузки данных.
//
Процедура ОпределитьПараметрыЗагрузкиДанныхИзФайла(ИдентификаторКоманды, ПараметрыЗагрузки) Экспорт
// Настройка параметров загрузки.
КонецПроцедуры

// Сопоставляет загружаемые данные с данными в информационной базе.
//
// Параметры:
// ИдентификаторКоманды - Строка - имя команды.
// ЗагружаемыеДанные - ТаблицаЗначений - описание загружаемых данных.
//
Процедура СопоставитьЗагружаемыеДанныеИзФайла(ИдентификаторКоманды, ЗагружаемыеДанные) Экспорт
// Реализация логики поиска данных.
КонецПроцедуры

// Загружает сопоставленные данные в базу.
//
// Параметры:
// ИдентификаторКоманды - Строка - имя команды.
// ЗагружаемыеДанные - ТаблицаЗначений - описание загружаемых данных.
// ПараметрыЗагрузки - Структура - пользовательские настройки загрузки.
// Отказ - Булево - признак отмены загрузки.
//
Процедура ЗагрузитьИзФайла(ИдентификаторКоманды, ЗагружаемыеДанные, ПараметрыЗагрузки, Отказ) Экспорт
// Реализация логики загрузки данных.
КонецПроцедуры

Примеры реализации разных видов дополнительных обработок

1. Печатная форма

// Возвращает сведения о внешней обработке.
//
// Возвращаемое значение:
// см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Информация = НСтр("ru = 'Печать ценников для Очков'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "25.02.24.1";

// Назначение печатной формы - для каких объектов будет доступна
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваров");
ПараметрыРегистрации.Назначение.Добавить("Документ.УстановкаЦенНоменклатуры");
ПараметрыРегистрации.Назначение.Добавить("Документ.ПеремещениеТоваров");
ПараметрыРегистрации.Назначение.Добавить("Справочник.Номенклатура");

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

Возврат ПараметрыРегистрации;
КонецФункции

// Обработчик печати
//
// Параметры:
// МассивОбъектов - Массив - ссылки на объекты для печати
// КоллекцияПечатныхФорм - ТаблицаЗначений - коллекция печатных форм
// ОбъектыПечати - СписокЗначений - соответствие объектов и областей печати
// ПараметрыВывода - Структура - дополнительные параметры
//
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Получаем ссылку на печатную форму в коллекции
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПечатьОчки");

Если ПечатнаяФорма <> Неопределено Тогда
// Создаем табличный документ для вывода печатной формы
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.КлючПараметровПечати = "ПараметрыПечатиЦенников";

// Перебираем объекты для печати
Для Каждого Ссылка Из МассивОбъектов Цикл
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;

НачалоОбласти = ТабличныйДокумент.ВысотаТаблицы + 1;

// Формируем данные для печати
СформироватьПечатнуюФормуЦенников(ТабличныйДокумент, Ссылка);

// Регистрируем область печати для объекта
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НачалоОбласти, ОбъектыПечати, Ссылка);
КонецЦикла;

// Записываем табличный документ в печатную форму
ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
КонецЕсли;
КонецПроцедуры

// Формирует печатную форму ценников
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент - документ для вывода данных
// Ссылка - СправочникСсылка, ДокументСсылка - объект для печати
//
Процедура СформироватьПечатнуюФормуЦенников(ТабличныйДокумент, Ссылка)
// Логика формирования печатной формы
// ...
КонецПроцедуры

2. Обработка заполнения объекта

// Возвращает сведения о внешней обработке.
//
// Возвращаемое значение:
// см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Информация = НСтр("ru = 'Автоматическое заполнение контрагента'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.0.0.1";

// Назначение обработки
ПараметрыРегистрации.Назначение.Добавить("Справочник.Контрагенты");

// Команда для заполнения полей в объекте
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Заполнить реквизиты контрагента'");
НоваяКоманда.Идентификатор = "ЗаполнитьРеквизитыКонтрагента";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;

// Команда для заполнения данных в форме без записи объекта
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Заполнить ИНН контрагента'");
НоваяКоманда.Идентификатор = "ЗаполнитьИНН";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
НоваяКоманда.ПоказыватьОповещение = Истина;

Возврат ПараметрыРегистрации;
КонецФункции

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

// Заполняет реквизиты контрагента
//
// Параметры:
// МассивСсылок - Массив - ссылки на контрагентов
//
Процедура ЗаполнитьРеквизитыКонтрагента(МассивСсылок)
// Логика заполнения реквизитов
// ...
КонецПроцедуры

// Заполняет ИНН контрагента в форме
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма объекта
//
Процедура ЗаполнитьИННвФорме(Форма)
// Генерируем случайный ИНН
Генератор = Новый ГенераторСлучайныхЧисел;
Форма.Объект.ИНН = Формат(Генератор.СлучайноеЧисло(1, 999999999), "ЧЦ=12; ЧДЦ=0; ЧВН=; ЧГ=");

// Помечаем форму как измененную
Форма.Модифицированность = Истина;

// Выводим сообщение
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "Объект.ИНН";
Сообщение.Текст = НСтр("ru = 'Поле ИНН успешно заполнено'");
Сообщение.Сообщить();
КонецПроцедуры

3. Обработка создания связанных объектов

// Возвращает сведения о внешней обработке.
//
// Возвращаемое значение:
// см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Информация = НСтр("ru = 'Создание комплекта документов на основании'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов();
ПараметрыРегистрации.Версия = "1.0.0.1";

// Назначение обработки
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");

// Команда создания связанных объектов
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Создать комплект документов'");
НоваяКоманда.Идентификатор = "СоздатьКомплектДокументов";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;

Возврат ПараметрыРегистрации;
КонецФункции

// Обработчик серверных команд.
//
// Параметры:
// ИдентификаторКоманды - Строка - имя команды
// ОбъектыНазначения - Массив - ссылки объектов, для которых вызвана команда
// СозданныеОбъекты - Массив - ссылки новых объектов, созданных в результате выполнения
// ПараметрыВыполнения - Структура - контекст выполнения команды
//
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "СоздатьКомплектДокументов" Тогда
СоздатьКомплектДокументов(ОбъектыНазначения, СозданныеОбъекты);
КонецЕсли;
КонецПроцедуры

// Создает комплект связанных документов
//
// Параметры:
// МассивСсылок - Массив - ссылки на документы-основания
// СозданныеОбъекты - Массив - ссылки на созданные документы
//
Процедура СоздатьКомплектДокументов(МассивСсылок, СозданныеОбъекты)
// Перебираем исходные документы
Для Каждого ДокументОснование Из МассивСсылок Цикл
// Создаем связанные документы
СоздатьСчетНаОплату(ДокументОснование, СозданныеОбъекты);
СоздатьРеализацию(ДокументОснование, СозданныеОбъекты);
КонецЦикла;
КонецПроцедуры

// Создает счет на оплату
//
// Параметры:
// ДокументОснование - ДокументСсылка - документ-основание
// СозданныеОбъекты - Массив - ссылки на созданные объекты
//
Процедура СоздатьСчетНаОплату(ДокументОснование, СозданныеОбъекты)
// Логика создания счета на оплату
// ...
// Добавление созданного документа в массив
СозданныеОбъекты.Добавить(НовыйДокумент.Ссылка);
КонецПроцедуры

// Создает реализацию
//
// Параметры:
// ДокументОснование - ДокументСсылка - документ-основание
// СозданныеОбъекты - Массив - ссылки на созданные объекты
//
Процедура СоздатьРеализацию(ДокументОснование, СозданныеОбъекты)
// Логика создания реализации
// ...
// Добавление созданного документа в массив
СозданныеОбъекты.Добавить(НовыйДокумент.Ссылка);
КонецПроцедуры

4. Глобальная обработка

// Возвращает сведения о внешней обработке.
//
// Возвращаемое значение:
// см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Информация = НСтр("ru = 'Утилиты для работы с файлами'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0.0.1";

// Команда открытия формы обработки
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Открыть утилиты для работы с файлами'");
НоваяКоманда.Идентификатор = "ОткрытьФормуОбработки";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;

// Команда запуска анализа файлов без открытия формы
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Анализ файлов'");
НоваяКоманда.Идентификатор = "АнализФайлов";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;

Возврат ПараметрыРегистрации;
КонецФункции

// Обработчик серверных команд.
//
// Параметры:
// ИдентификаторКоманды - Строка - имя команды
// ПараметрыВыполнения - Структура - контекст выполнения команды
//
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "АнализФайлов" Тогда
АнализФайлов();
КонецЕсли;
КонецПроцедуры

// Выполняет анализ файлов в каталоге временных файлов
//
Процедура АнализФайлов()
// Логика анализа файлов
// ...
КонецПроцедуры

5. Глобальный отчет

// Возвращает сведения о внешней обработке.
//
// Возвращаемое значение:
// см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке
//
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Информация = НСтр("ru = 'Расширенный анализ продаж'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Версия = "1.0.0.1";

// Подключение к подсистеме "Варианты отчетов"
ПараметрыРегистрации.ОпределитьНастройкиФормы = Истина;
ПараметрыРегистрации.НазначениеВариантаОтчета = Перечисления.НазначенияВариантовОтчетов.ДляЛюбыхУстройств;

// Команда формирования отчета
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Расширенный анализ продаж'");
НоваяКоманда.Идентификатор = "СформироватьОтчет";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;

Возврат ПараметрыРегистрации;
КонецФункции

// Настройки общей формы отчета подсистемы "Варианты отчетов".
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения, Неопределено - Форма отчета или форма настроек
// КлючВарианта - Строка, Неопределено - Идентификатор варианта отчета
// Настройки - Структура - настройки формы отчета
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
// Настраиваем компоновщик настроек
Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") И Форма.Открыта() Тогда
ТипФормы = Форма.ИмяФормы;

Если ТипФормы = "ОбщаяФорма.ФормаОтчета" Тогда
// Настройка основной формы отчета
// ...
ИначеЕсли ТипФормы = "ОбщаяФорма.ФормаНастроекОтчета" Тогда
// Настройка формы настроек отчета
// ...
КонецЕсли;
КонецЕсли;

Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПриЗакрытии = Истина;
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
КонецПроцедуры

// Формирует отчет
//
// Параметры:
// ПараметрыОтчета - Структура - параметры формирования отчета
// АдресХранилища - Строка - адрес хранилища с результатом отчета
//
Процедура СформироватьОтчет(ПараметрыОтчета, АдресХранилища) Экспорт
// Логика формирования отчета
// ...
КонецПроцедуры

Дополнительные возможности

Сохранение параметров обработок между сеансами

Для сохранения настроек и параметров обработок между сеансами используется реквизит ХранилищеНастроек справочника ДополнительныеОтчетыИОбработки:

// Сохранение настроек
Процедура СохранитьНастройки(ДополнительнаяОбработкаСсылка, Настройки)
ДополнительнаяОбработкаОбъект = ДополнительнаяОбработкаСсылка.ПолучитьОбъект();
ДополнительнаяОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(Настройки);
ДополнительнаяОбработкаОбъект.Записать();
КонецПроцедуры

// Чтение настроек
Функция ЗагрузитьНастройки(ДополнительнаяОбработкаСсылка)
ХранилищеНастроек = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДополнительнаяОбработкаСсылка, "ХранилищеНастроек");
Настройки = ХранилищеНастроек.Получить();
Возврат Настройки;
КонецФункции

Фоновое выполнение длительных операций

Для длительных операций рекомендуется использовать фоновое выполнение. Для этого в системе предусмотрен специальный программный интерфейс:

// На стороне клиента
&НаКлиенте
Процедура ВыполнитьДлительнуюОперацию(Команда)
// Настраиваем параметры выполнения в фоне
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполнение длительной операции...'");

// Запускаем операцию в фоне
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне("ИдентификаторКоманды", ПараметрыКоманды, Обработчик);
КонецПроцедуры

// Обработчик завершения фонового задания
&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
// Пользователь отменил задание
Возврат;
КонецЕсли;

Если Результат.Статус = "Ошибка" Тогда
// Произошла ошибка при выполнении
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;

// Обрабатываем результат
ПоказатьОповещениеПользователя(НСтр("ru = 'Операция завершена'"), , "Длительная операция выполнена успешно", БиблиотекаКартинок.Успешно32);
КонецПроцедуры

Настройка прав доступа

Для работы с дополнительными отчетами и обработками используются следующие роли:

  1. ДобавлениеИзменениеДополнительныхОтчетовИОбработок - право на добавление и настройку обработок
  2. ЧтениеДополнительныхОтчетовИОбработок - право на запуск и использование обработок

Дополнительно может использоваться вид доступа ДополнительныеОтчетыИОбработки для тонкой настройки доступа к отдельным обработкам.

Заключение

Подсистема «Дополнительные отчеты и обработки» предоставляет гибкий и мощный инструмент для расширения функциональности конфигураций 1С без изменения кода. Она позволяет добавлять новые печатные формы, отчеты, обработки для заполнения объектов и создания связанных документов.

Ключевым элементом разработки является правильная реализация функции СведенияОВнешнейОбработке(), которая определяет свойства обработки, её назначение и команды.

При разработке своих дополнительных обработок следуйте приведенным в статье примерам и используйте программный интерфейс подсистемы для более эффективной работы. Это поможет создавать надежные и удобные расширения для системы 1С:Предприятие.