Как из формы элемента справочника открыть отчет с установленным отбором?

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

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

Базовый синтаксис передачи параметров в форму отчета

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

Рассмотрим структуру вызова на клиенте:


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

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

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

Разбор типичной ошибки: ЭтотОбъект вместо ссылки на элемент

Проанализируем распространенную ошибку начинающих разработчиков. При попытке передать текущий элемент в отбор в модуль формы часто пишут следующий код:

ПараметрыОтбора.Вставить("ФизЛицо", ЭтотОбъект);

При выполнении этого кода возникает системная ошибка передачи данных между клиентом и сервером либо сообщение о некорректном типе данных. Выясним причину этой ошибки:

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

Управление уникальностью окон отчета: почему открывается старая форма

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

Рассмотрим подробнее работу механизма уникальности форм в методе ОткрытьФорму. Метод имеет следующий синтаксис:


ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)

Четвертый параметр — Уникальность — управляет повторным открытием форм:

  1. Значение по умолчанию (Ложь или не указано): Платформа ищет уже существующую открытую форму с таким же именем. Если форма найдена, платформа просто активирует ее окно на экране, не перечитывая заново параметры Отбор и не вызывая обработчик инициализации заново.
  2. Значение Истина: Платформа будет создавать абсолютно новое независимое окно отчета при каждом нажатии. Если нажать кнопку десять раз, откроется десять разных окон.
  3. Передача ключа уникальности (рекомендуемый подход): Чтобы открывать отдельное окно для каждого конкретного физлица, но не создавать дубли одного и того же сотрудника, в качестве ключа уникальности передают ссылку на элемент справочника.

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


&НаКлиенте
Процедура ОткрытьОтчетПоДолгам(Команда)

    Если Объект.Ссылка.Пустая() Тогда
        Предупреждение("Сначала запишите элемент справочника!");
        Возврат;
    КонецЕсли;

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

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

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

Особенности и ограничения стандартного отбора

При использовании параметра Отбор необходимо учитывать несколько системных правил:

  1. Вид сравнения: Стандартный параметр формы отчета Отбор принимает только соответствие на равенство (вид сравнения Равно). Если требуется установить условие В списке или Не равно, необходимо передавать настройки через коллекцию ФиксированныеНастройки компоновщика настроек отчета.
  2. Именование полей: Ключи в структуре отбора должны в точности соответствовать путям к данным полей в схеме компоновки данных отчета (например, Организация, Контрагент.ГоловнойКонтрагент и т.д.).
  3. Проверка заполненности ссылки: Всегда проверяйте Объект.Ссылка.Пустая() перед открытием отчета. Если вызвать отчет из новой, еще не сохраненной карточки, отчет откроется с условием отбора по пустой ссылке, что приведет к неверному выводу информации.
← На главную