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