Как открыть внешний отчет из элемента справочника без доработки конфигурации и передать в него ссылку на объект

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

При работе с типовыми конфигурациями 1С, построенными на базе Библиотеки стандартных подсистем (БСП), часто возникает необходимость добавить новый отчет, который должен вызываться прямо из формы конкретного справочника или документа. Главное условие при этом — не изменять саму конфигурацию, чтобы оставить ее на «замке» для беспрепятственного обновления. В этой статье мы подробно разберем, как реализовать передачу параметра (например, ссылки на текущую номенклатуру) во внешний отчет, используя только штатные механизмы 1С.

Механизм работы дополнительных отчетов в БСП

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

После регистрации в меню «Отчеты» (или «Дополнительные отчеты») формы элемента справочника автоматически появляется команда для вызова вашего отчета. Теперь разберем, как передать в него данные выбранного элемента.

Передача параметров через массив «ОбъектыНазначения»

Основной секрет взаимодействия формы справочника и внешнего отчета кроется в параметре ОбъектыНазначения. Когда БСП открывает форму внешнего отчета из формы объекта, она автоматически передает в параметры открываемой формы массив ссылок на объекты, из которых был совершен вызов.

Рассмотрим по шагам, как получить эти данные внутри внешнего отчета. Если у вашего отчета создана собственная форма, нам необходимо перехватить эти параметры при ее создании.

Разберем программный код для формы отчета:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, переданы ли объекты назначения в параметры формы
    Если Параметры.Свойство("ОбъектыНазначения") Тогда
        
        МассивОбъектов = Параметры.ОбъектыНазначения;
        
        // Если отчет открыт из формы элемента, в массиве будет одна ссылка
        Если МассивОбъектов.Количество() > 0 Тогда
            
            // Получаем ссылку на объект (например, Номенклатуру)
            СсылкаНаОбъект = МассивОбъектов[0];
            
            // Далее мы можем установить этот параметр в Схему Компоновки Данных (СКД)
            // Чтобы отчет сразу формировался по выбранному элементу
            ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Ссылка");
            Если ПараметрСКД <> Неопределено Тогда
                ПараметрСКД.Значение = СсылкаНаОбъект;
                ПараметрСКД.Использование = Истина;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

В этом примере мы проанализировали ситуацию, когда отчет вызывается из формы одного элемента. В МассивОбъектов попадает ссылка на текущий справочник. Мы извлекаем её и программно подставляем в настройки компоновки данных. Это позволяет пользователю не выбирать объект вручную после открытия отчета — данные подтянутся автоматически.

Автоматическое заполнение отборов без написания кода в форме

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

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

Использование внешних обработок вместо отчетов

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

В этом случае выполнение кода происходит в модуле объекта в процедуре ВыполнитьКоманду. Ссылки передаются через структуру ПараметрыВыполненияКоманды.

Пример кода в модуле объекта обработки:


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

Альтернатива через расширения конфигурации

Если штатного меню «Дополнительные отчеты» недостаточно (например, нужно разместить кнопку в определенном месте формы, а не в общем выпадающем списке), проанализируем использование Расширений конфигурации. Это мощный инструмент, который также позволяет не менять основную конфигурацию.

С помощью расширения мы можем:

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

Преимущество расширений в том, что вы можете программно управлять открытием формы отчета, используя метод ОткрытьФорму, где вторым параметром передается структура параметров.

Нюансы безопасного режима

Важно помнить, что внешние отчеты и обработки по умолчанию запускаются в Безопасном режиме. Это ограничивает доступ к файловой системе, реестру Windows и внешним COM-объектам. Если ваш отчет должен сохранять файлы на диск или подключаться к другой базе данных, при регистрации отчета в справочнике «Дополнительные отчеты и обработки» необходимо установить режим «Небезопасный» или прописать соответствующие разрешения в функции СведенияОВнешнейОбработке.

Заключение

Мы рассмотрели основной способ передачи параметров во внешние отчеты без внесения изменений в метаданные основной конфигурации. Использование параметра ОбъектыНазначения в процедуре ПриСозданииНаСервере формы отчета является наиболее надежным и гибким методом. Это позволяет создавать удобные инструменты для пользователей, сохраняя при этом типовую конфигурацию в чистоте и обеспечивая её легкое обновление в будущем.

← На главную