Как правильно работать с выделенными строками в таблице формы 1С: особенности управляемых и обычных форм?

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

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

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

Понимание принципов работы с выделенными строками

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

  1. Управляемые формы (УФ): В управляемых формах свойство элемента таблицы формы ВыделенныеСтроки содержит не сами объекты строк таблицы, а массив их уникальных идентификаторов. Это сделано для оптимизации работы с динамическими списками и большими объемами данных, когда не все строки могут быть загружены в память целиком. Чтобы упростить интерфейс, иногда применяют программное перемещение колонок динамического списка или используют флажки в динамическом списке для альтернативного способа выбора строк (поможет конструктор адаптивных форм и динамических списков без конфигуратора). Чтобы получить доступ к данным конкретной выделенной строки, нам необходимо использовать специальные методы, такие как НайтиПоИдентификатору() или ДанныеСтроки(), передавая в них полученный идентификатор.

  2. Обычные формы (ОФ): В обычных формах работа с выделенными строками может быть более прямолинейной. Свойство ВыделенныеСтроки табличного поля, как правило, содержит коллекцию, элементы которой могут быть либо ссылками на сами объекты строк, либо их индексами. Для включения возможности множественного выделения в табличном поле нам необходимо установить значение "Множественный" у его свойства РежимВыделения.

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

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

Свойство ТекущаяСтрока элемента таблицы формы в управляемых формах также возвращает идентификатор текущей (активной) строки, а не саму строку.

Работа с выделенными строками в управляемых формах

Как мы уже выяснили, в управляемых формах мы оперируем идентификаторами строк. Рассмотрим, как с ними правильно работать.

  1. Получение данных выделенных строк:

    Для обработки выделенных строк нам нужно пройтись по коллекции ВыделенныеСтроки, получить идентификатор каждой строки, а затем по этому идентификатору найти саму строку или ее данные.

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

    Метод НайтиПоИдентификатору() позволяет получить элемент коллекции по его идентификатору, что является критически важным для связывания выделенных строк с их данными.

  2. Программное выделение и снятие выделения:

    Мы можем программно управлять выделением строк. Это полезно, например, для реализации кнопки "Выделить все" или "Снять выделение".

    • Снятие выделения со всех строк:

      Для этого достаточно использовать метод Очистить() у коллекции ВыделенныеСтроки.

      
      // Снимаем выделение со всех строк в таблице "МояТаблица"
      Элементы.МояТаблица.ВыделенныеСтроки.Очистить();
      
    • Программное выделение всех строк:

      Для выделения всех строк нам нужно обойти все строки таблицы и добавить их идентификаторы в коллекцию ВыделенныеСтроки.

      
      // Выделяем все строки в таблице "МояТаблица"
      Элементы.МояТаблица.ВыделенныеСтроки.Очистить(); // Сначала очистим текущее выделение
      
      // Предположим, МояТаблица связана с ТаблицейЗначений или ДинамическимСписком
      Если ТипЗнч(Элементы.МояТаблица.ПодчиненныеЭлементы) = Тип("ДинамическийСписок") Тогда
          // Для динамического списка требуется обход через запросы или методы списка
          // Это более сложная задача...
          Для Каждого СтрокаТЗ Из МояТаблицаДанных Цикл // МояТаблицаДанных - это источник данных таблицы
              ИдентификаторСтроки = Элементы.МояТаблица.ПолучитьИдентификаторСтроки(СтрокаТЗ);
              Если ИдентификаторСтроки <> Неопределено Тогда
                  Элементы.МояТаблица.ВыделенныеСтроки.Добавить(ИдентификаторСтроки);
              КонецЕсли;
          КонецЦикла;
      ИначеЕсли ТипЗнч(Элементы.МояТаблица.ПодчиненныеЭлементы) = Тип("ТаблицаЗначений") Тогда
          Для Каждого СтрокаТЗ Из МояТаблицаДанных Цикл // МояТаблицаДанных - это источник данных таблицы
              ИдентификаторСтроки = Элементы.МояТаблица.ПолучитьИдентификаторСтроки(СтрокаТЗ);
              Если ИдентификаторСтроки <> Неопределено Тогда
                  Элементы.МояТаблица.ВыделенныеСтроки.Добавить(ИдентификаторСтроки);
              КонецЕсли;
          КонецЦикла;
      КонецЕсли;
      

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

Работа с выделенными строками в обычных формах

В обычных формах подход к работе с выделенными строками, как правило, более прямолинеен.

  1. Настройка режима выделения:

    Прежде всего, убедитесь, что свойство РежимВыделения вашего табличного поля установлено в "Множественный". Это позволит пользователям выделять несколько строк.

  2. Получение данных выделенных строк:

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

    
    // Предположим, у нас есть табличное поле "МоеТабличноеПоле"
    // и нам нужно обработать выделенные строки
    Для Каждого ВыделеннаяСтрока Из Элементы.МоеТабличноеПоле.ВыделенныеСтроки Цикл
        // Здесь ВыделеннаяСтрока уже является объектом строки табличного поля
        Сообщить("Выделена строка: " + ВыделеннаяСтрока.Представление);
        // Или обращаемся к колонкам: ВыделеннаяСтрока.МояКолонка
    КонецЦикла;
    

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

Эффективная работа с большим количеством строк

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

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

В некоторых интерфейсах (например, "Версия 8.5") при выделении одной или нескольких строк внизу списка отображается панель множественного выделения, которая показывает количество выбранных строк и содержит часто используемые команды для работы с ними. Это значительно упрощает массовые операции — для этого подойдёт настройка форм списков и массового выбора для 1С.

Типичные проблемы и их решения

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

  1. Рассинхронизация ВыделенныеСтроки и визуального выделения:

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

  2. Некорректная работа НайтиПоИдентификатору() после сдвига строк:

    При работе с табличными частями документов идентификаторы строк могут "поплыть" после записи объекта. Решение: Старайтесь минимизировать операции с идентификаторами в периоды активного изменения структуры табличной части.

  3. Условное оформление строк в управляемых формах:

    В управляемых формах мы не используем событие "ПриВыводеСтроки". Вместо этого применяется свойство формы УсловноеОформление. Решение: Изучите и применяйте механизм УсловноеОформление для динамического изменения внешнего вида строк на форме.

Надеемся, этот подробный разбор поможет вам эффективно и без ошибок работать с выделенными строками в таблицах форм 1С:Предприятия. Используйте эти знания для создания более удобных и функциональных решений!

← На главную