Разработка и Конфигурация · 11 мин
Как создать кнопку на форме документа в 1С
Разбираем, как добавить кнопку на форму документа в 1С: работа в конфигураторе, команды и обработчики, расширения конфигурации, типичные ошибки и проверка результата.
Кнопка на форме документа в 1С — это элемент интерфейса, связанный с командой: по нажатию выполняется код на встроенном языке. Задача решается двумя путями: через изменение формы документа в конфигураторе или через расширение конфигурации, если типовую конфигурацию нельзя редактировать. В обоих случаях алгоритм одинаков: создать команду, разместить кнопку на форме, написать обработчик и проверить работу в режиме предприятия.
Материал ориентирован на управляемые формы — они используются в большинстве современных конфигураций (Управление торговлей, Бухгалтерия предприятия, ERP и другие на платформе 8.3). Для обычных форм логика похожа, но редактор формы устроен иначе, и отдельные шаги будут отличаться.
Определите, где и как вы будете добавлять кнопку
Первое решение — изменять саму конфигурацию или создавать расширение. Если это собственная (самописная) конфигурация или типовая, снятая с поддержки, можно редактировать форму документа напрямую. Если конфигурация типовая и обновляется автоматически, прямое изменение приведёт к сложностям при обновлении: доработки придётся сравнивать и объединять вручную.
Второе решение — где именно разместить кнопку. Варианты: командная панель формы (верхняя полоса с кнопками «Провести», «Записать»), командная панель табличной части (для действий со строками), отдельная группа на форме или контекстное меню. От места зависит, как пользователь будет находить кнопку и какие данные будут доступны в обработчике.
Как выбрать подход
Создайте команду формы
Откройте конфигуратор, найдите нужный документ в дереве конфигурации (ветка «Документы»), раскройте его и дважды щёлкните по форме документа — обычно она называется «ФормаДокумента». Если формы нет, её нужно сначала создать через конструктор форм.
В редакторе формы перейдите на вкладку «Команды» → «Команды формы» и нажмите «Добавить». Задайте имя команды латиницей без пробелов, например ЗаполнитьПоОстаткам. В свойствах команды укажите заголовок — именно он будет виден пользователю на кнопке, например «Заполнить по остаткам». При необходимости задайте картинку, подсказку и сочетание клавиш.
После создания команды платформа предложит создать обработчик — согласитесь, выбрав тип «На клиенте». В модуль формы добавится заготовка процедуры &НаКлиенте Процедура ЗаполнитьПоОстаткам(Команда) ... КонецПроцедуры. Код обработчика рассмотрим ниже.
Разместите кнопку на форме
Команда сама по себе невидима — чтобы появилась кнопка, команду нужно перетащить мышью из списка команд в дерево элементов формы (левая часть редактора). Платформа автоматически создаст элемент «Кнопка формы», связанный с этой командой.
Куда перетаскивать: чтобы кнопка оказалась в верхней командной панели — перетащите на элемент «КоманднаяПанель» формы. Чтобы в панель табличной части — на командную панель соответствующей таблицы. Чтобы кнопка стояла отдельно в теле формы — создайте группу и перетащите команду в неё.
У созданной кнопки можно настроить свойства: «Важность» (выделение цветом для основного действия), «Отображение» (картинка, надпись или оба варианта), «ТолькоВоВсехДействиях» (скрыть кнопку в меню «Ещё», если она второстепенная). Для редко используемых действий разумно сразу убирать кнопку в «Ещё», чтобы не перегружать панель.
- 1Откройте форму документа в конфигураторе
- 2На вкладке «Команды» создайте команду формы с понятным именем и заголовком
- 3Согласитесь на создание обработчика и выберите контекст «На клиенте»
- 4Перетащите команду в дерево элементов — в командную панель или группу
- 5Напишите код обработчика в модуле формы
- 6Обновите конфигурацию базы данных (F7) и проверьте кнопку в режиме предприятия
Напишите обработчик команды
Обработчик — это процедура в модуле формы, которая выполняется при нажатии кнопки. Ключевой момент — контекст выполнения. Код с директивой &НаКлиенте работает на компьютере пользователя: здесь доступны вопросы пользователю, открытие форм, но нельзя напрямую выполнять запросы к базе. Код с директивой &НаСервере выполняется на сервере: здесь доступны запросы, но нельзя показывать диалоги.
Типовой шаблон: клиентская процедура запускается кнопкой, при необходимости задаёт вопрос пользователю, затем вызывает серверную процедуру, которая делает основную работу с данными объекта.
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
ЗаполнитьПоОстаткамНаСервере();
ЭтотОбъект.Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
// Работа с данными объекта через реквизит "Объект"
Для Каждого СтрокаТовара Из Объект.Товары Цикл
// логика заполнения строки
КонецЦикла;
КонецПроцедуры
Данные текущего документа в модуле формы доступны через реквизит Объект (типа «ДанныеФормыСтруктура»). Изменения, сделанные на сервере через Объект, автоматически отобразятся на форме. Помните: серверная процедура без контекста серверного вызова должна быть помечена директивой &НаСервере, а вызываться из клиентской — просто по имени.
&НаКлиенте
Процедура ПечатьСчета(Команда)
Если Объект.Ссылка.Пустая() Тогда
ПоказатьПредупреждение(, "Сначала запишите документ");
Возврат;
КонецЕсли;
КонецПроцедурыДобавление кнопки через расширение конфигурации
Если типовую конфигурацию менять нельзя, создайте расширение: в конфигураторе откройте «Конфигурация» → «Расширения конфигурации» → «Создать». Задайте имя и префикс (он добавится к именам заимствованных объектов, например «Расш1_»).
В дереве расширения найдите нужный документ, раскройте его формы, вызовите контекстное меню у формы документа и выберите «Добавить в расширение». Форма скопируется в расширение. Дальше действия те же: на вкладке «Команды» добавьте свою команду (она будет с префиксом расширения), перетащите её в дерево элементов и напишите обработчик в модуле формы расширения.
Ограничение расширений: нельзя удалять типовые элементы формы и менять некоторые свойства, можно добавлять свои элементы и изменять часть свойств существующих. Также учитывайте, что при обновлении типовой конфигурации форма в расширении не обновится автоматически — если вендор изменит форму, расширение нужно будет проверить и при необходимости актуализировать.
Проверка результата и типичные ошибки
После сохранения формы обновите конфигурацию базы данных (клавиша F7) и запустите режим предприятия. Откройте документ и проверьте: кнопка видна в ожидаемом месте, заголовок читаемый, при нажатии код выполняется без ошибок, данные документа меняются как задумано, а для незаписанного документа обработчик ведёт себя корректно.
Проверьте также права: если у пользователя нет права на интерактивное изменение документа, кнопка, модифицирующая данные, должна либо быть недоступна, либо обработчик должен корректно сообщать о невозможности выполнения. Для управления доступностью можно использовать свойство команды «Изменяет сохраняемые данные» — платформа автоматически заблокирует кнопку, когда форма открыта только на просмотр.
Как проверить результат
Кнопка отображается в нужной командной панели с понятным заголовком
Кнопки нет или она не там, где ожидалась — проверьте, перетащена ли команда в дерево элементов
Код выполняется, данные документа изменяются, ошибок нет
Ничего не происходит — проверьте связь команды и процедуры-обработчика
Обработчик сообщает, что документ нужно записать, либо корректно работает с новым объектом
Ошибка обращения к пустой ссылке или потеря введённых данных
Кнопка недоступна или корректно отказывает при отсутствии прав
Ошибка нарушения прав доступа при нажатии
Часто задаваемые вопросы
Можно ли добавить кнопку на форму без конфигуратора, прямо в режиме предприятия?
Нет, создание команд и кнопок — это разработка, выполняемая только в конфигураторе или через расширение. В режиме предприятия пользователь может лишь изменить видимость существующих кнопок через настройку формы («Ещё» → «Изменить форму»), если это разрешено, но добавить новую команду с кодом так нельзя.
Как сделать, чтобы кнопка вызывала внешнюю обработку или печатную форму?
Создайте команду формы и в клиентском обработчике вызовите нужный механизм: для печати — процедуру из общего модуля управления печатью (в типовых конфигурациях это обычно УправлениеПечатьюКлиент), для открытия внешней обработки — открытие формы обработки с передачей параметров. Если печатных форм несколько, удобнее подключить их через стандартный механизм дополнительных отчётов и обработок — тогда кнопка появится в подменю «Печать» без доработки формы.
Почему кнопка есть, но серая и не нажимается?
Чаще всего включено свойство команды «Изменяет сохраняемые данные», а форма открыта в режиме просмотра или объект недоступен для изменения. Также проверьте, не управляется ли доступность программно (свойство «Доступность» элемента формы) и хватает ли у пользователя прав на изменение документа.
Как разместить кнопку, которая выполняет действие для выбранной строки табличной части?
Перетащите команду в командную панель табличной части. В обработчике текущая строка доступна через Элементы.Товары.ТекущиеДанные (на клиенте). Если действие массовое, обходите коллекцию Объект.Товары целиком, а не только текущую строку, и явно укажите это в заголовке кнопки, чтобы пользователь понимал область действия.
Что лучше для типовой конфигурации: расширение или снятие с поддержки?
Расширение почти всегда предпочтительнее: типовая конфигурация остаётся на поддержке, обновления устанавливаются штатно, а доработка хранится отдельно и её легко отключить. Снятие с поддержки оправдано только когда доработок очень много и они затрагивают механизмы, которые расширениями изменить нельзя.
Как скрыть кнопку для части пользователей?
Стандартный путь — управлять видимостью программно: в обработчике ПриСозданииНаСервере проверить роль или функциональную опцию пользователя и установить Элементы.ИмяКнопки.Видимость = Ложь. Также можно привязать команду к функциональной опции через свойство, если механизм должен отключаться централизованно для всей базы.
Что важно запомнить
Кнопка на форме документа создаётся в три шага: команда формы, перетаскивание её в дерево элементов и обработчик в модуле формы с правильным разделением клиентского и серверного кода. Для типовых конфигураций используйте расширение, а результат всегда проверяйте на копии базы: видимость кнопки, выполнение кода, поведение с незаписанным документом и права пользователей.