Почему при закрытии документа появляется сообщение «Данные были изменены, сохранить изменения?» и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Понимание природы проблемы

Платформа 1С:Предприятие автоматически отслеживает состояние данных на форме. Свойство Модифицированность становится равным Истина, если платформа фиксирует любое изменение реквизитов или табличных частей, связанных с элементами управления. Когда вы выполняете программный код в обработчике ПередЗаписью, особенно если вы выгружаете табличную часть методом Выгрузить() или обращаетесь к данным формы, платформа может интерпретировать это как изменение состояния объекта.

Если запись не состоялась (установлен Отказ = Истина), флаг модифицированности не сбрасывается автоматически, так как система считает, что данные в форме все еще отличаются от данных, записанных в информационной базе.

Способ №1: Анализ причины и использование отладки

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

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

Способ №2: Принудительный сброс флага (техническое решение)

Если вы уверены, что проводимые проверки не меняют данных документа, а лишь выполняют аналитическую функцию (как в вашем примере с проверкой товаров на комиссии), можно явно сообщить системе, что форма не требует сохранения. Для этого воспользуйтесь установкой свойства Модифицированность в значение Ложь.

Разберем, куда правильно вставить этот код:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // ... ваш код проверок ...
    Если Не Рез.Пустой() Тогда
        Сообщить("В табличной части документа присутствуют товары не относящиеся к группе «Товары на комиссии»!");
        Отказ = Истина;
        
        // Сбрасываем признак модифицированности, так как изменений в данных не было
        ЭтаФорма.Модифицированность = Ложь;
    КонецЕсли;
КонецПроцедуры

Важно: Мы размещаем эту строку сразу после установки Отказ = Истина. Таким образом, если пользователь получит сообщение об ошибке и нажмет кнопку закрытия формы, система не будет спрашивать его о сохранении, так как мы явно указали, что данные не были изменены.

Почему лучше избегать «костылей»?

Хотя сброс флага Модифицированность = Ложь решает проблему с назойливым сообщением, помните о рисках. Если в будущем вы добавите код, который реально меняет данные на форме, этот принудительный сброс может «спрятать» эти изменения от пользователя. Пользователь закроет форму, не сохранив важную информацию, и система не предупредит его об этом.

Рекомендации по архитектуре кода

Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил:

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

← На главную