Почему в расширении 1С дублируется форма выбора и как это исправить?

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

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

Разбираем механизм работы стандартных обработчиков (эффект «суслика»)

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

Важно понимать, что в платформе 1С существует так называемый "основной обработчик". Даже если в модуле типовой конфигурации не написан код для события НачалоВыбора, платформа все равно инициирует открытие формы выбора по умолчанию для ссылочных типов данных. Это и есть тот самый "суслик", которого не видно, но он существует. Когда вы используете директиву &После, происходит следующее:

  1. Срабатывает стандартный механизм платформы, который открывает первую форму.
  2. Выполняется ваш код, помеченный аннотацией &После, который открывает вторую форму (возможно, уже с вашими отборами).

Для решения этой задачи необходимо использовать директиву &Вместо. Она полностью перехватывает управление и подавляет стандартное поведение платформы. Рассмотрим пример правильной структуры метода:


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

Проблема версий платформы и функционала ВыборДобавлением

Разберем ситуацию, связанную с различием версий платформы 1С у разработчика и клиента. Проанализируем пример: разработчик использует современную платформу (например, 8.3.26), а у заказчика установлена версия 8.3.18. В новых версиях платформы появились механизмы, такие как ВыборДобавлением, которые отсутствуют в старых релизах.

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

Корректное подключение обработчика в свойствах элемента

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

Выясним причину, почему даже директива &Вместо может не срабатывать: если в свойствах элемента формы (в палитре свойств) в строке события (например, "Начало выбора") не указано имя вашей процедуры из расширения, платформа может продолжать выполнять только стандартное действие.

Алгоритм действий для проверки подключения:

  1. Откройте форму в расширении.
  2. Выберите нужный элемент (поле ввода).
  3. В палитре свойств перейдите на закладку "События".
  4. Найдите событие НачалоВыбора и убедитесь, что там выбрана процедура с префиксом вашего расширения.

Реализация отбора через Список Значений (В Списке)

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

Вместо того чтобы вручную открывать форму через ОткрытьФорму, часто лучше использовать параметры выбора. Но если программное открытие неизбежно, используйте следующий шаблон:


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

Программное открытие формы против декларативного метода

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

Пошаговая настройка в расширении:

  1. Зайдите в свойства поля "Ответственный" в расширенной форме.
  2. Найдите свойство ПараметрыВыбора.
  3. Нажмите на кнопку с тремя точками и добавьте новый параметр (например, Отбор.Статус = Значение(Перечисление.СтатусыПользователей.Активен)).
  4. Найдите свойство СвязиПараметровВыбора, если отбор должен зависеть от другого поля формы (например, организации).

Использование декларативного метода позволяет избежать написания лишнего кода и гарантирует, что форма откроется ровно один раз силами самой платформы, но уже с примененными фильтрами. Если же логика отбора слишком сложная для свойств, всегда возвращайтесь к методу с директивой &Вместо и обязательным флагом СтандартнаяОбработка = Ложь.

← На главную