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