Разработка и Конфигурация · 9 мин
Как выполнить команду объекта в 1С
Как выполнить команду объекта в 1С: команды формы, командный интерфейс, глобальные команды, программный вызов через ВыполнитьКоманду. Примеры кода и типичные ошибки.
Выполнение команды объекта — одна из базовых операций при работе с 1С как в режиме пользователя, так и при разработке. Под «командой объекта» обычно понимают три разных механизма: команды формы (кнопки и пункты меню), команды командного интерфейса (панели разделов, навигации и действий) и глобальные команды, заданные в общих модулях. У каждого механизма свой способ вызова — интерактивный или программный.
Пользователь выполняет команду щелчком по кнопке или сочетанием клавиш, а разработчику часто нужно вызвать ту же команду из кода — например, открыть объект с параметрами, создать новый элемент справочника с заполнением или имитировать нажатие кнопки формы. Для этого в платформе есть методы ВыполнитьКоманду(), ОткрытьФорму(), а также обработчики команд в модулях форм.
Ниже разобраны все основные сценарии: где искать команды объекта в конфигураторе, как выполнить их вручную и программно, какие ограничения существуют у тонкого и веб-клиента и какие ошибки встречаются чаще всего.
Что такое команда объекта и где она находится
В конфигураторе команды объекта (справочника, документа, отчета) отображаются на закладке «Команды» в окне редактирования объекта. Там же задаются стандартные команды, которые платформа добавляет автоматически: «Создать», «Найти», «Провести», «Печать» и другие. Свои команды разработчик добавляет через кнопку «Добавить» и связывает с обработчиком в модуле формы, модуля объекта или общем модуле.
Важно различать область видимости команды. Команда формы существует только внутри конкретной формы и недоступна извне. Команда командного интерфейса видна в панелях разделов и может быть вызвана пользователем в любой момент. Глобальная команда общего модуля доступна из любого места конфигурации, если у модуля установлены нужные флаги клиентского контекста.
Интерактивное выполнение команды пользователем
В режиме 1С:Предприятие команды объекта доступны в нескольких местах. Кнопки формы расположены в командной панели формы и в меню «Ещё». Команды создания и открытия списков находятся в панели навигации раздела, команды действий (отчеты, обработки, служебные операции) — в панели действий. Если пользователь не видит нужную команду, её может скрывать настройка командного интерфейса или ограничение прав.
Для быстрого доступа многие команды имеют сочетания клавиш, которые назначаются в конфигураторе в свойствах кнопки или команды формы. Например, стандартное проведение документа обычно доступно по Ctrl+Enter в форме документа, а запись — по Ctrl+S. Проверить назначенные сочетания можно в свойствах элемента формы в конфигураторе.
Если команда должна быть видна, но отсутствует, проверьте три вещи: роль пользователя (функциональные опции и права на объект), настройку видимости команд в разделе «Администрирование — Настройка командного интерфейса» и условия видимости кнопки в коде формы.
Программный вызов команды формы
Команда формы выполняется через её обработчик — процедуру с директивой &НаКлиенте или &НаСервере, которая указывается в свойстве «Действие» команды. Программно вызвать команду можно двумя способами: напрямую вызвать процедуру-обработчик из другого кода той же формы или обратиться к команде через коллекцию ЭтаФорма.Команды.
Типичный пример — программное нажатие кнопки «Записать» из другого обработчика:
&НаКлиенте
Процедура СохранитьИЗакрыть(Команда)
// Вызываем стандартный обработчик записи
Записать();
Закрыть();
КонецПроцедуры
Если нужно выполнить команду другой открытой формы, получите на неё ссылку через ПолучитьФорму() или при открытии и вызовите её экспортную процедуру. Учтите ограничение: процедуры с директивой &НаКлиенте нельзя вызывать с сервера, а серверные вызовы из клиента требуют, чтобы процедура была экспортной и форма имела соответствующий контекст.
&НаКлиенте
Процедура ВыполнитьКомандуФормы()
// Прямой вызов обработчика команды формы
Записать();
// Или обращение к команде по имени
КомандаЗаписать = ЭтаФорма.Команды.Найти("Записать");
Если КомандаЗаписать <> Неопределено Тогда
Записать();
КонецЕсли;
КонецПроцедурыПрограммное открытие объекта и выполнение стандартных команд
Чаще всего под «выполнить команду объекта» подразумевают действие, которое пользователь делал бы через командный интерфейс: создать элемент, открыть список, открыть конкретный объект. Программно это делается через ОткрытьФорму() с указанием полного имени формы и структуры параметров.
&НаКлиенте
Процедура СоздатьНовыйЭлемент(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Родитель", ТекущаяГруппа);
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта",
ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Для открытия существующего объекта передайте параметр Ключ со ссылкой на объект. Для открытия списка с отбором — параметр Отбор в виде структуры. Этот способ полностью заменяет интерактивные команды «Создать» и «Открыть» и работает одинаково в тонком, толстом и веб-клиенте.
Стандартные команды записи и проведения документа программно выполняются методами объекта на сервере: ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение). Это не требует открытия формы и подходит для фоновой обработки, но обходит проверки, зашитые в клиентских обработчиках формы.
Глобальные команды и общие модули
Глобальные команды создаются в ветке «Общие — Команды» конфигуратора и привязываются к экспортным процедурам общих модулей. Такой подход используют для действий, не привязанных к конкретной форме: открытие обработки, запуск регламентной операции, вызов внешнего отчета.
Программно глобальную команду выполняют прямым вызовом её обработчика, если модуль доступен в текущем контексте. Для клиентского вызова общий модуль должен иметь флаг «Клиент (управляемое приложение)», для серверного — «Сервер». Если требуется вызов сервера из клиента, модуль дополнительно помечают флагом «Вызов сервера».
Альтернатива — метод ИнтерфейсКлиента.ВыполнитьКоманду() и варианты ВыполнитьКоманду() в некоторых расширениях платформы, но на практике прямой вызов процедуры предпочтительнее: он даёт контроль над параметрами, возвратом значения и обработкой ошибок.
Проверка результата и ограничения
После программного выполнения команды убедитесь, что действие действительно произошло: объект записался (проверка по ссылке), документ проведён (свойство Проведен), форма открылась с нужными параметрами. Для отладки используйте точки останова в обработчике команды и окно «Вычислить выражение» для проверки состояния объекта.
Основные ограничения: в тонком и веб-клиенте недоступен модальный вызов некоторых методов без режима использования модальности, обмен данными между клиентом и сервером сериализуется (нельзя передать несериализуемые типы), а в безопасном режиме расширений часть операций с файловой системой и COM-объектами заблокирована.
Как проверить результат
Ссылка объекта не пустая, объект читается из базы
Ссылка пустая или объект отсутствует — запись не выполнена
Свойство Проведен = Истина, движения видны в регистрах
Документ записан, но не проведён — проверьте исключения в обработке проведения
Форма открылась, поля заполнены из структуры параметров
Форма открылась пустой — имена параметров не совпадают с ожидаемыми формой
FAQ
Как выполнить команду формы из другой формы?
Сохраните ссылку на открытую форму (например, через параметр при открытии или владельца формы) и вызовите её экспортную процедуру: ФормаВладелец.ИмяПроцедуры(). Процедура должна быть объявлена с ключевым словом Экспорт и доступной директивой контекста.
Почему кнопка команды есть, а нажатие ничего не делает?
Чаще всего у команды не назначен обработчик в свойстве «Действие» или обработчик завершается ошибкой, которая подавляется. Откройте свойства кнопки в конфигураторе, проверьте привязку процедуры и поставьте точку останова в её начале.
Можно ли выполнить команду командного интерфейса программно?
Напрямую — нет, но её действие воспроизводится через ОткрытьФорму() с теми же параметрами, что заданы у команды, либо вызовом процедуры-обработчика команды, если она находится в доступном общем модуле.
Как выполнить команду на сервере без открытия формы?
Используйте объектную модель: получите объект методом ПолучитьОбъект() по ссылке, измените данные и вызовите Записать(). Для документов передайте режим записи — Запись, Проведение или ОтменаПроведения.
Команда работает в толстом клиенте, но не в тонком — в чём причина?
В тонком клиенте недоступна часть объектной модели (например, прямая работа с объектами данных) и модальные вызовы. Перенесите логику в серверную процедуру с директивой &НаСервере и вызывайте её из клиентского обработчика команды.
Как назначить горячую клавишу на команду?
В конфигураторе откройте свойства кнопки или команды формы, найдите свойство «СочетаниеКлавиш» и выберите комбинацию из списка. Убедитесь, что сочетание не пересекается со стандартными командами платформы, иначе сработает одна из них.
Что важно запомнить
Команду объекта выполняют интерактивно через кнопки и командный интерфейс или программно: обработчик команды формы вызывается напрямую, открытие и создание объектов — через ОткрытьФорму() с параметрами, запись и проведение — методами объекта на сервере. Соблюдайте контекст клиент/сервер и проверяйте результат по состоянию объекта.