Разработчики и продвинутые пользователи 1С часто сталкиваются с задачей расширения функционала типовых конфигураций. Одной из таких задач является необходимость вызова внешнего отчета непосредственно из формы документа, при этом требуется сохранить возможность обновления конфигурации без дополнительных сложностей. Стандартные отчеты конфигурации можно легко привязать к командной панели документа, но как быть с внешними отчетами, которые загружены в базу как дополнительные?
Мы рассмотрим подробное решение этой проблемы, используя два мощных инструмента платформы 1С:Предприятие 8.3: Дополнительные отчеты и обработки (ДОО) и Расширения конфигурации. Эти механизмы позволяют нам добавлять и вызывать необходимый функционал, не внося изменения в основную конфигурацию, что критически важно для поддержки и обновления.
Прежде чем перейти к пошаговой инструкции, выясним, какие механизмы нам понадобятся и почему они так важны:
Наш внешний отчет должен быть готов к тому, что его будут вызывать извне, и что ему могут передавать параметры, например, ссылку на текущий документ. Для этого нам необходимо соответствующим образом настроить его модуль.
Функция СведенияОВнешнейОбработке()
Каждый внешний отчет, который должен быть зарегистрирован через механизм ДОО, должен содержать экспортную функцию СведенияОВнешнейОбработке() в модуле объекта. Эта функция возвращает структуру, описывающую наш отчет и его команды.
В этой структуре нам обязательно нужно указать:
Вид: Для отчета это будет ДополнительныйОтчет.Наименование: Человекочитаемое имя отчета, под которым он будет отображаться в списке ДОО.Команды: Таблица значений, описывающая команды, которые могут быть выполнены с помощью нашего отчета. Именно здесь мы определим команду, которая будет открывать форму отчета.Рассмотрим пример кода для модуля объекта внешнего отчета:
// Модуль объекта внешнего отчета (.erf файл)
// Функция, которая предоставляет сведения о внешнем отчете для его регистрации
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
ПараметрыРегистрации.Вставить("Наименование", "Мой Внешний Отчет По Документу"); // Точное наименование для поиска
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); // Важно для безопасности
ПараметрыРегистрации.Вставить("Информация", "Отчет, запускаемый из формы документа для анализа данных по нему.");
// Определяем команды, которые могут быть выполнены для этого отчета
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление"); // Текст, который увидит пользователь
Команды.Колонки.Добавить("Идентификатор"); // Уникальный идентификатор команды
Команды.Колонки.Добавить("Использование"); // Как будет использоваться команда (ОткрытиеФормы, ВызовСерверногоМетода и т.д.)
Команды.Колонки.Добавить("ПоказыватьОповещение", Тип("Булево")); // Показывать ли оповещение после выполнения команды
НоваяКоманда = Команды.Добавить();
НоваяКоманда.Представление = "Открыть Отчет по Текущему Документу";
НоваяКоманда.Идентификатор = "ОткрытьОтчетПоДокументу"; // Идентификатор, который мы будем использовать для вызова
НоваяКоманда.Использование = "ОткрытиеФормы"; // Указываем, что эта команда открывает форму отчета
НоваяКоманда.ПоказыватьОповещение = Ложь; // Обычно для отчетов оповещение не требуется
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
// Процедура ПриОткрытии() в модуле формы отчета
// Здесь мы обрабатываем параметры, переданные при открытии формы
Процедура ПриОткрытии(Отказ, СтандартнаяОбработка)
// Мы ожидаем получить параметр "ОтборПоДокументу", содержащий ссылку на документ
Если Параметры.Свойство("ОтборПоДокументу") Тогда
СсылкаНаДокумент = Параметры.ОтборПоДокументу;
// Предположим, что в СКД отчета есть поле "СсылкаНаДокумент", по которому
// мы хотим сделать отбор.
// Очищаем текущие элементы отбора, чтобы не было конфликтов
КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
// Создаем новый элемент отбора
НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СсылкаНаДокумент"); // Имя поля в СКД
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлементОтбора.ПравоеЗначение = СсылкаНаДокумент;
НовыйЭлементОтбора.Использование = Истина; // Включаем этот элемент отбора
// Если нам также передали параметр "СформироватьПриОткрытии",
// сразу сформируем отчет
Если Параметры.Свойство("СформироватьПриОткрытии") И Параметры.СформироватьПриОткрытии Тогда
СкомпоноватьРезультат(Элементы.Результат);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Мы видим, что в процедуре ПриОткрытии() формы отчета мы проверяем наличие параметра ОтборПоДокументу. Если он есть, мы используем его для динамического формирования отбора в Системе Компоновки Данных (СКД) отчета. Это позволяет отчету сразу отображать данные, отфильтрованные по тому документу, из которого он был вызван.
После подготовки файла внешнего отчета (.erf), его необходимо зарегистрировать в информационной базе. Это делается в режиме 1С:Предприятия (не в Конфигураторе).
После успешной регистрации отчет появится в списке дополнительных отчетов. Система присвоит ему внутреннее служебное имя (например, ВнешнийОтчет_000000001), которое мы будем использовать для его вызова.
Теперь, когда отчет готов и зарегистрирован, нам нужно добавить кнопку или команду на форму документа, чтобы вызвать его. Поскольку мы не можем изменять основную конфигурацию, мы воспользуемся расширением.
Представление: "Мой Отчет по Документу" (это текст, который будет на кнопке).Группа: Укажите, куда будет помещена команда. Для командной панели формы документа часто используют группы, связанные с формой, например, ПанельНавигацииФормы или КоманднаяПанельФормы. Можно также использовать Форма.СтандартныеПодсистемы.Отчеты, чтобы она попала в подменю "Отчеты".Действие создайте обработчик, который будет выполнять код вызова отчета. Для этого перейдите на вкладку Действие и выберите "Создать на клиенте" или "Создать на сервере" (обычно для вызова формы достаточно клиента, но поиск имени объекта может потребовать серверного вызова). Мы рассмотрим вариант с клиентским вызовом, который обращается к серверу для получения имени.ПараметрКоманды, установив его в Объект.Ссылка. Это позволит нам передавать ссылку на текущий документ в обработчик команды.Самый важный шаг – это написание кода для обработчика нашей команды. Здесь мы должны найти наш зарегистрированный внешний отчет и открыть его форму, передав ссылку на текущий документ.
Обратите внимание, что для открытия формы внешнего отчета, зарегистрированного через ДОО, нельзя использовать имя файла отчета. Необходимо получить его внутреннее служебное имя, которое 1С присваивает при регистрации (например, ВнешнийОтчет_000000001). Это имя хранится в справочнике ДополнительныеОтчетыИОбработки.
Пример кода для модуля команды расширения:
// Модуль общей команды расширения
// (Например, 'ОбщиеКоманды.ВызватьВнешнийОтчетПоДокументу')
// Обработчик команды, выполняется на клиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Экспорт
// ПараметрКоманды содержит ссылку на текущий документ, если команда
// размещена на форме документа и для нее установлено свойство "ПараметрКоманды = Объект.Ссылка".
СсылкаНаДокумент = ПараметрКоманды;
// 1. Получаем полное имя формы внешнего отчета.
// Это делается на сервере, так как справочник "ДополнительныеОтчетыИОбработки"
// доступен только на сервере.
ИмяОбъектаОтчетаВБазе = ПолучитьИмяОбъектаВнешнегоОтчетаНаСервере("Мой Внешний Отчет По Документу");
Если ЗначениеЗаполнено(ИмяОбъектаОтчетаВБазе) Тогда
ПолноеИмяФормыОтчета = "ВнешнийОтчет." + ИмяОбъектаОтчетаВБазе + ".Форма";
// 2. Формируем параметры для передачи в отчет.
// Отчет должен быть готов принять эти параметры в процедуре ПриОткрытии() своей формы.
ПараметрыФормыОтчета = Новый Структура;
// Имя параметра "ОтборПоДокументу" должно соответствовать ожидаемому в отчете (см. Шаг 1)
ПараметрыФормыОтчета.Вставить("ОтборПоДокументу", СсылкаНаДокумент);
// Параметр для автоматического формирования отчета при открытии
ПараметрыФормыОтчета.Вставить("СформироватьПриОткрытии", Истина);
// 3. Открываем форму внешнего отчета
ОткрытьФорму(ПолноеИмяФормыОтчета, ПараметрыФормыОтчета, ПараметрыВыполненияКоманды.Источник);
Иначе
ПоказатьПредупреждение(,"Не удалось найти зарегистрированный внешний отчет с наименованием 'Мой Внешний Отчет По Документу'. "
+ "Убедитесь, что отчет зарегистрирован в разделе 'Дополнительные отчеты и обработки' "
+ "и его наименование точно соответствует указанному.");
КонецЕсли;
КонецПроцедуры
// Функция для получения внутреннего имени внешнего отчета на сервере
// Выносим в отдельную серверную функцию, так как запросы к справочникам
// выполняются на сервере.
Функция ПолучитьИмяОбъектаВнешнегоОтчетаНаСервере(НаименованиеОтчета) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДополнительныеОтчетыИОбработки.ИмяОбъекта КАК ИмяОбъектаВБазе
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
|ГДЕ
| ДополнительныеОтчетыИОбработки.Вид = &Вид
| И ДополнительныеОтчетыИОбработки.Наименование = &НаименованиеОтчета";
Запрос.УстановитьПараметр("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет);
Запрос.УстановитьПараметр("НаименованиеОтчета", НаименованиеОтчета); // Используем наименование из СведенияОВнешнейОбработке()
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.ИмяОбъектаВБазе;
Иначе
Возврат "";
КонецЕсли;
КонецФункции
В этом коде мы сначала на сервере находим внутреннее имя нашего отчета в справочнике ДополнительныеОтчетыИОбработки по его человекочитаемому наименованию. Затем формируем полное имя формы и передаем в нее необходимые параметры, включая ссылку на текущий документ. Функция ОткрытьФорму() затем открывает отчет, и он, благодаря нашей настройке в ПриОткрытии(), автоматически формируется по переданному документу.
Если в вашей конфигурации активно используется Библиотека стандартных подсистем (БСП), вы можете воспользоваться ее функциями для более стандартизированного и надежного вызова дополнительных отчетов. Функции БСП абстрагируют многие детали, такие как поиск внутреннего имени отчета, и обеспечивают корректный вызов даже в облачных решениях или при работе с безопасным режимом.
В БСП за работу с дополнительными отчетами и обработками отвечают, в частности, модули ПодключаемыеКомандыКлиент, ДополнительныеОтчетыИОбработкиКлиент и ДополнительныеОтчетыИОбработки.
Пример использования БСП в обработчике команды расширения:
// Модуль общей команды расширения с использованием БСП
// Обработчик команды, выполняется на клиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Экспорт
СсылкаНаДокумент = ПараметрКоманды;
// Определяем параметры для вызова команды БСП
ПараметрыВызоваБСП = Новый Структура;
// Наименование дополнительной обработки, как она зарегистрирована в 1С:Предприятии
ПараметрыВызоваБСП.Вставить("НаименованиеДополнительнойОбработки", "Мой Внешний Отчет По Документу");
// Идентификатор команды, определенный в функции СведенияОВнешнейОбработке()
ПараметрыВызоваБСП.Вставить("ИдентификаторКоманды", "ОткрытьОтчетПоДокументу");
// Формируем дополнительные параметры, которые будут переданы в форму отчета
ДополнительныеПараметрыОтчета = Новый Структура;
ДополнительныеПараметрыОтчета.Вставить("ОтборПоДокументу", СсылкаНаДокумент);
ДополнительныеПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыВызоваБСП.Вставить("ДополнительныеПараметры", ДополнительныеПараметрыОтчета);
// Указываем источник вызова, чтобы форма отчета могла быть открыта корректно
ПараметрыВызоваБСП.Вставить("Источник", ПараметрыВыполненияКоманды.Источник);
// Вызываем команду через клиентскую функцию БСП
// (название функции может отличаться в зависимости от версии БСП)
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду(ПараметрыВызоваБСП);
КонецПроцедуры
В этом варианте мы используем функцию ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду() (или аналогичную из вашей версии БСП), передавая ей структурированные параметры: наименование отчета, идентификатор команды, дополнительные параметры для отчета и источник вызова. БСП сама позаботится о поиске отчета, получении его внутреннего имени и открытии формы с передачей всех указанных параметров. Это более предпочтительный способ, так как он использует стандартные механизмы и обеспечивает большую устойчивость к изменениям.
ИмяОбъекта). Не полагайтесь на имя файла отчета, так как оно может быть изменено, а внутренний идентификатор остается стабильным.Мы видим, что реализовать переход на внешний отчет из документа 1С без изменения конфигурации вполне реально и даже является стандартной практикой для современных типовых конфигураций. Комбинация механизмов "Дополнительные отчеты и обработки" и "Расширения конфигурации" предоставляет мощный и гибкий инструментарий для расширения функционала без риска потерять возможность легкого обновления. Использование БСП дополнительно упрощает и стандартизирует процесс, делая его более надежным и менее подверженным ошибкам. Следуя этим шагам, вы сможете успешно интегрировать внешний отчет в работу с документами вашей информационной базы.