Разработка и Конфигурация · 10 мин
1С: как установить позицию в списке
Как в 1С установить позицию в списке: ТекущаяСтрока динамического списка, АктивизироватьПоЗначению, позиционирование по ссылке в форме списка и табличной части.
Под «установкой позиции в списке» в 1С обычно понимают программное позиционирование курсора на нужной строке: в форме списка справочника или документа, в динамическом списке, в табличной части или в элементе формы типа «Таблица». Типовая задача — после создания нового элемента открыть список так, чтобы курсор сразу стоял на нём, или вернуть пользователя на ту строку, с которой он работал до обновления.
Способ решения зависит от того, с каким списком вы работаете: динамическим списком управляемой формы, таблицей значений на форме, обычной формой (в старых конфигурациях) или табличной частью документа. Универсального «одного метода для всего» нет, поэтому ниже разобраны основные сценарии с готовыми примерами кода.
Какой у вас тип списка: определяем сценарий
Прежде чем писать код, важно понять, с каким объектом вы имеете дело, потому что механизмы различаются принципиально. Ошибка на этом этапе — самая частая причина того, что «позиционирование не срабатывает».
Основные варианты:
- Динамический список — основной реквизит управляемой формы списка (справочники, документы, регистры сведений). Позиционируется через свойство ТекущаяСтрока элемента формы.
- Табличная часть объекта (документа, справочника) — позиционируется через ТекущаяСтрока элемента формы, но значением является идентификатор строки, а не ссылка.
- Таблица значений или дерево значений на форме — аналогично табличной части, используется идентификатор строки (получается через ПолучитьИдентификатор()).
- Обычная форма (конфигурации на 8.2 и ранних 8.3 в режиме обычного приложения) — используются методы табличного поля.
Позиционирование в динамическом списке управляемой формы
Самый распространённый случай — форма списка справочника или документов. Чтобы установить курсор на конкретный элемент, достаточно присвоить ссылку свойству ТекущаяСтрока элемента формы, отображающего список:
// Код на форме списка
&НаКлиенте
Процедура УстановитьПозицию(НужнаяСсылка)
Элементы.Список.ТекущаяСтрока = НужнаяСсылка;
КонецПроцедуры
Важный нюанс: позиционирование сработает только если запись удовлетворяет текущему отбору динамического списка. Если на список наложен отбор (по организации, по периоду, по папке) и нужный элемент в него не попадает, курсор не встанет на строку — элемент просто не отображается. В этом случае сначала снимите или скорректируйте отбор.
Если список отображает регистр сведений, в ТекущаяСтрока присваивается не ссылка, а ключ записи — структура значений измерений (и периода для периодического регистра), полученная через РегистрыСведений.Менеджер.СоздатьКлючЗаписи().
Открытие формы списка с позиционированием на элементе
Часто требуется не изменить позицию в уже открытом списке, а открыть список так, чтобы курсор сразу стоял на нужной строке — например, после создания нового документа из обработки. Для этого у формы списка есть стандартный параметр «ТекущаяСтрока»:
&НаКлиенте
Процедура ОткрытьСписокСПозицией(НужнаяСсылка)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТекущаяСтрока", НужнаяСсылка);
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);
КонецПроцедуры
Этот параметр поддерживается типовыми формами списков большинства объектов: справочников, документов, планов счетов, регистров сведений. Если форма списка полностью самописная и параметр в ней не обрабатывается, придётся добавить обработку вручную в обработчике ПриСозданииНаСервере или ПриОткрытии.
Альтернативный вариант — открыть форму элемента, а не списка: тогда пользователь сразу видит карточку объекта. Выбор зависит от задачи: позиционирование в списке удобно, когда пользователю нужно видеть соседние строки и контекст.
- 1Получите ссылку на нужный элемент (результат записи, поиск по коду или наименованию)
- 2Сформируйте структуру параметров формы и добавьте ключ ТекущаяСтрока с этой ссылкой
- 3Вызовите ОткрытьФорму с именем формы списка и подготовленными параметрами
- 4Проверьте, что элемент попадает под отбор списка — иначе позиционирования не будет
Позиционирование в табличной части и таблице значений
Для табличной части документа или таблицы значений на форме логика другая: ТекущаяСтрока принимает не ссылку, а идентификатор строки коллекции данных формы. Идентификатор получают методом ПолучитьИдентификатор() у строки коллекции:
&НаКлиенте
Процедура ПозиционироватьНаСтрокеТЧ()
ИскомыеСтроки = Объект.Товары.НайтиСтроки(
Новый Структура("Номенклатура", НужнаяНоменклатура));
Если ИскомыеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока =
ИскомыеСтроки[0].ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
Если нужно просто встать на последнюю (например, только что добавленную) строку, возьмите последний элемент коллекции: Объект.Товары[Объект.Товары.Количество() - 1].ПолучитьИдентификатор(). Это типовой приём при программном добавлении строк — пользователь сразу видит добавленную позицию.
Для дерева значений идентификатор получается аналогично, но поиск строки нужно вести рекурсивно по ветвям дерева, учитывая вложенность.
После установки ТекущаяСтрока полезно дополнительно вызвать Элементы.Товары.ТекущийЭлемент и при необходимости активизировать нужную колонку — тогда пользователь сможет сразу начать ввод без лишнего клика мышью.
Позиционирование в обычных формах (обычное приложение)
В конфигурациях, работающих в режиме обычного приложения (типично для старых версий 1С:Предприятия 8.1–8.2 и части решений на 8.3), механизм иной. Там у табличного поля есть метод АктивизироватьПоЗначению(), который ищет строку по значению в указанной колонке и устанавливает на неё курсор:
// Обычная форма
ЭлементыФормы.СправочникСписок.АктивизироватьПоЗначению(
НужнаяСсылка, "Ссылка");
Для обычных форм списков также применялся вызов СправочникСписок.ТекущаяСтрока либо установка через объект списка. Если вы сопровождаете такую конфигурацию, ориентируйтесь на методы табличного поля обычной формы — свойства и параметры управляемых форм там не работают.
При постепенном переводе конфигурации на управляемые формы код позиционирования придётся переписать: АктивизироватьПоЗначению в управляемых формах отсутствует, его заменяет присваивание ТекущаяСтрока.
Способы установить позицию
Основной способ в управляемых формах. Работает только если элемент виден при текущем отборе.
Позиционирует список в момент открытия. Требует, чтобы форма списка была типовой или обрабатывала параметр.
Для табличных частей и таблиц значений. Идентификатор получают через ПолучитьИдентификатор().
Только для обычного приложения. В управляемых формах метода нет.
Почему позиционирование не срабатывает: проверка и типичные ошибки
Если курсор не встаёт на нужную строку, проблема почти всегда в одном из немногих типовых мест. Проверяйте их последовательно.
Как проверить результат
Нужный элемент проходит условия отбора и виден в списке
Элемент отфильтрован — позиционирование молча не срабатывает
Для динамического списка — ссылка, для ТЧ — идентификатор строки
Перепутаны типы: ссылка присвоена табличной части или наоборот
Позиционирование выполняется после загрузки данных списка (например, в ПриОткрытии)
Установка до формирования списка — значение теряется
Обращение идёт к элементу-таблице (Элементы.Список), а не к реквизиту
Опечатка в имени элемента — ошибка или отсутствие эффекта
Отдельный случай — динамический список с произвольным запросом и группировками. Если основная таблица не указана или запрос сложный, платформа может не суметь сопоставить ссылку со строкой результата. Тогда помогает установка свойства «Основная таблица» у динамического списка либо пересмотр запроса.
Также учитывайте интерактивную сортировку: если пользователь отсортировал список по колонке, позиционирование всё равно сработает, но строка может оказаться вне видимой области — платформа обычно прокручивает список к текущей строке, однако при нестандартных настройках списка стоит проверить поведение вручную.
Частые вопросы
Как вернуть курсор на прежнюю строку после обновления списка?
Перед обновлением сохраните значение Элементы.Список.ТекущаяСтрока в переменную, а после обновления присвойте его обратно. Для динамического списка это ссылка, поэтому восстановление позиции работает надёжно, если запись не была удалена и по-прежнему проходит отбор.
Как установить позицию на группу справочника?
Точно так же, как на элемент: присвойте ссылку на группу свойству ТекущаяСтрока. Убедитесь, что список отображается в режиме иерархии или дерева и группа видна при текущих настройках отображения.
Почему параметр ТекущаяСтрока при открытии формы игнорируется?
Либо форма списка самописная и не обрабатывает этот параметр, либо на список установлен отбор, исключающий переданный элемент. Проверьте обработчик ПриСозданииНаСервере формы списка и состав отбора.
Можно ли позиционировать список регистра сведений?
Да, но в ТекущаяСтрока передаётся ключ записи, а не ссылка. Ключ создаётся на сервере методом СоздатьКлючЗаписи менеджера регистра с заполненными измерениями (и периодом для периодического регистра), затем передаётся на клиент.
Как спозиционироваться на первой или последней строке списка?
Для табличной части возьмите идентификатор первой или последней строки коллекции и присвойте его ТекущаяСтрока. Для динамического списка прямого способа нет — нужно получить ссылку нужной записи запросом (например, с упорядочиванием и выбором первой записи) и присвоить её.
Работает ли позиционирование в мобильном клиенте и веб-клиенте?
Механизм ТекущаяСтрока работает во всех клиентах, но визуальное поведение (прокрутка к строке) может отличаться. Проверяйте результат на целевом клиенте, особенно при больших списках с постраничной подгрузкой.
Что важно запомнить
В управляемых формах позиция в списке задаётся через Элементы.Список.ТекущаяСтрока: ссылкой — для динамического списка, идентификатором строки — для табличной части и таблицы значений. При открытии формы используйте параметр ТекущаяСтрока. Главные причины неудачи — отбор, скрывающий элемент, и неверный тип присваиваемого значения.