К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как установить позицию в списке

Как в 1С установить позицию в списке: ТекущаяСтрока динамического списка, АктивизироватьПоЗначению, позиционирование по ссылке в форме списка и табличной части.

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

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

Какой у вас тип списка: определяем сценарий

Прежде чем писать код, важно понять, с каким объектом вы имеете дело, потому что механизмы различаются принципиально. Ошибка на этом этапе — самая частая причина того, что «позиционирование не срабатывает».

Основные варианты:

  • Динамический список — основной реквизит управляемой формы списка (справочники, документы, регистры сведений). Позиционируется через свойство ТекущаяСтрока элемента формы.
  • Табличная часть объекта (документа, справочника) — позиционируется через ТекущаяСтрока элемента формы, но значением является идентификатор строки, а не ссылка.
  • Таблица значений или дерево значений на форме — аналогично табличной части, используется идентификатор строки (получается через ПолучитьИдентификатор()).
  • Обычная форма (конфигурации на 8.2 и ранних 8.3 в режиме обычного приложения) — используются методы табличного поля.

Позиционирование в динамическом списке управляемой формы

Самый распространённый случай — форма списка справочника или документов. Чтобы установить курсор на конкретный элемент, достаточно присвоить ссылку свойству ТекущаяСтрока элемента формы, отображающего список:

// Код на форме списка

&НаКлиенте

Процедура УстановитьПозицию(НужнаяСсылка)

Элементы.Список.ТекущаяСтрока = НужнаяСсылка;

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

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

Если список отображает регистр сведений, в ТекущаяСтрока присваивается не ссылка, а ключ записи — структура значений измерений (и периода для периодического регистра), полученная через РегистрыСведений.Менеджер.СоздатьКлючЗаписи().

Открытие формы списка с позиционированием на элементе

Часто требуется не изменить позицию в уже открытом списке, а открыть список так, чтобы курсор сразу стоял на нужной строке — например, после создания нового документа из обработки. Для этого у формы списка есть стандартный параметр «ТекущаяСтрока»:

&НаКлиенте

Процедура ОткрытьСписокСПозицией(НужнаяСсылка)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ТекущаяСтрока", НужнаяСсылка);

ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);

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

Этот параметр поддерживается типовыми формами списков большинства объектов: справочников, документов, планов счетов, регистров сведений. Если форма списка полностью самописная и параметр в ней не обрабатывается, придётся добавить обработку вручную в обработчике ПриСозданииНаСервере или ПриОткрытии.

Альтернативный вариант — открыть форму элемента, а не списка: тогда пользователь сразу видит карточку объекта. Выбор зависит от задачи: позиционирование в списке удобно, когда пользователю нужно видеть соседние строки и контекст.

Как открыть список с курсором на нужном элементе
  1. 1
    Получите ссылку на нужный элемент (результат записи, поиск по коду или наименованию)
  2. 2
    Сформируйте структуру параметров формы и добавьте ключ ТекущаяСтрока с этой ссылкой
  3. 3
    Вызовите ОткрытьФорму с именем формы списка и подготовленными параметрами
  4. 4
    Проверьте, что элемент попадает под отбор списка — иначе позиционирования не будет

Позиционирование в табличной части и таблице значений

Для табличной части документа или таблицы значений на форме логика другая: ТекущаяСтрока принимает не ссылку, а идентификатор строки коллекции данных формы. Идентификатор получают методом ПолучитьИдентификатор() у строки коллекции:

&НаКлиенте

Процедура ПозиционироватьНаСтрокеТЧ()

ИскомыеСтроки = Объект.Товары.НайтиСтроки(

Новый Структура("Номенклатура", НужнаяНоменклатура));

Если ИскомыеСтроки.Количество() > 0 Тогда

Элементы.Товары.ТекущаяСтрока =

ИскомыеСтроки[0].ПолучитьИдентификатор();

КонецЕсли;

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

Если нужно просто встать на последнюю (например, только что добавленную) строку, возьмите последний элемент коллекции: Объект.Товары[Объект.Товары.Количество() - 1].ПолучитьИдентификатор(). Это типовой приём при программном добавлении строк — пользователь сразу видит добавленную позицию.

Для дерева значений идентификатор получается аналогично, но поиск строки нужно вести рекурсивно по ветвям дерева, учитывая вложенность.

После установки ТекущаяСтрока полезно дополнительно вызвать Элементы.Товары.ТекущийЭлемент и при необходимости активизировать нужную колонку — тогда пользователь сможет сразу начать ввод без лишнего клика мышью.
ПЗ
Практическое замечание

Позиционирование в обычных формах (обычное приложение)

В конфигурациях, работающих в режиме обычного приложения (типично для старых версий 1С:Предприятия 8.1–8.2 и части решений на 8.3), механизм иной. Там у табличного поля есть метод АктивизироватьПоЗначению(), который ищет строку по значению в указанной колонке и устанавливает на неё курсор:

// Обычная форма

ЭлементыФормы.СправочникСписок.АктивизироватьПоЗначению(

НужнаяСсылка, "Ссылка");

Для обычных форм списков также применялся вызов СправочникСписок.ТекущаяСтрока либо установка через объект списка. Если вы сопровождаете такую конфигурацию, ориентируйтесь на методы табличного поля обычной формы — свойства и параметры управляемых форм там не работают.

При постепенном переводе конфигурации на управляемые формы код позиционирования придётся переписать: АктивизироватьПоЗначению в управляемых формах отсутствует, его заменяет присваивание ТекущаяСтрока.

Способы установить позицию

ТекущаяСтрока = Ссылка (динамический список)

Основной способ в управляемых формах. Работает только если элемент виден при текущем отборе.

Параметр ТекущаяСтрока при ОткрытьФорму

Позиционирует список в момент открытия. Требует, чтобы форма списка была типовой или обрабатывала параметр.

ТекущаяСтрока = Идентификатор (ТЧ, таблица значений)

Для табличных частей и таблиц значений. Идентификатор получают через ПолучитьИдентификатор().

АктивизироватьПоЗначению (обычные формы)

Только для обычного приложения. В управляемых формах метода нет.

Почему позиционирование не срабатывает: проверка и типичные ошибки

Если курсор не встаёт на нужную строку, проблема почти всегда в одном из немногих типовых мест. Проверяйте их последовательно.

Контрольные точки

Как проверить результат

Отбор динамического списка
Норма

Нужный элемент проходит условия отбора и виден в списке

Тревожный признак

Элемент отфильтрован — позиционирование молча не срабатывает

Тип значения в ТекущаяСтрока
Норма

Для динамического списка — ссылка, для ТЧ — идентификатор строки

Тревожный признак

Перепутаны типы: ссылка присвоена табличной части или наоборот

Момент установки
Норма

Позиционирование выполняется после загрузки данных списка (например, в ПриОткрытии)

Тревожный признак

Установка до формирования списка — значение теряется

Имя элемента формы
Норма

Обращение идёт к элементу-таблице (Элементы.Список), а не к реквизиту

Тревожный признак

Опечатка в имени элемента — ошибка или отсутствие эффекта

Отдельный случай — динамический список с произвольным запросом и группировками. Если основная таблица не указана или запрос сложный, платформа может не суметь сопоставить ссылку со строкой результата. Тогда помогает установка свойства «Основная таблица» у динамического списка либо пересмотр запроса.

Также учитывайте интерактивную сортировку: если пользователь отсортировал список по колонке, позиционирование всё равно сработает, но строка может оказаться вне видимой области — платформа обычно прокручивает список к текущей строке, однако при нестандартных настройках списка стоит проверить поведение вручную.

Типичные ошибки
01
Присвоение ссылки табличной части вместо идентификатора строки — курсор не встаёт, ошибки может не быть
02
Позиционирование при активном отборе, в который элемент не входит — эффект отсутствует без сообщений
03
Установка ТекущаяСтрока в ПриСозданииНаСервере до инициализации списка — значение перезаписывается платформой
04
Попытка позиционировать список из серверной процедуры вне контекста формы — Элементы недоступны

Частые вопросы

Как вернуть курсор на прежнюю строку после обновления списка?

Перед обновлением сохраните значение Элементы.Список.ТекущаяСтрока в переменную, а после обновления присвойте его обратно. Для динамического списка это ссылка, поэтому восстановление позиции работает надёжно, если запись не была удалена и по-прежнему проходит отбор.

Как установить позицию на группу справочника?

Точно так же, как на элемент: присвойте ссылку на группу свойству ТекущаяСтрока. Убедитесь, что список отображается в режиме иерархии или дерева и группа видна при текущих настройках отображения.

Почему параметр ТекущаяСтрока при открытии формы игнорируется?

Либо форма списка самописная и не обрабатывает этот параметр, либо на список установлен отбор, исключающий переданный элемент. Проверьте обработчик ПриСозданииНаСервере формы списка и состав отбора.

Можно ли позиционировать список регистра сведений?

Да, но в ТекущаяСтрока передаётся ключ записи, а не ссылка. Ключ создаётся на сервере методом СоздатьКлючЗаписи менеджера регистра с заполненными измерениями (и периодом для периодического регистра), затем передаётся на клиент.

Как спозиционироваться на первой или последней строке списка?

Для табличной части возьмите идентификатор первой или последней строки коллекции и присвойте его ТекущаяСтрока. Для динамического списка прямого способа нет — нужно получить ссылку нужной записи запросом (например, с упорядочиванием и выбором первой записи) и присвоить её.

Работает ли позиционирование в мобильном клиенте и веб-клиенте?

Механизм ТекущаяСтрока работает во всех клиентах, но визуальное поведение (прокрутка к строке) может отличаться. Проверяйте результат на целевом клиенте, особенно при больших списках с постраничной подгрузкой.

Итог

Что важно запомнить

В управляемых формах позиция в списке задаётся через Элементы.Список.ТекущаяСтрока: ссылкой — для динамического списка, идентификатором строки — для табличной части и таблицы значений. При открытии формы используйте параметр ТекущаяСтрока. Главные причины неудачи — отбор, скрывающий элемент, и неверный тип присваиваемого значения.