При работе с типовыми конфигурациями 1С, построенными на базе Библиотеки стандартных подсистем (БСП), часто возникает необходимость добавить новый отчет, который должен вызываться прямо из формы конкретного справочника или документа. Главное условие при этом — не изменять саму конфигурацию, чтобы оставить ее на «замке» для беспрепятственного обновления. В этой статье мы подробно разберем, как реализовать передачу параметра (например, ссылки на текущую номенклатуру) во внешний отчет, используя только штатные механизмы 1С.
Для начала проанализируем, как система понимает, что отчет нужно вывести в конкретном справочнике. В 1С существует справочник ДополнительныеОтчетыИОбработки. Когда мы регистрируем в нем внешний файл, система считывает из него функцию СведенияОВнешнейОбработке(), расположенную в модуле объекта. Именно в этой функции программист указывает «Назначение» отчета (например, справочник Номенклатура).
После регистрации в меню «Отчеты» (или «Дополнительные отчеты») формы элемента справочника автоматически появляется команда для вызова вашего отчета. Теперь разберем, как передать в него данные выбранного элемента.
Основной секрет взаимодействия формы справочника и внешнего отчета кроется в параметре ОбъектыНазначения. Когда БСП открывает форму внешнего отчета из формы объекта, она автоматически передает в параметры открываемой формы массив ссылок на объекты, из которых был совершен вызов.
Рассмотрим по шагам, как получить эти данные внутри внешнего отчета. Если у вашего отчета создана собственная форма, нам необходимо перехватить эти параметры при ее создании.
Разберем программный код для формы отчета:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, переданы ли объекты назначения в параметры формы
Если Параметры.Свойство("ОбъектыНазначения") Тогда
МассивОбъектов = Параметры.ОбъектыНазначения;
// Если отчет открыт из формы элемента, в массиве будет одна ссылка
Если МассивОбъектов.Количество() > 0 Тогда
// Получаем ссылку на объект (например, Номенклатуру)
СсылкаНаОбъект = МассивОбъектов[0];
// Далее мы можем установить этот параметр в Схему Компоновки Данных (СКД)
// Чтобы отчет сразу формировался по выбранному элементу
ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Ссылка");
Если ПараметрСКД <> Неопределено Тогда
ПараметрСКД.Значение = СсылкаНаОбъект;
ПараметрСКД.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом примере мы проанализировали ситуацию, когда отчет вызывается из формы одного элемента. В МассивОбъектов попадает ссылка на текущий справочник. Мы извлекаем её и программно подставляем в настройки компоновки данных. Это позволяет пользователю не выбирать объект вручную после открытия отчета — данные подтянутся автоматически.
Рассмотрим ситуацию, когда мы не хотим создавать форму для внешнего отчета. Выясним, можно ли обойтись стандартными средствами Системы компоновки данных (СКД). В современных версиях БСП реализован «умный» механизм сопоставления. Если в вашей схеме компоновки данных есть параметр с именем Ссылка или Объект, тип которого совпадает с типом объекта-владельца (например, СправочникСсылка.Номенклатура), система может попытаться заполнить его автоматически при вызове команды.
Однако для гарантированного результата рекомендуется все же использовать форму и явную установку параметров, так как это дает полный контроль над логикой поведения отчета.
Иногда задача стоит шире: нужно не просто вывести отчет, а произвести какие-то действия с объектом (например, печать по сложному шаблону или заполнение реквизитов). В этом случае мы создаем Внешнюю печатную форму или Дополнительную обработку. В функции СведенияОВнешнейОбработке() мы указываем тип команды ВызовСерверногоМетода.
В этом случае выполнение кода происходит в модуле объекта в процедуре ВыполнитьКоманду. Ссылки передаются через структуру ПараметрыВыполненияКоманды.
Пример кода в модуле объекта обработки:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт
Для Каждого ТекущийОбъект Из ОбъектыНазначения Цикл
// Здесь можно реализовать логику:
// открыть форму отчета вручную или сформировать печатную форму
Сообщить("Обработка запущена для объекта: " + ТекущийОбъект);
КонецЦикла;
КонецПроцедуры
Если штатного меню «Дополнительные отчеты» недостаточно (например, нужно разместить кнопку в определенном месте формы, а не в общем выпадающем списке), проанализируем использование Расширений конфигурации. Это мощный инструмент, который также позволяет не менять основную конфигурацию.
С помощью расширения мы можем:
Номенклатура.Преимущество расширений в том, что вы можете программно управлять открытием формы отчета, используя метод ОткрытьФорму, где вторым параметром передается структура параметров.
Важно помнить, что внешние отчеты и обработки по умолчанию запускаются в Безопасном режиме. Это ограничивает доступ к файловой системе, реестру Windows и внешним COM-объектам. Если ваш отчет должен сохранять файлы на диск или подключаться к другой базе данных, при регистрации отчета в справочнике «Дополнительные отчеты и обработки» необходимо установить режим «Небезопасный» или прописать соответствующие разрешения в функции СведенияОВнешнейОбработке.
Мы рассмотрели основной способ передачи параметров во внешние отчеты без внесения изменений в метаданные основной конфигурации. Использование параметра ОбъектыНазначения в процедуре ПриСозданииНаСервере формы отчета является наиболее надежным и гибким методом. Это позволяет создавать удобные инструменты для пользователей, сохраняя при этом типовую конфигурацию в чистоте и обеспечивая её легкое обновление в будущем.