Как программно записать и провести документ в 1С (Управляемые формы)?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разница между записью объекта и записью формы

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

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

Программная запись и проведение через управляемую форму (На Клиенте)

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

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


ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);

Форма = ПолучитьФорму("Документ.ИмяДокумента.Форма.ФормаДокумента");
Форма.Объект.Дата = ТекущаяДата();

// Записываем и проводим форму с переданными параметрами
Форма.Записать(ПараметрыЗаписи);
Форма.Открыть();

Если код выполняется непосредственно в модуле самой формы (например, в обработчике команды), то вызов будет еще проще:


&НаКлиенте
Процедура ПровестиПрограммно(Команда)
    ПараметрыЗаписи = Новый Структура;
    ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
    ЭтаФорма.Записать(ПараметрыЗаписи);
КонецПроцедуры

Программное проведение документа без открытия формы (На Сервере)

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

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


&НаСервере
Процедура ИзменитьИПровестиДокументНаСервере(СсылкаНаДокумент)
    
    // Получаем объект из ссылки
    ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    ДокОбъект.Комментарий = "Документ изменен программно";
    
    // Оборачиваем проведение в Попытку
    Попытка
        ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        Сообщить("Не удалось провести документ: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Оперативное и неоперативное проведение

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

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

← На главную