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