Как определить текущую ячейку в табличном документе и настроить расшифровку для открытия отчетов

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

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

Метод 1. Проверка координат и имен областей (Геометрический подход)

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

Для этого мы можем обратиться к свойству ТекущаяОбласть элемента формы, который отображает табличный документ. Проанализируем пример кода:


// Пример проверки номера колонки
Если Элементы.ТабДок.ТекущаяОбласть.Лево = 6 Тогда
    // Выполняем процедуру для шестой колонки
КонецЕсли;

Однако этот метод крайне хрупок. Если в макет добавится новая колонка слева, индекс сместится, и код перестанет работать. Более надежный способ — работа с именованными областями. Если в макете вы выделили область и задали ей имя (например, "ОбластьОтказы"), мы можем получить её границы и сравнить с текущим положением курсора.

Выясним, как программно получить границы области:


НужнаяОбласть = Макет.ПолучитьОбласть("ОбластьОтказы");
// Границы определяются свойствами:
// НужнаяОбласть.Верх, НужнаяОбласть.Низ, НужнаяОбласть.Лево, НужнаяОбласть.Право

Несмотря на работоспособность, такой подход требует ручного анализа координат при каждом клике, что неудобно при больших объемах данных или сложной структуре отчета.

Метод 2. Использование механизма расшифровки (Рекомендуемый подход)

Рассмотрим более профессиональный и гибкий инструмент — свойство Расшифровка ячейки. Этот механизм позволяет «привязать» к ячейке любые данные (строку, ссылку или целую структуру), которые будут переданы в обработчик события при клике.

Разберем по шагам, как настроить такую систему:

  1. Настройка макета: В макете отчета выберите ячейку, для которой нужна расшифровка. В палитре свойств найдите поле «Расшифровка». Укажите там имя параметра, например, ПарРасшифровки.
  2. Программное заполнение: При формировании табличного документа в коде заполните этот параметр данными.

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


Пока Выборка.Следующий() Цикл
    ОбластьДетали = Макет.ПолучитьОбласть("Детали");
    
    // Создаем структуру с данными для расшифровки
    ДанныеРасшифровки = Новый Структура;
    ДанныеРасшифровки.Вставить("ТипОтчета", "ОтчетПоОтказам");
    ДанныеРасшифровки.Вставить("СсылкаНаОбъект", Выборка.Ссылка);
    
    // Заполняем параметр расшифровки в области
    ОбластьДетали.Параметры.Заполнить(Выборка);
    ОбластьДетали.Параметры.ПарРасшифровки = ДанныеРасшифровки;
    
    ТабДок.Вывести(ОбластьДетали);
КонецЦикла;

Метод 3. Обработка расшифровки на форме

Теперь выясним, как перехватить нажатие на ячейку. Для элемента формы «Поле табличного документа» существует событие ОбработкаРасшифровки. Рассмотрим, как правильно написать код обработчика на стороне клиента.

Важно помнить: чтобы стандартное окно 1С не открывалось, необходимо установить СтандартнаяОбработка = Ложь.


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

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

Важный нюанс: Если вы используете СКД для формирования основного отчета, параметр Расшифровка будет содержать идентификатор, и данные нужно будет извлекать через ПолучитьДанныеРасшифровки(). Если же отчет «ручной» (через построчный вывод областей макета), в Расшифровка попадет ровно то значение, которое вы положили в Параметры в коде формирования.

Типичные ошибки и советы по отладке

Рассмотрим основные причины, по которым расшифровка может не работать:

Посмотрим на пример правильной последовательности вывода области:


Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Заполнить(ДанныеСтроки); // Сначала заполняем данные из запроса
// А теперь принудительно устанавливаем расшифровку, чтобы ее ничего не затерло
Область.Параметры.ПараметрРасшифровки = Новый Структура("Ключ", "Значение"); 
ТабДок.Вывести(Область);

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

← На главную