Как правильно управлять вводом данных в цепочке подчиненных справочников 1С 7.7?

Программист 1С v7.7 Управленческий учет Промышленность, строительство и АПК
← На главную

При разработке конфигураций на платформе 1С:Предприятие 7.7 часто возникает архитектурная задача: работа с цепочкой подчиненных справочников. Например, когда у нас есть иерархия Товар -> Спецификация -> НормаРасхода. Проблема, с которой сталкиваются многие разработчики, заключается в том, что при быстром переключении между элементами верхнего уровня, форма подчиненного справочника не всегда успевает обновить контекст своего владельца. В результате пользователь может создать запись, которая «привяжется» к предыдущему владельцу или останется без него.

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

Метод первый: Проверка владельца через событие ПриВводеСтроки

Этот способ является наиболее простым и надежным для предотвращения «попадания» данных в чужой справочник. Суть метода заключается в принудительной проверке текущего владельца в момент начала ввода новой строки.

Реализуем это следующим образом: в модуле формы третьего справочника (в нашем примере — НормыРасхода) мы будем хранить текущий контекст владельца, полученный из предыдущей формы, и сравнивать его с тем, что возвращает функция ИспользоватьВладельца().


// В модуле формы 2-го справочника при выборе владельца
Процедура ПриВыбореВладельца()
    ТекЭлементСпр2 = ТекущийЭлемент();
КонецПроцедуры

// В модуле формы 3-го справочника
Процедура ПриВводеСтроки()
    Если ИспользоватьВладельца() <> ТекЭлементСпр2 Тогда
        СтатусВозврата(0); // Запрещаем ввод
        Предупреждение("Владелец не соответствует текущему элементу!");
    КонецЕсли;
КонецПроцедуры

Использование СтатусВозврата(0) позволяет моментально прервать операцию ввода, если система «залипла» на старом владельце, защищая целостность ваших данных.

Метод второй: Динамическое обновление доступности формы

Если вы хотите, чтобы пользователь видел, когда форма стала неактуальной, можно управлять свойством ТолькоПросмотр. Мы можем проверять соответствие владельца в формуле текстового реквизита, размещенного на форме.

Разберем логику:

  1. Создаем на форме подчиненного справочника реквизит, отображающий функцию.
  2. В модуле функции проверяем текущего владельца.
  3. Если владелец не совпадает с ожидаемым, переключаем режим ТолькоПросмотр в состояние «Истина».

Функция ПроверкаВладельца()
    КонтекстВладельца = Форма.Параметр;
    Если ИспользоватьВладельца() <> КонтекстВладельца Тогда
        Форма.ТолькоПросмотр(1);
    Иначе
        Форма.ТолькоПросмотр(0);
    КонецЕсли;
    Возврат "";
КонецФункции

Метод третий: Принудительное переоткрытие при смене владельца

Чтобы исключить «зависание» контекста, можно реализовать принудительное обновление формы. Используем для этого событие ПриПовторномОткрытии().

Логика работы:

Когда мы переходим на другой товар, вызываем процедуру открытия формы третьего справочника с новым параметром владельца. Внутри самой формы 3-го справочника используем:


Процедура ПриПовторномОткрытии()
    Если Форма.Параметр <> ИспользоватьВладельца().Владелец Тогда
        // Если владелец не совпал, закрываем форму или перечитываем данные
        Форма.Закрыть();
        ОткрытьФорму("Справочник.НормыРасхода", Форма.Параметр);
    КонецЕсли;
КонецПроцедуры

Рекомендации по архитектуре

Хотя вышеперечисленные методы помогают решить проблему «на лету», важно помнить о принципах построения качественных интерфейсов в 7.7:

Мы проанализировали основные причины возникновения проблем при работе со сложными иерархиями подчинения и рассмотрели способы защиты данных. Выбор метода зависит от сложности вашей конфигурации: для простых случаев достаточно блокировки через ПриВводеСтроки, для более серьезных задач — стоит задуматься об архитектурном пересмотре в пользу документов.

← На главную