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