Почему форма в 1С 7.7 становится модифицированной при открытии и как это исправить?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Поиск причины в коде и формулах диалога

Первым делом проанализируем стандартные места, где может происходить изменение контекста формы. Основная сложность в версии 7.7 заключается в том, что флаг модифицированности может взводиться не только в процедуре ПриОткрытии(), но и в вычисляемых текстовых полях или функциях, привязанных к элементам управления.

Рассмотрим алгоритм диагностики:

  1. Проверка процедур инициализации. Проанализируем содержимое процедуры ПриОткрытии(). Часто в типовых конфигурациях (например, «Торговля и Склад») из неё вызываются вспомогательные процедуры вроде УправлениеДиалогом(). Если внутри них происходит присвоение значений реквизитам или переменным, связанным с полями ввода, платформа пометит форму как измененную.
  2. Анализ текстовых формул. В 1С 7.7 текстовые элементы на форме могут содержать формулы. Эти формулы вычисляются платформой при отрисовке интерфейса. Если функция, указанная в текстовом поле, изменяет хотя бы одну переменную, связанную с реквизитом документа, Модифицированность() станет равной 1.
  3. Использование замера производительности. Если обычная пошаговая отладка не помогает, включим замер производительности. Это позволит увидеть полный стек вызовов функций, которые отрабатывают в момент открытия, включая скрытые вызовы из формул диалога.

Типичный пример: Изменение переменной в процедуре управления диалогом

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


Процедура УправлениеДиалогомРезерв()
    // ... какой-то код
    Если СостояниеЗаявки = Перечисление.СостоянияЗаявок.Неподтвержденная Тогда
        Склад = ""; // Изменение значения реквизита или связанной переменной
    КонецЕсли;
КонецПроцедуры

Важный нюанс: В отладчике значение Модифицированность() в «Табло» может обновиться не сразу после выполнения строки кода, а только после того, как фокус управления вернется к платформе или будет завершен текущий программный блок. Это часто сбивает разработчиков с толку.

Скрытые причины модифицированности

Если в коде модуля формы прямых присвоений нет, стоит обратить внимание на особенности работы самой платформы:

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

Методы диагностики «невидимых» изменений

Когда отладчик бессилен, воспользуемся проверенными методами:

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


Функция МояФункцияДляФормулы()
    Сообщить("Вызов из формулы. Модифицированность: " + Модифицированность());
    // ... полезный код
    Возврат Результат;
КонецФункции

Использование СтатусВозврата(0): В процедуре ПриОткрытии() можно временно установить СтатусВозврата(0) в самом конце. Это предотвратит фактическое открытие формы, но позволит проверить в отладчике, в какой именно момент до появления окна данные считаются измененными.

Как принудительно сбросить флаг

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

В процедуре ПриОткрытии(), после вызова всех функций управления диалогом, добавим строку:


Процедура ПриОткрытии()
    // Основная логика открытия
    УправлениеДиалогом(); 
    
    // Сбрасываем флаг, если форма открывается только для просмотра 
    // или если мы уверены, что программные изменения при открытии допустимы
    Модифицированность(0); 
КонецПроцедуры

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

← На главную