К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как выполнить команду объекта в 1С

Как выполнить команду объекта в 1С: команды формы, командный интерфейс, глобальные команды, программный вызов через ВыполнитьКоманду. Примеры кода и типичные ошибки.

Выполнение команды объекта — одна из базовых операций при работе с 1С как в режиме пользователя, так и при разработке. Под «командой объекта» обычно понимают три разных механизма: команды формы (кнопки и пункты меню), команды командного интерфейса (панели разделов, навигации и действий) и глобальные команды, заданные в общих модулях. У каждого механизма свой способ вызова — интерактивный или программный.

Пользователь выполняет команду щелчком по кнопке или сочетанием клавиш, а разработчику часто нужно вызвать ту же команду из кода — например, открыть объект с параметрами, создать новый элемент справочника с заполнением или имитировать нажатие кнопки формы. Для этого в платформе есть методы ВыполнитьКоманду(), ОткрытьФорму(), а также обработчики команд в модулях форм.

Ниже разобраны все основные сценарии: где искать команды объекта в конфигураторе, как выполнить их вручную и программно, какие ограничения существуют у тонкого и веб-клиента и какие ошибки встречаются чаще всего.

Что такое команда объекта и где она находится

В конфигураторе команды объекта (справочника, документа, отчета) отображаются на закладке «Команды» в окне редактирования объекта. Там же задаются стандартные команды, которые платформа добавляет автоматически: «Создать», «Найти», «Провести», «Печать» и другие. Свои команды разработчик добавляет через кнопку «Добавить» и связывает с обработчиком в модуле формы, модуля объекта или общем модуле.

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

Интерактивное выполнение команды пользователем

В режиме 1С:Предприятие команды объекта доступны в нескольких местах. Кнопки формы расположены в командной панели формы и в меню «Ещё». Команды создания и открытия списков находятся в панели навигации раздела, команды действий (отчеты, обработки, служебные операции) — в панели действий. Если пользователь не видит нужную команду, её может скрывать настройка командного интерфейса или ограничение прав.

Для быстрого доступа многие команды имеют сочетания клавиш, которые назначаются в конфигураторе в свойствах кнопки или команды формы. Например, стандартное проведение документа обычно доступно по Ctrl+Enter в форме документа, а запись — по Ctrl+S. Проверить назначенные сочетания можно в свойствах элемента формы в конфигураторе.

Если команда должна быть видна, но отсутствует, проверьте три вещи: роль пользователя (функциональные опции и права на объект), настройку видимости команд в разделе «Администрирование — Настройка командного интерфейса» и условия видимости кнопки в коде формы.

Программный вызов команды формы

Команда формы выполняется через её обработчик — процедуру с директивой &НаКлиенте или &НаСервере, которая указывается в свойстве «Действие» команды. Программно вызвать команду можно двумя способами: напрямую вызвать процедуру-обработчик из другого кода той же формы или обратиться к команде через коллекцию ЭтаФорма.Команды.

Типичный пример — программное нажатие кнопки «Записать» из другого обработчика:

&НаКлиенте

Процедура СохранитьИЗакрыть(Команда)

// Вызываем стандартный обработчик записи

Записать();

Закрыть();

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

Если нужно выполнить команду другой открытой формы, получите на неё ссылку через ПолучитьФорму() или при открытии и вызовите её экспортную процедуру. Учтите ограничение: процедуры с директивой &НаКлиенте нельзя вызывать с сервера, а серверные вызовы из клиента требуют, чтобы процедура была экспортной и форма имела соответствующий контекст.

bsl
&НаКлиенте
Процедура ВыполнитьКомандуФормы()
    // Прямой вызов обработчика команды формы
    Записать();
    // Или обращение к команде по имени
    КомандаЗаписать = ЭтаФорма.Команды.Найти("Записать");
    Если КомандаЗаписать <> Неопределено Тогда
        Записать();
    КонецЕсли;
КонецПроцедуры

Программное открытие объекта и выполнение стандартных команд

Чаще всего под «выполнить команду объекта» подразумевают действие, которое пользователь делал бы через командный интерфейс: создать элемент, открыть список, открыть конкретный объект. Программно это делается через ОткрытьФорму() с указанием полного имени формы и структуры параметров.

&НаКлиенте

Процедура СоздатьНовыйЭлемент(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Родитель", ТекущаяГруппа);

ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта",

ПараметрыФормы, ЭтаФорма);

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

Для открытия существующего объекта передайте параметр Ключ со ссылкой на объект. Для открытия списка с отбором — параметр Отбор в виде структуры. Этот способ полностью заменяет интерактивные команды «Создать» и «Открыть» и работает одинаково в тонком, толстом и веб-клиенте.

Стандартные команды записи и проведения документа программно выполняются методами объекта на сервере: ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение). Это не требует открытия формы и подходит для фоновой обработки, но обходит проверки, зашитые в клиентских обработчиках формы.

Глобальные команды и общие модули

Глобальные команды создаются в ветке «Общие — Команды» конфигуратора и привязываются к экспортным процедурам общих модулей. Такой подход используют для действий, не привязанных к конкретной форме: открытие обработки, запуск регламентной операции, вызов внешнего отчета.

Программно глобальную команду выполняют прямым вызовом её обработчика, если модуль доступен в текущем контексте. Для клиентского вызова общий модуль должен иметь флаг «Клиент (управляемое приложение)», для серверного — «Сервер». Если требуется вызов сервера из клиента, модуль дополнительно помечают флагом «Вызов сервера».

Альтернатива — метод ИнтерфейсКлиента.ВыполнитьКоманду() и варианты ВыполнитьКоманду() в некоторых расширениях платформы, но на практике прямой вызов процедуры предпочтительнее: он даёт контроль над параметрами, возвратом значения и обработкой ошибок.

Типичные ошибки
01
Вызов клиентской процедуры формы с сервера — приводит к ошибке компиляции или выполнения; переносите общую логику в серверные процедуры
02
Обращение к команде формы, которая ещё не создана: команда добавлена в дерево элементов, но обработчик не назначен — нажатие ничего не делает
03
Попытка выполнить команду закрытой формы через сохранённую ссылку — форма недоступна, вызов завершается ошибкой
04
Игнорирование прав: команда видна в интерфейсе, но у пользователя нет прав на объект — выполнение обрывается ошибкой доступа

Проверка результата и ограничения

После программного выполнения команды убедитесь, что действие действительно произошло: объект записался (проверка по ссылке), документ проведён (свойство Проведен), форма открылась с нужными параметрами. Для отладки используйте точки останова в обработчике команды и окно «Вычислить выражение» для проверки состояния объекта.

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

Контрольные точки

Как проверить результат

Запись объекта после программной команды
Норма

Ссылка объекта не пустая, объект читается из базы

Тревожный признак

Ссылка пустая или объект отсутствует — запись не выполнена

Проведение документа
Норма

Свойство Проведен = Истина, движения видны в регистрах

Тревожный признак

Документ записан, но не проведён — проверьте исключения в обработке проведения

Открытие формы с параметрами
Норма

Форма открылась, поля заполнены из структуры параметров

Тревожный признак

Форма открылась пустой — имена параметров не совпадают с ожидаемыми формой

FAQ

Как выполнить команду формы из другой формы?

Сохраните ссылку на открытую форму (например, через параметр при открытии или владельца формы) и вызовите её экспортную процедуру: ФормаВладелец.ИмяПроцедуры(). Процедура должна быть объявлена с ключевым словом Экспорт и доступной директивой контекста.

Почему кнопка команды есть, а нажатие ничего не делает?

Чаще всего у команды не назначен обработчик в свойстве «Действие» или обработчик завершается ошибкой, которая подавляется. Откройте свойства кнопки в конфигураторе, проверьте привязку процедуры и поставьте точку останова в её начале.

Можно ли выполнить команду командного интерфейса программно?

Напрямую — нет, но её действие воспроизводится через ОткрытьФорму() с теми же параметрами, что заданы у команды, либо вызовом процедуры-обработчика команды, если она находится в доступном общем модуле.

Как выполнить команду на сервере без открытия формы?

Используйте объектную модель: получите объект методом ПолучитьОбъект() по ссылке, измените данные и вызовите Записать(). Для документов передайте режим записи — Запись, Проведение или ОтменаПроведения.

Команда работает в толстом клиенте, но не в тонком — в чём причина?

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

Как назначить горячую клавишу на команду?

В конфигураторе откройте свойства кнопки или команды формы, найдите свойство «СочетаниеКлавиш» и выберите комбинацию из списка. Убедитесь, что сочетание не пересекается со стандартными командами платформы, иначе сработает одна из них.

Итог

Что важно запомнить

Команду объекта выполняют интерактивно через кнопки и командный интерфейс или программно: обработчик команды формы вызывается напрямую, открытие и создание объектов — через ОткрытьФорму() с параметрами, запись и проведение — методами объекта на сервере. Соблюдайте контекст клиент/сервер и проверяйте результат по состоянию объекта.