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

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

Разработчики управляемых форм в среде 1С:Предприятие 8.3 часто сталкиваются с крайне неприятным поведением платформы: вы заимствуете форму в расширение, добавляете на неё новую кнопку или другой элемент, запускаете сеанс «1С:Предприятие» — а кнопки нет. При этом в отладчике в коллекции Элементы ваша кнопка присутствует, а если нажать «Ещё — Изменить форму — Установить стандартные настройки», элемент временно появляется на экране. Однако стоит закрыть форму и открыть её заново, как кнопка бесследно исчезает.

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

Почему возникает эта проблема?

Прежде чем переходить к активным действиям, давайте разберемся, из-за чего платформа скрывает добавленный элемент интерфейса. Основных причин может быть несколько:

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

Решение 1. Очистка серверного кэша 1С:Предприятия

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

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

  1. Если у вас файловая база данных, достаточно просто завершить все сеансы пользователей (включая конфигуратор) и перезапустить веб-сервер (например, IIS или Apache), если база опубликована.
  2. Если база клиент-серверная, запланируйте перезапуск службы 1C:Enterprise 8.3 Server Agent во время технологического окна (например, ночью). Перезапуск службы полностью очистит оперативную память сервера от старых версий метаданных расширений.
  3. Если перезапускать службу целиком нежелательно, можно вручную очистить каталоги временных файлов сервера. Для этого остановите службу сервера 1С, перейдите в каталог данных сервера (по умолчанию это C:\Program Files\1cv8\srvinfo для Windows), найдите папки с кэшем конфигураций (например, папки внутри каталога вашей базы данных с длинными GUID-именами, а также папку snccntx) и удалите их содержимое. После этого запустите службу заново.

Решение 2. Правильная очистка пользовательских настроек

Если вы столкнулись с ситуацией, когда кнопка появляется при нажатии «Установить стандартные настройки», но пропадает при перезапуске, дело однозначно в сохраненных настройках интерфейса. Использование программного метода ХранилищеСистемныхНастроек.Удалить часто не дает эффекта, если настройки были сохранены в другие системные таблицы СУБД.

Выполним очистку настроек через интерактивный интерфейс системы 1С:Предприятие:

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

Решение 3. Проверка прав доступа к команде

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

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

Лучшая практика (Best Practice): Программное добавление элементов на форму

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

Давайте разберем по шагам, как это реализовать. Предположим, нам нужно добавить кнопку на командную панель формы. Для этого мы заимствуем форму в расширение и создаем обработчик события ПриСозданииНаСервере с директивой выполнения &После.

Проанализируем следующий пример программного кода:


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

&НаКлиенте
Процедура ИмяРасширения_МояСпециальнаяКомандаОбработчик(Команда)
    
    // Здесь описываем логику, которая должна выполняться при нажатии кнопки
    ПоказатьПредупреждение(, "Действие из расширения успешно выполнено!");
    
КонецПроцедуры

Почему этот подход является наиболее стабильным?

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

← На главную