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