Почему при добавлении записи в регистр сведений открываются две формы и как это исправить?

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

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

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

Разбор причин автоматического открытия формы

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

Простое использование Отказ = Истина в обработчике не всегда помогает, так как стандартная команда кнопки «Добавить» в панели инструментов табличного поля работает на более низком уровне и игнорирует этот флаг.

Способ 1: Отказ от стандартных механизмов

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

  1. Удалите стандартную кнопку «Добавить» из панели инструментов табличного поля.
  2. Создайте свою кнопку (команду) на форме.
  3. В процедуре этой команды напишите алгоритм, который либо сразу пишет данные в регистр, либо открывает вашу собственную форму без использования встроенных механизмов платформы.

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


Процедура ПриНажатииКнопкиДобавить(Кнопка)
    Форма = РегистрыСведений.ПрименяемостьИзделия.ПолучитьФорму("ФормаЗаписи");
    // Здесь можно передать параметры в форму
    Форма.Открыть();
КонецПроцедуры

Способ 2: Передача параметров в форму

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

Рассмотрим, как правильно подготовить параметры для передачи в открываемую форму:


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

Советы по архитектуре

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

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

← На главную