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