Разработка и Конфигурация · 12 мин
Модифицированность в 1С: что это такое и как с ней работать
Что такое модифицированность в 1С, где отображается признак изменённых данных, как сбросить или установить флаг программно и какие ошибки допускают разработчики.
Модифицированность — это внутренний признак в платформе 1С:Предприятие, который показывает, что данные объекта были изменены после загрузки или последнего сохранения, но ещё не записаны в базу данных. Проще говоря, система «помнит», что пользователь или программный код что-то поменял в форме, документе или элементе справочника, и при закрытии спросит, нужно ли сохранить изменения.
С этим механизмом сталкиваются все: бухгалтер видит звёздочку в заголовке окна документа, разработчик читает и устанавливает свойство Модифицированность у формы, а администратор разбирается, почему программа спрашивает о сохранении, хотя «ничего не меняли». Понимание того, как работает этот флаг, помогает избежать потери данных, лишних диалогов и ошибок в собственных доработках.
Ниже разобрано, где проявляется модифицированность, как платформа выставляет её автоматически, как управлять ей из кода на встроенном языке и какие типичные ошибки приводят к ложным срабатываниям или, наоборот, к потере изменений.
Где пользователь видит модифицированность
Самое заметное проявление — звёздочка (*) в заголовке окна или на закладке формы. Она появляется сразу после первого изменения любого реквизита: стоит поправить сумму в документе, добавить строку в табличную часть или сменить дату — и заголовок помечается звёздочкой. Это сигнал: текущее состояние объекта отличается от того, что хранится в базе.
Второе проявление — диалог при закрытии. Если закрыть форму с установленной модифицированностью, платформа спросит: «Данные были изменены. Сохранить изменения?» с вариантами «Да», «Нет» и «Отмена». Ответ «Отмена» возвращает в форму, «Нет» закрывает её без записи, «Да» записывает объект.
В управляемых формах признак модифицированности также влияет на доступность некоторых команд и на работу автосохранения настроек. В тонком и веб-клиенте поведение аналогично: признак един для всех видов клиентов, поскольку реализован на уровне платформы, а не конкретной конфигурации.
Как платформа выставляет признак автоматически
Модифицированность устанавливается автоматически при любом интерактивном изменении данных формы: вводе значения в поле, добавлении или удалении строки табличной части, изменении пометки в динамическом списке, если он редактируется. Также флаг взводится, когда программный код меняет реквизиты объекта, открытого в форме, — платформа отслеживает изменение данных, а не способ, которым оно произошло.
После успешной записи объекта (команда «Записать», «Провести», «Записать и закрыть») модифицированность автоматически сбрасывается в Ложь. То же происходит при повторном чтении объекта из базы — форма перечитывает данные и считает их неизменёнными.
Важный нюанс: изменение чисто интерфейсных элементов (например, раскрытие группы, смена активной вкладки, сортировка динамического списка) не влияет на модифицированность, потому что данные объекта при этом не меняются. Флаг реагирует только на изменения в данных, которые будут записаны.
Как работать с модифицированностью в коде
У управляемой формы есть свойство Модифицированность, доступное и для чтения, и для записи. Чтение позволяет проверить, есть ли несохранённые изменения, прежде чем выполнять действие. Запись значения Истина принудительно помечает форму как изменённую, а Ложь — снимает признак.
&НаКлиенте
Процедура ПередЗакрытиемОбработчик()
Если Модифицированность Тогда
ПоказатьПредупреждение(, "Есть несохранённые изменения");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьПризнак()
Модифицированность = Истина; // принудительно пометить форму
КонецПроцедуры
Типовой сценарий принудительной установки — кнопка, которая меняет данные косвенно: например, формирует файл на основании документа и должна гарантировать, что пользователь сначала сохранит текущее состояние. Установив Модифицированность = Истина, вы заставляете платформу спросить о сохранении при закрытии.
Обратная задача — снять флаг без записи — требуется реже. Например, при открытии формы код автоматически подставляет значение по умолчанию, но это не должно считаться изменением пользователя. Сброс через Модифицированность = Ложь решает задачу, но применять его нужно осторожно: если реальные правки пользователя окажутся «заметены», при закрытии они пропадут без предупреждения.
Модифицированность у объектов и расширений форм
Помимо свойства формы, похожая логика есть у расширений форм объектов — например, у Расширение формы объекта доступен метод Записать(), а признак изменённости по-прежнему хранится на уровне формы. У самих прикладных объектов (ДокументОбъект, СправочникОбъект) отдельного публичного свойства «Модифицированность» нет: для проверки, отличается ли объект от сохранённого, сравнивают значения реквизитов или используют Объект.Ссылка.ПолучитьОбъект() и постатейное сравнение.
В обычных формах (неуправляемый интерфейс старых конфигураций) свойство Модифицированность() у формы работает похожим образом, но является методом, а не свойством в строгом смысле. При переносе кода между обычными и управляемыми формами это различие вызывает ошибки компиляции — синтаксис нужно адаптировать.
Для динамических списков и таблиц значений, выведенных на форму, модифицированность формы взводится, только если редактирование меняет данные основного реквизита формы. Изменения в реквизитах формы, не связанных с объектом, также помечают форму изменённой — это частая причина «ложных» вопросов о сохранении в самописных обработках.
Типичные проблемы и их причины
Самая распространённая жалоба пользователей: «Ничего не менял, а программа спрашивает о сохранении». Причины обычно такие: обработчик ПриОткрытии программно заполняет какой-то реквизит; на форме есть поле с автоматическим пересчётом; код в ПриЧтенииНаСервере дописывает служебные данные в объект. Любое из этих действий взводит флаг, хотя пользователь не прикасался к данным.
Вторая проблема — обратная: изменения не фиксируются, форма закрывается молча. Такое бывает, когда разработчик сбрасывает модифицированность в обработчике записи, но запись фактически не выполнялась (например, отменена проверкой). Ещё один вариант — данные меняются в объекте на сервере без обновления формы, и пользователь видит устаревшие значения.
Третья группа проблем — лишние вопросы при программной записи. Если код вызывает Записать() формы, а затем закрывает её, платформа может снова спросить о сохранении, если между записью и закрытием что-то изменило данные (например, обработчик после записи подставил значение). Порядок действий в таких сценариях нужно продумывать: сначала все изменения, потом запись, потом закрытие.
Практические сценарии использования
Проверка перед печатью или отправкой. Если печатная форма строится по данным объекта, несохранённые изменения в открытой форме могут не попасть в документ. Перед формированием печати проверяйте Модифицированность и предлагайте записать объект:
&НаКлиенте
Процедура Печать(Команда)
Если Модифицированность Тогда
Если Не Записать() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
// далее формирование печатной формы
КонецПроцедуры
Блокировка закрытия до завершения обязательных действий. В некоторых мастерах и пошаговых обработках удобно держать модифицированность установленной, пока пользователь не завершит все шаги, — тогда случайное закрытие не пройдёт незамеченным.
Диагностика в обработчиках. В событии ПередЗаписью или ПриЗакрытии проверка модифицированности помогает отличить ситуацию «пользователь просто посмотрел документ» от «пользователь что-то правил», и строить логирование или проверки соответственно.
- 1Откройте модуль формы и найдите обработчики ПриОткрытии, ПриЧтенииНаСервере, ПриСозданииНаСервере
- 2Проверьте, нет ли в них присваиваний реквизитам объекта или реквизитам формы
- 3Если заполнение служебное и не должно считаться изменением, добавьте после него Модифицированность = Ложь
- 4Перезапустите форму и убедитесь, что при простом открытии и закрытии вопрос о сохранении больше не появляется
Как проверить, что всё работает правильно
После доработки логики модифицированности прогоните базовые сценарии вручную. Откройте объект и сразу закройте — вопроса быть не должно. Измените любой реквизит и закройте — вопрос обязан появиться, а ответ «Да» должен сохранить изменения. Нажмите «Записать» — звёздочка в заголовке исчезает.
Отдельно проверьте программные сценарии: печать, обмен, заполнение по кнопке. В каждом из них несохранённые изменения должны либо записываться до выполнения операции, либо явно игнорироваться с понятным пользователю поведением.
Как проверить результат
Форма закрывается молча, звёздочки в заголовке нет
Появляется вопрос о сохранении — где-то код меняет данные при открытии
Появляется вопрос, ответ Да сохраняет изменения
Форма закрывается без вопроса — изменения потеряны
После записи звёздочка в заголовке исчезает
Звёздочка остаётся — обработчик после записи снова меняет данные
Ограничения и особенности механизма
Модифицированность — свойство конкретной формы, а не объекта в базе. Если один и тот же документ открыт в двух окнах, каждая форма хранит собственный признак. Это не защита от конкурентного редактирования: платформа контролирует конфликты при записи, а не через модифицированность.
Признак не сохраняется между сеансами и не хранится в базе данных. Это чисто сеансовое состояние формы. Поэтому восстановить «незаписанные изменения» после аварийного завершения сеанса нельзя — если форма закрылась без записи, данные потеряны.
В расширениях конфигураций и внешних обработках механизм работает так же, как в основной конфигурации, но при обновлении типовой конфигурации доработки, связанные с модифицированностью, стоит перепроверять: изменения в типовых обработчиках записи могут поменять поведение вашего кода.
Что важно запомнить
Модифицированность — сеансовый признак несохранённых изменений формы: звёздочка в заголовке и вопрос при закрытии. В коде ей управляют через свойство Модифицированность; сбрасывать его без записи опасно, а ложные срабатывания обычно вызваны заполнением реквизитов в обработчиках открытия.
Частые вопросы
Почему 1С спрашивает о сохранении, если я ничего не менял?
Чаще всего при открытии формы срабатывает код, который программно заполняет какой-то реквизит или пересчитывает значение. Платформа воспринимает это как изменение данных. Пользователю достаточно ответить «Нет», а разработчику стоит найти такое присваивание в обработчиках открытия и либо убрать его, либо сбросить признак после выполнения.
Чем модифицированность отличается от проведения документа?
Это независимые вещи. Модифицированность означает, что данные формы изменены и не записаны. Проведение — это операция записи документа с формированием движений по регистрам. Документ может быть проведён и при этом помечен звёздочкой, если после проведения что-то изменили в форме.
Можно ли отключить вопрос о сохранении при закрытии?
Штатной настройкой для пользователя — нет, это поведение платформы. Программно вопрос убирают сбросом свойства Модифицированность в Ложь перед закрытием, но делать это без фактической записи данных рискованно: изменения будут потеряны молча.
Как узнать в коде, есть ли несохранённые изменения в форме?
Прочитайте свойство Модифицированность у формы: значение Истина означает наличие несохранённых изменений. Проверку обычно выполняют в обработчиках команд, которым нужны актуальные данные, — печати, обмена, формирования отчёта по объекту.
Работает ли модифицированность в веб-клиенте и тонком клиенте?
Да, механизм реализован на уровне платформы и одинаково работает во всех клиентских приложениях: толстом, тонком и веб-клиенте. Внешний вид звёздочки и диалога может немного отличаться, но логика идентична.
Что делать, если после нажатия «Записать» звёздочка не исчезает?
Значит, после записи какой-то обработчик снова изменил данные формы — например, код в ПослеЗаписи подставляет значение или пересчитывает реквизит. Найдите это присваивание и либо уберите его, либо выполняйте до записи, чтобы итоговое состояние формы совпадало с записанным.