Как отследить момент модификации формы и сведений в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе с управляемыми формами в «1С:Бухгалтерия 3.0» часто возникает задача отслеживания изменений данных. Например, в форме элемента справочника ФизЛица отображаются реквизиты, связанные с независимым регистром сведений ДокументыФизЛиц. При изменении этих реквизитов у формы появляется звездочка (признак модифицированности), информирующая пользователя о наличии несохраненных данных. В этой статье разберем, как платформа 1С отслеживает эти изменения и какими механизмами можно управлять этим поведением.

Выясним причину появления признака модифицированности

Рассмотрим, как платформа 1С определяет, что форма была изменена пользователем. Признак модифицированности формы (символ * в заголовке) устанавливается платформой автоматически при выполнении следующих условий:

  1. Флаг «Сохраняемые данные» у реквизитов формы. В конфигураторе для дополнительных (неосновных) реквизитов формы можно установить данный флаг. Если пользователь редактирует элемент управления, связанный с таким реквизитом, платформа автоматически переводит свойство формы Модифицированность в значение Истина.
  2. Свойство команды «Изменяет сохраняемые данные». Если кнопка на форме связана с командой, у которой включено это свойство, выполнение команды автоматически помечает форму как модифицированную.
  3. Открытие подчиненной формы с указанием владельца. Когда из основной формы открывается форма редактирования записи регистра сведений и ей передается владелец (текущая форма), внесенные изменения в подчиненной форме транслируются владельцу и устанавливают флаг модифицированности.

Программное управление модифицированностью на клиенте

Проанализируем контекстные ограничения платформы. Свойство Модифицированность доступно только в клиентском контексте (НаКлиенте). Вызов проверки на сервере обращается непосредственно к объекту базы данных, но не отражает состояние самой формы и ее неосновных реквизитов.

Посмотрим на пример программной установки модифицированности формы при изменении элемента управления на клиенте:


&НаКлиенте
Процедура ДокументУдостоверяющийЛичностьПриИзменении(Элемент)
    
    // Явно указываем платформе, что форма содержит несохраненные данные
    ЭтаФорма.Модифицированность = Истина;
    
КонецПроцедуры

Архитектура синхронизации формы с независимыми регистрами

Разберем по шагам, как правильно реализовать считывание и сохранение сведений, которые хранятся отдельно от основного объекта (например, данные из регистра сведений ДокументыФизЛиц для справочника ФизЛица):

  1. Чтение данных при открытии: В событии формы ПриСозданииНаСервере данные считываются из регистра сведений с помощью запроса или набора записей и записываются в специально созданный реквизит формы.
  2. Отслеживание изменений: У реквизита формы устанавливается флаг Сохраняемые данные или в событиях редактирования программно вызывается ЭтаФорма.Модифицированность = Истина;.
  3. Транзакционная запись: Чтобы данные регистра не записались раньше времени, их сохранение выполняется на сервере в обработчиках ПередЗаписьюНаСервере или ПриЗаписиНаСервере в момент сохранения самого элемента справочника.

Рассмотрим пример программной записи данных в регистр сведений при сохранении формы:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Формируем набор записей для независимого регистра сведений
    НаборЗаписей = РегистрыСведений.ДокументыФизЛиц.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Физлицо.Установить(ТекущийОбъект.Ссылка);
    
    Запись = НаборЗаписей.Добавить();
    Запись.Физлицо = ТекущийОбъект.Ссылка;
    Запись.ВидДокумента = ОбъектВидДокумента;
    Запись.Номер = ОбъектНомерДокумента;
    
    // Записываем данные регистра
    НаборЗаписей.Записать();
    
КонецПроцедуры

Обратите внимание: установка флага Сохраняемые данные заставляет форму выводить звездочку и предупреждать пользователя при закрытии, но платформа не записывает автоматически сторонние реквизиты в регистр сведений. Логику сохранения набора записей разработчик всегда должен реализовывать программно.

← На главную