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