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