Black Friday: Cashback 35% при покупке 1С лицензий на счет INFOSTART.RU

Группировка списка по текущей колонке

Публикация № 370645

Разработка - Практика программирования

группировка списка;динамический список;значение ячейки списка

11
Встать на некую ячейку списка, нажать кнопку, сгруппировать список по значениям этой колонки.

Во-первых, залезать в "настройку списка" бывает долго и неудобно.  Это ж догадаться надо, что есть кнопка "Ещё", да и не всегда она есть. Во-вторых, часть колонок может вообще настраиваться динамически, прямо в Предприятии, кодом или профилем или ещё чем-нибудь. И бывают они не просто данными "первого уровня", а разыменованиями через 2-3 точки, вот и поди догадайся, по чему делать группировку.

Поступим проще - у нас есть поле, т.е. текущая колонка, иногда есть её путь к данным и уж точно всегда есть имя. Разберёмся, каким должен быть путь группировки, да и сделаем её по нажатию на одну кнопку. Например, так:

// Функция разбирает путь к данным, известный для элемента, или имя элемента (если оно добавлено динамически),

// возвращает массив путей, соответствующих типам значений фигурирующих полей (обычно из 1 элемента).
// При ошибке возвращает Неопределено.
//
// Параметры:
// аргИмя - имя колонки как элемента формы;
// аргПуть - имя элемента списка, где расположена колонка;
// аргМетаданные - используется при внутренних рекурсивных вызовах, при внешнем вызове не нужен.
//
// Ограничения:
// Многотипное поле, объявленное в конфигураторе или предприятии, не может иметь дальнейшее разыменование;
// Любое дополнительное поле, объявленное в предприятии, не может иметь разыменование более чем на 1 шаг.
//
&НаСервере
Функция ПолучитьПутиКДанным(аргИмя,аргПуть,аргМетаданные=Неопределено)
    Попытка
        мПутей=Новый Массив;

        Если аргМетаданные=Неопределено Тогда // это первый шаг
            #Область ПервыйШаг
                рИмяЭлемента=аргИмя;
                рИмяСписка=аргПуть;
                //
                элСписок=Элементы.Найти(рИмяСписка);
                Если элСписок=Неопределено Тогда Возврат Неопределено КонецЕсли;
                //
                эл=Элементы.Найти(рИмяЭлемента);
                Если эл=Неопределено Тогда // это динамически добавленная колонка
                    рПутьСписка=элСписок.ПутьКДанным;
                    Для каждого элспис Из элСписок.ПодчиненныеЭлементы Цикл
                        Если ТипЗнч(элспис)<>Тип("ПолеФормы") Тогда Продолжить КонецЕсли;
                        Если Лев(рИмяЭлемента,СтрДлина(элспис.Имя))<>элспис.Имя Тогда Продолжить КонецЕсли;
                        // источником является именно это поле, рассмотрим его путь к данным и от него разыменуем
                        рПуть=СтрЗаменить(элспис.ПутьКДанным,рПутьСписка+".","");
                        // разбираем
                        мрек=ЭтаФорма.ПолучитьРеквизиты(рПутьСписка);
                        Для каждого рек Из мрек Цикл
                            Если Лев(рПуть,СтрДлина(рек.Имя))<>рек.Имя Тогда Продолжить КонецЕсли;
                            // рассматриваем по типам найденного реквизита формы
                            метадан=Неопределено;
                            Для каждого рТип Из рек.ТипЗначения.Типы() Цикл
                                метадан=Метаданные.НайтиПоТипу(рТип);
                                Если метадан=Неопределено Тогда Продолжить КонецЕсли; // разыменования глубже всё равно нет
                                рИмяКРазбору=СтрЗаменить(рИмяЭлемента,элспис.Имя,"");
                                Если Лев(рИмяКРазбору,1)="_" Тогда // это был "_", вставленный СКД, а не часть имени реквизита
                                    рИмяКРазбору=Сред(рИмяКРазбору,2); // далее там уже могут быть и свои "_", входящие в имена
                                КонецЕсли;
                                мПутейРек=ПолучитьПутиКДанным(рИмяКРазбору,рПуть,метадан);
                                Если ТипЗнч(мПутейРек)=Тип("Массив") Тогда
                                    Для каждого знч Из мПутейРек Цикл мПутей.Добавить(знч) КонецЦикла;
                                КонецЕсли;
                            КонецЦикла; // по типам найденного реквизита формы
                        КонецЦикла; // по реквизитам формы, подчинённым реквизиту списка
                        // уже всё нашли
                        Прервать;
                    КонецЦикла; // по подчинённым элементам списка
                    //
                Иначе
                    // простой случай, это штатное поле или его статично заданное разыменование
                    мПутей.Добавить(СтрЗаменить(эл.ПутьКДанным,рИмяСписка+".",""));
                КонецЕсли;
            #КонецОбласти
        Иначе
            #Область РекурсивныйШаг
                рИмяКРазбору=аргИмя;
                мПутей=Новый Массив;
                // ищем среди стандартных и обычных реквизитов левую часть; если находим - откусываем и двигаемся дальше
                метарек=Неопределено;
                Для каждого мтрк Из аргМетаданные.Реквизиты Цикл
                    Если Лев(рИмяКРазбору,СтрДлина(мтрк.Имя))=мтрк.Имя Тогда метарек=мтрк; Прервать КонецЕсли;
                КонецЦикла;
                Если метарек=Неопределено Тогда // обычно это случай стандартного реквизита
                    //В списках фигурируют как Code, Description, DeletionMark, Predefined, Owner, Parent, IsFolder, Date, Number, Posted
                    мПутей.Добавить(аргПуть+"."+рИмяКРазбору);
                Иначе
                    рПутьДальше=аргПуть+"."+метарек.Имя;
                    рИмяДальше=СтрЗаменить(рИмяКРазбору,метарек.Имя,"");
                    Если Лев(рИмяДальше,1)="_" Тогда // это был "_", вставленный СКД, а не часть имени реквизита
                        рИмяДальше=Сред(рИмяДальше,2); // далее там уже могут быть и свои "_", входящие в имена
                    КонецЕсли;
                    Если не ПустаяСтрока(рИмяДальше) Тогда
                        Для каждого рТип Из метарек.Тип.Типы() Цикл
                            метаданДальше=Метаданные.НайтиПоТипу(рТип);
                            Если метаданДальше=Неопределено Тогда Продолжить КонецЕсли; // разыменования глубже всё равно нет
                            мПутейРек=ПолучитьПутиКДанным(рИмяДальше,рПутьДальше,метаданДальше);
                            Если ТипЗнч(мПутейРек)=Тип("Массив") Тогда
                                Для каждого знч Из мПутейРек Цикл мПутей.Добавить(знч) КонецЦикла;
                            КонецЕсли;
                        КонецЦикла;
                    Иначе
                        мПутей.Добавить(рПутьДальше);
                    КонецЕсли;
                КонецЕсли;
            #КонецОбласти
        КонецЕсли;

        Возврат мПутей;
    Исключение
        Сообщить("ПолучитьПутиКДанным, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
        Возврат Неопределено;
    КонецПопытки;
КонецФункции

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

Нажатие одной кнопки - и список сгруппирован по значениям текущей колонки)

p.s. Допускаю, что я просмотрел какой-то хитрый случай разыменования для добавленных вручную колонок. Если что, сообщайте, довинтим)

11

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. TMV 14 22.06.15 21:50 Сейчас в теме
Проблемы со шрифтом в листинге мне причудились? А то глаза болят.
2. Bukaska 131 23.06.15 10:45 Сейчас в теме
3. TMV 14 23.06.15 13:40 Сейчас в теме
(2) Bukaska, так отлично, спасибо.
4. TreeDogNight 16 28.06.15 10:27 Сейчас в теме
Из приведенного кода понятно, что первый язык авторы был вовсе не 1С =)
5. Yashazz 2905 28.06.15 10:44 Сейчас в теме
(4) TreeDogNight, первым был Pascal 5.0, а что навело на эту мысль?
Оставьте свое сообщение

См. также

Полезные процедуры и функции для программиста 160

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Практика программирования Универсальные функции

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

07.10.2019    11505    HostHost    23       

Cashback 35% при покупке 1С лицензий на счет INFOSTART.RU с 27.11 по 04.12 Промо

Оформляете заказ на 1С лицензии или конфигурации. Получаете 35% от стоимости на счет в профиле INFOSTART.RU. Выбираете сервисы и продукты на сумму кэшбэка.

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Агрегатные функции СКД, о которых мало кто знает 353

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    15415    ids79    44       

Три костыля. Сказ про фокусы в коде 124

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    10466    YPermitin    69       

Онлайн-курс "Технология выполнения проектов ERP-класса – процессный подход". Третий поток. Курс проходит с 21 января по 18 марта 2020 года. Промо

Курс разработан Внедренческим центром «Раздолье». Курс предназначен для подготовки аналитиков, архитекторов и руководителей проектов автоматизации процессов управления с использованием комплексных ИТ-систем (1С:ERP, 1С:УХ, 1С:КА, 1С:УТ). В основе курса лежит методика применения процессного подхода.

9000 рублей

Отслеживание выполнения фонового задания 143

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    12595    ids79    16       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 261

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    17795    ids79    31       

Перенос данных БП 2.0 => УТ 11 / КА 2 / ERP 2 (перенос остатков, документов и справочников из "1С:Бухгалтерия предприятия 8", ред. 2.0 в "1С:Управление торговлей 8", ред.11 / КА 2 / ERP 2). Обновлено до УТ 11.4.10.х, КА 2.4.10.х, ERP 2.4.10.х! Промо

Перенос позволяет загрузить в УТ 11 / КА 2 / ERP 2 документы за выбранный период, справочную информацию и остатки по счетам бух. учета. Переносятся остатки денежных средств, взаиморасчетов, остатки товаров и материалов на складах. Переносятся девятнадцать основных видов документов за выбранный период и вся нормативно-справочная информация. Есть фильтр по организации. Если нужно переносить что-то дополнительно, то обычно бесплатно дорабатываю правила (перед покупкой согласуйте необходимые доработки).

29700 руб.

Фоновое выполнение кода в 1С - это просто 124

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

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

02.08.2019    12689    avalakh    21       

Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо

Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.

29700 руб.

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 141

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    15956    ids79    8       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 155

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    13505    ids79    27       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Регистры сведений. За кулисами 129

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    10532    YPermitin    12       

"Меньше копипаста!", или как Вася универсальную процедуру писал 183

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    9306    SeiOkami    49       

Перенос данных УТ 10.3 => УТ 11 / КА 2 / ERP 2 (ЕРП 2) (документы, остатки и справочная информация из "1С:Управление торговлей, ред. 10.3" в УТ 11 / КА 2 / ERP 2). Обновлен до УТ 10.3.56.х, УТ 11.4.10.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Уже более 100 компаний приобрели перенос и выполнили переход на УТ 11 / КА 2 / ERP 2 с помощью нашей разработки! Обработка перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2 позволяет перенести не только остатки на указанную дату (как типовой перенос), но и все возможные документы за выбранный период. При выходе новых релизов этих программ оперативно выпускаем обновление обработки. Предоставляем техническую поддержку. Можем сделать бесплатный тестовый перенос!

29700 руб.

Создание отчетов с помощью СКД - основные понятия и элементы 216

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    23624    ids79    17       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    13571    dmurk    134       

Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо

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

19700 руб.

Регистры накопления. Структура хранения в базе данных 178

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    21029    YPermitin    27       

Выполнение внешней обработки в фоновом задании 149

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    12924    Eret1k    23       

Вакансия Автор новостных обзоров на тему 1С и бухучета, По совместительству Промо

Редакция Infostart.ru будет рада сотрудничеству с 1С-специалистом, умеющим и любящим излагать свои мысли в письменной форме. Если вы работали в IT-изданиях или имеете опыт ведения технологического блога/канала/группы, если сможете сделать обзор обработок из каталога infostart.ru/public/all/, то у вас большое преимущество.

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    7312    m-rv    2       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    9871    m-rv    16       

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

О расширениях замолвите слово... 195

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    18863    ellavs    125       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    15096    ellavs    83       

Вакансия Программист, аналитик, эксперт 1С Промо

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

Трюки с внешними источниками данных 166

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    15839    YPermitin    52       

Специальное предложение по 1С:Документооборот 8! Промо

Оперативно навести порядок в документообороте? Легко! Воспользуйтесь специальным предложением! Внедрение за 2 недели! Фиксированная цена и гарантия результата!

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 173

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    19107    ids79    9