При активной доработке конфигураций с помощью расширений разработчики нередко сталкиваются с неприятной ситуацией: в заимствованной управляемой форме внезапно исчезают добавленные колонки табличной части (так называемые «красные» реквизиты формы, существующие внутри коллекции Объект.ТабличнаяЧасть). Проблема часто проявляется после динамического применения изменений («демонского обновления»), при этом повторное обновление формы из основной конфигурации или ручное добавление одноименных колонок не дает результата. Проанализируем, почему возникает данный сбой, и подробно разберем по шагам надежные способы его устранения.
Чтобы понять природу ошибки, рассмотрим особенности работы платформы 1С с расширениями:
ПутьКДанным, что делает отображение колонок невозможным.rphost или в локальном кэше пользователя «залипает» старая версия метаданных расширения.Разберем первоочередные действия, которые позволяют восстановить нормальную работу без переписывания метаданных:
%LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).1C:Enterprise Server Agent, очистить каталог серверного кэша и запустить службу заново.Если кэш очищен, а форма продолжает вести себя некорректно, типовая функция конфигуратора «Обновить форму из основной конфигурации» не всегда корректно восстанавливает структуру искусственных реквизитов. Выполним полное перезаимствование формы:
Если сбой затронул служебные таблицы расширений в базе данных, проанализируем следующий алгоритм:
.cfe..cfe.Визуальное заимствование управляемых форм в расширениях — один из наименее стабильных механизмов платформы при регулярных доработках. Чтобы навсегда исключить подобные проблемы, формы рекомендуется изменять программно, не заимствуя их визуальную структуру в конфигураторе.
Рассмотрим пример программного создания реквизита формы и вывода соответствующей колонки в табличную часть в обработчике события ПриСозданииНаСервере:
&Вместо("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызываем оригинальный обработчик
ПродолжитьВызов(Отказ, СтандартнаяОбработка);
// 1. Создаем описание добавляемого реквизита формы
МассивРеквизитов = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100));
// Реквизит связывается с существующей табличной частью формы
НовыйРеквизит = Новый РеквизитФормы(
"МояВычисляемаяКолонка",
ТипРеквизита,
"Объект.Товары",
"Вычисляемое поле"
);
МассивРеквизитов.Добавить(НовыйРеквизит);
// 2. Добавляем реквизит в структуру формы
ИзменитьРеквизиты(МассивРеквизитов);
// 3. Создаем визуальный элемент (колонку) в таблице
ТаблицаФормы = Элементы.Товары;
НовоеПоле = Элементы.Добавить("ТоварыМояВычисляемаяКолонка", Тип("ПолеФормы"), ТаблицаФормы);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Объект.Товары.МояВычисляемаяКолонка";
НовоеПоле.Заголовок = "Вычисляемое поле";
КонецПроцедуры
Посмотрим на преимущества такого подхода: создаваемые программно реквизиты и поля формы не зависят от визуального механизма разностей конфигуратора. Код метода ИзменитьРеквизиты выполняется в момент инициализации формы в режиме «1С:Предприятие», благодаря чему колонки никогда не исчезнут при обновлениях конфигурации или расширения.