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