СКД. Сортировка

03.12.18

Разработка - СКД

Показана реализация сортировки по двойному щелчку на заголовке колонки отчета и отображение направления сортировки в заголовках колонок.

Скачать файлы

Наименование Файл Версия Размер
Сортировка
.erf 14,12Kb
8
.erf 14,12Kb 8 Скачать

Приведенный ниже программный код предназначен для выполнения в контексте тонкого клиента. Проверка работоспособности проведена на платформе: 8.3.11.2867.

 

1. Визуализация направления сортировки в заголовке колонки.

 

Ищем поля порядка на всю глубину вложенности группировок отчета.  Здесь  _Структура - структура настроек отчета.

&НаСервере
procedure ПолучитьНаправлениеСортировки(_Структура,_sps)
  _Коллекция=_Структура.Порядок.Элементы;
  if _Коллекция.Количество()>0 then
    ПолучитьНаправлениеЭлемента(_Коллекция,_sps);
    if _Структура.Структура.Количество()>0 then
      for each _эл in _Структура.Структура do
          ПолучитьНаправлениеСортировки(_эл,_sps);
      enddo;
    endif;
  endif;
endprocedure

Запоминаем направление сортировки для каждого найденного поля. Элементы автопорядка пропускаем.

&НаСервере 
procedure ПолучитьНаправлениеЭлемента(_Элементы,_sps)
  for each _эл in _Элементы do
    if ТипЗнч(_эл) <> Тип("АвтоЭлементПорядкаКомпоновкиДанных") then
      x=string(_эл.Поле);
      v=0;
      if _эл.ТипУпорядочивания=НаправлениеСортировкиКомпоновкиДанных.Убыв then
        v=1;
      endif;    
      _sps.Вставить(x,v);
    endif;  
  enddo;
endprocedure

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

&НаСервере
procedure ОтобразитьНаправленияСортировки()
  //Отображает направление в заголовках колонок
  Настройки=Отчет.КомпоновщикНастроек.ПолучитьНастройки();  
  sps=new Структура();
  ПолучитьНаправлениеСортировки(Настройки.Структура[0],sps);
  for each x in sps do
    fld=x.Ключ;
    srt=x.Значение;
    _Поле=Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляПорядка.НайтиПоле(new ПолеКомпоновкиДанных(fld));
    if not _Поле=undefined then
      cap=_Поле.Заголовок;
      Область=Результат.НайтиТекст(cap,,,true,true);
      if not Область=undefined then
        if srt=0 then
          Область.Картинка=БиблиотекаКартинок.СтрелкаВверх;
        else  
          Область.Картинка=БиблиотекаКартинок.СтрелкаВниз;
        endif;
        Область.РазмерКартинки=РазмерКартинки.РеальныйРазмер;
        Область.ПоложениеТекстаОтносительноКартинки=ПоложениеТекстаОтносительноКартинки.Сверху;
      endif;
    endif;
  enddo;
endprocedure

2. Сортировка по  заголовку колонки.

 

Единственным событием, к которому можно привязать сортировку является событие  "Выбор" - событие, возникающее при двойном щелчке на ячейку или рисованный объект в режиме "только просмотр".

&НаКлиенте
Процедура РезультатВыбор(Элемент, Область, СтандартнаяОбработка)
  //Двойной щелчок на активной области
  Текст=Область.Текст;
  if УстановитьПолеСортировки(Текст) then
    ОтобразитьНаправленияСортировки();
  endif;
КонецПроцедуры

По заголовку колонки получаем имя выбранного поля, и запускаем процедуру поиска в структуре настроек отчета.

&НаСервере
function УстановитьПолеСортировки(txt)
  //Ищет поле сортировки по заголовку колонки
  Настройки=Отчет.КомпоновщикНастроек.ПолучитьНастройки();
  ДоступныеПоля=Настройки.Порядок.ДоступныеПоляПорядка.Элементы;
  for each д in ДоступныеПоля do
    if д.Заголовок=txt then
      НайтиПолеВИерархии(д.Поле,Настройки.Структура[0]);
      ОбновитьОтчет(Настройки);
      return true;
    endif;
  enddo;
  return false;
endfunction

Сначала проверяем на совпадение нашего поля с полями группировок. Если совпадение найдено, удаляем у найденного поля элемент автопорядка, если он есть.  Если в полях группировок наше поле не найдено, то это означает, что это поле является ресурсом и для него будет создано новое поле порядка.

&НаСервере
procedure НайтиПолеВИерархии(fld,_Структура)
  //Ищет  в группировках поле, выбранное пользователем 
  ПолеГрупп=_Структура.ПоляГруппировки.Элементы;
  for each п in ПолеГрупп do
    if п.Поле=fld then
      _Коллекция=_Структура.Порядок.Элементы;
      ПроверкаПоляАвтоПорядка(_Коллекция);
       НайтиПолеПорядка(fld,_Коллекция);
      return;
    endif;
  enddo;
  //Поле не найдено, спускаемся ниже
  if _Структура.Структура.Количество()>0 then
    for each _эл in _Структура.Структура do
      НайтиПолеВИерархии(fld,_эл);
    enddo;
  else
    //Это ресурс
    _Коллекция=_Структура.Порядок.Элементы;
    ПроверкаПоляАвтоПорядка(_Коллекция);
    НайтиПолеПорядка(fld,_Коллекция)
  endif;
endprocedure

Удаление элементов автопорядка.

procedure ПроверкаПоляАвтоПорядка(_Коллекция)
  //Если элемент автопорядка - удаляем
  if _Коллекция.Количество()>0 then
    for each _эл in _Коллекция do
      if ТипЗнч(_эл) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") then
        _Коллекция.Удалить(_эл);
      endif;
    enddo;
  endif;
endprocedure

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

&НаСервере
procedure НайтиПолеПорядка(fld,_Коллекция)
  //Проверка наличия поля порядка для fld
  if _Коллекция.Количество()>0 then
    for each _эл in _Коллекция do
      _ПолеПорядка=_эл.Поле;
      if _ПолеПорядка=fld then
        ИзменитьПорядокСортировки(_эл);
        return;
      endif;
    enddo;
    //Выбрано другое поле, очищаем коллекцию существующей сортировки и добавляем новое поле
    _Коллекция.Очистить();
    НовоеПолеПорядка(fld,_Коллекция)
  else
    //Коллекция пустая (нет полей сортировки), добавляем новое поле
    НовоеПолеПорядка(fld,_Коллекция)
  endif;
endprocedure

Изменение направления сортировки.

&НаСервере
procedure ИзменитьПорядокСортировки(_Порядок)
  //Меняет порядок сортировки на обратный
  if _Порядок.ТипУпорядочивания=НаправлениеСортировкиКомпоновкиДанных.Возр then
    _Порядок.ТипУпорядочивания=НаправлениеСортировкиКомпоновкиДанных.Убыв;
  else
    _Порядок.ТипУпорядочивания=НаправлениеСортировкиКомпоновкиДанных.Возр;
  endif;
endprocedure

Добавление новой сортировки в коллекцию полей порядка.

&НаСервере
procedure НовоеПолеПорядка(fld,_Коллекция)
  //Вставляет новое поле сортировки в коллекцию злементов порядка
  НовыйПорядок=_Коллекция.Вставить(0,Тип("ЭлементПорядкаКомпоновкиДанных"));
  НовыйПорядок.Поле= fld;
  НовыйПорядок.Использование=Истина;
  НовыйПорядок.ТипУпорядочивания=НаправлениеСортировкиКомпоновкиДанных.Возр;  
endprocedure

Формируем отчет с новыми настройками сортировки.

&НаСервере
procedure ОбновитьОтчет(Настройки)
//Сформировать отчет с новыми настройками 
  Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
  ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Непосредственно);
endprocedure

 

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

сортировка СКД

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122158    670    389    

714

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4041    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8159    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

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

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    4656    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5806    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6701    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4520    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. BigClock 04.12.18 16:09 Сейчас в теме
Зачем используются англоязычные ключевые слова вперемешку с переменными на русском?
Lacoste4life; Никулин Леонид; user712426; Maden; sdvig; maksa2005; Evg-Lylyk; Plotks2017; Razrab1c; acsent; dj_serega; borda4ev; Gang031; dabu-dabu; birkoff; zqzq; nbeliaev; Craig; awk; frutty; jif; TreeDogNight; A_Max; +23 Ответить
2. slimper 201 04.12.18 16:38 Сейчас в теме
(1) Мне так удобнее
Maden; akimych; Gang031; acanta; nazirovramzil; +5 7 Ответить
4. Bassgood 1425 05.12.18 14:42 Сейчас в теме
(2) А как же стандарты?
Реально глаза режет когда смотришь на текст, в котором перемешены два языка
Lacoste4life; KapasMordorov; mivari; dj_serega; birkoff; CSiER; awk; frutty; +8 Ответить
5. slimper 201 05.12.18 14:52 Сейчас в теме
(4) Это, наверно мое кривое восприятие. Мне трудно читать код, когда ключевые слова написаны кириллицей.
Maden; akimych; Vasvas05; user774630; +4 4 Ответить
6. awk 741 05.12.18 16:23 Сейчас в теме
(2) Если кто-то, будет в тестовом задании, такое делать, при трудоустройстве, то 100% пойдет мимо моей организации. Ну мне так удобней. Так же пойдет лесом человек неоправданно использующий "_" и однобуквенные переменные. Это если кто дошел из новичков до комментариев и решил, что код крутой.
Lacoste4life; Maden; maksa2005; skalex; Plotks2017; user717534; Razrab1c; collider; KapasMordorov; mivari; dj_serega; dabu-dabu; birkoff; avlanskih; Serj1C; IgorS; +16 Ответить
7. slimper 201 05.12.18 16:53 Сейчас в теме
(6) К счастью или сожалению я не буду соискателем места в вашей компании. Представленный код не претендует на образец для подражания. Вам удобней отправлять лесом людей, не подходящих под ваши представления, a мне удобней
такое делать
Maden; klaus38; starik-2005; ixijixi; akimych; Gang031; Govorun39; Vasvas05; +8 4 Ответить
11. awk 741 05.12.18 18:13 Сейчас в теме
(7) У меня в компании люди код пишут для коллег и себя, а не для ЧСВ,
Lacoste4life; nayd; user717534; Razrab1c; collider; +5 Ответить
13. slimper 201 05.12.18 18:24 Сейчас в теме
(11)
а не для ЧСВ

Ошибочная оценка, не соответствующая реальности.
Maden; klaus38; Gang031; +3 Ответить
18. Поручик 4670 06.12.18 13:56 Сейчас в теме
(7) Удобно чесать ЧСВ и показывать "крутость". Сишные понты. Я бы тоже лесом отправил.
10. Vasvas05 22 05.12.18 18:00 Сейчас в теме
(6)в языках программирования мы также использовали "_" , только на 1с это как то считается плохим
12. awk 741 05.12.18 18:14 Сейчас в теме
(10) Префикс "_" в Си зарезервирован для служебных переменных.
Plotks2017; Artem1995amyr; +2 Ответить
3. DoctorRoza 05.12.18 13:39 Сейчас в теме
(1) Тут другое, если ты пишешь на православном ООП, то почему условный оператор написан не по канону!?
if (_ПолеПорядка=fld) then ....
:)
dj_serega; birkoff; frutty; +3 Ответить
8. Трактор 1246 05.12.18 17:31 Сейчас в теме
Ключевая строка оказалась в конце
Формируем отчет с новыми настройками сортировки.

А нужно ли его формировать? Любопытно, что быстрее будет работать. Формирование нового отчёта или перестановка строк в уже сформированном.
9. slimper 201 05.12.18 17:52 Сейчас в теме
(8) Если я правильно понял, вы предлагаете просто переставить строки в табличном документе "Результат". Этот вариант я не рассматривал.
14. zqzq 23 06.12.18 09:26 Сейчас в теме
Просто тогда нужно и всё остальное на английский переводить. И соблюдать стандарты по большим буквам и вообще названиям (без _).
&НаСервере
procedure НовоеПолеПорядка(fld,_Коллекция)
//...
НовыйПорядок=_Коллекция.Вставить(0,Тип("ЭлементПорядкаКомпоновкиДанных"));

превращается в
&AtServer
Procedure NewFieldOfOrder(fld, Collection)
//...
NewOrder = Collection.Insert(0, Type("DataCompositionOrderItem"));

... и получится неплохой индусский код...
Maden; KapasMordorov; mivari; dj_serega; Yakud3a; neikist; rincewind; CSiER; awk; +9 Ответить
15. slimper 201 06.12.18 10:56 Сейчас в теме
(14) Попробую объяснить свой подход. Наверно в большинстве языков условный оператор это if, т.е. такое обозначение является мировым стандартом (может у китайцев по другому). В языке 1С объектная модель реализована на русском языке, поэтому названия объектов логично писать на этом языке, но для ключевых слов существует общий стандарт, который, для меня имеет приоритет над стандартом 1С. Если вы работаете в разных языковых средах, мне кажется проще, использовать ключевые слова из общего стандарта. Заглавные буквы - это должна делать сама среда разработки, как например в VS. Подчерки - здесь чтобы отличать переменные от системных объектов, при совпадении наименований.
16. buganov 200 06.12.18 12:50 Сейчас в теме
Работал как то с тру кодерами, которым нужно было написать обработку в 1С. Так у них вообще все было на английском, потому, что им так удобнее и привычнее. С такой точки зрения это оправдывает использование английского в 1С, но,

procedure ПроверкаПоляАвтоПорядка(_Коллекция)
  //Если элемент автопорядка - удаляем
  if _Коллекция.Количество()>0 then
    for each _эл in _Коллекция do


достойно премии всем известного сайта

В целом разработка интересна с точки зрения научного интереса, но, я думаю, многим проще и быстрее в настройках СКД задать свою сортировку.
19. slimper 201 06.12.18 16:08 Сейчас в теме
(16)
С такой точки зрения это оправдывает использование английского в 1С,

Нет, как справедливо отмечено в (14) это будет выглядеть довольно странно, почти также как писать русские слова латинскими буквами.

я думаю, многим проще и быстрее в настройках СКД задать свою сортировку.

Все еще проще. В СКД отчетах есть контекстное меню, где среди прочих присутствует команда "Упорядочить".
17. dabu-dabu 289 06.12.18 13:33 Сейчас в теме
Поиск ячейки по заголовку группировки - это здорово и просто, но совсем не универсально.
20. starik-2005 3033 15.01.19 10:05 Сейчас в теме
Нормальный код. Еще бы переменные на латинском языке были обозваны - вообще бы зачот! )))

ЗЫ: я бы лучше такого программера на работу взял, чем того, кто с кучей сертификатов, а программировать не умеет. У нас есть один умелец - он запросы пишет как матерый SQL-щик с SEL ECT FR OM LEFT JOIN WHERE GROUP BY ... - чё он там творит никто не знает, но все работает )))
Maden; Suslik_Johns; +2 Ответить
21. iov 406 09.10.19 17:22 Сейчас в теме
А говорят у прогеров нет времени. Вон сколько потратили на срач в каментах )))
Maden; Monex; Suslik_Johns; +3 Ответить
Оставьте свое сообщение