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

11.07.16

Разработка - Универсальные функции

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

Это, честно говоря, фрагмент одной большой задачи, но сделанный для себя, просто для удобства работы с большим объёмом данных.

Что умеет: индексирует указанную колонку коллекции, беря первые символы, и потом по ним устанавливает отбор строк. Символы рассматривает любые, т.к. ориентируется на переданное "оглавление" - строку тех символов, по которым будут сделаны листы оглавления. Если символа в оглавлении нет, он попадёт в раздел "Все". Если символ есть, он попадёт в один из блоков оглавления. Размер блока регулируется. Можно многократно пересоздавать, можно задавать несколько оглавлений (русское и английское, например).

Создаётся выпадающее подменю, состоящее из блоков. При щелчке выполняется отбор всех строк, у которых первый символ входит в блок. Имеющиеся другие отборы строк по возможности оставляются без изменений.

Недостатки: индексация (т.е. заполнение колонки отбора) может занимать длительное время сообразно размерам коллекции. Почему не запрос? Потому что в коллекции могут содержаться значения таких типов, которые запрос не обрабатывает - картинки, допустим. Поэтому инициализацию оглавления лучше делать тогда, когда содержание коллекции уже стабильно.

Исходный код:

// Анализирует оглавление и подключает его использование к полю коллекции (желательно вызывать при инициализации
// или перезаполнении обрабатываемой коллекции), заполняет/перезаполняет список блоков оглавления.
//
// Параметры:
//    рИмяКоллекции - имя реквизита формы типа ДанныеФормыКоллекция, имеющего одноимённый элемент формы "таблица";
//    рИмяПоля - имя реквизита (колонки) коллекции; подразумевается, что есть элемент формы, чьё имя составлено по общим правилам;
//    рВсеОглавления - строка со списком "заглавных" символов, разделённых при необходимости знаком "|", например, буквы алфавита;
//    рРазмерБлока - число, размер фрагмента оглавления; например, при 4 будет А-Г, Д-Ж итд); по умолчанию равен 4.
//
&НаКлиенте
Процедура ДобавитьОглавлениеПоля(рИмяКоллекции,рИмяПоля,рВсеОглавления,рРазмерБлока=0)
    мОглавлений=СтрРазделить(рВсеОглавления,"|");
    //
    рРазмерБлока=?(рРазмерБлока=0,4,рРазмерБлока);
    //
    мБлоков=Новый Массив;
    соотПервыхСимволов=Новый Соответствие;
    //
    Для ыыы=0 По мОглавлений.Количество()-1 Цикл
        рОглавление=мОглавлений.Получить(ыыы);
        рДлина=СтрДлина(рОглавление);
        пози=1; 
        Пока Истина Цикл
            ОбработкаПрерыванияПользователя();
            рБлок=Сред(рОглавление,пози,рРазмерБлока);
            пози=пози+рРазмерБлока;
            рПервыйСимвол=Лев(рБлок,1);
            Для й=2 По рРазмерБлока Цикл
                соотПервыхСимволов.Вставить(Сред(рБлок,й,1),рПервыйСимвол);
            КонецЦикла;
            мБлоков.Добавить(Новый Структура("НомерОглавления,Блок",ыыы,рБлок));
            Если пози>=рДлина Тогда Прервать КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    //
    ДобавитьИндексноеПолеОглавленияИМеню(рИмяКоллекции,рИмяПоля,соотПервыхСимволов,мБлоков);
КонецПроцедуры    
// Добавляет колонку с индексом (первым символом) для отборов оглавления, и элементы формы для его меню;
// является вспомогательной для ДобавитьОглавлениеПоля и не рассчитана на самостоятельный вызов.
&НаСервере
Процедура ДобавитьИндексноеПолеОглавленияИМеню(рИмяКоллекции,рИмяПоля,соотПервыхСимволов,мБлоков)
    Попытка
        мрек=Новый Массив;
        мрек.Добавить(Новый РеквизитФормы(рИмяПоля+"_ИПО",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(1)),рИмяКоллекции));
        ИзменитьРеквизиты(мрек);
    Исключение
    КонецПопытки;
    //
    рКоллекция=ЭтаФорма[рИмяКоллекции];
    Для каждого стро Из рКоллекция Цикл
        сим=Лев(стро[рИмяПоля],1);
        соотсим=соотПервыхСимволов.Получить(сим);
        Если соотсим=Неопределено Тогда соотсим=сим КонецЕсли;
        стро[рИмяПоля+"_ИПО"]=соотсим;
    КонецЦикла;
    
    заг=Элементы[рИмяКоллекции+рИмяПоля].Заголовок;
    преф="ИПО_"+рИмяКоллекции+"_"+рИмяПоля+"_";
    грэл=Элементы.Найти("ИПО_Вызовы_"+рИмяКоллекции);
    Если грэл=Неопределено Тогда
        грэл=Элементы.Добавить("ИПО_Вызовы_"+рИмяКоллекции,Тип("ГруппаФормы"),Элементы[рИмяКоллекции+"КоманднаяПанель"]);
        грэл.Вид=ВидГруппыФормы.Подменю;
        грэл.Заголовок="Оглавление"+?(ПустаяСтрока(заг),""," ("+заг+")");
    КонецЕсли;        
    //
    ком=ЭтаФорма.Команды.Найти(преф);
    Если ком=Неопределено Тогда
        ком=ЭтаФорма.Команды.Добавить(преф);
        ком.Действие="ОтобратьБлокПоОглавлению";
        ком.Отображение=ОтображениеКнопки.Текст;
    КонецЕсли;
    эл=Элементы.Найти(ком.Имя);
    Если эл=Неопределено Тогда
        эл=Элементы.Добавить(ком.Имя,Тип("КнопкаФормы"),грэл);
        эл.Вид=ВидКнопкиФормы.КнопкаКоманднойПанели;
        эл.ИмяКоманды=ком.Имя;
        эл.Заголовок="Все";
        эл.Пометка=Истина;
    КонецЕсли;    
    //
    Для каждого рБлок Из мБлоков Цикл
        Попытка
            рПервыйСимвол=Лев(рБлок.Блок,1);
            ком=ЭтаФорма.Команды.Добавить(преф+СокрЛП(рБлок.НомерОглавления)+"_"+рПервыйСимвол);
            ком.Действие="ОтобратьБлокПоОглавлению";
            ком.Отображение=ОтображениеКнопки.Текст;
            эл=Элементы.Добавить(ком.Имя,Тип("КнопкаФормы"),грэл);
            эл.Вид=ВидКнопкиФормы.КнопкаКоманднойПанели;
            эл.ИмяКоманды=ком.Имя;
            эл.Заголовок=рПервыйСимвол+" - "+Прав(рБлок.Блок,1);
        Исключение
        КонецПопытки;        
    КонецЦикла;
КонецПроцедуры
// Вызывается командами, созданными для каждого пункта меню оглавления, выполняет установку и снятие отбора
&НаКлиенте
Процедура ОтобратьБлокПоОглавлению(Команда)
    мстро=СтрРазделить(Команда.Имя,"_");
    рИмяКоллекции=мстро.Получить(1);
    рИмяПоля=мстро.Получить(2);
    Если мстро.Количество()=4 Тогда
        сим="";
    Иначе
        сим=мстро.Получить(4); // третьим идёт номер оглавления
    КонецЕсли;
    
    грэл=Элементы.Найти("ИПО_Вызовы_"+рИмяКоллекции);
    Для каждого эл Из грэл.ПодчиненныеЭлементы Цикл
        Если ТипЗнч(эл)=Тип("КнопкаФормы") Тогда эл.Пометка=Ложь КонецЕсли;
    КонецЦикла;
    
    отб=Новый Структура;
    отбСтарый=Элементы[рИмяКоллекции].ОтборСтрок;
    Если ТипЗнч(отбСтарый)<>Тип("ФиксированнаяСтруктура") Тогда отбСтарый=Новый Структура КонецЕсли;
    Для каждого киз Из отбСтарый Цикл отб.Вставить(киз.Ключ,киз.Значение) КонецЦикла;
    Если ПустаяСтрока(сим) Тогда // все пункты
        Попытка отб.Удалить(рИмяПоля+"_ИПО") Исключение КонецПопытки;
    Иначе
        отб.Вставить(рИмяПоля+"_ИПО",сим);
    КонецЕсли;
    Элементы[рИмяКоллекции].ОтборСтрок=Новый ФиксированнаяСтруктура(отб);
    
    Элементы[Команда.Имя].Пометка=Истина;
КонецПроцедуры

 

Пример вызова:

Оглавления="abcdefghijklmnopqrstuvwxyz|ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ДобавитьОглавлениеПоля("ТаблицаПроизводителей", "Название", Оглавления);

Таблица формы оглавление алфавитный указатель отбор в таблице

См. также

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4316    atdonya    22    

41

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3883    ke.92@mail.ru    16    

60

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8560    YA_418728146    6    

139

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2020    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16012    131    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7200    quazare    8    

108
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dj_serega 390 13.07.16 10:47 Сейчас в теме
Я так понял используется последняя версия 1С?
2. Yashazz 4707 13.07.16 14:45 Сейчас в теме
(1) dj_serega, достаточно заменить СтрРазделить на общемодульную РазложитьСтрокуВМассивПодстрок, и всё остальное заработает на любой 8.3 и, думаю, 8.2
dj_serega; +1 Ответить
Оставьте свое сообщение