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