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