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

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

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

Причины, по которым кнопка может не отображаться

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

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

Программное добавление кнопки: Надежный подход

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

Разберем по шагам, как мы можем добавить кнопку программно:

  1. Определяем место для кода. Процедуры для программного добавления кнопок и команд обычно размещают в обработчике события формы ПриСозданииНаСервере. Если элементов планируется много, чтобы код оставался читаемым, можно использовать текучий конструктор для программной модификации форм.
  2. Создаем команду. Прежде чем добавить кнопку, нам необходимо создать команду, которую эта кнопка будет вызывать. Для этого мы используем метод ЭтаФорма.Команды.Добавить().
  3. Создаем элемент формы (кнопку). После создания команды мы можем добавить саму кнопку на форму через метод ЭтаФорма.Элементы.Добавить(), указывая тип КнопкаФормы.

Посмотрим на пример кода. Допустим, мы хотим добавить кнопку «Отправить все» на форму списка документа. Кстати, если вы решили серьезно прокачать динамический список, добавив в него не только кнопки, но и новые колонки с иконками, программный метод будет самым гибким решением:


&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    // 1. Создаем команду
    Перем НоваяКоманда;
    НоваяКоманда = ЭтаФорма.Команды.Добавить("Расш_ОтправитьВсе");
    НоваяКоманда.Действие = "Расш_ОтправитьВсеНаКлиенте";
    НоваяКоманда.Заголовок = "Отправить все";
    НоваяКоманда.Пояснение = "Отправить все выделенные элементы";
    НоваяКоманда.Картинка = БиблиотекаКартинок.Отправить;

    // 2. Находим группу, куда будем добавлять кнопку
    Перем ГруппаКоманд;
    Попытка
        ГруппаКоманд = ЭтаФорма.Элементы.Найти("КоманднаяПанельСписка");
        Если ГруппаКоманд = Неопределено Тогда
            ГруппаКоманд = ЭтаФорма.Элементы.Найти("ГруппаКомандФормы");
        КонецЕсли;
    Исключение
        ГруппаКоманд = ЭтаФорма.Элементы.Найти("ОсновнаяКоманднаяПанель");
    КонецПопытки;

    Если ГруппаКоманд <> Неопределено Тогда
        // 3. Создаем кнопку и привязываем ее к команде
        Перем НоваяКнопка;
        НоваяКнопка = ЭтаФорма.Элементы.Добавить("Расш_КнопкаОтправитьВсе", Тип("КнопкаФормы"), ГруппаКоманд);
        НоваяКнопка.ИмяКоманды = НоваяКоманда.Имя;
        НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
        НоваяКнопка.Отображение = ОтображениеКнопки.Текст;

        // 4. Устанавливаем видимость и доступность
        НоваяКнопка.Видимость = Истина;
        НоваяКнопка.Доступность = Истина;
    Иначе
        ЗаписатьЛогТехническойИнформации("Не удалось найти группу для добавления кнопки 'Расш_ОтправитьВсе'.");
    КонецЕсли;

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

&НаКлиенте
Процедура Расш_ОтправитьВсеНаКлиенте(Команда)
    Сообщить("Кнопка 'Отправить все' нажата!");
КонецПроцедуры

Работа с параметризуемыми командами

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


&НаКлиенте
Процедура Расш_ОткрытьОтчетПоСкладу(Команда)
    Если Команда.ПараметрКоманды <> Неопределено Тогда
        Сообщить("Открываем отчет по складу: " + Команда.ПараметрКоманды);
    Иначе
        Сообщить("Параметр команды не передан.");
    КонецЕсли;
КонецПроцедуры

Отладка и диагностика проблемы

Если кнопка все еще не отображается, используем отладчик для проверки коллекции ЭтаФорма.Элементы. Чтобы упростить этот процесс и анализировать свойства элементов прямо в интерфейсе, можно использовать редактор форм в режиме предприятия, который позволяет просматривать и менять свойства открытых форм «на лету» — в этом поможет интерактивный редактор управляемых форм в режиме предприятия.

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

Общие рекомендации и лучшие практики

В заключение, давайте обобщим ключевые моменты:

  1. Используйте расширения. Это ваш основной инструмент для доработки типовых конфигураций.
  2. Предпочитайте программное добавление. Это наиболее надежный способ управления интерфейсом.
  3. Используйте уникальные префиксы. Для всех добавляемых вами объектов (команд, элементов формы, реквизитов) используйте префиксы (например, Расш_).
  4. Тщательно тестируйте. Всегда проверяйте результат в режиме «1С:Предприятие».
  5. Используйте вспомогательные инструменты. Отладчик и специализированные средства диагностики сэкономят вам массу времени — для этого отлично подойдет инструмент инспекции и отладки переменных в режиме 1С:Предприятие.

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

← На главную