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