Как сделать так, чтобы при копировании документа в динамическом списке курсор вставал на новый документ в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

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

Почему пропадает автоматическое позиционирование?

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

Способ 1: Использование метода Оповестить()

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

  1. В модуле формы документа, в обработчике события записи (например, ПослеЗаписи), необходимо вызвать глобальный метод Оповестить.
  2. В модуле формы списка документа необходимо перехватить этот сигнал в стандартном обработчике ОбработкаОповещения.

Посмотрим на пример кода, который нужно добавить в форму списка:


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

КонецПроцедуры

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

Способ 2: Использование владельца формы и ОповеститьОВыборе()

Разберем альтернативное, более архитектурно правильное решение. Использование широковещательного метода Оповестить заставляет "слушать" сообщение вообще все открытые окна в системе 1С. В высоконагруженных системах лучше применять локальное оповещение через владельца формы.

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


&НаКлиенте
Процедура СписокОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    // ВыбранноеЗначение содержит ссылку на наш новый документ
    Элементы.Список.Обновить();
    Элементы.Список.ТекущаяСтрока = ВыбранноеЗначение;

КонецПроцедуры

Дополнительные факторы: Сортировка и типы данных

Рассмотрим еще два важных аспекта, которые могут повлиять на результат:

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

Применяя эти методы, вы сможете легко управлять поведением интерфейса 1С и делать работу пользователей более комфортной и интуитивно понятной.

← На главную