Почему документ «Реализация товаров и услуг» становится модифицированным (появляется «звездочка») сразу после открытия?

Программист 1С v8.3 (Обычные формы)
← На главную

Ситуация, когда при открытии документа в 1С (особенно в конфигурациях на обычных формах, таких как УПП 1.3) в заголовке окна появляется символ «*» (звездочка), означает, что свойство Модифицированность формы приняло значение Истина. Это сигнализирует пользователю о том, что данные были изменены и требуют сохранения, хотя фактически пользователь ничего не вводил. Рассмотрим подробно, почему это происходит и как найти «невидимого» виновника изменений.

Метод 1. Использование замера производительности — «золотой стандарт» диагностики

Если обычная отладка с точками останова в процедурах ПриОткрытии и ПередОткрытием не дает результатов, а значение Модифицированность меняется на Истина «само по себе», нам поможет замер производительности. Этот метод позволяет зафиксировать абсолютно все операции, которые выполняет платформа, включая обращения к реквизитам.

Выполним следующие шаги по шагам:

  1. Запустим конфигурацию в режиме «1С:Предприятие».
  2. Откроем список документов «Реализация товаров и услуг», но сам документ пока не открываем.
  3. В главном меню перейдем в Отладка — Замер производительности (включим его).
  4. Откроем проблемный документ. Как только форма полностью загрузилась и появилась «звездочка», сразу выключаем замер производительности (тем же пунктом меню).
  5. Проанализируем полученную таблицу. Нас интересуют строки кода, где встречается символ присваивания =.
  6. Особое внимание уделим строкам, где происходит обращение к ЭтотОбъект или ЭтотОбъект.Ссылка. Ищите конструкции вида Объект.Реквизит = ... или ЭлементыФормы.ИмяПоля.Значение = .... Любое, даже техническое переприсваивание (например, Объект.Сумма = Объект.Сумма), принудительно выставляет флаг модифицированности.

Метод 2. Проверка свойства элементов формы «Изменяет данные»

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

Проанализируем форму документа:

  1. Зайдем в конфигуратор и откроем форму документа «Реализация товаров и услуг».
  2. Выделим все элементы управления (Ctrl+A).
  3. В палитре свойств найдем пункт «Изменяет данные».
  4. Обратим внимание на те поля, которые заполняются программно в коде формы. Если поле привязано к реквизиту объекта и у него стоит этот флаг, то любая «нормализация» данных (например, удаление лишних пробелов или подстановка значения по умолчанию) вызовет появление звездочки.

Часто проблема кроется в невидимых элементах. Проверьте элементы с Видимость = Ложь. Если программный код меняет их значение при открытии, пользователь не видит изменений, но платформа фиксирует модификацию объекта.

Метод 3. Процедуры модуля объекта и подписки на события

Иногда корень проблемы лежит вне модуля формы. Выясним причину, изучив модуль самого объекта документа. Платформа 1С выполняет определенные действия при чтении данных из базы в память.

Рассмотрим процедуры:

Если в коде встречается прямое присвоение свойству Модифицированность, это сразу решит вопрос. Пример кода, который стоит искать:


// Такой код принудительно устанавливает флаг
ЭтаФорма.Модифицированность = Истина;

Метод 4. Расхождение в точности типов (Числа и Даты)

Это одна из самых коварных причин, которую крайне сложно поймать обычным заполнением реквизитов. Разберем ситуацию с точностью данных.

Миллисекунды в датах: В базе данных 1С значение даты хранится с точностью до секунды. Однако при программном формировании даты (например, через внешние источники или специфические функции) в переменную могут попасть миллисекунды. Стандартное поле ввода на форме 1С не умеет отображать миллисекунды. При открытии формы платформа «обрезает» дату до секунд. Это расхождение между данными в базе и данными в элементе управления платформа интерпретирует как изменение, что выставляет Модифицированность = Истина.

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

Метод 5. Автоматические расчеты и обработчики ожидания

Проверим наличие обработчиков ожидания, которые могут запускаться при открытии. Используем поиск по тексту модуля формы для фразы ПодключитьОбработчикОжидания. Если такой обработчик срабатывает через 0.1 секунды после открытия, вы можете не успеть поймать его отладчиком в ПриОткрытии, но флаг уже будет установлен.

Также посмотрим на обработчик ПриАктивизацииСтроки. Хотя в обсуждении упоминалось, что модифицированность появляется и без заполненных строк, важно помнить: при открытии формы первая строка (если она есть) активизируется автоматически. Если в этом событии прописана логика пересчета итогов, это может быть причиной:


Процедура ТоварыПриАктивизацииСтроки(Элемент)
    // Если здесь меняется какой-либо реквизит объекта, 
    // форма станет модифицированной сразу при открытии.
    Объект.ТекущийОстатокНаСкладе = ПолучитьОстаток(Элемент.ТекущиеДанные.Номенклатура);
КонецПроцедуры

Метод 6. Влияние настроек пользователя и автозаполнения

В типовых решениях (УПП, УТ 10.3) реализован механизм «Настройки пользователя». При открытии нового или даже существующего документа система может пытаться «дозаполнить» пустые реквизиты (Склад, Подразделение, Ответственный). Если документ был записан с пустым реквизитом, а при открытии система нашла подходящее значение в настройках и подставила его — документ станет модифицированным.

Для проверки этой гипотезы попробуем закомментировать вызовы общих модулей в процедуре ПередОткрытием, которые отвечают за заполнение настроек, например:

// РаботаСДиалогами.ЗаполнитьНачальныеНастройки(ЭтаФорма);

Если после комментирования «звездочка» исчезла, значит, причина в автоматической подстановке значений по умолчанию.

Итоги диагностики

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

← На главную