Как реализовать расшифровку в табличном документе 1С вручную?

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

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

Шаг 1. Настройка ячейки в макете

Первым делом проанализируем состояние макета в конфигураторе. Для того чтобы 1С понимала, что ячейка является интерактивной, недостаточно просто вывести в нее текст. Нам необходимо поработать со свойствами ячейки:

  1. Откроем макет нашего отчета.
  2. Выделим ячейку, для которой планируется расшифровка.
  3. В палитре свойств найдем раздел Макет.
  4. Обратим внимание на поле Параметр расшифровки. Здесь нужно вписать имя параметра, например, ИмяПараметраРасшифровки.

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

Шаг 2. Программное заполнение данных в коде

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

Рассмотрим пример кода, который формирует область и заполняет данные для расшифровки:


// Получаем область из макета
ОбластьДетали = Макет.ПолучитьОбласть("Детали");

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

// ПРАВИЛЬНОЕ ЗАПОЛНЕНИЕ:
// Обращаемся к коллекции Параметры и используем имя, которое указали в макете
ОбластьДетали.Параметры.ИмяПараметраРасшифровки = ДанныеДляРасшифровки;

// Заполняем текстовое значение ячейки (если это параметр)
ОбластьДетали.Параметры.ЗначениеЯчейки = Выборка.Организация;

// Выводим область в результирующий табличный документ
ТабДок.Вывести(ОбластьДетали);

Проанализируем этот фрагмент. Мы используем Структура, чтобы передать сразу несколько значений. Это лучший подход, так как в обработчике на клиенте нам может понадобиться не только ссылка на объект, но и контекст (дата, фильтры и т.д.).

Шаг 3. Настройка свойств табличного документа

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

Шаг 4. Обработка расшифровки на клиенте

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

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


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

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

В этом примере мы видим использование СтандартнаяОбработка = Ложь. Это обязательное действие, если вы планируете выполнять собственные алгоритмы (открывать свои формы, выводить сообщения или формировать новые отчеты). Если этого не сделать, после выполнения вашего кода 1С может попытаться выполнить стандартное действие, что приведет к непредсказуемым результатам.

Дополнительные возможности: Автоматическое меню

Иногда требуется предложить пользователю выбор из нескольких действий при клике на ячейку. Проанализируем, как это реализовать проще всего. Если в параметр расшифровки (в Шаге 2) передать не структуру, а объект СписокЗначений, то 1С при двойном клике автоматически отобразит выпадающее меню со всеми элементами этого списка.

Рассмотрим пример:


СписокДействий = Новый СписокЗначений;
СписокДействий.Добавить("Действие1", "Посмотреть детализацию");
СписокДействий.Добавить("Действие2", "Сформировать график");

Область.Параметры.ИмяПараметраРасшифровки = СписокДействий;

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

Типичные ошибки и способы их решения

Проанализируем основные "загвоздки", которые мешают работе расшифровки:

  1. Расшифровка работает только на некоторых ячейках. Проверьте макет: скорее всего, для "нерабочих" ячеек не задано имя в свойстве "Параметр расшифровки".
  2. При клике открывается окно выбора типа. Это происходит, когда в расшифровке лежит составной тип данных, а СтандартнаяОбработка не установлена в Ложь.
  3. Код обработчика не срабатывает. Убедитесь, что процедура в модуле формы действительно назначена событию элемента в палитре свойств на вкладке "События". Просто написать код с именем ТабДокОбработкаРасшифровки недостаточно — нужно связать его с элементом.

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

← На главную