Как реализовать переход на внешний отчет из документа 1С без изменения конфигурации?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Основные принципы и инструменты

Прежде чем перейти к пошаговой инструкции, выясним, какие механизмы нам понадобятся и почему они так важны:

  1. Дополнительные отчеты и обработки (ДОО):
    • Что это? ДОО — это механизм платформы 1С, который позволяет загружать внешние отчеты и обработки (файлы с расширениями .erf, .epf) непосредственно в базу данных. Они становятся частью информационной базы, но при этом не включаются в состав метаданных конфигурации.
    • Зачем нужны? ДОО позволяют нам расширять функциональность конфигурации без изменения ее исходного кода. Это означает, что вы можете добавлять новые отчеты, не снимая конфигурацию с поддержки и не боясь проблем при ее обновлении.
    • Взаимодействие с БСП: Для эффективной работы с ДОО в большинстве современных типовых конфигураций используется Библиотека стандартных подсистем (БСП). БСП предоставляет унифицированный программный интерфейс (API) для регистрации, вызова, управления безопасностью и других операций с внешними отчетами и обработками.
  2. Расширения конфигурации:
    • Что это? Расширения конфигурации — это отдельный объект метаданных, который позволяет модифицировать поведение и интерфейс существующей конфигурации, не изменяя ее исходный код. Расширения работают как "наслоение" поверх основной конфигурации.
    • Зачем нужны? Расширения позволяют нам добавлять новые элементы интерфейса (кнопки, команды), обработчики событий, изменять формы и модули объектов без прямого вмешательства в основную конфигурацию. Это идеальный инструмент для добавления кнопки вызова нашего внешнего отчета на форму документа.

Шаг 1: Подготовка модуля внешнего отчета

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

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

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

В этой структуре нам обязательно нужно указать:

Рассмотрим пример кода для модуля объекта внешнего отчета:


// Модуль объекта внешнего отчета (.erf файл)

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

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

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

    ПараметрыРегистрации.Вставить("Команды", Команды);
    Возврат ПараметрыРегистрации;
КонецФункции

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

        // Предположим, что в СКД отчета есть поле "СсылкаНаДокумент", по которому
        // мы хотим сделать отбор.
        // Очищаем текущие элементы отбора, чтобы не было конфликтов
        КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();

        // Создаем новый элемент отбора
        НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СсылкаНаДокумент"); // Имя поля в СКД
        НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        НовыйЭлементОтбора.ПравоеЗначение = СсылкаНаДокумент;
        НовыйЭлементОтбора.Использование = Истина; // Включаем этот элемент отбора

        // Если нам также передали параметр "СформироватьПриОткрытии",
        // сразу сформируем отчет
        Если Параметры.Свойство("СформироватьПриОткрытии") И Параметры.СформироватьПриОткрытии Тогда
            СкомпоноватьРезультат(Элементы.Результат);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Мы видим, что в процедуре ПриОткрытии() формы отчета мы проверяем наличие параметра ОтборПоДокументу. Если он есть, мы используем его для динамического формирования отбора в Системе Компоновки Данных (СКД) отчета. Это позволяет отчету сразу отображать данные, отфильтрованные по тому документу, из которого он был вызван.

Шаг 2: Регистрация внешнего отчета в режиме 1С:Предприятия

После подготовки файла внешнего отчета (.erf), его необходимо зарегистрировать в информационной базе. Это делается в режиме 1С:Предприятия (не в Конфигураторе).

  1. Откройте 1С:Предприятие.
  2. Перейдите в раздел Администрирование.
  3. Найдите пункт Печатные формы, отчеты и обработки.
  4. В этом разделе выберите Дополнительные отчеты и обработки.
  5. Нажмите кнопку Создать или Добавить из файла.
  6. Укажите путь к вашему файлу внешнего отчета (.erf).
  7. После загрузки, система предложит настроить параметры отчета. Особое внимание уделите вкладке Размещение. Здесь вы можете указать, для каких объектов конфигурации (например, документов "Реализация товаров и услуг", "Поступление товаров и услуг" и т.д.) этот отчет должен быть доступен. Если вы выберете конкретный документ, то команда на открытие отчета может появиться в подменю "Отчеты" формы этого документа. Однако, для прямого размещения кнопки на командной панели мы будем использовать расширение.
  8. Сохраните изменения. Убедитесь, что отчет активен.

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

Шаг 3: Добавление команды для вызова отчета через Расширение Конфигурации

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

  1. Создание расширения конфигурации:
    • Откройте Конфигуратор.
    • Перейдите в меню Конфигурация → Расширения конфигурации.
    • Нажмите кнопку Добавить (+).
    • Задайте имя расширения (например, "МоеРасширениеОтчетов") и другие необходимые параметры.
    • Нажмите ОК.
  2. Добавление общей команды в расширение:
    • В дереве объектов расширения найдите ветку Общие → Общие команды.
    • Создайте новую общую команду (например, "ВызватьВнешнийОтчетПоДокументу").
    • В свойствах команды задайте:
      • Представление: "Мой Отчет по Документу" (это текст, который будет на кнопке).
      • Группа: Укажите, куда будет помещена команда. Для командной панели формы документа часто используют группы, связанные с формой, например, ПанельНавигацииФормы или КоманднаяПанельФормы. Можно также использовать Форма.СтандартныеПодсистемы.Отчеты, чтобы она попала в подменю "Отчеты".
      • В свойстве Действие создайте обработчик, который будет выполнять код вызова отчета. Для этого перейдите на вкладку Действие и выберите "Создать на клиенте" или "Создать на сервере" (обычно для вызова формы достаточно клиента, но поиск имени объекта может потребовать серверного вызова). Мы рассмотрим вариант с клиентским вызовом, который обращается к серверу для получения имени.
  3. Подключение команды к форме документа:
    • В расширении добавьте в состав нужный документ, форму которого вы хотите изменить. Например, если вызов будет из "Реализация товаров и услуг", то добавьте объект "Документ.РеализацияТоваровУслуг" и его форму объекта (например, "ФормаДокумента").
    • Откройте форму документа в расширении.
    • Перенесите созданную общую команду из панели "Команды" на нужный элемент командной панели формы (например, в подменю "Отчеты" или непосредственно на командную панель).
    • Для добавленной команды настройте свойство ПараметрКоманды, установив его в Объект.Ссылка. Это позволит нам передавать ссылку на текущий документ в обработчик команды.
  4. Реализация обработчика команды:

    Самый важный шаг – это написание кода для обработчика нашей команды. Здесь мы должны найти наш зарегистрированный внешний отчет и открыть его форму, передав ссылку на текущий документ.

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

    Пример кода для модуля команды расширения:

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

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

    Альтернативный подход: Использование функций БСП для более унифицированного вызова

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

    В БСП за работу с дополнительными отчетами и обработками отвечают, в частности, модули ПодключаемыеКомандыКлиент, ДополнительныеОтчетыИОбработкиКлиент и ДополнительныеОтчетыИОбработки.

    Пример использования БСП в обработчике команды расширения:

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

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

    Важные аспекты при работе с внешними отчетами и расширениями

    • Безопасность: Всегда проверяйте источник внешних отчетов. Внешние отчеты могут содержать произвольный код. В 1С:Предприятии предусмотрен безопасный режим выполнения ДОО, который ограничивает их возможности. Администраторы могут подписывать отчеты электронной подписью, чтобы доверять их коду.
    • Права доступа: Пользователь, который регистрирует или запускает дополнительные отчеты, должен иметь соответствующие права. Обычно это роли, связанные с "Добавление и изменение дополнительных отчетов и обработок" (для администратора) и "Чтение дополнительных отчетов и обработок" (для обычных пользователей).
    • Уникальные идентификаторы: Как мы уже выяснили, при регистрации 1С присваивает внешнему отчету уникальный идентификатор (ИмяОбъекта). Не полагайтесь на имя файла отчета, так как оно может быть изменено, а внутренний идентификатор остается стабильным.
    • Обновление отчетов: Если вы внесли изменения во внешний отчет (.erf файл), его необходимо перезагрузить в разделе "Дополнительные отчеты и обработки" через кнопку "Загрузить из файла". Старая версия будет заменена, сохраняя при этом тот же внутренний идентификатор.
    • Тестирование: Всегда тщательно тестируйте функциональность в тестовой базе перед внедрением на продуктивный контур. Проверяйте работу отчета с разными документами, с разными правами пользователей.
    • БСП: Использование БСП сильно упрощает разработку и поддержку функциональности. Если ваша конфигурация ее содержит, обязательно изучите соответствующие модули для работы с подключаемыми командами и дополнительными отчетами/обработками.

    Заключение

    Мы видим, что реализовать переход на внешний отчет из документа 1С без изменения конфигурации вполне реально и даже является стандартной практикой для современных типовых конфигураций. Комбинация механизмов "Дополнительные отчеты и обработки" и "Расширения конфигурации" предоставляет мощный и гибкий инструментарий для расширения функционала без риска потерять возможность легкого обновления. Использование БСП дополнительно упрощает и стандартизирует процесс, делая его более надежным и менее подверженным ошибкам. Следуя этим шагам, вы сможете успешно интегрировать внешний отчет в работу с документами вашей информационной базы.

← На главную