При доработке типовых конфигураций 1С мы часто сталкиваемся с необходимостью добавить новые элементы на формы, например, кнопки для вызова специфического функционала. Расширения предоставляют нам мощный и гибкий инструмент для таких модификаций без снятия конфигурации с поддержки. Однако иногда, добавив кнопку через расширение, мы обнаруживаем, что она просто не появляется на форме в режиме «1С:Предприятие». Давайте вместе разберем, почему это происходит и как решить эту проблему.
Прежде чем перейти к решению, выясним возможные причины, по которым добавленная нами кнопка может быть не видна. Это поможет нам точнее диагностировать проблему:
Видимость, установленное в Ложь, или Доступность в Ложь.Мы выяснили, что наиболее надежным и рекомендованным способом добавления кнопок и других элементов на форму через расширение является их программное создание. Этот подход минимизирует риски при обновлении типовых конфигураций и позволяет избежать проблем, когда система "скрывает" элементы, добавленные декларативно.
Разберем по шагам, как мы можем добавить кнопку программно:
ПриСозданииНаСервере или ПриСозданииНаСервереПосле. Используйте директиву &После, если расширяете существующий обработчик, чтобы ваш код выполнился после стандартного функционала.ЭтаФорма.Команды.Добавить(). При этом мы указываем имя команды, имя процедуры-обработчика (действия) и заголовок, который будет отображаться на кнопке.ЭтаФорма.Элементы.Добавить(), указывая имя кнопки, ее тип (КнопкаФормы), родительский элемент (группу или панель, куда мы хотим ее поместить) и связываем ее с ранее созданной командой через свойство ИмяКоманды.Посмотрим на пример кода. Допустим, мы хотим добавить кнопку «Отправить все» на форму списка какого-либо документа:
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// 1. Создаем команду
// Используем уникальный префикс, например, "Расш_".
Перем НоваяКоманда;
НоваяКоманда = ЭтаФорма.Команды.Добавить("Расш_ОтправитьВсе");
НоваяКоманда.Действие = "Расш_ОтправитьВсеНаКлиенте"; // Имя клиентской процедуры-обработчика
НоваяКоманда.Заголовок = "Отправить все";
НоваяКоманда.Пояснение = "Отправить все выделенные элементы";
НоваяКоманда.Картинка = БиблиотекаКартинок.Отправить; // Если есть картинка в расширении
// 2. Находим группу, куда будем добавлять кнопку
// Например, это может быть группа команд "КоманднаяПанельСписка"
// или "КоманднаяПанельФормы". Проверьте имя в конфигураторе.
Перем ГруппаКоманд;
Попытка
ГруппаКоманд = ЭтаФорма.Элементы.Найти("КоманднаяПанельСписка"); // Пример стандартной группы
Если ГруппаКоманд = Неопределено Тогда
ГруппаКоманд = ЭтаФорма.Элементы.Найти("ГруппаКомандФормы"); // Другой пример
КонецЕсли;
Исключение
// Если не нашли стандартную группу, можно создать свою или добавить в корень формы
ГруппаКоманд = ЭтаФорма.Элементы.Найти("ОсновнаяКоманднаяПанель"); // Еще один пример
КонецПопытки;
Если ГруппаКоманд <> Неопределено Тогда
// 3. Создаем кнопку и привязываем ее к команде
Перем НоваяКнопка;
НоваяКнопка = ЭтаФорма.Элементы.Добавить("Расш_КнопкаОтправитьВсе", Тип("КнопкаФормы"), ГруппаКоманд);
НоваяКнопка.ИмяКоманды = НоваяКоманда.Имя;
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
НоваяКнопка.ПоложениеВГруппе = ПоложениеВГруппе.Авто; // Можно указать конкретное положение
НоваяКнопка.Отображение = ОтображениеКнопки.Текст; // Или ОтображениеКнопки.КартинкаИТекст
// 4. Устанавливаем видимость и доступность, если нужно
НоваяКнопка.Видимость = Истина;
НоваяКнопка.Доступность = Истина;
Иначе
ЗаписатьЛогТехническойИнформации("Не удалось найти группу для добавления кнопки 'Расш_ОтправитьВсе'.");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Расш_ОтправитьВсеНаКлиенте(Команда)
// Здесь будет ваш клиентский код обработки нажатия кнопки
// Пример из темы форума:
// МассивНаОтправку = ОбщегоНазначенияУТКлиент.ПроверитьПолучитьВыделенныеВСпискеСсылки(Элементы.Список);
// ... ваш код для отправки
Сообщить("Кнопка 'Отправить все' нажата!");
КонецПроцедуры
Обратите внимание, что мы используем префикс Расш_ для наших команд и элементов, чтобы избежать конфликтов с объектами основной конфигурации. Также мы проверяем наличие группы, прежде чем добавлять в нее кнопку. Если вы хотите добавить картинку, ее можно предварительно добавить в библиотеку картинок расширения.
Иногда нам требуется добавить не просто команду, а параметризуемую команду. Это команда, которая ожидает получить какой-либо параметр при своем вызове. Например, мы хотим открыть отчет по конкретному складу, и команда должна получить ссылку на этот склад.
При создании параметризуемой команды обычно мы делаем это декларативно, через свойства команды в конфигураторе расширения:
СправочникСсылка.Склады).Если у документа или объекта, для которого предназначена форма, есть реквизит соответствующего типа (например, реквизит Склад типа СправочникСсылка.Склады), то в группе «Параметризуемые» в командной панели формы появится ветка с названием реквизита, в которой будет доступна ваша параметризуемая команда.
В обработчике такой команды (процедура ОбработкаКоманды) мы можем получить переданный параметр через свойство ПараметрКоманды и использовать его в нашей логике. Например:
&НаКлиенте
Процедура Расш_ОткрытьОтчетПоСкладу(Команда)
Если Команда.ПараметрКоманды <> Неопределено Тогда
Сообщить("Открываем отчет по складу: " + Команда.ПараметрКоманды);
// Здесь ваш код для открытия отчета с отбором по складу
Иначе
Сообщить("Параметр команды не передан.");
КонецЕсли;
КонецПроцедуры
Хотя параметризуемые команды чаще создаются декларативно, понимание их работы важно для комплексной доработки форм.
Если кнопка все еще не отображается, или вы хотите проверить ее состояние, используем отладчик:
ПриСозданииНаСервере или ПриСозданииНаСервереПосле. Установите точку останова в том месте, где вы добавляете команду и кнопку.ЭтаФорма.Элементы. Убедитесь, что ваш элемент с именем Расш_КнопкаОтправитьВсе (или как вы его назвали) присутствует в этой коллекции.Видимость и Доступность. Они должны быть установлены в Истина. Также убедитесь, что свойство ИмяКоманды корректно указывает на вашу команду.ЭтаФорма.Команды, чтобы убедиться, что ваша команда (например, Расш_ОтправитьВсе) присутствует и имеет корректно заданное Действие.ГруппаКоманд в нашем примере) существует на форме и имеет свойство Видимость установленное в Истина.Если отладчик показывает, что кнопка присутствует в коллекции Элементы, ее Видимость и Доступность установлены в Истина, но она все равно не отображается, попробуйте следующие шаги:
В заключение, давайте обобщим ключевые моменты, которые помогут нам эффективно работать с расширениями и избегать проблем с отображением кнопок:
Расш_) для предотвращения конфликтов.Следуя этим рекомендациям, мы сможем эффективно добавлять новые элементы на формы через расширения и добиваться стабильного и предсказуемого результата.
← К списку