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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

← К списку