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