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

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

Как вызвать команду документа в 1С: программные и интерактивные способы

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

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

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

Ниже разобраны оба варианта: как вызвать команду из формы документа, как выполнить её программно без открытия формы, как передать параметры и проверить, что команда действительно отработала.

Где хранятся команды документа и какие они бывают

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

Различают стандартные и прикладные команды. Стандартные (Провести, Записать, ПометитьНаУдаление) платформа добавляет автоматически, их вызов обычно делается методами объекта: Записать(РежимЗаписиДокумента.Проведение). Прикладные команды создаёт разработчик, и их вызов требует явного обращения к форме или к процедуре-обработчику.

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

Интерактивный вызов команды из формы документа

Чтобы пользователь мог вызвать команду, её нужно вывести в интерфейс формы. В редакторе формы документа откройте дерево элементов, перетащите команду из списка «Команды» в нужную командную панель или группу кнопок. Платформа автоматически создаст кнопку с заголовком из синонима команды.

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

Команды, помещённые в группу «Ещё», доступны через одноимённое меню в правой части командной панели. Это стандартное место для редко используемых действий — таких как выгрузка, заполнение по шаблону, служебные операции.

Как добавить кнопку команды на форму
  1. 1
    Откройте форму документа в конфигураторе
  2. 2
    В панели команд найдите нужную команду документа
  3. 3
    Перетащите её в командную панель формы или группу кнопок
  4. 4
    Задайте заголовок, картинку и важность (обычная/важная)
  5. 5
    Обновите конфигурацию базы данных и проверьте в режиме предприятия

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

Из модуля формы команда вызывается методом формы ВыполнитьКоманду либо прямым вызовом процедуры-обработчика. Прямой вызов предпочтительнее: он проверяется компилятором и не зависит от строкового имени команды.

&НаКлиенте

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

ЗаполнитьТабличнуюЧастьНаСервере();

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

&НаСервере

Процедура ЗаполнитьТабличнуюЧастьНаСервере()

// работа с Объект.Товары

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

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

bsl
// Вызов команды формы по имени
ФормаДокумента.ВыполнитьКоманду("Заполнить");

Программный вызов без формы: модуль объекта и менеджер

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

&НаСервере

Процедура ВыполнитьЗаполнение(ДокументСсылка) Экспорт

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

ДокументОбъект.ЗаполнитьПоУмолчанию(); // экспортная процедура модуля объекта

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

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

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

Вызов команды печати документа

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

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

МассивОбъектов = Новый Массив;

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

ПечатныеФормы = УправлениеПечатью.ФормироватьПечатныеФормы(

"Документ.РеализацияТоваровУслуг", "Накладная", МассивОбъектов, Неопределено);

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

Передача параметров и проверка результата

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

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

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

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

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

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

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

Записан, но не проведён; исключение при Записать()

Команда на форме
Норма

Кнопка видна, обработчик отрабатывает без ошибок

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

Кнопки нет в командной панели или ошибка «процедура не обнаружена»

Печатная форма
Норма

Табличный документ сформирован и содержит данные

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

Пустая коллекция печатных форм или пустой макет

Типичные ошибки при вызове команд

Самая частая ошибка — обращение к процедуре, которая объявлена без ключевого слова Экспорт или находится в другом контексте. Вторая по частоте — попытка вызвать клиентскую процедуру с сервера или наоборот. Третья — использование ВыполнитьКоманду с устаревшим именем команды после переименования: строковые вызовы компилятор не проверяет.

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

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

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

Интерактивный вызов команды — кнопка на форме, программный — прямой вызов экспортной процедуры модуля объекта или менеджера. Бизнес-логику держите вне модуля формы, результат всегда проверяйте явно.

Часто задаваемые вопросы

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

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

Почему команда не отображается на форме документа?

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

Как вызвать команду документа из регламентного задания?

Реализуйте логику в экспортной процедуре модуля менеджера документа или общего серверного модуля и вызывайте её из обработчика задания. Форма и клиентский контекст в регламентных заданиях недоступны.

Чем отличается ВыполнитьКоманду от прямого вызова процедуры?

ВыполнитьКоманду обращается к команде по строковому имени и не проверяется компилятором — при переименовании команды вызов молча сломается. Прямой вызов процедуры безопаснее и работает быстрее.

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

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

Можно ли вызвать стандартную команду «Провести» программно?

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