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

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

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

Проанализируем типовую ситуацию, когда простая строчка присваивания цвета вызывает исключительную ситуацию:


ОбластьЦенника.Область(1, 1).ЦветТекста = ЭлементыФормы.ПолеТабличногоДокумента1.Область(1, 1).ЦветТекста;

При выполнении этого кода платформа 1С может выдать ошибку «Несоответствие типов», несмотря на то что при прямой установке системного цвета (например, через WebЦвета.Зеленый) код отрабатывает штатно, а отладчик на первый взгляд показывает совпадающие типы данных.

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

Причины возникновения ошибки «Несоответствие типов»

Свойства ЦветТекста, ЦветФона и ЦветРамки объекта ОбластьЯчеекТабличногоДокумента являются строго типизированными. Они принимают исключительно значение типа Цвет. Если в ячейку-приемник передается значение другого типа (включая Неопределено), платформа незамедлительно прерывает выполнение с ошибкой несоответствия типов.

Выделим ключевые причины сбоя при чтении цвета из ячейки-источника:

  1. Значение Неопределено вместо реального цвета: если область охватывает диапазон ячеек с разным оформлением либо считывается пустая неинициализированная ячейка, свойство ЦветТекста возвращает Неопределено. В отличие от некоторых других свойств, сбросить или перетереть цвет значением Неопределено нельзя.
  2. Повреждение привязки элемента управления: в обычном приложении элемент ПолеТабличногоДокумента связывается с реквизитом через свойство «Данные». При программных или визуальных переработках формы внутренние ссылки контрола могут сбиться, из-за чего прямое обращение через ЭлементыФормы начинает возвращать некорректные системные ссылки на область ячеек.

Способ 1. Пересоздание элемента формы и проверка привязки данных

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

  1. Удалим существующий элемент ПолеТабличногоДокумента1 с формы.
  2. Добавим новый элемент управления ПолеТабличногоДокумента и зададим ему нужное имя.
  3. Проверим свойство Данные: рекомендуется привязать элемент к реквизиту формы с типом ТабличныйДокумент.
  4. В коде модуля обратимся не к элементу интерфейса, а непосредственно к связанному реквизиту формы, что исключит побочные эффекты слоя визуализации.

Именно пересоздание элемента управления позволило автору темы полностью устранить ошибку типизации.

Способ 2. Безопасное присваивание цвета с проверкой типа

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


ЦветИсточника = ЭлементыФормы.ПолеТабличногоДокумента1.Область(1, 1).ЦветТекста;

Если ТипЗнч(ЦветИсточника) = Тип("Цвет") Тогда
    ОбластьЦенника.Область(1, 1).ЦветТекста = ЦветИсточника;
Иначе
    // Если цвет не задан, явно инициализируем цвет по умолчанию
    ОбластьЦенника.Область(1, 1).ЦветТекста = Новый Цвет;
КонецЕсли;

Конструкция Новый Цвет без параметров создает объект цвета с видом АвтоЦвет, что эквивалентно стандартному оформлению платформы и корректно воспринимается свойством ЦветТекста.

Способ 3. Комплексный перенос оформления через метод ВставитьОбласть()

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

Посмотрим на пример использования метода без смещения существующих ячеек:


ЯчейкаИсточник = ПолеТабличногоДокумента1.Область(1, 1);
ЯчейкаПриемник = ОбластьЦенника.Область(1, 1);

// Переносим оформление ячейки целиком
ТабличныйДокументПриемник.ВставитьОбласть(
    ЯчейкаИсточник,
    ЯчейкаПриемник,
    ТипСмещенияТабличногоДокумента.БезСмещения,
    Ложь
);

// При необходимости перезаписываем только текст, сохраняя перенесенный стиль
ЯчейкаПриемник.Текст = "Новая цена";

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

← На главную