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