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