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

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

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

В чем заключается основная ошибка при использовании ПолучитьОбласть

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

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

Использование метода Область для прямого доступа

Для модификации уже выведенных данных в 1С существует метод Область(). В отличие от своего «собрата», он не копирует данные, а возвращает ссылку на конкретный диапазон ячеек в текущем документе. Любое свойство, измененное через этот объект, мгновенно отображается в таблице.

Проанализируем синтаксис метода Область():

ТабДок.Область(НомерНачалаСтроки, НомерНачалаКолонки, НомерКонцаСтроки, НомерКонцаКолонки)

Рассмотрим пример кода, который исправляет проблему автора и позволяет объединять ячейки и менять их оформление «на лету»:


// Предположим, сетка уже выведена методами Вывести() и Присоединить()
// Теперь нам нужно объединить ячейки и очистить их
ТекОбласть = Таб.Область(ВерхняяСтрока, ТекПроезд + 1, НижняяСтрока, ТекСтрока.Проезд - 1);

// Объединяем ячейки в одну
ТекОбласть.Объединить();

// Меняем оформление напрямую
ТекОбласть.Расшифровка = Неопределено;
ТекОбласть.ЦветФона = Новый Цвет(255, 255, 255); // Белый цвет
ТекОбласть.Текст = ""; // Очищаем текст

Работа со свойствами Текст и Значение: важные нюансы

Иногда при попытке изменить текст в ячейке программисты сталкиваются с ошибкой «Поле объекта недоступно для записи». Выясним причину этой ситуации. В табличном документе ячейка может работать в двух режимах, которые определяются свойством СодержитЗначение.

  1. Режим текста (СодержитЗначение = Ложь): В этом случае данные хранятся в свойстве Текст. Это обычная строка, которая просто отображается пользователю.
  2. Режим значения (СодержитЗначение = Истина): Этот режим используется, когда в ячейке нужно хранить ссылку на объект (например, на справочник «Номенклатура» или «Ячейки»). В этом случае данные записываются в свойство Значение, а свойство Текст становится недоступным для прямой записи (оно формируется автоматически или используется для представления).

Если вам нужно программно изменить содержимое ячейки, которая была выведена как параметр, проверьте настройки в макете или принудительно установите флаг в коде:


ОбластьДляИзменения = Таб.Область(5, 2, 5, 2); // Берем конкретную ячейку
ОбластьДляИзменения.СодержитЗначение = Ложь; // Отключаем типизацию значения
ОбластьДляИзменения.Текст = "Новое наименование ячейки";

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


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

Объединение ячеек и управление визуализацией

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

  1. Вывод базовой сетки: Сначала выводим документ, заполненный мелкими однотипными ячейками. Это наш «холст».
  2. Определение координат: В процессе обхода данных (например, таблицы значений с остатками) вычисляем координаты (с1, к1, с2, к2), которые соответствуют физическому расположению объекта на стеллаже.
  3. Групповое изменение: Используем метод Область() для получения этого диапазона.
  4. Применение свойств: Вызываем Объединить(). Помните, что после объединения визуальные свойства (текст, цвет) будут взяты из левой верхней ячейки диапазона. Поэтому сначала объединяйте, а потом назначайте текст и цвет.

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


Таб.ОтображатьСетку = Ложь;
Таб.ОтображатьЗаголовки = Ложь;
Таб.ТолькоПросмотр = Истина; // Позволяет работать расшифровке, но запрещает редактирование сетки пользователем

Оптимизация производительности

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

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


// Быстро: красим весь проезд (колонку) в серый цвет
Таб.Область(, НомерКолонкиПроезда, , НомерКолонкиПроезда).ЦветФона = ЦветаСтиля.ЦветФонаГруппировки;

Использование имен: Если область имеет логический смысл, ей можно назначить имя через свойство Имя. В дальнейшем это позволит обращаться к ней не по координатам, которые могут «поплыть» при изменении макета, а по понятному идентификатору: Таб.Область("Секция_А1").ЦветФона = ....

Таким образом, комбинируя методы Вывести для первоначального формирования и Область для последующей модификации, мы получаем гибкий инструмент для создания динамических и интерактивных отчетов в 1С.

← На главную