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