К статье
Практический материал

Разработка и Конфигурация · 12 мин

Модифицированность в 1С: что это такое и как с ней работать

Что такое модифицированность в 1С, где отображается признак изменённых данных, как сбросить или установить флаг программно и какие ошибки допускают разработчики.

Модифицированность — это внутренний признак в платформе 1С:Предприятие, который показывает, что данные объекта были изменены после загрузки или последнего сохранения, но ещё не записаны в базу данных. Проще говоря, система «помнит», что пользователь или программный код что-то поменял в форме, документе или элементе справочника, и при закрытии спросит, нужно ли сохранить изменения.

С этим механизмом сталкиваются все: бухгалтер видит звёздочку в заголовке окна документа, разработчик читает и устанавливает свойство Модифицированность у формы, а администратор разбирается, почему программа спрашивает о сохранении, хотя «ничего не меняли». Понимание того, как работает этот флаг, помогает избежать потери данных, лишних диалогов и ошибок в собственных доработках.

Ниже разобрано, где проявляется модифицированность, как платформа выставляет её автоматически, как управлять ей из кода на встроенном языке и какие типичные ошибки приводят к ложным срабатываниям или, наоборот, к потере изменений.

Где пользователь видит модифицированность

Самое заметное проявление — звёздочка (*) в заголовке окна или на закладке формы. Она появляется сразу после первого изменения любого реквизита: стоит поправить сумму в документе, добавить строку в табличную часть или сменить дату — и заголовок помечается звёздочкой. Это сигнал: текущее состояние объекта отличается от того, что хранится в базе.

Второе проявление — диалог при закрытии. Если закрыть форму с установленной модифицированностью, платформа спросит: «Данные были изменены. Сохранить изменения?» с вариантами «Да», «Нет» и «Отмена». Ответ «Отмена» возвращает в форму, «Нет» закрывает её без записи, «Да» записывает объект.

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

Как платформа выставляет признак автоматически

Модифицированность устанавливается автоматически при любом интерактивном изменении данных формы: вводе значения в поле, добавлении или удалении строки табличной части, изменении пометки в динамическом списке, если он редактируется. Также флаг взводится, когда программный код меняет реквизиты объекта, открытого в форме, — платформа отслеживает изменение данных, а не способ, которым оно произошло.

После успешной записи объекта (команда «Записать», «Провести», «Записать и закрыть») модифицированность автоматически сбрасывается в Ложь. То же происходит при повторном чтении объекта из базы — форма перечитывает данные и считает их неизменёнными.

Важный нюанс: изменение чисто интерфейсных элементов (например, раскрытие группы, смена активной вкладки, сортировка динамического списка) не влияет на модифицированность, потому что данные объекта при этом не меняются. Флаг реагирует только на изменения в данных, которые будут записаны.

Как работать с модифицированностью в коде

У управляемой формы есть свойство Модифицированность, доступное и для чтения, и для записи. Чтение позволяет проверить, есть ли несохранённые изменения, прежде чем выполнять действие. Запись значения Истина принудительно помечает форму как изменённую, а Ложь — снимает признак.

&НаКлиенте

Процедура ПередЗакрытиемОбработчик()

Если Модифицированность Тогда

ПоказатьПредупреждение(, "Есть несохранённые изменения");

КонецЕсли;

КонецПроцедуры

&НаСервере

Процедура УстановитьПризнак()

Модифицированность = Истина; // принудительно пометить форму

КонецПроцедуры

Типовой сценарий принудительной установки — кнопка, которая меняет данные косвенно: например, формирует файл на основании документа и должна гарантировать, что пользователь сначала сохранит текущее состояние. Установив Модифицированность = Истина, вы заставляете платформу спросить о сохранении при закрытии.

Обратная задача — снять флаг без записи — требуется реже. Например, при открытии формы код автоматически подставляет значение по умолчанию, но это не должно считаться изменением пользователя. Сброс через Модифицированность = Ложь решает задачу, но применять его нужно осторожно: если реальные правки пользователя окажутся «заметены», при закрытии они пропадут без предупреждения.

Модифицированность у объектов и расширений форм

Помимо свойства формы, похожая логика есть у расширений форм объектов — например, у Расширение формы объекта доступен метод Записать(), а признак изменённости по-прежнему хранится на уровне формы. У самих прикладных объектов (ДокументОбъект, СправочникОбъект) отдельного публичного свойства «Модифицированность» нет: для проверки, отличается ли объект от сохранённого, сравнивают значения реквизитов или используют Объект.Ссылка.ПолучитьОбъект() и постатейное сравнение.

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

Для динамических списков и таблиц значений, выведенных на форму, модифицированность формы взводится, только если редактирование меняет данные основного реквизита формы. Изменения в реквизитах формы, не связанных с объектом, также помечают форму изменённой — это частая причина «ложных» вопросов о сохранении в самописных обработках.

Типичные проблемы и их причины

Самая распространённая жалоба пользователей: «Ничего не менял, а программа спрашивает о сохранении». Причины обычно такие: обработчик ПриОткрытии программно заполняет какой-то реквизит; на форме есть поле с автоматическим пересчётом; код в ПриЧтенииНаСервере дописывает служебные данные в объект. Любое из этих действий взводит флаг, хотя пользователь не прикасался к данным.

Вторая проблема — обратная: изменения не фиксируются, форма закрывается молча. Такое бывает, когда разработчик сбрасывает модифицированность в обработчике записи, но запись фактически не выполнялась (например, отменена проверкой). Ещё один вариант — данные меняются в объекте на сервере без обновления формы, и пользователь видит устаревшие значения.

Третья группа проблем — лишние вопросы при программной записи. Если код вызывает Записать() формы, а затем закрывает её, платформа может снова спросить о сохранении, если между записью и закрытием что-то изменило данные (например, обработчик после записи подставил значение). Порядок действий в таких сценариях нужно продумывать: сначала все изменения, потом запись, потом закрытие.

Типичные ошибки
01
Заполнение реквизита в ПриОткрытии без сброса флага — форма сразу выглядит изменённой и спрашивает о сохранении
02
Сброс Модифицированность = Ложь до записи объекта — реальные правки пользователя теряются при закрытии без вопроса
03
Перенос кода из обычных форм в управляемые без адаптации синтаксиса — ошибки компиляции и неработающая логика
04
Игнорирование модифицированности перед внешней операцией (печать, обмен) — в файл уходят несохранённые или устаревшие данные

Практические сценарии использования

Проверка перед печатью или отправкой. Если печатная форма строится по данным объекта, несохранённые изменения в открытой форме могут не попасть в документ. Перед формированием печати проверяйте Модифицированность и предлагайте записать объект:

&НаКлиенте

Процедура Печать(Команда)

Если Модифицированность Тогда

Если Не Записать() Тогда

Возврат;

КонецЕсли;

КонецЕсли;

// далее формирование печатной формы

КонецПроцедуры

Блокировка закрытия до завершения обязательных действий. В некоторых мастерах и пошаговых обработках удобно держать модифицированность установленной, пока пользователь не завершит все шаги, — тогда случайное закрытие не пройдёт незамеченным.

Диагностика в обработчиках. В событии ПередЗаписью или ПриЗакрытии проверка модифицированности помогает отличить ситуацию «пользователь просто посмотрел документ» от «пользователь что-то правил», и строить логирование или проверки соответственно.

Как убрать ложный вопрос о сохранении
  1. 1
    Откройте модуль формы и найдите обработчики ПриОткрытии, ПриЧтенииНаСервере, ПриСозданииНаСервере
  2. 2
    Проверьте, нет ли в них присваиваний реквизитам объекта или реквизитам формы
  3. 3
    Если заполнение служебное и не должно считаться изменением, добавьте после него Модифицированность = Ложь
  4. 4
    Перезапустите форму и убедитесь, что при простом открытии и закрытии вопрос о сохранении больше не появляется

Как проверить, что всё работает правильно

После доработки логики модифицированности прогоните базовые сценарии вручную. Откройте объект и сразу закройте — вопроса быть не должно. Измените любой реквизит и закройте — вопрос обязан появиться, а ответ «Да» должен сохранить изменения. Нажмите «Записать» — звёздочка в заголовке исчезает.

Отдельно проверьте программные сценарии: печать, обмен, заполнение по кнопке. В каждом из них несохранённые изменения должны либо записываться до выполнения операции, либо явно игнорироваться с понятным пользователю поведением.

Контрольные точки

Как проверить результат

Открытие и закрытие формы без правок
Норма

Форма закрывается молча, звёздочки в заголовке нет

Тревожный признак

Появляется вопрос о сохранении — где-то код меняет данные при открытии

Изменение реквизита и закрытие
Норма

Появляется вопрос, ответ Да сохраняет изменения

Тревожный признак

Форма закрывается без вопроса — изменения потеряны

Команда Записать
Норма

После записи звёздочка в заголовке исчезает

Тревожный признак

Звёздочка остаётся — обработчик после записи снова меняет данные

Ограничения и особенности механизма

Модифицированность — свойство конкретной формы, а не объекта в базе. Если один и тот же документ открыт в двух окнах, каждая форма хранит собственный признак. Это не защита от конкурентного редактирования: платформа контролирует конфликты при записи, а не через модифицированность.

Признак не сохраняется между сеансами и не хранится в базе данных. Это чисто сеансовое состояние формы. Поэтому восстановить «незаписанные изменения» после аварийного завершения сеанса нельзя — если форма закрылась без записи, данные потеряны.

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

Итог

Что важно запомнить

Модифицированность — сеансовый признак несохранённых изменений формы: звёздочка в заголовке и вопрос при закрытии. В коде ей управляют через свойство Модифицированность; сбрасывать его без записи опасно, а ложные срабатывания обычно вызваны заполнением реквизитов в обработчиках открытия.

Частые вопросы

Почему 1С спрашивает о сохранении, если я ничего не менял?

Чаще всего при открытии формы срабатывает код, который программно заполняет какой-то реквизит или пересчитывает значение. Платформа воспринимает это как изменение данных. Пользователю достаточно ответить «Нет», а разработчику стоит найти такое присваивание в обработчиках открытия и либо убрать его, либо сбросить признак после выполнения.

Чем модифицированность отличается от проведения документа?

Это независимые вещи. Модифицированность означает, что данные формы изменены и не записаны. Проведение — это операция записи документа с формированием движений по регистрам. Документ может быть проведён и при этом помечен звёздочкой, если после проведения что-то изменили в форме.

Можно ли отключить вопрос о сохранении при закрытии?

Штатной настройкой для пользователя — нет, это поведение платформы. Программно вопрос убирают сбросом свойства Модифицированность в Ложь перед закрытием, но делать это без фактической записи данных рискованно: изменения будут потеряны молча.

Как узнать в коде, есть ли несохранённые изменения в форме?

Прочитайте свойство Модифицированность у формы: значение Истина означает наличие несохранённых изменений. Проверку обычно выполняют в обработчиках команд, которым нужны актуальные данные, — печати, обмена, формирования отчёта по объекту.

Работает ли модифицированность в веб-клиенте и тонком клиенте?

Да, механизм реализован на уровне платформы и одинаково работает во всех клиентских приложениях: толстом, тонком и веб-клиенте. Внешний вид звёздочки и диалога может немного отличаться, но логика идентична.

Что делать, если после нажатия «Записать» звёздочка не исчезает?

Значит, после записи какой-то обработчик снова изменил данные формы — например, код в ПослеЗаписи подставляет значение или пересчитывает реквизит. Найдите это присваивание и либо уберите его, либо выполняйте до записи, чтобы итоговое состояние формы совпадало с записанным.