Почему при закрытии элемента справочника в 1С 7.7 закрывается текущая группа и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При работе в платформе 1С v7.7 пользователи иногда сталкиваются с неприятным поведением формы списка справочника: после редактирования или просмотра элемента и последующего закрытия его диалогового окна курсор не остается на этом элементе, а сбрасывается на уровень выше. В результате группа (папка), в которой находился контрагент или другой объект, автоматически сворачивается или закрывается. Проанализируем, почему возникает эта проблема, и разберем по шагам правильное решение.

Выясняем причину сбоя позиционирования

Рассмотрим код предопределенной процедуры ПриЗакрытии() в модуле формы элемента справочника, приведенный в примере:


Процедура ПриЗакрытии() //предопределенная 
    Если (НовыйКонтрагент = 1) И (Выбран() = 1) Тогда
        СпрДог = СоздатьОбъект("Справочник.Договоры");
        СпрДог.ИспользоватьВладельца(ТекущийЭлемент());
        Если СпрДог.ВыбратьЭлементы() = 0 Тогда
            СпрДог.Новый();
            СпрДог.Наименование = "Основной договор";
            СпрДог.ВидДоговора = глЗначениеПоУмолчанию("ОсновнойВидДоговоров");
            СпрДог.ОплатаДоговора = 1;
            СпрДог.АвтоОбработкаНДС = 1;
            СпрДог.Записать();
            
            ОсновнойДоговор = СпрДог.ТекущийЭлемент();
            Записать();
        КонецЕсли;
    КонецЕсли;
    ...
КонецПроцедуры

Главная ошибка заключается в вызове метода Записать() внутри процедуры ПриЗакрытии(), а также в размещении проверок реквизитов перед закрытием окна. Разберем подробнее, что происходит на платформенном уровне в 1С 7.7:

  1. Когда пользователь закрывает форму нажатием на кнопку «ОК» или «Крестик», платформа переводит окно в стадию уничтожения.
  2. Если в этот момент из кода вызывается метод Записать(), происходит повторная запись объекта в базу данных и отсылка сигнала обновления активной форме списка.
  3. Поскольку диалоговое окно элемента уже завершает работу, графическое ядро 1С 7.7 теряет правильный контекст текущей строки. При обновлении дерева справочника форма списка сбрасывает фокус и поднимается на уровень родительской группы.

Шаги по исправлению и оптимизации кода

Чтобы исключить сброс позиции и обеспечить корректную работу со справочником, выполним следующие рекомендации:

  1. Перенос вызова Записать() в событие ПриЗаписи(): создание подчиненных объектов (например, автосоздание элемента справочника «Договоры») и повторное сохранение текущего элемента должны выполняться строго до начала процесса закрытия формы.
  2. Перенос проверок заполнения реквизитов: все проверки корректности данных (ИНН, КПП, адрес, e-mail) необходимо размещать в предопределенной процедуре ПриЗаписи(). При обнаружении ошибки следует вызывать СтатусВозврата(0) и завершать выполнение оператором Возврат. Это отменит сохранение и отменит закрытие формы, дав пользователю возможность исправить заполнение.

Посмотрим на пример правильной организации кода в процедуре ПриЗаписи():


Процедура ПриЗаписи()
    // Проверка заполнения ИНН
    Если ПустаяСтрока(ИНН) = 1 Тогда
        Предупреждение("У Контрагента не введен ИНН. Необходимо заполнить!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    
    // Проверка длины ИНН
    Если (ПустаяСтрока(ИНН) = 0) И (СтрДлина(ИНН) <> 10) И (СтрДлина(ИНН) <> 12) Тогда
        Предупреждение("У Контрагента неправильно введен ИНН!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Перенеся логику сохранения и валидации реквизитов из процедуры ПриЗакрытии() в ПриЗаписи(), мы избавляемся от конфликтов обновления формы списка, и позиция курсора на текущем элементе сохраняется корректно.

← На главную