Почему в форме расширения 1С пропадают колонки табличной части и как это исправить?

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

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

Выясним причины сбоя

Чтобы понять природу ошибки, рассмотрим особенности работы платформы 1С с расширениями:

  1. Сбой механизма разностей (diff) формы: управляемые формы в расширениях не сохраняются целиком. Платформа фиксирует только различия между типовой формой и изменениями в расширении. При динамическом обновлении внутренние XML-структуры и кэш метаданных могут повредиться, из-за чего редактор форм теряет связь с добавленными в коллекцию элементами.
  2. Потеря пути к данным: в результате рассинхронизации у визуальных элементов формы очищается свойство ПутьКДанным, что делает отображение колонок невозможным.
  3. Кэширование на стороне сервера и клиента: в рабочих процессах rphost или в локальном кэше пользователя «залипает» старая версия метаданных расширения.
  4. Пользовательские настройки интерфейса: сохраненные персональные настройки формы в режиме «1С:Предприятие» могут скрывать элементы, которые платформа посчитала измененными или удаленными.

Способ 1. Очистка кэша и сброс настроек пользователя

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

  1. Сброс настроек формы в режиме «1С:Предприятие»: в открытой форме перейдем в меню Еще, выберем Изменить форму, затем внутри окна настройки нажмем Еще — Установить стандартные настройки. Это исключит влияние персональных настроек интерфейса.
  2. Очистка пользовательского кэша: удалим временные файлы сеанса текущего пользователя (каталоги %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).
  3. Очистка серверного кэша и перезапуск службы: динамические доработки расширений накапливают ошибки в оперативной памяти сервера. Рекомендуется остановить службу сервера 1C:Enterprise Server Agent, очистить каталог серверного кэша и запустить службу заново.

Способ 2. Полное перезаимствование формы в расширении

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

  1. Откроем модуль формы в расширении и скопируем весь программный код в надежный текстовый редактор.
  2. Удалим проблемную заимствованную форму из состава расширения.
  3. Применим изменения (обновим конфигурацию базы данных).
  4. Заново добавим (заимствуем) форму из основной конфигурации в расширение.
  5. Перенесем ранее сохраненный программный код обратно в модуль формы.

Способ 3. Переустановка расширения через выгрузку в файл

Если сбой затронул служебные таблицы расширений в базе данных, проанализируем следующий алгоритм:

  1. Выгрузим текущее расширение в файл с расширением .cfe.
  2. Полностью удалим данное расширение из списка расширений информационной базы.
  3. Обновим конфигурацию базы данных, чтобы платформа удалила внутренние ссылки и очистила служебные таблицы СУБД.
  4. Добавим расширение заново и загрузим его из сохраненного файла .cfe.

Способ 4. Программное добавление колонок на форму (наиболее надежный подход)

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

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


&Вместо("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вызываем оригинальный обработчик
    ПродолжитьВызов(Отказ, СтандартнаяОбработка);
    
    // 1. Создаем описание добавляемого реквизита формы
    МассивРеквизитов = Новый Массив;
    ТипРеквизита = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100));
    
    // Реквизит связывается с существующей табличной частью формы
    НовыйРеквизит = Новый РеквизитФормы(
        "МояВычисляемаяКолонка", 
        ТипРеквизита, 
        "Объект.Товары", 
        "Вычисляемое поле"
    );
    МассивРеквизитов.Добавить(НовыйРеквизит);
    
    // 2. Добавляем реквизит в структуру формы
    ИзменитьРеквизиты(МассивРеквизитов);
    
    // 3. Создаем визуальный элемент (колонку) в таблице
    ТаблицаФормы = Элементы.Товары;
    НовоеПоле = Элементы.Добавить("ТоварыМояВычисляемаяКолонка", Тип("ПолеФормы"), ТаблицаФормы);
    НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПоле.ПутьКДанным = "Объект.Товары.МояВычисляемаяКолонка";
    НовоеПоле.Заголовок = "Вычисляемое поле";
    
КонецПроцедуры

Посмотрим на преимущества такого подхода: создаваемые программно реквизиты и поля формы не зависят от визуального механизма разностей конфигуратора. Код метода ИзменитьРеквизиты выполняется в момент инициализации формы в режиме «1С:Предприятие», благодаря чему колонки никогда не исчезнут при обновлениях конфигурации или расширения.

← На главную