Как правильно выполнить обновление табличной части после заполнения документа на основании?

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

При разработке конфигураций на платформе 1С:Предприятие 8 часто возникает желание «автоматизировать» действия пользователя, например, вызвать процедуру формы сразу после выполнения кода ОбработкаЗаполнения. Однако прямой вызов клиентских процедур из серверного кода невозможен и архитектурно неверен. Давайте разберем, как реализовать такую задачу правильно, следуя принципам разработки в управляемом приложении.

Почему нельзя просто вызвать клиентскую процедуру с сервера?

Важно понимать, что в момент выполнения ОбработкаЗаполнения документ находится на сервере. В этот момент на сервере нет визуального представления (формы). Более того, код заполнения может выполняться в фоновом задании, при программном создании документа или при групповой обработке, когда пользовательский интерфейс отсутствует в принципе. Попытка принудительно «нажать кнопку» на клиенте из серверного контекста приведет к ошибке, так как форма не существует в оперативной памяти сервера.

Решение 1: Вынос логики в серверные модули (рекомендуемый подход)

Самый надежный способ — это полное разделение бизнес-логики и визуального представления. Если логика расчета цен или обновления строк Товары должна выполняться при вводе на основании, то этот код не должен зависеть от событий формы.

Перенесите выполняемый код в ОбщийМодуль или модуль объекта в экспортную процедуру. Теперь форма будет лишь посредником, который вызывает этот серверный метод, передает ему данные и получает результат.


// В общем модуле (сервер)
Процедура РассчитатьИОбновитьТЧ(ОбъектДокумента) Экспорт
    // Логика расчета
    Для Каждого СтрокаТЧ Из ОбъектДокумента.Товары Цикл
        СтрокаТЧ.Цена = ПолучитьЦену(СтрокаТЧ.Номенклатура);
    КонецЦикла;
КонецПроцедуры

Таким образом, процедура РассчитатьИОбновитьТЧ может быть вызвана как из ОбработкаЗаполнения (на сервере), так и из клиентского обработчика формы после вопроса пользователю. Это обеспечивает стабильность работы при обновлении конфигурации.

Решение 2: Использование механизма ДополнительныеСвойства

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

  1. В процедуре ОбработкаЗаполнения установите флаг в дополнительных свойствах: Источник.ДополнительныеСвойства.Вставить("НужноОбновитьТЧ", Истина);
  2. В модуле формы в событии ПриЧтенииНаСервере или ПриОткрытии проверьте этот флаг:
    
    Если Объект.ДополнительныеСвойства.Свойство("НужноОбновитьТЧ") Тогда
        // Выполняем действия по обновлению
        ОбновитьТабличнуюЧастьНаКлиенте();
    КонецЕсли;
    

Решение 3: События формы ПриОткрытии или ПослеЗаписи

Часто разработчики пытаются запустить обновление «здесь и сейчас», хотя логичнее перенести это событие в ПриОткрытии формы. Когда пользователь открывает созданный на основании документ, форма сама может проанализировать заполненность реквизитов и, если данные требуют актуализации, вызвать соответствующую процедуру расчета.

Важное примечание: При проектировании всегда задавайтесь вопросом: «Будет ли этот код работать, если документ создается программно в регламентном задании?». Если ответ «нет» — логику следует выносить в серверные модули, не привязанные к объекту Форма.

Подведем итоги

Чтобы ваша разработка была профессиональной и не вызывала проблем при поддержке:

Следуя этим правилам, вы добьетесь предсказуемого поведения системы и упростите отладку своего кода.

← На главную