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