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