Как программно настроить расшифровку в табличном документе 1С при обращении по координатам?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Однако начинающие разработчики часто сталкиваются с ошибкой "Значение не является значением объектного типа" при попытке программно заполнить параметры расшифровки по координатам ячеек. В этой статье мы подробно разберем, почему возникает данная ошибка, в чем разница между ключевыми методами работы с областями макета и как правильно написать рабочий код несколькими способами.

Выясняем причину: почему возникает ошибка объектного типа?

Давайте проанализируем ситуацию, которая часто приводит к ошибке. Предположим, у нас есть макет, в котором для ячейки с координатами R5C3 (5-я строка, 3-я колонка) в свойствах указано заполнение "Параметр", а в качестве параметра расшифровки прописано имя СсылкаНаНоменклатуру.

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


Макет.Область("R5C3").Параметр = Выборка.НоменклатураНаименование;
Макет.Область("R5C3").ПараметрРасшифровки.СсылкаНаНоменклатуру = Выборка.СсылкаНаНоменклатуру;

В результате платформа выдает ошибку: «Значение не является значением объектного типа (СсылкаНаНоменклатуру)». Почему так происходит?

Секрет кроется во внутренних механизмах платформы 1С и типах данных, которые возвращают различные методы табличного документа:

  1. Метод Макет.Область("R5C3") возвращает объект типа ОбластьЯчеекТабличногоДокумента.
  2. У объекта ОбластьЯчеекТабличногоДокумента свойство ПараметрРасшифровки является обычной Строкой. Оно содержит лишь текстовое имя параметра (в нашем случае строку "СсылкаНаНоменклатуру"), которое было задано в конфигураторе.
  3. Попытка обратиться к свойству строки через точку (.ПараметрРасшифровки.СсылкаНаНоменклатуру) закономерно вызывает ошибку, так как у примитивного типа "Строка" не может быть никаких вложенных свойств.

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

Способ №1. Прямая запись в свойство "Расшифровка" (работа по координатам)

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

Разберем рабочий пример кода:


// Записываем текстовое представление в ячейку
Макет.Область("R5C4").Текст = Выборка.НоменклатураНаименование;

// Напрямую записываем ссылочное значение в свойство Расшифровка
Макет.Область("R5C4").Расшифровка = Выборка.НоменклатураСсылка;

В данном случае свойство Расшифровка принимает значение произвольного типа. Мы напрямую передаем туда ссылку на элемент справочника. При выводе документа в форму платформа сама поймет, что ячейка интерактивна, и при двойном клике откроет карточку номенклатуры.

Способ №2. Использование метода "ПолучитьОбласть" и коллекции параметров

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

Посмотрим на пример кода:


// Получаем область как отдельный ТабличныйДокумент
ОбластьНоменклатуры = Макет.ПолучитьОбласть("R5C3");

// Заполняем основной параметр текста
ОбластьНоменклатуры.Параметры.НоменклатураНаименование = Выборка.НоменклатураНаименование;

// Заполняем параметр расшифровки через коллекцию Параметры
ОбластьНоменклатуры.Параметры.СсылкаНаНоменклатуру = Выборка.СсылкаНаНоменклатуру;

// Выводим готовую область в результирующий табличный документ
ТабДок.Вывести(ОбластьНоменклатуры);

Почему этот способ работает без ошибок? Метод ПолучитьОбласть() возвращает объект типа ТабличныйДокумент. У этого объекта есть полноценное свойство Параметры (коллекция параметров табличного документа). Платформа автоматически сопоставляет имя параметра расшифровки, указанное в конфигураторе, со свойством в коллекции Параметры и корректно связывает визуальное отображение с расшифровкой.

Обязательные условия для работы расшифровки в режиме Предприятия

Даже если ваш программный код написан абсолютно верно, расшифровка (когда при наведении мыши на ячейку курсор принимает вид "лупы") может не работать в интерфейсе. Давайте разберем чек-лист обязательных условий:

  1. Запрет редактирования документа: Итоговый табличный документ обязательно должен быть защищен от изменений пользователем. Если документ доступен для редактирования, двойной клик по ячейке будет открывать ее для ввода текста, а не для расшифровки.
  2. Заполнение свойств защиты в коде: Перед выводом табличного документа на экран обязательно пропишите:
    
    ТабДок.ТолькоПросмотр = Истина;
    // или
    ТабДок.Защита = Истина;
    
  3. Проверка на пустое значение: Если в поле расшифровки попадет значение Неопределено или пустая ссылка, платформа проигнорирует клик по ячейке. Всегда проверяйте заполненность передаваемых данных.

Что можно передавать в значение расшифровки?

Диапазон возможностей расшифровки в 1С очень широк. В свойство Расшифровка или соответствующий параметр макета можно передавать:

Посмотрим на пример передачи сложной структуры в расшифровку:


ДанныеРасшифровки = Новый Структура;
ДанныеРасшифровки.Вставить("Номенклатура", Выборка.Номенклатура);
ДанныеРасшифровки.Вставить("Склад", Выборка.Склад);
ДанныеРасшифровки.Вставить("Период", Выборка.Период);

Макет.Область("R5C4").Расшифровка = ДанныеРасшифровки;

Как перехватить клик пользователя: событие "ОбработкаРасшифровки"

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

Для этого табличный документ должен быть выведен на управляемую форму как элемент управления (поле табличного документа). У этого элемента существует клиентское событие ОбработкаРасшифровки. Рассмотрим шаблон его заполнения:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    // Отменяем стандартное поведение 1С (открытие карточки объекта)
    СтандартнаяОбработка = Ложь;
    
    // Проверяем тип пришедших данных
    Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
        
        // Получаем наши параметры, которые мы упаковали в макете
        ВыбраннаяНоменклатура = Расшифровка.Номенклатура;
        ВыбранныйСклад        = Расшифровка.Склад;
        
        // Здесь пишем свой алгоритм, например, открытие другого отчета:
        ПараметрыОтчета = Новый Структура;
        ПараметрыОтчета.Вставить("ОтборНоменклатура", ВыбраннаяНоменклатура);
        ПараметрыОтчета.Вставить("ОтборСклад", ВыбранныйСклад);
        
        ОткрытьФорму("Отчет.ВедомостьПоТоварамНаСкладах.Форма", ПараметрыОтчета);
        
    КонецЕсли;
    
КонецПроцедуры

Рекомендации по производительности: почему координаты — это плохой тон?

В завершение разберем важный архитектурный аспект. Хотя обращение к ячейкам по жестко заданным координатам вида Область("R5C4") технически реализуемо и работает, мы настоятельно рекомендуем избегать этого подхода в реальных задачах по следующим причинам:

Лучшая практика: Всегда создавайте именованные области в конфигураторе (например, "Шапка", "Строка", "Подвал") и заполняйте параметры через коллекцию Параметры полученной области. Это гарантирует быстродействие вашей программы и стабильность работы отчета при любых изменениях дизайна макета.

← На главную