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