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