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