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

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

Архитектура командной панели и объекты метаданных

Прежде чем приступать к написанию кода, необходимо четко понимать структуру объекта, с которым мы будем работать. Командная панель в 1С — это не просто набор кнопок, а сложная иерархическая структура, управляемая объектом Форма. Каждая кнопка представляет собой элемент управления типа КнопкаФормы, который имеет свои свойства, такие как видимость, доступность и заголовок.

Важно различать контексты выполнения кода. Манипуляции с элементами формы возможны только на клиенте. Попытка создать кнопку на стороне сервера приведет к ошибке выполнения, так как сервер не имеет доступа к визуальным компонентам интерфейса пользователя. Поэтому весь код, связанный с созданием и размещением элементов, должен быть помечен директивой &НаКлиенте.

Существует два основных подхода к решению задачи. Первый — это динамическое создание элемента в момент открытия формы через событие ПриСозданииНаСервере или ПриОткрытии. Второй, более современный и предпочтительный для неизменяемых конфигураций, — использование расширений конфигурации, где кнопка добавляется штатными средствами, а её поведение программируется.

⚠️ Внимание: Прямое изменение структуры формы в коде (создание новых элементов "на лету") может привести к проблемам с сохранением настроек пользователя (LSavedSettings). Если пользователь настроил вид формы, динамическое добавление элементов может сбить его персонализацию.
Технические ограничения динамического создания

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

Создание кнопки через код в событии формы

Для программного добавления кнопки нам потребуется получить доступ к коллекции команд формы. В объекте формы существует свойство Команды (или Commands в английской версии), которое позволяет управлять элементами панели инструментов. Мы можем создать новый объект команды и добавить его в эту коллекцию.

Рассмотрим пример создания простой кнопки в обработчике события ПриОткрытии. Сначала мы объявляем переменную типа КнопкаФормы. Затем задаем ей уникальное имя, заголовок, который увидит пользователь, и привязываем к ней команду.

После создания объекта кнопки необходимо добавить его в командную панель. Обычно кнопки размещаются в группе КоманднаяПанель или в специальной группе действий. Если такой группы нет, кнопку можно добавить в корневую коллекцию команд формы, и платформа автоматически разместит её в стандартном месте.

☑️ Алгоритм создания кнопки

Выполнено: 0 / 4

Код для создания кнопки может выглядеть следующим образом:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

// Создаем новую команду

НоваяКоманда = Форма.Команды.Добавить("МояНоваяКнопка");

НоваяКоманда.Заголовок = "Выполнить действие";

НоваяКоманда.Картинка = БесплатныеБиблиотекиКартинок.СтрелкаВправо;

// Назначаем обработчик

Форма.Команды.МояНоваяКнопка.Действие = ЭтотОбъект.КнопкаНажата;

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

&НаКлиенте

Процедура КнопкаНажата(Команда)

Сообщить("Кнопка успешно нажата!");

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

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

💡

Используйте свойство "Важность" (Importance) для кнопки, чтобы выделить её цветом. Значение "Важно" окрасит кнопку в синий цвет, привлекая внимание пользователя к ключевому действию.

Работа с расширениями конфигурации

В современных версиях платформы 1С (начиная с 8.3.10) предпочтительным способом изменения интерфейса является использование Расширений конфигурации. Этот метод позволяет добавлять кнопки в стандартные формы без модификации самой конфигурации, что упрощает обновление типовой базы.

В режиме Расширения вы можете открыть форму объекта (например, Документ.РеализацияТоваровУслуг) и просто перетащить новую кнопку из палитры свойств в командную панель. Система автоматически создаст необходимый элемент метаданных. Вам останется только написать обработчик события нажатия.

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

Характеристика Динамическое создание (Код) Расширение конфигурации
Сложность внедрения Высокая (требует знаний API) Низкая (конструктор форм)
Влияние на обновление Минимальное Минимальное (изолировано)
Производительность Ниже (создание при открытии) Выше (статическая структура)
Гибкость Максимальная (условная логика) Средняя (через СКД или условия)

Однако, если вам нужно показывать кнопку только при выполнении сложных условий, которые нельзя описать стандартными средствами (например, в зависимости от результата запроса к внешней базе), то программный метод или комбинация расширения с кодом будет единственным выходом.

📊 Какой способ добавления кнопок вы используете чаще?
Только код (Динамически)
Только Расширения
Комбинированный метод
Не добавляю кнопки

Назначение обработчиков событий и логика работы

Сама по себе кнопка — лишь элемент интерфейса. Ценность ей придает действие, которое она выполняет. В 1С существует механизм Команд, который связывает элемент управления с алгоритмом выполнения. При нажатии на кнопку вызывается процедура-обработчик, указанная в свойстве Действие.

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

Частая ошибка новичков — попытка выполнить серверный код напрямую из клиента без правильных директив. Всегда проверяйте, что серверная процедура помечена как &НаСервере, а клиентская, вызывающая её, имеет доступ к необходимым контекстным данным.

&НаКлиенте

Процедура КнопкаПечатьНажата(Команда)

// Проверка прав доступа перед вызовом

Если Не Пользователи.ЭтоПолныеПрава() Тогда

Сообщить("У вас нет прав на печать документов", СтатусСообщения.Важное);

Возврат;

КонецЕсли;

// Вызов серверной логики

ПечатьДокументаНаСервере(ТекущийДокумент);

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

&НаСервере

Процедура ПечатьДокументаНаСервере(СсылкаНаДокумент)

// Логика формирования макета печати

//..

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

Для сложных сценариев полезно использовать параметризуемые команды. Вы можете передавать параметры в обработчик, что позволяет использовать одну и ту же процедуру для обработки нажатий разных кнопок, различая их по имени или переданным аргументам.

⚠️ Внимание: При работе с расширениями убедитесь, что имена ваших процедур не конфликтуют с именами процедур в основной конфигурации. Используйте префиксы, например, Рш_ (Расширение), для всех своих обработчиков.
💡

Правильное разделение клиентского и серверного кода — залог стабильной работы интерфейса. Никогда не выполняйте тяжелые вычисления или запросы к БД непосредственно в клиентском обработчике нажатия кнопки.

Управление видимостью и доступностью кнопок

Динамический интерфейс должен реагировать на состояние системы. Кнопка не всегда должна быть доступна для нажатия. Свойства Видимость (Visible) и Доступность (Enabled) позволяют управлять поведением элемента в реальном времени.

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

Свойство доступности полезно, когда кнопка должна быть видна, но неактивна до выполнения определенных условий. Классический пример: кнопка "Оплатить" становится активной только после того, как в документ введены данные о сумме и выбран контрагент.

  • 🔍 Используйте свойство Видимость для полного скрытия элемента из интерфейса, если функция пользователю не доступна принципиально.
  • 🔒 Используйте свойство Доступность (серое состояние), если функция существует, но временно недоступна из-за незаполненных данных.
  • 🎨 Меняйте заголовок кнопки динамически, чтобы подсказать пользователю, почему действие недоступно (например, "Оплатить (нет суммы)").

Для управления этими свойствами в коде используется обращение к элементу формы по имени. Например: Элементы.МояКнопка.Доступность = Ложь;. Если вы работаете в расширении, эти свойства можно привязать к условиям СКД (Система Компоновки Данных) или прописать в модуле формы.

Обработка ошибок и отладка интерфейса

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

Основным инструментом диагностики остаются сообщения пользователю и журнал регистрации. При возникновении ошибки в обработчике нажатия платформы обычно показывает стандартное окно ошибки. Чтобы сделать диагностику проще, оборачивайте критические участки кода в конструкцию Попытка.. Исключение.

Также полезно использовать метод ВыполнитьПроверкуЗаполнения перед выполнением действий, зависящих от реквизитов формы. Это предотвратит попытки выполнить команду с некорректными данными и снизит количество ошибок в журнале регистрации.

ℹ️ Примечание: Поведение интерфейса и доступные свойства могут отличаться в разных версиях платформы 1С и в разных режимах запуска (Толстый клиент, Тонкий клиент, Веб-клиент). Всегда тестируйте новые кнопки во всех используемых вами интерфейсах.
Секреты отладки

Если кнопка не видна, проверьте свойство "Видимость" в палитре свойств. Если она серая, проверьте условия Доступности. Используйте метод "Отладка формы" (Shift+F9 в конфигураторе) для просмотра дерева элементов в рантайме.

Часто задаваемые вопросы (FAQ)

Как добавить кнопку в панель разделов (внизу экрана)?

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

Почему моя кнопка исчезает после сохранения настроек формы?

Если вы создаете кнопку динамически в коде, она не является частью сохраненного макета формы. При сбросе настроек или повторном открытии она должна создаваться заново кодом. Убедитесь, что код создания выполняется в событии ПриСозданииНаСервере (с передачей на клиент) или ПриОткрытии. Если кнопка создана в расширении, проверьте, не отключено ли расширение у данного пользователя.

Можно ли изменить цвет кнопки программно?

Прямого свойства "Цвет" у кнопки в 1С нет. Цвет определяется стилем оформления (темой) и свойством Важность. Вы можете установить Важность в значения: Обычное, Важно (синий), Опасно (красный). Для более сложной кастомизации потребуется использование HTML-документов или сторонних обработок, что не рекомендуется в типовой разработке.

Как скрыть стандартную кнопку "Провести" только для одного вида документа?

Это делается через расширение конфигурации. Откройте форму нужного документа в режиме расширения, найдите кнопку "Провести" в командной панели и установите свойство Видимость в Ложь. Либо используйте условное оформление, если нужно скрывать её динамически в зависимости от реквизитов.