В современной разработке на платформе 1С:Предприятие 8.3 часто возникает задача вызвать внешний отчет не через стандартный интерфейс подсистемы «Дополнительные отчеты и обработки», а программно, например, по нажатию кнопки в форме справочника или документа. Это особенно актуально для конфигураций вроде УНФ, ERP или УТ 11. В данной статье мы разберем несколько способов решения этой задачи, проанализируем типичные ошибки, такие как ограничения безопасного режима, и научимся использовать встроенные механизмы БСП.
Рассмотрим базовый алгоритм, который позволяет извлечь двоичные данные отчета из справочника, подключить его во внешние отчеты сеанса и открыть его форму. Этот метод полезен, когда нужно иметь полный контроль над процессом подключения.
Для начала проанализируем код, который выполняется на стороне сервера. Нам необходимо найти элемент в справочнике ДополнительныеОтчетыИОбработки, получить из него двоичные данные файла и поместить их во временное хранилище.
&НаСервере
Функция ПолучитьАдресПодключенногоОтчета(ИмяОтчета)
// Поиск отчета в справочнике по наименованию
ОтчетСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОтчета);
Если ОтчетСсылка.Пустая() Тогда
ВызватьИсключение "Внешний отчет '" + ИмяОтчета + "' не найден в справочнике!";
КонецЕсли;
// Извлечение двоичных данных из хранилища
ДвоичныеДанные = ОтчетСсылка.ХранилищеОбработки.Получить();
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
// Подключение отчета. Используем уникальное имя для избежания конфликтов
ИмяБиблиотеки = "ВнешнийОтчет_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
ВнешниеОтчеты.Подключить(АдресХранилища, ИмяБиблиотеки, Ложь);
Возврат ИмяБиблиотеки;
КонецФункции
После того как отчет подключен на сервере, мы можем открыть его форму на клиенте. Обратите внимание, что для открытия формы внешнего отчета используется префикс ВнешнийОтчет..
&НаКлиенте
Процедура ОткрытьВнешнийОтчет(Команда)
ИмяПодключенногоОтчета = ПолучитьАдресПодключенногоОтчета("Сравнение СФ");
ПараметрыФормы = Новый Структура;
// Можно добавить параметры, например, КлючВарианта
ОткрытьФорму("ВнешнийОтчет." + ИмяПодключенногоОтчета + ".Форма", ПараметрыФормы);
КонецПроцедуры
Часто при выполнении кода ВнешниеОтчеты.Подключить() разработчики сталкиваются с ошибкой: «Установлен безопасный режим. Выполнение операции запрещено». Выясним причину этой ситуации. Проблема возникает, если ваш отчет внутри себя пытается создать COM-соединение (например, для обмена данными с 1С:Бухгалтерией) или обращается к файловой системе.
По умолчанию платформа 1С запускает внешние обработки в безопасном режиме. Чтобы разрешить опасные операции, необходимо обратить внимание на третий параметр метода Подключить(). Рассмотрим подробнее:
ВнешниеОтчеты.Подключить(Адрес, Имя, БезопасныйРежим) принимает булево значение. Если вы передадите Истина или не укажете параметр, отчет не сможет использовать COM.Ложь.Ложь может не сработать без настройки соответствующих разрешений в консоли администрирования.Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), как в случае с УНФ, лучше использовать штатные процедуры. Это гарантирует корректную работу прав доступа и настроек безопасности. Для реализации такого сценария подойдёт готовая универсальная процедура вызова дополнительной обработки средствами БСП.
Разберем, как выполнить команду внешнего отчета через модуль ДополнительныеОтчетыИОбработкиКлиент. Этот способ хорош тем, что нам не нужно вручную заниматься низкоуровневым подключением через временное хранилище.
&НаКлиенте
Процедура ВыполнитьВнешнийОтчетБСП()
// 1. Получаем ссылку на отчет на сервере (или передаем заранее)
СсылкаНаОтчет = ПолучитьСсылкуНаВнешнийОтчет("Сравнение СФ");
// 2. Формируем структуру параметров
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ДополнительнаяОбработкаСсылка", СсылкаНаОтчет);
ПараметрыВыполнения.Вставить("ИмяКоманды", "ОткрытьФорму"); // Имя команды из карточки доп. отчета
// 3. Вызываем команду БСП
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду(ПараметрыВыполнения);
КонецПроцедуры
Просто открыть пустую форму отчета обычно недостаточно. Проанализируем ситуацию, когда нам нужно передать конкретного контрагента в отбор или заставить отчет сформироваться сразу при открытии. Для этого используются параметры формы 1С.
Рассмотрим пример подготовки параметров на сервере:
Истина, отчет сразу нажмет кнопку «Сформировать».
&НаКлиенте
Процедура ОткрытьОтчетСПараметрами()
ИмяОтчета = ПодключитьОтчетНаСервере();
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
// Передача отбора через пользовательские настройки (упрощенный пример)
Отбор = Новый Структура("Организация", Объект.Организация);
ПараметрыФормы.Вставить("Отбор", Отбор);
ОткрытьФорму("ВнешнийОтчет." + ИмяОтчета + ".ФормаОтчета", ПараметрыФормы);
КонецПроцедуры
Проанализировав практику разработки, выделим несколько критических моментов:
"МойОтчет". Если два пользователя одновременно запустят этот код, возникнет конфликт имен. Всегда добавляйте к имени УникальныйИдентификатор.УникальныйИдентификатор текущей формы. Это гарантирует, что данные будут удалены из оперативной памяти сервера сразу после закрытия вашей формы, предотвращая утечки памяти.ВнешниеОтчеты.Подключить() запрещен. Там единственным рабочим вариантом является использование механизмов БСП через справочник дополнительных отчетов.Таким образом, для простых задач внутри локальной сети подойдет метод ручного подключения с отключением безопасного режима, а для тиражируемых решений в современных конфигурациях следует отдавать предпочтение методам БСП. Для быстрого поиска и изучения программного кода подсистем можно использовать инструмент со справочником методов БСП и примерами их использования.