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