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

Программист 1С v7.7 Управленческий учет Промышленность, строительство и АПК
← На главную

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

Анализ исходной ситуации

Проанализируем типичный код, в котором происходит перебор документов определенных видов за выбранный период. В нашем примере выполняется поиск документов «ВыпускРулоннойПродукции», «ДвижениеМПЗ», «ТребованиеНакладная» и «РеализацияПродукции». При нахождении соответствия по номеру рулона данные выводятся в секцию таблицы. Однако изначально таблица просто отображает текст, не позволяя перейти к источнику данных.

Разберем базовый алгоритм, который использовал автор темы:


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

Механизм расшифровки в 1С 7.7

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

Существует два основных способа работы с расшифровкой:

  1. Мягкая расшифровка (использование символа #): Если в поле «Расшифровка» указать имя переменной и добавить в конце символ решетки (например, ТекРасшифровка#), система при нажатии автоматически откроет форму объекта (документа или элемента справочника).
  2. Программная обработка: Если символа решетки нет, то при нажатии на ячейку вызывается предопределенная процедура ОбработкаРасшифровки в модуле формы отчета, где программист сам описывает логику (например, открытие другого отчета).

Пошаговое решение задачи

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

Шаг 1. Подготовка переменной в модуле

Выясним, какой именно объект мы хотим открывать. В цикле обхода документов у нас есть переменная Док. Однако важно помнить, что в 1С 7.7 Док — это объект-итератор. Чтобы передать в таблицу конкретную ссылку на документ, необходимо использовать метод ТекущийДокумент(). Рассмотрим исправленный фрагмент кода в процедуре Сформировать:


// Перед выводом каждой строки таблицы мы должны обновить значение переменной расшифровки
ТекРасшифровка = Док.ТекущийДокумент(); 
Таб.ВывестиСекцию("Строка_1");

Шаг 2. Настройка шаблона таблицы

Теперь перейдем в конфигуратор, откроем таблицу отчета и найдем ячейку в секции Строка_1, на которую пользователь будет нажимать (например, ячейку с номером документа или названием). Выполним следующие действия:

  1. Щелкните правой кнопкой мыши по ячейке и выберите «Свойства».
  2. Перейдите на закладку «Текст».
  3. В поле «Расшифровка» введите имя нашей переменной с символом решетки: ТекРасшифровка#.

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

Оптимизация производительности: Использование объекта «Запрос»

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

Мы рекомендуем использовать объект Запрос. Он позволяет выполнить фильтрацию данных на уровне сервера базы данных. Рассмотрим пример реализации более быстрого поиска:


ТекстЗапроса = "
|Период с ВыбНачПериода по ВыбКонПериода;
|Док = Документ.ВыпускРулоннойПродукции.ТекущийДокумент, 
|      Документ.РеализацияПродукции.ТекущийДокумент;
|НомРул = Документ.ВыпускРулоннойПродукции.НомерРулона, 
|         Документ.РеализацияПродукции.Номер;
|Группировка Док;
|Условие (НомРул = НомерИщем);
|";

Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка(1) = 1 Цикл
        ТекРасшифровка = Запрос.Док;
        // Здесь заполняем данные для секции из объекта Запрос.Док
        Таб.ВывестиСекцию("Строка_1");
    КонецЦикла;
КонецЕсли;

Такой подход значительно сократит время ожидания для пользователя и снизит нагрузку на систему.

Визуальное выделение интерактивных элементов

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

Эти настройки задаются в свойствах ячейки на закладке «Шрифт» в конфигураторе.

Обработка расшифровки вручную

Бывают ситуации, когда нужно не просто открыть документ, а, например, открыть другой отчет с фильтром по этому документу. В таком случае в поле «Расшифровка» пишем просто ТекРасшифровка (без решетки), а в модуле формы отчета создаем процедуру:


Процедура ОбработкаРасшифровки(ЗначениеРасшифровки, ФлагСтандартнойОбработки)
    Если ТипЗначенияСтр(ЗначениеРасшифровки) = "Документ" Тогда
        // Запрещаем стандартное открытие формы, если хотим сделать что-то свое
        // ФлагСтандартнойОбработки = 0; 
        
        // Пример: выведем сообщение о виде документа
        Сообщить("Вы открываете документ вида: " + ЗначениеРасшифровки.Вид());
    КонецЕсли;
КонецПроцедуры

Подведем итог. Для реализации задачи автора достаточно было добавить переменную в модуль перед выводом секции и прописать ее в свойствах ячейки с символом #. Это самый простой и эффективный способ сделать отчет «живым» в среде 1С 7.7.

← На главную