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