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