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