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

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

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

В этой статье мы подробно разберем, почему возникает этот эффект «зависания» элементов, как устроена внутренняя архитектура платформы «1С:Предприятие 8.3» в части работы с управляемыми формами, и рассмотрим практические способы решения этой проблемы как для одного разработчика, так и для всех пользователей работающей базы данных.

Выясняем причину: механизм тройного наложения формы

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

  1. Основная форма из конфигурации-источника. Это базовый слой, спроектированный разработчиком основной конфигурации (или поставляемый вендором, например, в составе УНФ, ERP или БП).
  2. Изменения из расширений. Платформа анализирует все активные расширения, находит в них заимствованную форму, вычисляет разницу (дифф) между базовой формой и формой в расширении и накладывает эти изменения на первый слой.
  3. Пользовательские настройки формы. Это самый приоритетный слой. Платформа 1С предоставляет пользователям мощный инструмент кастомизации интерфейса под себя (кнопка «Ещё» — «Изменить форму»). Пользователь может менять элементы местами, скрывать ненужные колонки, объединять поля в группы. Все эти персональные изменения платформа сохраняет автоматически.

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

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

Различие между локальным кэшем и хранилищем настроек

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

Способ 1. Сброс настроек формы вручную (для разработчика)

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

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

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

Способ 2. Очистка настроек для всех пользователей в типовых конфигурациях

Метод ручного сброса идеален для разработчика, но совершенно не подходит для живой базы, в которой работают десятки или сотни сотрудников. Мы не можем зайти под каждым пользователем и вручную сбросить настройки формы. Для массового решения проблемы в типовых конфигурациях (таких как «Управление нашей фирмой», «ERP», «Комплексная автоматизация» или «Бухгалтерия предприятия») предусмотрен специальный инструмент администратора.

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

  1. Перейдите в раздел «Администрирование» (или «Настройки» в зависимости от интерфейса конфигурации).
  2. Выберите пункт «Настройки пользователей и прав».
  3. Найдите гиперссылку «Очистка настроек» (в некоторых редакциях — «Очистка настроек пользователей»).
  4. В открывшемся окне выберите вариант очистки: вы можете очистить настройки для конкретного пользователя, для списка пользователей или для всех пользователей сразу.
  5. Перейдите на вкладку «Внешний вид» (или найдите в списке настроек конкретную форму нужного документа/справочника).
  6. Отметьте флажком проблемную форму и нажмите кнопку «Очистить».

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

Способ 3. Программная очистка настроек формы

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

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


// Процедура очищает сохраненные настройки конкретной формы для всех пользователей базы данных
Процедура ОчиститьНастройкиФормыПрограммно() Экспорт

    // Указываем полное системное имя формы, настройки которой нужно сбросить
    ПолноеИмяФормы = "Документ.ЗаказПокупателя.Форма.ФормаДокумента";
    КлючОбъекта = "Общая/НастройкиФорм/" + ПолноеИмяФормы;
    
    Попытка
        // Метод Удалить с третьим параметром Неопределено очищает настройки для всех пользователей
        ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", Неопределено);
        Сообщить("Настройки формы успешно очищены для всех пользователей базы данных.");
    Исключение
        ВызватьИсключение "Не удалось очистить настройки формы: " + ОписаниеОшибки();
    КонецПопытки;

КонецПроцедуры

Этот код обращается напрямую к системному хранилищу настроек. Ключ "Общая/НастройкиФорм/" является стандартным префиксом платформы для хранения кастомизированных форм. Передавая в качестве имени пользователя пустую строку, а в качестве третьего параметра значение Неопределено, мы принудительно стираем записи кэша формы для абсолютно всех учетных записей в текущей базе данных.

Способ 4. Работа с «Сохраненной формой» в Конфигураторе

Еще один важный платформенный нюанс связан с так называемыми «снимками состояния» (snapshots) заимствованных форм в расширении. Когда мы заимствуем форму из основной конфигурации в расширение, платформа делает и сохраняет снимок ее структуры на момент заимствования.

Если после этого основная конфигурация обновляется (например, вы обновили релиз «УНФ»), структура оригинальной формы меняется. При запуске предприятия расширение пытается сопоставить свой старый сохраненный снимок с новой формой из конфигурации. В результате элементы могут начать вести себя непредсказуемо: игнорировать изменение цвета, шрифта, видимости или двоиться.

Чтобы решить эту проблему на уровне разработки, выполним следующие действия:

  1. Откроем конфигуратор и перейдем в дерево метаданных нашего расширения.
  2. Найдем заимствованную форму и откроем ее редактор.
  3. В верхнем меню дерева элементов формы выберем пункт «Действия» (или нажмем правой кнопкой мыши по корню формы) -> «Расширения» -> «Обновить сохраненную форму».
  4. Платформа обновит внутренний XML-снимок оригинальной формы и синхронизирует все связи элементов. Нам останется лишь сохранить расширение и обновить базу данных.

Рекомендация для разработчиков: программное создание элементов

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

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

Давайте рассмотрим пример, как правильно и безопасно добавить декорацию-надпись программно в модуле формы расширения:


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

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

← На главную