Разработчики управляемых форм в среде 1С:Предприятие 8.3 часто сталкиваются с крайне неприятным поведением платформы: вы заимствуете форму в расширение, добавляете на неё новую кнопку или другой элемент, запускаете сеанс «1С:Предприятие» — а кнопки нет. При этом в отладчике в коллекции Элементы ваша кнопка присутствует, а если нажать «Ещё — Изменить форму — Установить стандартные настройки», элемент временно появляется на экране. Однако стоит закрыть форму и открыть её заново, как кнопка бесследно исчезает.
В этой статье мы подробно разберем природу этого системного сбоя, проанализируем причины его возникновения и рассмотрим по шагам все надежные способы решения: от быстрой очистки кэша до профессионального программного создания элементов формы.
Прежде чем переходить к активным действиям, давайте разберемся, из-за чего платформа скрывает добавленный элемент интерфейса. Основных причин может быть несколько:
Как показывает практика практикующих разработчиков, банальное удаление базы из списка запуска очищает только локальный кэш клиента. Кэш метаданных расширения на стороне сервера при этом остается нетронутым. Именно поэтому радикальным, но гарантированным способом решения проблемы является перезапуск службы сервера 1С.
Рассмотрим, как правильно выполнить очистку серверного кэша без вреда для работающих пользователей:
1C:Enterprise 8.3 Server Agent во время технологического окна (например, ночью). Перезапуск службы полностью очистит оперативную память сервера от старых версий метаданных расширений.C:\Program Files\1cv8\srvinfo для Windows), найдите папки с кэшем конфигураций (например, папки внутри каталога вашей базы данных с длинными GUID-именами, а также папку snccntx) и удалите их содержимое. После этого запустите службу заново.Если вы столкнулись с ситуацией, когда кнопка появляется при нажатии «Установить стандартные настройки», но пропадает при перезапуске, дело однозначно в сохраненных настройках интерфейса. Использование программного метода ХранилищеСистемныхНастроек.Удалить часто не дает эффекта, если настройки были сохранены в другие системные таблицы СУБД.
Выполним очистку настроек через интерактивный интерфейс системы 1С:Предприятие:
Часто разработчики забывают, что новая кнопка должна быть работоспособна для конечного пользователя с точки зрения системы прав доступа. Если кнопка привязана к новой команде, созданной в расширении, проверьте права:
ДополнительныеПраваРасширения), добавьте в неё право «Просмотр» и «Использование» на созданную команду.Чтобы раз и навсегда обезопасить себя от «танцев с бубном» вокруг очистки кэша, сброса настроек пользователей и конфликтов обновлений, опытные разработчики рекомендуют полностью отказаться от визуального добавления элементов интерфейса в редакторе форм расширения. Вместо этого гораздо надежнее создавать новые команды и кнопки программно в момент инициализации формы.
Давайте разберем по шагам, как это реализовать. Предположим, нам нужно добавить кнопку на командную панель формы. Для этого мы заимствуем форму в расширение и создаем обработчик события ПриСозданииНаСервере с директивой выполнения &После.
Проанализируем следующий пример программного кода:
&После("ПриСозданииНаСервере")
Процедура ИмяВашегоРасширения_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Шаг 1. Проверяем, не была ли кнопка уже создана ранее (защита от повторного вызова)
ИмяКнопки = "ИмяРасширения_МояСпециальнаяКнопка";
ИмяКоманды = "ИмяРасширения_МояСпециальнаяКоманда";
Если Элементы.Найти(ИмяКнопки) = Неопределено Тогда
// Шаг 2. Создаем команду формы программно
НоваяКоманда = Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "ИмяРасширения_МояСпециальнаяКомандаОбработчик";
НоваяКоманда.Заголовок = "Выполнить действие";
НоваяКоманда.ИзменяетСохраняемыеДанные = Ложь;
// Шаг 3. Определяем родительский элемент (например, Командная панель формы)
РодительскийЭлемент = Элементы.КоманднаяПанель;
// Шаг 4. Добавляем саму кнопку на форму
НоваяКнопка = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), РодительскийЭлемент);
НоваяКнопка.ИмяКоманды = ИмяКоманды;
НоваяКнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
// Опционально: можно настроить отображение (например, выводить и картинку, и текст)
НоваяКнопка.Отображение = ОтображениеКнопки.КартинкаИТекст;
НоваяКнопка.Картинка = БиблиотекаКартинок.Выполнить;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИмяРасширения_МояСпециальнаяКомандаОбработчик(Команда)
// Здесь описываем логику, которая должна выполняться при нажатии кнопки
ПоказатьПредупреждение(, "Действие из расширения успешно выполнено!");
КонецПроцедуры
Почему этот подход является наиболее стабильным?
Таким образом, сочетание своевременной очистки кэша сервера приложений 1С и переход на динамическое программное конструирование элементов интерфейса полностью решает проблему исчезающих кнопок на управляемых формах.