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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

&НаКлиенте
Процедура Расш_ОтправитьВсеНаКлиенте(Команда)
    // Здесь будет ваш клиентский код обработки нажатия кнопки
    // Пример из темы форума:
    // МассивНаОтправку = ОбщегоНазначенияУТКлиент.ПроверитьПолучитьВыделенныеВСпискеСсылки(Элементы.Список);
    // ... ваш код для отправки
    Сообщить("Кнопка 'Отправить все' нажата!");
КонецПроцедуры

Обратите внимание, что мы используем префикс Расш_ для наших команд и элементов, чтобы избежать конфликтов с объектами основной конфигурации. Также мы проверяем наличие группы, прежде чем добавлять в нее кнопку. Если вы хотите добавить картинку, ее можно предварительно добавить в библиотеку картинок расширения.

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

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

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

  1. В расширении добавляем новую команду.
  2. В свойствах этой команды указываем «Тип параметра команды» (например, СправочникСсылка.Склады).
  3. Также указываем «Группа» для ее расположения, например, «Параметризуемые».

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

В обработчике такой команды (процедура ОбработкаКоманды) мы можем получить переданный параметр через свойство ПараметрКоманды и использовать его в нашей логике. Например:


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

Хотя параметризуемые команды чаще создаются декларативно, понимание их работы важно для комплексной доработки форм.

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

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

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

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

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

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

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

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

← К списку