Почему форма документа становится модифицированной при нажатии кнопки заполнения ТЧ и как это исправить?

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

При разработке внешних обработок заполнения табличных частей для конфигураций на обычных формах (таких как Комплексная автоматизация 1.1 или УПП 1.3) программисты часто сталкиваются со странным поведением системы. Даже если процедура Инициализировать в модуле обработки абсолютно пустая, после нажатия на кнопку заполнения в заголовке формы документа появляется «звездочка» (символ (*)), а при закрытии программа настойчиво предлагает сохранить изменения. Давайте разберем по шагам, почему это происходит и как «поймать» этот момент.

Анализируем причину появления модифицированности

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

Когда вы подключаете внешнюю обработку заполнения, система автоматически формирует подменю кнопки «Заполнить». За это отвечает общий модуль УниверсальныеМеханизмы. В процессе программного создания кнопок для каждой из них принудительно устанавливается свойство ИзменяетДанные = Истина. Рассмотрим, к чему это приводит:

  1. Пользователь нажимает на кнопку в подменю.
  2. Платформа 1С, видя установленный флаг ИзменяетДанные, мгновенно взводит свойство Модифицированность формы в значение Истина.
  3. Это происходит до того, как управление передается в вашу процедуру Инициализировать.

Именно поэтому, даже если ваш код не содержит ни одной строки, «звездочка» уже красуется в заголовке. Платформа действует превентивно: она предполагает, что раз кнопка предназначена для изменения данных, значит, пользователь должен иметь возможность сохранить результат работы этой кнопки.

Как проверить состояние модифицированности в отладке

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

  1. Откройте модуль формы документа, где вызывается процедура НажатиеНаДополнительнуюКнопкуЗаполненияТЧ.
  2. Установите точку останова (клавиша F9) на первой строке этой процедуры.
  3. В режиме предприятия нажмите вашу кнопку заполнения.
  4. Когда выполнение остановится, откройте окно «Табло» или «Вычислить выражение» (Shift+F9) и введите: ЭтаФорма.Модифицированность.

Вы увидите, что значение уже равно Истина, хотя код обработки еще даже не начинал создаваться. Платформа отработала «интерфейсное» нажатие кнопки.

Решение 1: Программный сброс флага модифицированности

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


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

КонецПроцедуры

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

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

Решение 2: Использование типа «Печатная форма»

Проанализируем ситуацию: если ваша обработка заполнения ТЧ на самом деле ничего не записывает в объект (например, она просто открывает какое-то окно с информацией или выполняет расчеты без изменения реквизитов), возможно, вы выбрали неверный тип регистрации.

Как советовали опытные разработчики, попробуйте зарегистрировать обработку не как «Заполнение табличных частей», а как «Внешнюю печатную форму». Для кнопок печати типовые механизмы 1С обычно не устанавливают флаг ИзменяетДанные, и нажатие на такую кнопку не приводит к появлению «звездочки».

Решение 3: Изменение свойств кнопки в коде формы

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

Обычно это делается в процедуре, вызываемой из ПриОткрытии. Посмотрим на примерную логику поиска кнопки:


Для Каждого Кнопка Из ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПодменюЗаполнить.Кнопки Цикл
    Если Кнопка.Имя = "ИмяВашейКнопки" Тогда
        Кнопка.ИзменяетДанные = Ложь;
    КонецЕсли;
КонецЦикла;

Этот способ самый «чистый» с точки зрения поведения платформы, так как он предотвращает саму причину взвода флага модифицированности. Однако он требует изменения типового кода формы документа, что не всегда желательно при поддержке конфигурации.

Сравнение с управляемыми формами (8.3)

Стоит отметить, что в современных конфигурациях на управляемых формах (БП 3.0, ERP 2.x) эта проблема решена более изящно. В модуле СведенияОВнешнейОбработке мы указываем параметр Использование. Если выбрать ДополнительнаяОбработка (а не ВызовСерверногоМетода), то платформа не будет автоматически помечать объект как измененный, пока ваш код явно не вызовет метод ЭтаФорма.Модифицированность = Истина или не изменит данные объекта, связанные с формой.

В старых же «обычных» формах логика работы с интерфейсом была более жесткой и привязанной к свойствам самих элементов управления. Понимание свойства ИзменяетДанные поможет вам избежать лишних вопросов от пользователей о сохранении данных в пустых или информационных обработках.

← На главную