Работа с табличными частями документов, списками номенклатуры или отчетами в интерфейсе 1С:Предприятие часто требует точного позиционирования курсора. Разработчики сталкиваются с необходимостью программно выделить конкретную запись после создания новой строки, поиска по условию или возврата к предыдущему выбору пользователя. Неправильная установка фокуса может дезориентировать оператора и привести к ошибкам ввода данных.
Механизм управления выделением зависит от типа формы: управляемая форма или обычная форма. В современном мире управляемых форм (СКД и стандартные формы) логика базируется на объекте ТекущиеДанные формы и методах объекта КоллекцияСтрок. Понимание разницы между активной строкой в визуальном элементе и выделенной строкой в памяти критически важно для корректной работы скрипта.
В этой статье мы разберем основные приемы навигации по таблицам значений. Вы узнаете, как использовать метод Найти для поиска по уникальному идентификатору, как работать со свойством ТекущиеДанные и как избежать типовых ошибок, связанных с обновлением интерфейса. Эти знания необходимы для создания удобных и отзывчивых интерфейсов в конфигурациях на базе платформы 1С 8.3.
Основы работы с табличными частями в управляемых формах
В архитектуре управляемых форм таблица на экране является лишь представлением (View) набора данных, хранящегося в памяти. Чтобы изменить выделенную строку визуально, необходимо сначала изменить контекст выборки в объекте формы. Ключевым элементом здесь выступает реквизит формы, который хранит ссылку на активную строку коллекции.
Для доступа к этому механизму используется свойство ТекущиеДанные. Оно возвращает структуру или объект, соответствующий строке, которая сейчас активна в таблице. Однако, простое присваивание значения этому свойству не всегда гарантирует мгновенное перемещение курсора на экране без дополнительного обновления.
Разработчик должен четко различать два понятия: активная строка (та, на которой стоит курсор ввода) и выделенные строки (одна или несколько строк, подсвеченных цветом). Чаще всего задача сводится именно к установке активной строки. Для этого используется метод УстановитьАктивность или прямое присваивание объекту строки в свойство ТекущиеДанные.
⚠️ Внимание: Попытка установить текущую строку в пустую таблицу или на строку, которая была удалена из коллекции, приведет к ошибке выполнения. Всегда проверяйте количество строк перед операциями навигации.
Используйте метод Найти() вместо перебора циклом, если у вас есть уникальный ключ строки (например, Ссылка или UUID). Это значительно ускоряет работу кода на больших объемах данных.
Поиск и выбор строки по уникальному идентификатору
Наиболее частый сценарий — необходимость выбрать строку, зная её уникальный ключ. Это может быть ссылка на элемент справочника, UUID новой записи или номер документа. В платформе 1С для этого предусмотрен эффективный метод Найти, доступный у объектов типа ТаблицаЗначений и ДеревоЗначений.
Алгоритм действий прост: сначала мы находим нужную строку в коллекции данных, а затем делаем её текущей в форме. Игнорирование проверки результата поиска — грубая ошибка программирования.
СтрокаТаблицы = Объект.Товары.Найти(ИдентификаторНовогоТовара, "Ссылка");
Если СтрокаТаблицы <> Неопределено Тогда
Объект.ТекущиеДанные = СтрокаТаблицы;
КонецЕсли;
В данном примере мы ищем строку в табличной части Товары по колонке Ссылка. Если строка найдена, мы присваиваем её свойству ТекущиеДанные формы. Платформа автоматически обновит интерфейс, и курсор встанет на нужную позицию. Такой подход гарантирует, что пользователь сразу увидит результат своего действия, например, добавления новой позиции.
- 🔍 Метод Найти работает быстрее ручного цикла, так как использует внутренние индексы коллекции.
- 🎯 Точность поиска зависит от типа данных в ключе: строки сравниваются с учетом регистра, если не указано иное.
- 🔄 Автоматическое обновление интерфейса происходит сразу после изменения свойства
ТекущиеДанные.
Если в таблице несколько строк с одинаковым ключом (что возможно при отсутствии уникальных индексов), метод Найти вернет первую найденную. В таких редких случаях может потребоваться более сложная логика фильтрации перед установкой фокуса.
Навигация по номеру строки и относительное смещение
Иногда уникального ключа под рукой нет, и требуется перейти к строке по её порядковому номеру (индексу). Это актуально при обработке списков, где порядок имеет значение, или при реализации клавиатурных навигаторов «Вверх/Вниз». В 1С индексация строк начинается с нуля, что часто становится источником ошибок для новичков.
Для получения строки по индексу используется синтаксис массива. Вы можете обратиться к строке как к элементу коллекции, указав её номер в квадратных скобках. После получения ссылки на строку, механизм установки её текущей остается прежним — через свойство формы.
НомерСтроки = 5; // Шестая строка по счету
Если НомерСтроки < Объект.Товары.Количество() Тогда
Объект.ТекущиеДанные = Объект.Товары[НомерСтроки];
КонецЕсли;
Важно всегда проверять границу массива через метод Количество(). Попытка обратиться к несуществующему индексу вызовет исключение «Индекс за границами диапазона». Это особенно критично в динамических таблицах, где количество строк меняется в реальном времени.
Также распространена задача смещения относительно текущей строки. Например, кнопка «Перейти к следующей». В этом случае нужно сначала получить текущую строку, определить её индекс, увеличить его и установить новую строку.
| Метод | Описание | Возвращаемое значение |
|---|---|---|
Найти(Значение, ИмяКолонки) |
Поиск строки по значению в конкретной колонке | СтрокаТаблицыЗначений или Неопределено |
Индекс(Строка) |
Получение порядкового номера строки в коллекции | Число (начинается с 0) |
Количество() |
Получение общего числа строк в таблице | Число |
Сдвинуть(Строка, Смещение) |
Изменение порядка строк (перемещение вверх/вниз) | Нет (изменяет коллекцию) |
⚠️ Внимание: При удалении строки, на которой стоит курсор, фокус может «слететь» на соседнюю строку или исчезнуть. Логика обработки удаления должна явно предусматривать установку новой активной строки, если таблица не стала пустой.
Работа с выделением нескольких строк (Multi-Select)
Современные интерфейсы 1С поддерживают выделение нескольких строк одновременно с помощью клавиши Ctrl или Shift. Программное управление этим процессом осуществляется через свойство ВыделенныеСтроки. Это свойство представляет собой массив ссылок на строки таблицы значений.
В отличие от ТекущиеДанные, которое хранит одну активную строку, ВыделенныеСтроки позволяет управлять групповым выделением. Это полезно для реализации массовых операций: удаления, проведения, помечания на удаление. Чтобы программно выделить строки, необходимо сформировать массив и присвоить его этому свойству.
МассивВыделения = Новый Массив;
МассивВыделения.Добавить(Строка1);
МассивВыделения.Добавить(Строка2);
Объект.ВыделенныеСтроки = МассивВыделения;
При такой установке визуально подсветятся все строки из массива, но активная строка (та, с которой будет работать клавиатура) останется прежней или станет последней в списке выделения, в зависимости от версии платформы и настроек формы. Для полного контроля рекомендуется также устанавливать ТекущиеДанные явно.
Особенность сброса выделения
Чтобы снять выделение со всех строк программно, достаточно присвоить свойству ВыделенныеСтроки пустой массив или значение Неопределено (в зависимости от контекста вызова).
Синхронизация данных и обновление интерфейса
Одной из самых коварных проблем при работе с формами является рассинхронизация данных и картинки на экране. Вы можете изменить ТекущиеДанные в коде, но пользователь не увидит изменений, если форма не будет обновлена. В управляемых формах это обычно происходит автоматически при завершении обработки события, но в некоторых сценариях требуется принудительный вызов.
Метод Обновить() у объекта формы заставляет систему перечитать данные из переменных формы и перерисовать элементы управления. Это «тяжелая» операция, и злоупотреблять ею не стоит, но при сложных алгоритмах навигации она может быть необходима.
Также стоит упомянуть о событии ПриАктивацииСтроки. Оно срабатывает каждый раз, когда пользователь или код меняет активную строку. Внутри этого обработчика часто размещают логику подбора дополнительных данных (например, заполнение полей цены при выборе номенклатуры). Если вы программно меняете строку, это событие также сработает, что нужно учитывать, чтобы не вызвать рекурсию или лишние вычисления.
- 🚀 Производительность: частый вызов Обновить() в цикле может «заморозить» интерфейс на несколько секунд.
- 🛡️ Блокировка изменений: при обновлении формы могут срабатывать проверки блокировки данных, если документ уже записан.
- ⚡ Асинхронность: в некоторых случаях обновление интерфейса происходит асинхронно, и сразу после присваивания ТекущиеДанные визуального эффекта еще нет.
Всегда проверяйте, не заблокирована ли форма для редактирования, перед попыткой изменить активную строку. Изменение фокуса в режиме «Только просмотр» может быть недоступно или не иметь смысла.
Типовые ошибки и способы их устранения
Разработчики часто сталкиваются с ситуацией, когда код работает в отладчике пошагово, но падает при обычном запуске. Это классический признак гонки данных или неправильного контекста выполнения. Самая распространенная ошибка — попытка обратиться к строке таблицы, которая еще не добавлена в коллекцию формы, или работа с объектом, который уже был очищен.
Еще один частый сценарий ошибки связан с типами данных. Если вы ищете строку по ссылке, убедитесь, что тип искмого значения совпадает с типом колонки. Сравнение СправочникСсылка.Номенклатура и Строка (даже если содержание одинаковое) вернет Неопределено.
⚠️ Внимание: Интерфейс и методы работы с формами могут отличаться в разных версиях платформы 1С (8.2, 8.3, 8.3.20+). Если вы поддерживаете старые конфигурации, проверяйте совместимость методов в синтаксическом помощнике.
Для отладки проблем с выделением используйте панель «Отладка» в режиме предприятия. Она позволяет видеть текущие значения переменных формы в реальном времени. Также полезно выводить служебные сообщения через Сообщить() с указанием индексов и ключей, чтобы понять, на каком этапе поиск перестает работать корректно.
☑️ Диагностика проблемы с курсором
Часто задаваемые вопросы (FAQ)
Как установить курсор на последнюю добавленную строку?
Самый надежный способ — сохранить ссылку на созданную строку в момент её добавления методом Добавить(). Этот метод возвращает ссылку на новую строку. Сразу после добавления присвойте эту ссылку свойству Объект.ТекущиеДанные.
Почему метод Найти() возвращает Неопределено, хотя строка визуально есть?
Вероятно, не совпадает тип данных или значение. Проверьте, нет ли лишних пробелов в строковых полях, и убедитесь, что вы ищете значение именно в той колонке, где оно хранится. Также проверьте, не является ли таблица иерархической — в деревьях поиск работает иначе.
Можно ли программно прокрутить таблицу к нужной строке, не меняя активного элемента?
Прямого метода «прокрутить без фокуса» нет. Стандартное поведение 1С предполагает, что навигация к строке делает её активной. Если нужно просто показать область, используют хитрости с временным выделением или работой с элементами формы через расширенные возможности (расширения), но это нестандартный путь.
Как очистить выделение всех строк в таблице?
Присвойте свойству формы ВыделенныеСтроки пустой массив: Объект.ВыделенныеСтроки = Новый Массив;. Это снимет подсветку со всех строк, но активная строка (курсор) останется на месте.