При разработке прикладных решений на платформе 1С:Предприятие 8 часто возникает задача связать справочники и отчеты. Например, непосредственно из карточки физического лица, контрагента или номенклатуры требуется открыть отчет, где данные уже отфильтрованы по текущему объекту и сформированы автоматически. Разберем по шагам, как правильно реализовать такой механизм, с какими ошибками часто сталкиваются разработчики и как управлять поведением окон отчета.
Платформа 1С:Предприятие предоставляет стандартный интерфейс открытия отчетов на схеме компоновки данных (СКД). Чтобы передать отбор и сразу инициировать формирование отчета при открытии, используется структура параметров формы. В нее помещают специальный ключ Отбор, значением которого является вложенная структура, где имя ключа соответствует имени поля СКД, а значение — значению фильтрации.
Рассмотрим структуру вызова на клиенте:
&НаКлиенте
Процедура ОткрытьОтчетПоФизическомуЛицу(Команда)
// Проверим, записан ли текущий элемент
Если Объект.Ссылка.Пустая() Тогда
ПоказатьПредупреждение(, "Перед формированием отчета необходимо записать элемент!");
Возврат;
КонецЕсли;
// Формируем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ФизЛицо", Объект.Ссылка);
// Формируем параметры открытия формы отчета
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", ПараметрыОтбора);
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
// Открываем форму отчета
ОткрытьФорму("Отчет.ВедомостьПоДолжникам.Форма.ФормаОтчета", ПараметрыОткрытия);
КонецПроцедуры
Проанализируем распространенную ошибку начинающих разработчиков. При попытке передать текущий элемент в отбор в модуль формы часто пишут следующий код:
ПараметрыОтбора.Вставить("ФизЛицо", ЭтотОбъект);
При выполнении этого кода возникает системная ошибка передачи данных между клиентом и сервером либо сообщение о некорректном типе данных. Выясним причину этой ошибки:
ЭтотОбъект: В контексте модуля управляемой формы ключевое слово ЭтотОбъект возвращает контекст самой формы (объект типа УправляемаяФорма), а не элемент справочника. Форма не может быть передана в качестве ссылки на данные информационной базы.Объект (тип ДанныеФормыСтруктура).СправочникСсылка.ФизическиеЛица). Поэтому для установки отбора необходимо передавать реквизит Объект.Ссылка.После исправления ссылки разработчики часто сталкиваются со следующим поведением: если открыть отчет по одному сотруднику, не закрывать его, перейти в карточку другого сотрудника и снова нажать кнопку, открывается то же самое окно с данными первого сотрудника. Новые параметры игнорируются, а отчет не переформировывается.
Рассмотрим подробнее работу механизма уникальности форм в методе ОткрытьФорму. Метод имеет следующий синтаксис:
ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)
Четвертый параметр — Уникальность — управляет повторным открытием форм:
Ложь или не указано): Платформа ищет уже существующую открытую форму с таким же именем. Если форма найдена, платформа просто активирует ее окно на экране, не перечитывая заново параметры Отбор и не вызывая обработчик инициализации заново.Истина: Платформа будет создавать абсолютно новое независимое окно отчета при каждом нажатии. Если нажать кнопку десять раз, откроется десять разных окон.Посмотрим на пример правильного вызова с контролем уникальности:
&НаКлиенте
Процедура ОткрытьОтчетПоДолгам(Команда)
Если Объект.Ссылка.Пустая() Тогда
Предупреждение("Сначала запишите элемент справочника!");
Возврат;
КонецЕсли;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ФизЛицо", Объект.Ссылка);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Отбор", ПараметрыОтбора);
// В качестве 4-го параметра передаем ссылку текущего объекта
ОткрытьФорму("Отчет.ВедомостьПоДолжникам.Форма.ФормаОтчета",
ПараметрыОткрытия,
ЭтотОбъект,
Объект.Ссылка);
КонецПроцедуры
В этом случае для разных физических лиц будут открыты разные окна отчетов, а при повторном нажатии в карточке того же самого лица платформа просто переключит фокус на уже существующую вкладку.
При использовании параметра Отбор необходимо учитывать несколько системных правил:
Отбор принимает только соответствие на равенство (вид сравнения Равно). Если требуется установить условие В списке или Не равно, необходимо передавать настройки через коллекцию ФиксированныеНастройки компоновщика настроек отчета.Организация, Контрагент.ГоловнойКонтрагент и т.д.).Объект.Ссылка.Пустая() перед открытием отчета. Если вызвать отчет из новой, еще не сохраненной карточки, отчет откроется с условием отбора по пустой ссылке, что приведет к неверному выводу информации.