При работе со старыми или типовыми конфигурациями 1С на обычных формах разработчики часто сталкиваются с нестандартным поведением интерфейсных элементов. Типичная ситуация: в коде формы есть обращение к контекстному меню табличного поля, например через ЭлементыФормы.КонтекстноеМеню, но при попытке найти этот элемент в визуальном редакторе конфигуратора мы терпим неудачу. Его нет ни на самой форме, ни в списке элементов управления.
В этой статье мы подробно разберем, почему возникает такая проблема, как обнаружить «потерянное» меню и как гарантированно добавить в него новую кнопку — как интерактивно, так и полностью программным методом.
Перед тем как переходить к активным действиям, давайте проанализируем ситуацию и выясним основные причины, по которым элемент управления может «исчезнуть» из поля зрения разработчика:
Лево или Верх в значение -1000). Элемент существует, но визуально его не найти.Если элемент создается динамически или его не удается найти в конфигураторе, самым надежным и быстрым решением будет программное добавление кнопки. Этот способ гарантирует, что кнопка появится в меню на любом релизе платформы и при любых настройках интерфейса.
Рассмотрим пример добавления кнопки «Вес нетто» в подменю «Штрихкоды и единицы измерения» существующего контекстного меню.
Для реализации этой задачи перейдем в модуль формы и добавим код в процедуру ПриОткрытии:
Процедура ПриОткрытии()
// 1. Находим родительское контекстное меню табличного поля
ПанельКМ = ЭлементыФормы.КонтекстноеМеню;
// 2. Находим нужное подменю по его имени
ПодменюШтрихкоды = ПанельКМ.Кнопки.Штрихкоды_ЕдиницыИзмерения;
// 3. Добавляем новую кнопку в коллекцию кнопок этого подменю
НоваяКнопка = ПодменюШтрихкоды.Кнопки.Добавить(
"ВесНетто",
ТипКнопкиКоманднойПанели.Действие,
"Вес нетто",
Новый Действие("ДействиеВесНетто")
);
КонецПроцедуры
После добавления кнопки нам обязательно нужно описать процедуру-обработчик, которая будет выполняться при нажатии на нашу кнопку. Имя этой процедуры должно в точности соответствовать имени, переданному в конструктор Новый Действие():
Процедура ДействиеВесНетто(Кнопка)
// Здесь мы описываем логику, которая должна выполниться при нажатии
ТекущиеДанные = ЭлементыФормы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Пример бизнес-логики: расчет чистого веса строки
Предупреждение("Выполнен расчет нетто для номенклатуры: " + ТекущиеДанные.Номенклатура);
КонецПроцедуры
Этот подход чрезвычайно удобен, так как он полностью исключает риск сломать визуальную структуру формы в конфигураторе.
Если вы принципиально хотите найти элемент в конфигураторе, чтобы отредактировать его состав визуально, выполним несколько последовательных шагов поиска.
Шаг 1. Использование списка элементов управления.
Не пытайтесь найти элемент кликами по форме. Вместо этого откройте специализированное окно. В главном меню конфигуратора выберите пункт Форма — Список элементов управления формы... (или воспользуйтесь быстрой комбинацией клавиш Ctrl + Shift + + при активном окне формы).
В открывшемся дереве элементов нажмите комбинацию Ctrl + F и введите имя искомого контекстного меню (например, КонтекстноеМеню). Если элемент присутствует на форме физически, платформа сфокусируется на нем в списке.
Шаг 2. Фокусировка через свойства табличного поля.
Выделите табличное поле, к которому привязано меню. Откройте палитру его свойств. Найдите строку Контекстное меню. В ней будет указано имя связанной командной панели. Нажмите на пиктограмму с изображением лупы рядом с именем. Платформа попытается автоматически выделить этот элемент на самой форме.
Шаг 3. Временный принудительный вывод координат.
Если элемент нашелся в списке элементов управления, но при выделении фокус уходит в пустоту за границы экрана, мы можем вернуть его в видимую область программно. Для этого временно добавьте в процедуру ПриОткрытии следующий отладочный код:
// Временный код для "спасения" элемента из-за границ экрана
ЭлементыФормы.КонтекстноеМеню.Видимость = Истина;
ЭлементыФормы.КонтекстноеМеню.Лево = 10;
ЭлементыФормы.КонтекстноеМеню.Верх = 10;
ЭлементыФормы.КонтекстноеМеню.Ширина = 300;
ЭлементыФормы.КонтекстноеМеню.Высота = 50;
Запустите конфигурацию в режиме отладки. Командная панель отобразится прямо поверх других элементов в левом верхнем углу формы. Это поможет вам убедиться в ее существовании и увидеть состав кнопок. После этого вы сможете скорректировать координаты элемента непосредственно в конфигураторе, найдя его в свойствах и задав корректные значения свойств Лево и Верх.
Важно помнить ключевое отличие обычных форм от управляемых. В управляемых формах контекстное меню жестко подчинено элементу и настраивается внутри него. В обычных формах контекстное меню — это полноценный самостоятельный элемент управления типа КоманднаяПанель, который создается отдельно.
Связь между табличным полем и контекстным меню устанавливается исключительно через свойство Контекстное меню в свойствах самого табличного поля, где выбирается созданная командная панель. Сама командная панель при этом обычно имеет свойство Видимость = Ложь, чтобы она не дублировалась на теле формы, а вызывалась только по щелчку правой кнопкой мыши.
Применяя описанные методы, вы сможете быстро решать задачи кастомизации интерфейса даже в самых запутанных и устаревших конфигурациях на платформе 1С:Предприятие 8.