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

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

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

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

Почему стандартное поведение платформы не подходит и какие ошибки совершают?

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

Попытки решить задачу «в лоб» часто приводят к следующей проблематике:

  1. Попытка изменить тип основного реквизита внешнего отчета. Иногда разработчики пытаются указать в качестве основного реквизита обработки или отчета ДокументОбъект вместо ВнешнийОтчетОбъект. Это некорректно и может приводить к аварийному завершению работы платформы.
  2. Использование несуществующих методов. Попытка вызвать методы вроде Выбор() у результата компоновки данных вызывает ошибку «Метод объекта не обнаружен». Нажатия на ячейки обрабатываются исключительно через механизм расшифровки табличного документа.

Способ 1. Добавление формы отчета и перехват события расшифровки

Рассмотрим основной и самый безопасный метод решения задачи в рамках внешнего отчета — создание собственной формы отчета и обработка события ОбработкаРасшифровки у табличного документа.

Разберем процесс по шагам:

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

Посмотрим на пример кода обработки расшифровки:


Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    // Отключаем стандартный переход по ссылке
    СтандартнаяОбработка = Ложь;
    
    // Получаем текущие данные расшифровки
    Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    ЭлементРасшифровки = Данные.Элементы[Расшифровка];
    
    // Проверяем, содержит ли элемент ссылку на нужный документ
    Для Каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
        Если ТипЗнч(Поле.Значение) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
            
            // Формируем параметры для открытия формы
            ПараметрыФормы = Новый Структура;
            ПараметрыФормы.Вставить("Ключ", Поле.Значение);
            
            // Открываем необходимую форму
            ОткрытьФорму("Документ.ЗаказПокупателя.Форма.НашаФормаЗаказа", ПараметрыФормы);
            Возврат;
            
        КонецЕсли;
    КонецЦикла;

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

Способ 2. Использование события ОбработкаПолученияФормы в модуле менеджера

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

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

Разберем пример реализации данного метода:


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

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

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

Итоги

Мы разобрали два надежных подхода к открытию произвольной формы из отчета СКД:

← На главную