При разработке конфигураций на базе 1С:Предприятие часто возникает задача реализации логических связей между дополнительными реквизитами. Например, при выборе значения в реквизите А необходимо автоматически пересчитать или обновить значение в реквизите Б. Так как дополнительные реквизиты являются динамически создаваемыми объектами БСП, стандартные методы работы с событиями элементов формы здесь требуют особого подхода.
Дополнительные реквизиты и сведения (ДРиС) в современных конфигурациях управляются подсистемой БСП. При открытии формы элементы управления создаются программно, поэтому привычное назначение обработчиков через конфигуратор невозможно. Вся логика изменений проходит через централизованную процедуру Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент).
Для того чтобы внедрить свою логику, мы не должны изменять типовой код напрямую. Мы воспользуемся механизмом расширений конфигурации, что обеспечит корректное обновление системы в будущем.
Рассмотрим пошагово, как реализовать механизм зависимости реквизитов. Наша цель — создать обработчик, который перехватывает изменение конкретного свойства и выполняет расчеты.
&После для процедуры Подключаемый_ПриИзмененииДополнительногоРеквизита.Приведем пример кода, который позволит идентифицировать нужный реквизит и изменить значение другого:
&НаКлиенте
&После("Подключаемый_ПриИзмененииДополнительногоРеквизита")
Процедура Расш1_Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
// Вызываем серверную часть для выполнения логики
Расш1_Подключаемый_ПриИзмененииДополнительногоРеквизитаНаСервере(Элемент.Имя);
КонецПроцедуры
&НаСервере
Процедура Расш1_Подключаемый_ПриИзмененииДополнительногоРеквизитаНаСервере(ИмяЭлементаФормы)
// Находим описание измененного реквизита в таблице свойств
СтруктураПоиска = Новый Структура("ИмяРеквизитаЗначение", ИмяЭлементаФормы);
МассивСтрок = ЭтотОбъект.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска);
Если МассивСтрок.Количество() > 0 Тогда
ОписаниеСвойства = МассивСтрок[0];
// Ссылаемся на наш ПВХ, который нужно отследить
СвойствоИсточник = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Реквизит_А");
Если ОписаниеСвойства.Свойство = СвойствоИсточник Тогда
// Выполняем расчеты и записываем в реквизит Б
НовоеЗначение = "Результат расчета";
СвойствоПриемник = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Реквизит_Б");
СтруктураПоискаБ = Новый Структура("Свойство", СвойствоПриемник);
МассивСтрокБ = ЭтотОбъект.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоискаБ);
Если МассивСтрокБ.Количество() > 0 Тогда
ЭтотОбъект[МассивСтрокБ[0].ИмяРеквизитаЗначение] = НовоеЗначение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
1. Безопасность поиска свойств. Старайтесь избегать поиска НайтиПоНаименованию, так как пользователь может переименовать реквизит, что приведет к поломке кода. Лучше использовать НайтиПоРеквизиту("Имя", ...) (если вы задали уникальное имя в режиме конфигуратора) или поиск по ссылке на ПВХ.
2. Работа с таблицей свойств. Данные о дополнительных реквизитах на форме хранятся в коллекции Свойства_ОписаниеДополнительныхРеквизитов. Именно она связывает имя элемента на форме (например, ДопРеквизит_12345) с конкретной ссылкой на план видов характеристик. Для внесения изменений всегда сначала находите нужную строку в этой коллекции.
3. Отладка. Если ваш обработчик не срабатывает, первым делом проверьте, вызывается ли процедура Подключаемый_ПриИзмененииДополнительногоРеквизита при изменении других свойств. Если нет — возможно, подсистема свойств не была корректно инициализирована при создании формы или реквизит находится в «закрытой» группе (например, внутри скрытой таблицы или формы выбора), где событие не пробрасывается на форму объекта.
4. Альтернативные методы. Если задача требует выполнения сложной бизнес-логики, не привязанной к конкретной форме (например, проверка значений при сохранении объекта), рассмотрите использование Подписок на события для объекта. Это будет более надежным архитектурным решением, так как оно будет работать независимо от того, через какую форму (основную, форму выбора или обработку) записываются данные.
Таким образом, сочетание расширения формы и грамотного поиска по коллекции Свойства_ОписаниеДополнительныхРеквизитов позволяет гибко управлять зависимостями между дополнительными реквизитами, сохраняя чистоту типовой конфигурации.