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