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

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

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

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

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

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

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

Что считается командой объекта в 1С

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

Отдельно существуют команды формы — они создаются в редакторе формы и выполняются только в её контексте, а также общие команды конфигурации, доступные глобально. Путаница между этими тремя видами команд — источник большинства вопросов по теме.

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

Вызов стандартных команд через методы объекта

Стандартные команды документов и справочников имеют прямые аналоги в объектной модели. Команда «Провести» эквивалентна методу Записать с режимом проведения, «Отменить проведение» — записи с режимом отмены проведения, «Пометить на удаление» — методу УстановитьПометкуУдаления.

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение,

РежимПроведенияДокумента.Оперативный);

Такой вызов полностью повторяет действие команды «Провести», включая выполнение обработчика проведения модуля объекта. Если проведение невозможно (не заполнены реквизиты, нарушены проверки), метод вызовет исключение — его следует оборачивать в конструкцию Попытка/Исключение при пакетной обработке.

Для команды «Пометить на удаление» аналог выглядит так:

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

ДокументОбъект.УстановитьПометкуУдаления(Истина);

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

Если команда создана в форме объекта, её обработчик находится в модуле формы. Программно вызвать такую команду изнутри самой формы можно, просто обратившись к процедуре обработчика по имени — это обычный вызов процедуры модуля:

&НаКлиенте

Процедура КомандаЗаполнить(Команда)

ЗаполнитьТабличнуюЧасть();

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

&НаКлиенте

Процедура ПрограммныйВызов()

КомандаЗаполнить(Неопределено);

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

Если обработчик команды использует параметр Команда и обращается к его свойствам, передайте вместо Неопределено реальный объект команды формы: ЭтаФорма.Команды.ИмяКоманды. Это важно для обработчиков, которые проверяют имя команды или её представление.

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

Порядок выноса логики команды для программного вызова
  1. 1
    Найдите обработчик команды в модуле формы
  2. 2
    Перенесите рабочий код в процедуру модуля объекта или общего серверного модуля
  3. 3
    Оставьте в обработчике команды только вызов этой процедуры с нужными параметрами
  4. 4
    Вызывайте ту же процедуру программно из нужного места
  5. 5
    Проверьте, что команда из формы и программный вызов дают одинаковый результат

Вызов команды объекта, описанной в конфигураторе

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

Чтобы выполнить такую команду программно, нужно вызвать ту же логику, которую выполняет её обработчик. Типовой приём — разместить обработчик команды в модуле менеджера объекта как экспортную процедуру:

// Модуль менеджера документа

Процедура СформироватьПечатнуюФорму(СсылкаНаДокумент) Экспорт

// логика формирования

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

// Программный вызов из любого места

Документы.РеализацияТоваровУслуг.СформироватьПечатнуюФорму(Ссылка);

Для печатных форм в типовых конфигурациях на базе БСП действует другой механизм — печать вызывается через модуль УправлениеПечатью, где команды печати регистрируются централизованно. Программная печать в таких конфигурациях выполняется через УправлениеПечатью.СформироватьПечатныеФормы, а не через прямой вызов команды.

Вызов глобальных и общих команд

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

ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма",

, , Новый УникальныйИдентификатор);

Если общая команда выполняет не открытие формы, а серверное действие, её логика размещается в модуле общей команды. Программный вызов снова сводится к вызову той же серверной процедуры из общего модуля.

Сравнение способов вызова

Метод объектной модели (Записать, УстановитьПометкуУдаления)

Подходит для стандартных команд документов и справочников. Работает на сервере и в фоновых заданиях. Не подходит для команд, существующих только в форме.

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

Подходит внутри самой формы. Не работает извне формы и на сервере без контекста формы.

Экспортная процедура модуля менеджера или общего модуля

Универсальный вариант для команд объекта: доступен отовсюду, включая фоновые задания и внешние соединения. Требует вынесения логики из формы.

Типичные ошибки и ограничения

Первая группа ошибок связана с контекстом выполнения. Клиентский обработчик команды нельзя вызвать из серверной процедуры, а серверный вызов из клиентского кода возможен только через серверную процедуру формы или вызов сервера общего модуля. Директивы &НаКлиенте и &НаСервере должны соответствовать месту вызова.

Вторая группа — попытка вызвать команду формы, когда форма не открыта. Если логика нужна и в форме, и вне её, она обязана жить в модуле объекта, менеджера или общем модуле. Форма — только один из способов запуска этой логики.

Третья типичная ситуация — игнорирование прав доступа. Программный вызов метода Записать с проведением выполняется с проверкой прав текущего пользователя (кроме вызова из привилегированного модуля). Если пользователь не имеет права проведения документа, программный вызов завершится ошибкой так же, как и нажатие кнопки.

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

Проверка результата вызова

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

Если ДокументСсылка.Проведен Тогда

// команда проведения выполнена успешно

КонецЕсли;

При вызове в цикле полезно собирать протокол: какие объекты обработаны успешно, по каким возникли ошибки и с каким текстом. Это позволяет повторить обработку только для проблемных объектов, а не для всей выборки.

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

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

Свойство Проведен у ссылки документа
Норма

Равно Истина после вызова Записать с режимом проведения

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

Осталось Ложь — проведение не выполнено, смотрите текст исключения

Движения по регистрам
Норма

Записи появились в регистрах, указанных в обработчике проведения

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

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

Повторный запуск команды из формы
Норма

Результат совпадает с программным вызовом

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

Результаты различаются — логика продублирована и разошлась, выносите её в общую процедуру

Частые вопросы

Можно ли вызвать команду объекта по её имени строкой, как Execute в других языках?

Универсального метода «выполнить команду по имени» у прикладных объектов нет. Можно использовать Выполнить с динамически сформированным текстом вызова, но это небезопасный приём, запрещённый во многих стандартах разработки. Правильный путь — вызов конкретной процедуры или метода объектной модели.

Как программно нажать кнопку «Сформировать» в отчёте на СКД?

Для отчёта на компоновке данных программное формирование выполняется через объект ОтчетОбъект и метод СкомпоноватьРезультат либо через программную работу со схемой компоновки и процессором компоновки. Нажатие кнопки формы имитировать не нужно.

Почему программный вызов команды работает в форме, но не работает в фоновом задании?

Фоновое задание выполняется на сервере без пользовательского интерфейса и без открытых форм. Любой код, завязанный на форму или клиентский контекст, там недоступен. Логику нужно перенести в серверный общий модуль или модуль менеджера объекта.

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

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

Выполняется ли обработчик проведения при программном вызове Записать с режимом проведения?

Да, выполняется полностью, включая все проверки заполнения, контроль остатков и формирование движений. Программный вызов равнозначен нажатию команды «Провести» пользователем, с той же проверкой прав доступа.

Можно ли открыть форму объекта и сразу выполнить её команду?

Да: получите форму через ПолучитьФорму, затем вызовите её экспортную процедуру или обработчик команды, и после этого откройте форму методом Открыть. Либо передайте в параметрах формы признак, по которому обработчик ПриСозданииНаСервере сам выполнит нужное действие.

Итог

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

Команда объекта в 1С вызывается программно не по имени, а через эквивалент: методы объектной модели для стандартных команд, вызов обработчика для команд формы, экспортные процедуры модулей для команд объекта. Логику, нужную вне формы, выносят в серверные модули. Изменяющие данные вызовы выполняйте с транзакциями и проверкой результата.