При разработке отчетов и печатных форм на платформе 1С:Предприятие одной из частых задач является создание интерактивных документов. Мы хотим, чтобы пользователь мог не просто увидеть текстовые данные (например, наименование номенклатуры), но и кликнуть по ячейке дважды, чтобы открыть соответствующую карточку справочника или документа. Это поведение в системе называется расшифровкой.
Однако начинающие разработчики часто сталкиваются с ошибкой "Значение не является значением объектного типа" при попытке программно заполнить параметры расшифровки по координатам ячеек. В этой статье мы подробно разберем, почему возникает данная ошибка, в чем разница между ключевыми методами работы с областями макета и как правильно написать рабочий код несколькими способами.
Давайте проанализируем ситуацию, которая часто приводит к ошибке. Предположим, у нас есть макет, в котором для ячейки с координатами R5C3 (5-я строка, 3-я колонка) в свойствах указано заполнение "Параметр", а в качестве параметра расшифровки прописано имя СсылкаНаНоменклатуру.
Разработчик пытается написать следующий код в цикле выборки данных:
Макет.Область("R5C3").Параметр = Выборка.НоменклатураНаименование;
Макет.Область("R5C3").ПараметрРасшифровки.СсылкаНаНоменклатуру = Выборка.СсылкаНаНоменклатуру;
В результате платформа выдает ошибку: «Значение не является значением объектного типа (СсылкаНаНоменклатуру)». Почему так происходит?
Секрет кроется во внутренних механизмах платформы 1С и типах данных, которые возвращают различные методы табличного документа:
Макет.Область("R5C3") возвращает объект типа ОбластьЯчеекТабличногоДокумента.ОбластьЯчеекТабличногоДокумента свойство ПараметрРасшифровки является обычной Строкой. Оно содержит лишь текстовое имя параметра (в нашем случае строку "СсылкаНаНоменклатуру"), которое было задано в конфигураторе..ПараметрРасшифровки.СсылкаНаНоменклатуру) закономерно вызывает ошибку, так как у примитивного типа "Строка" не может быть никаких вложенных свойств.Теперь, когда мы поняли физику процесса, давайте рассмотрим варианты решения этой задачи.
Если вам необходимо работать именно по фиксированным координатам ячейки с помощью метода Область(), то использовать свойство ПараметрРасшифровки для передачи значения не нужно. Вместо этого у объекта ОбластьЯчеекТабличногоДокумента есть прямое свойство Расшифровка.
Разберем рабочий пример кода:
// Записываем текстовое представление в ячейку
Макет.Область("R5C4").Текст = Выборка.НоменклатураНаименование;
// Напрямую записываем ссылочное значение в свойство Расшифровка
Макет.Область("R5C4").Расшифровка = Выборка.НоменклатураСсылка;
В данном случае свойство Расшифровка принимает значение произвольного типа. Мы напрямую передаем туда ссылку на элемент справочника. При выводе документа в форму платформа сама поймет, что ячейка интерактивна, и при двойном клике откроет карточку номенклатуры.
Этот способ является более гибким, надежным и считается стандартом разработки в среде 1С. Вместо прямого обращения по координатам мы получаем именованную область макета (или область по координатам) как отдельный табличный документ.
Посмотрим на пример кода:
// Получаем область как отдельный ТабличныйДокумент
ОбластьНоменклатуры = Макет.ПолучитьОбласть("R5C3");
// Заполняем основной параметр текста
ОбластьНоменклатуры.Параметры.НоменклатураНаименование = Выборка.НоменклатураНаименование;
// Заполняем параметр расшифровки через коллекцию Параметры
ОбластьНоменклатуры.Параметры.СсылкаНаНоменклатуру = Выборка.СсылкаНаНоменклатуру;
// Выводим готовую область в результирующий табличный документ
ТабДок.Вывести(ОбластьНоменклатуры);
Почему этот способ работает без ошибок? Метод ПолучитьОбласть() возвращает объект типа ТабличныйДокумент. У этого объекта есть полноценное свойство Параметры (коллекция параметров табличного документа). Платформа автоматически сопоставляет имя параметра расшифровки, указанное в конфигураторе, со свойством в коллекции Параметры и корректно связывает визуальное отображение с расшифровкой.
Даже если ваш программный код написан абсолютно верно, расшифровка (когда при наведении мыши на ячейку курсор принимает вид "лупы") может не работать в интерфейсе. Давайте разберем чек-лист обязательных условий:
ТабДок.ТолькоПросмотр = Истина;
// или
ТабДок.Защита = Истина;
Неопределено или пустая ссылка, платформа проигнорирует клик по ячейке. Всегда проверяйте заполненность передаваемых данных.Диапазон возможностей расшифровки в 1С очень широк. В свойство Расшифровка или соответствующий параметр макета можно передавать:
СправочникСсылка, ДокументСсылка, ПланВидовХарактеристикСсылка). При активизации ячейки платформа автоматически откроет основную форму соответствующего объекта.Число, Строка, Дата, Булево). При двойном клике откроется небольшое модальное окно с отображением этого значения в текстовом виде.Структура, Массив, Соответствие). Это открывает огромные возможности для кастомизации. Вы можете упаковать в ячейку целый массив параметров, чтобы затем обработать их в специальном событии формы.Посмотрим на пример передачи сложной структуры в расшифровку:
ДанныеРасшифровки = Новый Структура;
ДанныеРасшифровки.Вставить("Номенклатура", Выборка.Номенклатура);
ДанныеРасшифровки.Вставить("Склад", Выборка.Склад);
ДанныеРасшифровки.Вставить("Период", Выборка.Период);
Макет.Область("R5C4").Расшифровка = ДанныеРасшифровки;
Если вы передали в расшифровку сложную структуру или хотите переопределить стандартное поведение платформы (например, вместо открытия карточки номенклатуры построить новый отчет с отбором по этой номенклатуре), вам потребуется использовать событие управляемой формы.
Для этого табличный документ должен быть выведен на управляемую форму как элемент управления (поле табличного документа). У этого элемента существует клиентское событие ОбработкаРасшифровки. Рассмотрим шаблон его заполнения:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// Отменяем стандартное поведение 1С (открытие карточки объекта)
СтандартнаяОбработка = Ложь;
// Проверяем тип пришедших данных
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
// Получаем наши параметры, которые мы упаковали в макете
ВыбраннаяНоменклатура = Расшифровка.Номенклатура;
ВыбранныйСклад = Расшифровка.Склад;
// Здесь пишем свой алгоритм, например, открытие другого отчета:
ПараметрыОтчета = Новый Структура;
ПараметрыОтчета.Вставить("ОтборНоменклатура", ВыбраннаяНоменклатура);
ПараметрыОтчета.Вставить("ОтборСклад", ВыбранныйСклад);
ОткрытьФорму("Отчет.ВедомостьПоТоварамНаСкладах.Форма", ПараметрыОтчета);
КонецЕсли;
КонецПроцедуры
В завершение разберем важный архитектурный аспект. Хотя обращение к ячейкам по жестко заданным координатам вида Область("R5C4") технически реализуемо и работает, мы настоятельно рекомендуем избегать этого подхода в реальных задачах по следующим причинам:
ПолучитьОбласть().Лучшая практика: Всегда создавайте именованные области в конфигураторе (например, "Шапка", "Строка", "Подвал") и заполняйте параметры через коллекцию Параметры полученной области. Это гарантирует быстродействие вашей программы и стабильность работы отчета при любых изменениях дизайна макета.