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