Как встроить отчет или историю регистра в форму документа в обычных формах 1С?

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

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

Способ 1. Программный вывод отчета на СКД в элемент формы «Поле табличного документа»

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

Разберем по шагам, как настроить встроенный вывод отчета:

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

Посмотрим на пример процедуры формирования макета СКД в поле табличного документа:


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

Такой подход обеспечивает полноценную верстку СКД прямо внутри формы документа без открытия дополнительных окон.

Способ 2. Отображение списка регистра через динамическое табличное поле

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

Разберем по шагам, как реализовать этот вариант:

  1. На отдельную вкладку панели документа помещаем элемент управления ТабличноеПоле.
  2. В свойстве элемента ТипЗначения выбираем тип динамического списка: РегистрСведенийСписок.<ИмяРегистра>.
  3. В коде формы накладываем фиксированный отбор по ссылке текущего документа:

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

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

Способ 3. Использование механизма внешних печатных форм

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

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

Способ 4. Открытие отдельной формы отчета с установленными отборами

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

Посмотрим на пример открытия формы существующего отчета с передачей ссылки на документ:


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

Важные правила оптимизации и нюансы работы

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

  1. Ленивая инициализация (Lazy Loading): Никогда не формируйте встроенный отчет в процедуре ПриОткрытии формы документа. Это заблокирует быстрый доступ к документу. Выполняйте построение в событии панели ПриСменеСтраницы, только когда пользователь физически кликнул на вкладку с отчетом.
  2. Проверка нового документа: Всегда проверяйте условие ЭтоНовый(). Не записанный в базу документ не имеет постоянной ссылки, поэтому выборки по регистру сведений вернут пустой результат.
  3. Контроль модифицированности: При заполнении элементов формы убедитесь, что не устанавливается флаг Модифицированность = Истина. Вывод данных в ПолеТабличногоДокумента или настройка отбора в динамическом списке не влияют на изменение самого документа, сохраняя корректную работу флага записи.
← На главную