Как при открытии отчета из другой базы по ссылке передать параметр

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

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

В этой статье мы подробно разберем, как реализовать передачу параметров в отчет другой базы, как «отловить» эти данные на стороне приемника и как правильно обойти ограничения типов данных при работе с навигационными ссылками.

Механизм передачи данных через навигационную ссылку

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

Рассмотрим основной принцип: для передачи информации мы должны использовать строковое представление данных. Это может быть уникальный идентификатор (GUID), код элемента или артикул. Если базы синхронизированы и объекты в них имеют одинаковые УникальныйИдентификатор, это значительно упрощает задачу.

Шаг 1. Формирование ссылки в исходной базе

Выясним, как подготовить данные для передачи. Если нам нужно передать ссылку на конкретный объект, мы преобразуем его UUID в строку. Давайте посмотрим на пример кода, который формирует параметр для передачи:


// В исходной базе получаем строковое представление УИДа
ЗначениеПараметра = Строка(СсылкаНаОбъект.УникальныйИдентификатор());
// Формируем навигационную ссылку (для использования в веб-клиенте или через запуск системы)
ТекстСсылки = "e1cib/app/Отчет.Продажи?ПараметрЗапуска=" + ЗначениеПараметра;

Если мы используем веб-клиент, параметры можно передавать непосредственно в URL. В случае с тонким клиентом часто используется механизм ПараметрЗапуска, который анализируется при старте системы.

Шаг 2. Обработка параметров в форме отчета

Теперь разберем, как «поймать» переданную строку в целевой базе. Вся магия происходит в модуле формы отчета. Нам понадобится обработчик события ПриСозданииНаСервере. Именно здесь система инициализирует форму, и именно сюда попадает структура Параметры.

Проанализируем ситуацию: когда мы открываем форму программно через ОткрытьФорму или через внешнее обращение, переданные ключи становятся свойствами структуры Параметры. Нам нужно извлечь строковое значение и превратить его обратно в объект 1С (ссылку).


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

КонецПроцедуры

Шаг 3. Программная установка параметров СКД

Мало просто получить ссылку в коде, ее нужно передать в систему компоновки данных (СКД), чтобы отчет сформировался с нужным отбором. Разберем, как это сделать правильно через КомпоновщикНастроек.

Для этого удобно создать вспомогательную процедуру, которая будет искать параметр в настройках и устанавливать его значение:


&НаСервере
Процедура УстановитьПараметрВНастройкиСКД(ИмяПараметра, Значение)
    
    ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
    Если ПараметрСКД <> Неопределено Тогда
        ПараметрСКД.Значение = Значение;
        ПараметрСКД.Использование = Истина;
    КонецЕсли;
    
КонецПроцедуры

Важный момент: если вы хотите, чтобы отчет не просто открылся, а сразу начал формироваться после установки параметров, передайте в параметрах формы свойство СформироватьПриОткрытии со значением Истина.

Использование вариантов отчета для упрощения задачи

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

Если в целевой базе уже настроены варианты (например, «Продажи по филиалу А», «Продажи по филиалу Б»), мы можем вызвать отчет, передав параметр КлючВарианта.

Пример структуры ссылки при таком подходе: e1cib/app/Отчет.ИмяОтчета?КлючВарианта=ИмяВарианта

Это избавляет от необходимости писать сложный код парсинга в ПриСозданииНаСервере, так как система сама применит все настройки, сохраненные в варианте.

Особенности работы через веб-публикацию

Если ваша база опубликована на веб-сервере, вы можете использовать возможности URL-параметров. Посмотрим на сценарий использования ПараметрЗапуска. Когда пользователь переходит по ссылке вида http://server/base/#e1cib/app/Отчет.Имя?ПараметрЗапуска=MyData, этот текст доступен в глобальном контексте через свойство ПараметрЗапуска.

В модуле управляемого приложения в обработчике ПриНачалеРаботыСистемы можно проанализировать этот параметр и программно открыть нужную форму:


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

Подведение итогов и рекомендации

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

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

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

← На главную