В процессе разработки часто возникает задача модификации уже выведенного табличного документа. Типичный сценарий: сначала мы считываем данные из внешнего файла и строим таблицу, а затем, после создания объектов в информационной базе, хотим дополнить эту таблицу ссылками на созданные элементы с возможностью их открытия (расшифровкой). В этой статье мы подробно разберем, как правильно управлять содержимым ячеек и почему иногда вместо ожидаемого текста 1С отображает пустые скобки <>.
Рассмотрим ситуацию, с которой столкнулся автор темы. При попытке программно установить текст и расшифровку в ячейку табличного документа, вместо наименования номенклатуры в поле отображаются символы <>. Проанализируем фрагмент кода, который привел к этой проблеме:
ОбластьГруппы = ТабДок.Область(К, 7, К, 7);
ОбластьГруппы.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
ОбластьГруппы.Расшифровка = СозданнаяНоменклатура.Родитель;
ОбластьГруппы.Текст = СокрЛП(СозданнаяНоменклатура.Родитель);
Выясним причину такого поведения системы. Основная ошибка здесь заключается в установке свойства Заполнение в значение Параметр. Выбор этого типа заполнения оправдан только на этапе работы с макетом, когда вы готовите область для метода Вывести() или Заполнить(). Когда свойство Заполнение установлено как Параметр, 1С ожидает, что значение в ячейку будет передано через структуру параметров. Если же вы записываете текст напрямую в свойство Текст уже сформированного документа, система игнорирует его, так как "ищет" параметр с именем, которое (в данном случае) даже не определено. В результате мы видим пустые угловые скобки.
Важное правило: Если вы работаете с уже выведенным, готовым табличным документом и хотите просто изменить текст в конкретной ячейке, свойство Заполнение должно иметь значение ТипЗаполненияОбластиТабличногоДокумента.Текст (это значение по умолчанию).
Рассмотрим корректный способ добавления данных в ячейку. Для того чтобы в ячейке отображалось строковое представление объекта, а при двойном клике открывалась его форма, достаточно следующего кода:
// Получаем область (одна конкретная ячейка)
ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);
// Убеждаемся, что режим заполнения — Текст
ОбластьЯчейки.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Текст;
// Устанавливаем текст, который увидит пользователь
ОбластьЯчейки.Текст = Строка(СсылкаНаНоменклатуру);
// Устанавливаем данные расшифровки (саму ссылку)
ОбластьЯчейки.Расшифровка = СсылкаНаНоменклатуру;
В этом случае 1С корректно отобразит название объекта и сохранит ссылку "под капотом". Однако этот метод требует ручного обновления текста, если ссылка вдруг изменится.
Разберем более продвинутый и профессиональный способ работы с данными в табличном документе. 1С позволяет ячейке вести себя подобно полю ввода на форме. Для этого используются свойства СодержитЗначение, ТипЗначения и Значение. Посмотрим, как это реализовать на практике:
ОбластьЯчейки = ТабДок.Область(К, 7);
// Сообщаем системе, что ячейка хранит типизированное значение
ОбластьЯчейки.СодержитЗначение = Истина;
// Назначаем тип (необязательно, если сразу присваиваем значение)
ОбластьЯчейки.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
// Записываем саму ссылку
ОбластьЯчейки.Значение = СозданнаяНоменклатура;
// Текст сформируется автоматически на основании представления ссылки
Преимущества этого метода очевидны:
Формат (например, "ЧДЦ=2" для округления до копеек).Проанализируем ситуацию: код написан верно, но при двойном клике по ячейке ничего не происходит. Почему так бывает? В 1С работа расшифровки напрямую зависит от состояния табличного документа.
Чтобы расшифровка "отрабатывала" (то есть открывала форму объекта или вызывала событие), табличный документ или его область должны находиться в режиме Только просмотр. Если документ доступен для редактирования, то двойной клик просто переводит ячейку в режим ввода текста.
Посмотрим, как управлять этим программно:
// Сделать весь документ доступным только для чтения
ТабДок.ТолькоПросмотр = Истина;
// Или, если нужно оставить возможность редактирования других ячеек:
// 1. У документа ТолькоПросмотр = Ложь
// 2. У конкретной ячейки устанавливаем свойство Защита
ОбластьЯчейки.Защита = Истина;
В Обычных формах (которые обсуждались в теме) этого достаточно. Если же вы работаете в Управляемых формах, помните, что для обработки расшифровки у элемента формы Поле табличного документа должен быть назначен обработчик события ОбработкаРасшифровки. Если вы хотите, чтобы открывалась стандартная форма, в этом обработчике параметру СтандартнаяОбработка нужно оставить значение Истина.
В ходе обсуждения на форуме был затронут важный нюанс: работа с объединенными областями. Если ячейка, в которую вы хотите записать значение, является частью объединенной области (например, R1C1:R1C5), обращаться к ней нужно правильно.
Правило обращения: При записи текста или значения в объединенную область, всегда адресуйте данные в верхнюю левую ячейку этой области. Если вы попытаетесь записать текст в "середину" объединения (например, в R1C3), результат может не отобразиться.
Пример обращения по координатам (строка, колонка):
// Если ячейки 7, 8 и 9 в строке К объединены
Область = ТабДок.Область(К, 7); // Обращаемся к началу объединения
Область.Текст = "Номенклатура создана";
Подведем итог. Чтобы успешно добавить значение и расшифровку в сформированный документ, выполните следующие действия:
Текст + Расшифровка, либо типизированное Значение (рекомендуется).Заполнение = Параметр для ячеек уже выведенного документа, если не планируете повторно вызывать метод Заполнить().ТолькоПросмотр у табличного документа — без него расшифровка по двойному клику не сработает.СодержитЗначение = Истина, это позволит избежать проблем с форматированием текста.Следуя этим правилам, вы сможете динамически изменять табличные документы, делая их интерактивными и удобными для пользователя.