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

Программист 1С v8.3 (Обычные формы)
← На главную

В процессе разработки часто возникает задача модификации уже выведенного табличного документа. Типичный сценарий: сначала мы считываем данные из внешнего файла и строим таблицу, а затем, после создания объектов в информационной базе, хотим дополнить эту таблицу ссылками на созданные элементы с возможностью их открытия (расшифровкой). В этой статье мы подробно разберем, как правильно управлять содержимым ячеек и почему иногда вместо ожидаемого текста 1С отображает пустые скобки <>.

Разбор типовой ошибки: почему появляется текст <>

Рассмотрим ситуацию, с которой столкнулся автор темы. При попытке программно установить текст и расшифровку в ячейку табличного документа, вместо наименования номенклатуры в поле отображаются символы <>. Проанализируем фрагмент кода, который привел к этой проблеме:


ОбластьГруппы = ТабДок.Область(К, 7, К, 7); 
ОбластьГруппы.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
ОбластьГруппы.Расшифровка = СозданнаяНоменклатура.Родитель;
ОбластьГруппы.Текст = СокрЛП(СозданнаяНоменклатура.Родитель);

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

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

Правильный алгоритм установки текста и расшифровки

Рассмотрим корректный способ добавления данных в ячейку. Для того чтобы в ячейке отображалось строковое представление объекта, а при двойном клике открывалась его форма, достаточно следующего кода:


// Получаем область (одна конкретная ячейка)
ОбластьЯчейки = ТабДок.Область(НомерСтроки, НомерКолонки);

// Убеждаемся, что режим заполнения — Текст
ОбластьЯчейки.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Текст;

// Устанавливаем текст, который увидит пользователь
ОбластьЯчейки.Текст = Строка(СсылкаНаНоменклатуру);

// Устанавливаем данные расшифровки (саму ссылку)
ОбластьЯчейки.Расшифровка = СсылкаНаНоменклатуру;

В этом случае 1С корректно отобразит название объекта и сохранит ссылку "под капотом". Однако этот метод требует ручного обновления текста, если ссылка вдруг изменится.

Использование механизма «СодержитЗначение»

Разберем более продвинутый и профессиональный способ работы с данными в табличном документе. 1С позволяет ячейке вести себя подобно полю ввода на форме. Для этого используются свойства СодержитЗначение, ТипЗначения и Значение. Посмотрим, как это реализовать на практике:


ОбластьЯчейки = ТабДок.Область(К, 7);
// Сообщаем системе, что ячейка хранит типизированное значение
ОбластьЯчейки.СодержитЗначение = Истина;

// Назначаем тип (необязательно, если сразу присваиваем значение)
ОбластьЯчейки.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

// Записываем саму ссылку
ОбластьЯчейки.Значение = СозданнаяНоменклатура;

// Текст сформируется автоматически на основании представления ссылки

Преимущества этого метода очевидны:

  1. Система автоматически управляет отображением (представлением) объекта.
  2. Если в ячейке находится число или дата, вы можете легко управлять их форматом через свойство Формат (например, "ЧДЦ=2" для округления до копеек).
  3. Расшифровка (открытие карточки объекта) часто начинает работать автоматически, так как 1С понимает, что в ячейке лежит ссылка.

Обеспечение интерактивности: расшифровка и защита

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

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

Посмотрим, как управлять этим программно:


// Сделать весь документ доступным только для чтения
ТабДок.ТолькоПросмотр = Истина;

// Или, если нужно оставить возможность редактирования других ячеек:
// 1. У документа ТолькоПросмотр = Ложь
// 2. У конкретной ячейки устанавливаем свойство Защита
ОбластьЯчейки.Защита = Истина;

В Обычных формах (которые обсуждались в теме) этого достаточно. Если же вы работаете в Управляемых формах, помните, что для обработки расшифровки у элемента формы Поле табличного документа должен быть назначен обработчик события ОбработкаРасшифровки. Если вы хотите, чтобы открывалась стандартная форма, в этом обработчике параметру СтандартнаяОбработка нужно оставить значение Истина.

Работа с объединенными ячейками

В ходе обсуждения на форуме был затронут важный нюанс: работа с объединенными областями. Если ячейка, в которую вы хотите записать значение, является частью объединенной области (например, R1C1:R1C5), обращаться к ней нужно правильно.

Правило обращения: При записи текста или значения в объединенную область, всегда адресуйте данные в верхнюю левую ячейку этой области. Если вы попытаетесь записать текст в "середину" объединения (например, в R1C3), результат может не отобразиться.

Пример обращения по координатам (строка, колонка):


// Если ячейки 7, 8 и 9 в строке К объединены
Область = ТабДок.Область(К, 7); // Обращаемся к началу объединения
Область.Текст = "Номенклатура создана";

Резюме по решению проблемы

Подведем итог. Чтобы успешно добавить значение и расшифровку в сформированный документ, выполните следующие действия:

  1. Определитесь с методом: либо простая связка Текст + Расшифровка, либо типизированное Значение (рекомендуется).
  2. Никогда не устанавливайте Заполнение = Параметр для ячеек уже выведенного документа, если не планируете повторно вызывать метод Заполнить().
  3. Проверьте свойство ТолькоПросмотр у табличного документа — без него расшифровка по двойному клику не сработает.
  4. Если используете ссылки, лучше устанавливайте СодержитЗначение = Истина, это позволит избежать проблем с форматированием текста.

Следуя этим правилам, вы сможете динамически изменять табличные документы, делая их интерактивными и удобными для пользователя.

← На главную