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