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