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