Как передать параметр в отчет на СКД из формы списка документа?

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

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

Давайте подробно рассмотрим и проанализируем различные способы передачи параметров в отчет на базе Системы Компоновки Данных (СКД). Мы разберем по шагам как простые методы с использованием штатных отборов, так и более продвинутые подходы с применением механизмов Библиотеки Стандартных Подсистем (БСП).

Использование штатного параметра формы «Отбор»

Зачастую передавать ссылку на документ лучше не через параметр СКД, а через штатный механизм отбора. Технически в платформе 1С предусмотрен встроенный параметр расширения формы отчета — Отбор. Это самый простой и логичный способ, который избавит нас от необходимости заводить отдельный параметр в настройках СКД и писать сложные обработчики.

Посмотрим на пример того, как это можно реализовать в коде команды на форме списка документа:


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

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

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

Безопасная установка параметров через функции БСП

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

Разберем типичную ошибку. Часто разработчики пытаются установить параметр, обращаясь к нему по индексу в коллекции настроек. Например, пишут так:


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

Это очень плохая практика! Если пользователь или другой программист изменит порядок параметров, сдвинет их вверх или вниз, индекс собьется, и код перестанет работать корректно. Чтобы этого избежать, выясним правильный подход.

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


// Безопасная установка параметра по имени
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "ОтчетныйПериод", НужнаяДата);

Аналогично, если необходимо установить параметр именно в пользовательских настройках, применяется метод КомпоновкаДанныхКлиентСервер.УстановитьПараметрПользовательскойНастройки(). Это защитит ваш код от любых перестановок параметров в схеме.

Решение проблемы сброса параметров в «Расширенных настройках»

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

Чтобы избежать этой проблемы, мы можем сформировать настройки до открытия формы и передать их целиком как штатный параметр ПользовательскиеНастройки.

Рассмотрим подробнее этот подход:


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

При таком подходе платформа воспринимает переданные настройки как родные пользовательские, и сбоев при переходе между простым и расширенным видом настроек не произойдет.

Установка параметров в обработчике ПриКомпоновкеРезультата

Если вы не хотите связываться с перехватом событий формы отчета и передачей сложных структур с клиента на сервер, мы можем использовать жесткую установку параметров прямо в модуле объекта отчета. Для этого применяется предопределенная процедура ПриКомпоновкеРезультата.

Посмотрим на пример реализации в модуле отчета:


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

Важный нюанс: В этот момент отчет уже начал формирование, и принудительная установка параметра отработает гарантированно. Однако значение (например, ссылку на документ из формы списка) до этого момента все равно нужно пробросить внутрь. Чаще всего это комбинируют: документ передают в виде пользовательского параметра или отбора при открытии, а уже в ПриКомпоновкеРезультата дозаполняют служебные скрытые параметры.

Контекстные дополнительные отчеты (Best Practice)

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

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

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

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

← На главную