Как программно позиционировать курсор на документе в журнале 1С 7.7?

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

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

Причина проблемы и основной метод позиционирования

Проанализируем механику работы списков документов. В контексте модуля формы журнала для получения текущего выбранного документа используется свойство ТекущийДокумент. Однако это свойство доступно только для чтения. Попытка присвоить ему значение напрямую не вызовет ошибки синтаксиса, но и не приведет к перемещению строки в диалоге.

Для визуального перемещения курсора платформа предоставляет специальный метод формы — АктивизироватьОбъект().

Синтаксис метода:

АктивизироватьОбъект(<Объект>)

Параметр <Объект> принимает ссылку на элемент справочника, документ или запись журнала расчетов. Метод доступен строго в контексте модуля формы списка.

Частая ошибка разработчиков заключается в повторном вызове метода или свойства от уже полученной ссылки. Если мы предварительно сохранили значение ТекущийДокумент в переменную, то в метод АктивизироватьОбъект() необходимо передавать именно саму эту переменную, а не пытаться вызывать от нее несуществующие методы.

Пошаговое восстановление позиции при установке и сбросе отбора

Разберем по шагам правильный алгоритм сохранения и восстановления строки журнала при манипуляциях с отбором:

  1. Перед наложением или снятием фильтра запоминаем ссылку на текущую строку через обращение к ТекущийДокумент.
  2. Выполняем операцию сброса фильтрации журнала с помощью УстановитьОтбор("", "").
  3. Передаем сохраненную ссылку в метод АктивизироватьОбъект().

Посмотрим на пример реализации в коде формы журнала:


// Запоминаем документ, на котором стоит курсор
ДокДляВозврата = ТекущийДокумент;

// Сбрасываем установленный ранее отбор
УстановитьОтбор("", "");

// При необходимости обновляем данные формы
Форма.Обновить(0);

// Возвращаем курсор на исходную строку
Если ПустоеЗначение(ДокДляВозврата) = 0 Тогда
    АктивизироватьОбъект(ДокДляВозврата);
КонецЕсли;

Контроль интервала видимости журнала

Важно помнить: метод АктивизироватьОбъект() может успешно спозиционировать курсор только в том случае, если документ попадает в текущий видимый интервал дат журнала. Если документ окажется за пределами периода, платформа проигнорирует вызов метода.

Выясним, как программно гарантировать попадание документа в рабочий диапазон дат журнала с помощью методов НачалоИнтервала(), КонецИнтервала() и УстановитьИнтервал():


Если ПустоеЗначение(ДокДляВозврата) = 0 Тогда
    ДатаДок = ДокДляВозврата.ДатаДок;
    
    // Проверяем, входит ли дата документа в открытый интервал журнала
    Если (ДатаДок < НачалоИнтервала()) Или (ДатаДок > КонецИнтервала()) Тогда
        // Расширяем границы интервала журнала под нужный документ
        НовоеНачало = Мин(НачалоИнтервала(), ДатаДок);
        НовыйКонец = Макс(КонецИнтервала(), ДатаДок);
        УстановитьИнтервал(НовоеНачало, НовыйКонец);
    КонецЕсли;
    
    АктивизироватьОбъект(ДокДляВозврата);
КонецЕсли;

Программный аналог интерактивного поиска по номеру (Ctrl+F5)

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

  1. Создаем объект документа требуемого вида через СоздатьОбъект("Документ.<Вид>").
  2. Выполняем поиск по номеру с помощью метода НайтиПоНомеру(<Номер>, <ДатаПоиска>).
  3. Если документ найден, передаем его ссылку в АктивизироватьОбъект().

Рассмотрим пример функции перехода к документу по известному номеру и дате:


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

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

← На главную