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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Почему нельзя просто прочитать значение из ячейки таблицы

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

Сам объект данных при этом в теле ячейки не сохраняется. Единственным штатным механизмом платформы, позволяющим связать визуальное представление с прикладным объектом базы данных, является реквизит Расшифровка ячейки.

Роль расшифровки и сигнатура процедуры ОбработкаЯчейкиТаблицы

Для перехвата двойного клика мыши (или нажатия клавиши Enter) по ячейке в модуле отчета используется предопределенная процедура ОбработкаЯчейкиТаблицы. Распространенная ошибка заключается в неверном объявлении параметров этой процедуры.

Посмотрим на полную сигнатуру предопределенной процедуры:


Процедура ОбработкаЯчейкиТаблицы(Значение, ФлагСтандартнойОбработки, Таблица, Адрес)
    // Значение - то, что передано в поле "Расшифровка" ячейки
    // ФлагСтандартнойОбработки - признак вызова встроенного поведения 1С (1 или 0)
    // Таблица - ссылка на объект таблицы, в которой произошел клик
    // Адрес - строка вида "R1C1:R1C1", указывающая координаты ячейки
КонецПроцедуры

Если объявить процедуру только с одним параметром Значение, вы потеряете контроль над поведением платформы. Параметр ФлагСтандартнойОбработки (часто сокращаемый как ФСО) играет ключевую роль:

  1. Если ФлагСтандартнойОбработки = 1, платформа пытается самостоятельно обработать значение. Для ссылочных типов (документ, элемент справочника) она автоматически открывает их форму. Однако для примитивных типов (строка, число, дата) платформа выводит системное модальное предупреждение с этим значением.
  2. Если ФлагСтандартнойОбработки = 0, стандартное действие платформы блокируется, и выполнение полностью переходит к пользовательскому коду на встроенном языке.

Разбор частых ошибок при открытии документов

Рассмотрим две характерные ошибки, возникающие при попытке открыть документ из таблицы:

  1. Ошибка «Значение не представляет агрегатный объект (ТекущийДокумент)». Если колонка таблицы значений уже заполнена ссылкой (например, ТЗ.Документ = Запрос.ТекущийДокумент;), то переменная ТЗ.Документ сама по себе является ссылкой на документ. Метод ТекущийДокумент() применим только к объекту выборки или контексту формы, но не к ссылке. Повторный вызов метода у готовой ссылки вызывает исключение.
  2. Появление системного предупреждения с текстом команды. Если в расшифровку ячейки-кнопки (например, стрелки сортировки) передана строковая команда вроде "НомерЭСЧФ+", а ФлагСтандартнойОбработки остался равен 1, 1С отсортирует отчет, но при этом покажет модальное окно с текстом этой строки. Чтобы этого не происходило, для служебных команд необходимо явно выставлять ФлагСтандартнойОбработки = 0.

Пошаговое решение: совмещение ссылок и служебных команд сортировки

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

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

В свойствах ячеек макета на вкладке «Текст» или «Выражение» настраиваем поля отображения и расшифровки:

  1. Для ячеек с документами в поле «Текст» (или «Выражение») указываем ТЗ.Документ. В поле «Расшифровка» также прописываем ТЗ.Документ (без кавычек, чтобы передавался сам объект, а не строка).
  2. Для ячеек управления сортировкой в поле «Текст» выводим значок (например, ▲ или ▼), а в поле «Расшифровка» пишем текстовый идентификатор действия в кавычках: "ТекстЯчейкиДокументВверх", "ТекстЯчейкиНомерЭСЧФВниз" и т.д.

Шаг 2. Написание кода процедуры ОбработкаЯчейкиТаблицы

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


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

Альтернативный вариант: передача составных параметров через СписокЗначений

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

Посмотрим на пример заполнения расшифровки в цикле формирования отчета:


ПараметрыКлика = СоздатьОбъект("СписокЗначений");
ПараметрыКлика.Установить("Команда", "ОткрытьКарточку");
ПараметрыКлика.Установить("Документ", ТЗ.Документ);

Таб.ВывестиСекцию("Строка");
// Динамически переопределяем расшифровку выведенной ячейки
Таб.Область("R" + Таб.ВысотаТаблицы() + "C2").Расшифровка(ПараметрыКлика);

Теперь рассмотрим, как выглядит обработка такого составного значения:


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

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

← На главную