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