Как отключить автоматическую очистку полей формы при изменении реквизита в 1С?

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

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

Проанализируем ситуацию

Рассмотрим классический пример на базе типовой конфигурации 1С:Бухгалтерия предприятия 3.0, документ ВедомостьНаВыплатуЗарплаты. Пользователи просят сделать так, чтобы при изменении организации в шапке документа физические лица в табличной части не очищались. Кажется, что задача тривиальна — нужно просто найти обработчик события поля и закомментировать строку очистки. Но при детальном изучении мы сталкиваемся со следующими странностями:

  1. В свойствах элемента формы Организация не назначены события.
  2. Программная проверка через Элементы.Организация.ПолучитьДействие("ПриИзменении") возвращает пустую строку.
  3. Модуль формы может быть практически пустым, без какого-либо подозрительного кода, очищающего реквизиты.
  4. Подключенных расширений, влияющих на эту форму, нет.
  5. Очистка происходит строго при интерактивном изменении поля пользователем до записи документа.

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

Выясним причину: Связи параметров выбора

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

В настройках этой связи существует важное свойство — Режим изменения связанного значения. По умолчанию, когда разработчик настраивает связь, платформа устанавливает режим Очищать. Логика платформы здесь ясна: если вы поменяли организацию, то выбранный ранее сотрудник другой организации становится невалидным, поэтому движок автоматически стирает данные в зависимом поле, защищая пользователя от сохранения противоречивых данных.

Именно поэтому отладчик ничего не ловит — очистка происходит внутри самой платформы 1С. Важно отметить, что механизм автоматической очистки срабатывает только при интерактивном изменении. Если вы поменяете реквизит программно (например, Объект.Организация = Неопределено), связанные поля автоматически не очистятся.

Рассмотрим способы решения

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

Способ 1: Полное удаление связей (Быстрый, но с побочным эффектом)

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


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Переопределяем связи пустым фиксированным массивом
    Элементы.ЗарплатаФизическоеЛицо.СвязиПараметровВыбора = Новый ФиксированныйМассив(Новый Массив);
    Элементы.ЗарплатаБанковскийСчет.СвязиПараметровВыбора = Новый ФиксированныйМассив(Новый Массив);

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

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

Способ 2: Корректное изменение режима очистки (Рекомендуемый)

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


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

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

← На главную