1с сортировка табличной части по реквизиту реквизита

Содержание:

1.       Сортировка данных по столбцу

2.       Общая сортировка табличных частей

В данной статье будет описано то, как проводить сортировки записей в таблицах системы 1С, будет рассмотрено две вариации сортировок, а именно: обычная сортировка табличной части и сортировка данных по столбцу (колонке), которую можно просчитать. Также будут приведены примеры программных решений для демонстрации вышеописанных видов сортировок полей таблиц.   

1.    Сортировка данных по столбцу

Рассмотрим первый вариант, в котором будем создавать сортировку части таблицы через столбец (колонку), который можно вычислить. Сразу стоит отметить то, что провести сортировку табличных частей через столбец, который не есть реквизит, возможности нет через метод «Сортировать». Данный метод демонстрируется на скриншоте ниже, в нём товары должны быть отсортированы по реквизиту «Артикул»:

Сортировка данных по столбцу методом Сортировать

Если же, всё же, воспользоваться данным методом, то в результате будем иметь ошибку следующего вида: «Неверное имя колонки 1С».

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

Сортировка табличной части через известный столбец  

2. Общая сортировка табличных частей

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

·        Создать процедуру, которая будет отвечать за сортировку таблицы по возрастанию или по убыванию из внешней обработки в правильной последовательности;

·        Определить необходимые параметры сортировки;

·        Создать команду в форме, которая будет отвечать за направленность сортировки (сортировка таблицы по убыванию или возрастанию).

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

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

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

В данной статье было описано то, как проводить сортировку табличной части в 1С двумя способами, при помощи программных решений.

Специалист компании «Кодерлайн»

Айдар Фархутдинов

Сортировка табличной части

Я
   Dreams

30.11.07 — 16:15

Есть документ. По кнопке  вызывается функция «заполнить» в модуле документа,которая заполняет табличную часть. После заполнения необходимо полученную табличную часть сортировать по возрастанию по значению первого столбца (тип число).

Пользуюсь типовой функцией

СортироватьСтроки(<?>);

Синтаксис:

СортироватьСтроки(<Колонки>)

Назначение:

Сортировать многострочную часть документа по реквизитам.

Параметры:

<Колонки> — перечисленные через запятую реквизиты многострочной части документа, по которым следует сортировать. Знаки +,- ,* , предшествующие названию реквизита, указывают направление сортировки по реквизиту. »+»    — сортировать по  возрастанию; »- »  — сортировать по убыванию; »*» — сортировать по внутреннему значению.

В результате ничего не меняется, строки как были по наименованию отсортированы, так и осталось.

Можно ли выполнить сортировку иначе или я не верно использую данную функцию?

  

Партнерская программа EFSOL Oblako

   ТелепатБот

1 — 30.11.07 — 16:15

   GrayT

2 — 30.11.07 — 16:16

Обновить() ?

   Dreams

3 — 30.11.07 — 16:20

GrayT  обращаюсь к табличной части из модуля формы, метод Обновить  не работает.  А функцию СотрироватьСтроки() пишу просто, без использования сетода Создать Объект, потому что табличная часть этого документа

Обновить<<?>>();

{Документ.Автоматы.Форма.Модуль(230)}: Процедура не обнаружена (Обновить)

   4pok

4 — 30.11.07 — 16:20

(0) «или я не верно использую данную функцию». А как именно Вы используете данную функцию?

   Dreams

5 — 30.11.07 — 16:21

4pok  в модуле формы документа пишу строку

   СортироватьСтроки(«НомерАвтоматаВЗале»);

   Нуф-Нуф

6 — 30.11.07 — 16:22

Форма.Обновить();

   Dreams

7 — 30.11.07 — 16:29

Нуф-Нуф  то же самое, остается сортировка по наименование

   LarSha

8 — 30.11.07 — 16:31

ВыгрузитьТабличнуюЧасть,ЗагрузитьТабличнуюЧасть

   Ёпрст2

9 — 30.11.07 — 16:31

(7) Если руками нажимать на кнопку сортировки,  сортируется хоть? НомерАвтоматаВЗале — реквизит документа или текстовая колонка?

   4pok

10 — 30.11.07 — 16:35

+(9) иногда еще путают с заголовком колонки. Но попробовать: СортироватьСтроки(«+НомерАвтоматаВЗале»);

   Dreams

11 — 30.11.07 — 16:42

LarSha не могу использовать такую функцию потому что нахожусь в модуле формы

  Ёпрст2 кнопки сортировка нет, мне нужно чтобы по кнопке заполнить табличная часть заполнялась данными отсортированными не по наименованию а по  одной колонке,которая заполняется как и все остальные функцией заполнить.Я в конце этой процедуры писала СортироватьСтроки(«+НомерАвтоматаВЗале»);

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

  4pok результат тот же

   Ёпрст2

12 — 30.11.07 — 16:45

(11) Как это нет кнопок сортировки? Панель струментов скрыла ? …

И это, так , что пишет:

Сообщить(Метаданные.Документ(Вид()). РеквизитТабличнойЧасти(НомерАвтоматаВЗале).Выбран()

); //????

   Ёпрст2

13 — 30.11.07 — 16:45

(11) Как это нет кнопок сортировки? Панель струментов скрыла ? …

И это, так , что пишет:

Сообщить(Метаданные.Документ(Вид()). РеквизитТабличнойЧасти(«НомерАвтоматаВЗале»).Выбран()

); //????

   4pok

14 — 30.11.07 — 16:48

(11) Кнопки сртировки есть. В панельке открытого документа (сверху с буковками AZ — ZA). Курсор установить на колонку с НомерАвтоматаВЗале и нажать кнопочку Сортировать по возрастанию, затем Сортировать по убыванию.Что происходит?

   Dreams

15 — 30.11.07 — 16:52

Ёпрст2

документ не типовой,написан с нуля.

вот функции по заполению ТЧ

Процедура Заполнить()

   Если Вопрос(«Перед заполнением табличная часть будет очищена.»

   «Продолжить?»,»Да+Нет»)=»Нет» Тогда

       Возврат;

   КонецЕсли;

   УдалитьСтроки();

   
   //Из существующих документов за этот день сформировать список автоматов

   ДокА=СоздатьОбъект(«Документ.Автоматы»);

   ДокА.ВыбратьДокументы(ДатаДок,ДатаДок);

   СпА=СоздатьОбъект(«СписокЗначений»);

   СпА.УдалитьВсе();

   Пока ДокА.ПолучитьДокумент()=1 Цикл

       Если ДокА.Проведен()=0 Тогда

           Продолжить;

       КонецЕсли;

       ДокА.ВыбратьСтроки();

       Пока ДокА.ПолучитьСтроку()=1 Цикл

           СпА.ДобавитьЗначение(ДокА.ИгровойАвтомат);

       КонецЦикла;

   КонецЦикла; //существующие документы

   
   Спр=СоздатьОбъект(«Справочник.ИгровыеАвтоматы»);

   Спр.ВыбратьЭлементы();

   Пока Спр.ПолучитьЭлемент()=1 Цикл

       Если Спр.Состояние.Получить(ДатаДок)<>Перечисление.Состояния.Работает Тогда

           Продолжить;

       КонецЕсли;

       //проверка по введенным документам

       Если СпА.НайтиЗначение(Спр.ТекущийЭлемент())>0 Тогда

           Продолжить;

       КонецЕсли; //введенные документы

       Если (АвтоматыАтроникс=1) и (Спр.Производитель.Наименование=»Atronic») Тогда

           НоваяСтрока();

           ИгровойАвтомат=Спр.ТекущийЭлемент();

           ПриВыбореАвтомата();    

       КонецЕсли;

       Если (АвтоматыАтроникс=0) и (Спр.Производитель.Наименование<>»Atronic») Тогда

           НоваяСтрока();

           ИгровойАвтомат=Спр.ТекущийЭлемент();

           ПриВыбореАвтомата();    

       КонецЕсли;

   ЗаполнитьНачало();  

   СортироватьСтроки(«НомерАвтоматаВЗале»);

   Форма.Обновить();

КонецПроцедуры

Процедура ЗаполнитьНачало()

   Док=СоздатьОбъект(«Документ.Автоматы»);

   Док.ОбратныйПорядок(1);

   ВыбратьСтроки();

   Пока ПолучитьСтроку()=1 Цикл

       ст=0;

       Док.ВыбратьДокументы(,ДатаДок-1);

       Пока Док.ПолучитьДокумент()=1 Цикл

           Док.ВыбратьСтроки();

           Пока Док.ПолучитьСтроку()=1 Цикл

               Если Док.ИгровойАвтомат=ИгровойАвтомат Тогда

                   ПолученоНачало=Док.ПолученоКонец;

                   Стр2Начало=Док.Стр2Конец;

                   Стр3Начало=Док.Стр3Конец;

                   ВложеноНачало=Док.ВложеноКонец;

                   СнялиНачало=Док.СнялиКонец;

                   Деном=ИгровойАвтомат.Деноминация.Получить(ДатаДок);

                   ст=1;

                   Прервать;

               КонецЕсли;

           КонецЦикла;

           Если ст=1 Тогда

               Прервать;

           КонецЕсли;

       КонецЦикла;

       Если ИгровойАвтомат.ДатаОбнуления.Получить(ДатаДок)=ДатаДок Тогда

           ПолученоНачало=0;

           Стр2Начало=0;

           Стр3Начало=0;

           ВложеноНачало=0;

           СнялиНачало=0;

           Деном=ИгровойАвтомат.Деноминация.Получить(ДатаДок);

       КонецЕсли;

   КонецЦикла;

КонецПроцедуры

Процедура ПриВыбореАвтомата()

Если ИгровойАвтомат.Состояние.Получить(ДатаДок)<>Перечисление.Состояния.Работает Тогда

       Если Вопрос(«Данный автомат не является рабочим в данный момент. Продолжить?»,4)=7 Тогда

       ИгровойАвтомат=»»;

           Возврат;

       КонецЕсли;

   КонецЕсли;

НомерВЗале=ИгровойАвтомат.НомерАвтоматаВЗале.Получить(ДатаДок);

КонецПроцедуры

вот процедуры по которым заполняется ТЧ. Реквизит НомерАвтоматаВЗале периоднический НО!!!! я ведь сортирую после заполнения ТЧ, и все данные по сути уже есть

   4pok

16 — 30.11.07 — 16:54

СортироватьСтроки(«+НомерВЗале»)

   Ёпрст2

17 — 30.11.07 — 16:54

(15) Ну и где у тебя там реквизит «НомерАвтоматаВЗале » ??? Может, всё же

СортироватьСтроки(«НомерВЗале»);

   Dreams

18 — 30.11.07 — 16:55

Ёпрст2

если б она правильно работала,я бы не спрашивала,ни фига она ей не сортирует!!!

   Shaman100M

19 — 30.11.07 — 16:57

СортироватьСтроки(«НомерВЗале»);

А?

   AcaGost

20 — 30.11.07 — 16:58

(18) Реквизиты табличной части???

   Ёпрст2

21 — 30.11.07 — 17:00

(18) :))

На кнопки AZ↑ понажимай для начала …

   Dreams

22 — 30.11.07 — 17:04

теперь сортирует,но все равно как то странно.

   4pok

23 — 30.11.07 — 17:05

(22) В чем странность?

   Dreams

24 — 30.11.07 — 17:05

получается

1 10 11 12 13 14 15 2 21 22 23 24

   Ёпрст2

25 — 30.11.07 — 17:05

(22) Чего странного то? Реквизит в документе у тебя — «НомерВЗале», его и сортировать надо … а какой ты там ему Заголовок назначила для показа — фиолетово, хоть «Ромашкой» его назови …

   Ёпрст2

26 — 30.11.07 — 17:06

(24) Тип реквизита, строковый видать … :))

   Dreams

27 — 30.11.07 — 17:07

Ёпрст2  если пользоваться типовой соритровкой,как ты говоришь он сортирует точно так же,в формате 1,10,11,12,13,14,2,21,22,23,3,….

   4pok

28 — 30.11.07 — 17:08

(24) Наверное этот реквизит имеет тип Строка, или… Надо бы Число.

   Ёпрст2

29 — 30.11.07 — 17:08

(27) Ну правильно, тип реквизита в документе у вас — Строка.

   Dreams

30 — 30.11.07 — 17:10

да, конец рабочего дня это тяжко,особенно в пятницу. Всем спасибо))

  

AcaGost

31 — 30.11.07 — 17:10

(27) Выгрузи в ТЗ, добавь числовую колонку, заполни ее (Число(НомерВЗале)), отсортируй, удали лишнюю колонку, Загрузи обратно.

 0 

   

Распечатать

1С 8.x : Табличное поле ~ Сортировка строк табличной части

<Имя ТЧ>.Сортировать(«Дата Возр»);

Код 1C v 8.х

 ТаблицаЦен.Сортировать("Цена Убыв, Товар Возр");   

Сортировать(<Колонки>, <ОбъектСравнения>)

Параметры:

<Колонки> (обязательный)
Тип: Строка.
Список имен колонок, разделенных запятыми, по которым производится сортировка таблицы. После каждого имени колонки через пробел может быть указано направление сортировки. Направление определяется: «Убыв» («Desc») — упорядочивать по убыванию; «Возр» («Asc») — упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Порядок указания имен колонок таблицы определяет порядок сортировки. Это означает, что сначала таблица сортируется по колонке, указанной первой. Затем группы строк с одинаковым значением в этой колонке сортируются по колонке, которая указана второй, и так далее.
<ОбъектСравнения> (необязательный)

Тип: СравнениеЗначений.
Объект для сравнения элементов. Если объект сравнения не задан, сравнение выполняется по следующим правилам:
элементы, чьи типы не совпадают, сравниваются по коду типа;
элементы простых типов сравниваются по значению;
элементы остальных типов сравниваются по строковому представлению.

Описание:

Сортирует табличную часть в соответствии с указанными правилами сортировки.

Код 1C v 8.х

 	СписокДокументовРеализация.Сортировать("Дата Возр");
СписокДокументовПоступление.Сортировать("Дата Возр");
СписокДокументовДопРасходы.Сортировать("Дата Возр");

Быстрая сортировка табличной части документа по реквизитам данных (например, номеклатуры)

16.05.2017

Надо сортировать табличную часть по артикулу, номеру, модели, полному наименованию — реквизитам карточки номенклатуры и даже по нескольким полям. При этом лень пользоваться построителем для сортировки обычным пользователям. Для этого сделал простую обработку

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

Надо быстро отсортировать табличную часть документа по артикулу, номеру, модели, полному наименованию — реквизитам карточки номенклатуры, которых в самой табличной части нет и даже по нескольким полям в порядке приоритета. Но пользоваться построителем для этого — болит голова у пользователя. Для этого сделал простую и симпатичную обработку за час, которая у внедренцев на проектах пошла на «ура». Поля и их источник надо указывать в коде — это легко подправите если надо. Чтобы не засорять лишними полями сортировки.

1. Сортирует по нескольким полям

2. Запоминает последнюю сортировку, чтобы не настравивать каждый раз заново.

3. Не ломает конфигурацию доп. колонками в табличную часть документа

Skip to content

1С — сортировка в табличной части программно, по возрастанию, убыванию

Сортировка в табличной части программно

Допустим есть документ «Заказ покупателя» с табличной частью «Номенклатура», есть 2 колонки «Номенклатура», «Цена».

Необходимо добавить 2 кнопки, при нажатии которых будет происходить сортировка:

  • По номенклатуре;
  • По номенклатуре + по цене;

Процедура сортировки по Номенклатуре:

&НаКлиенте
Процедура СортироватьПоНоменклатуре(Команда)
	Объект.Номенклатура.Сортировать("Номенклатура Возр"); // по возрастанию
	// Объект.Номенклатура.Сортировать("Номенклатура Убыв"); // по убыванию
КонецПроцедуры

Рис. 1 — Результат сортировки по номенклатуре

Процедура сортировки по Номенклатуре + Цене

&НаКлиенте
Процедура СортироватьПоНоменклатураЦена(Команда)
	Объект.Номенклатура.Сортировать("Номенклатура Возр, Цена Возр");
КонецПроцедуры

Рис. 2 — Результат сортировки по Номенклатуре + Цене

Как мы видим из рис. 2 в рамках одинаковых номенклатурных позиций («микрофон») появилась сортировка строк по возрастанию, по колонке «цена», в отличие от 1 рисунка.

Связанные статьи

Сортировка строк табличной части.

Если поле табличной части не является реквизитом, то используя метод «Сортировать» упорядочить по этому полю табличную часть невозможно.

Если использовать такой код

Товары.Сортировать(«НомерСтроки»);

, то получим ошибку «Неверное имя колонки 1с».

Чтобы корректно отсортировать по полю, взятому нами в качестве примера, «НомерСтроки» можно выполнить следующий код.

&НаКлиенте

Процедура УдержанияДолжностьПриИзменении(Элемент)

ТабЧасть=Объект.Удержания.Выгрузить();

ТабЧасть.Колонки.Добавить(«НомерСтроки»);

Для каждого Стр из ТабЧасть цикл

Стр.НомерСтроки=Стр.Номенклатура.НомерСтроки;

                // или обрабатываем нужным образом Стр.НомерСтроки

КонецЦикла;

ТабЧасть.Сортировать(«НомерСтроки»);

Объект.Удержания.Загрузить(ТабЧасть);

КонецПроцедуры

Этот код нужно разместить в процедуре реакции на событие элемента формы или в процедуре реакции на событие нажатия кнопки.

Оцените статью:

Загрузка…

Если Вы заметили ошибку, то выделите ее мышью и нажмите Ctrl+Enter

А что за переменная Возр?
добавил — ошибка «неизвестная колонка»
   Объект.Ос.Сортировать(«ОсновноеСредство.ДокументПриобретения»);

Самой колонки
ОсновноеСредство.ДокументПриобретения — в ТЧ нет, это ссылочные данные из справочника

Добавлено: 09 фев 2015, 11:01


Данное поле есть в элементах-таблица, но у элемента таблицы нет сортировки

Добавлено: 09 фев 2015, 13:59


Невозможно.Синтаксис помощник пишет нельзя так достать объект из ссылки и сортировать по нему.
Остается выгрузить всю табличную часть в невидимую таблицу сортировать и загрузить обратно. Как сие сделать?

Добавлено: 10 фев 2015, 08:47


Пишу:

&НаКлиенте
Процедура ОтборПриИзменении(Элемент)
ОбновитьОтбор();
Элементы.Ос.Обновить();
КонецПроцедуры

&НаСервере
Процедура ОбновитьОтбор();
      Объект.Ос.Сортировать("Сотрудник");
КонецПроцедуры


не работает .. просто ничего не происходит

Понравилась статья? Поделить с друзьями:
  • 250 тыс на развитие бизнеса от соцзащиты самозанятым
  • 250 тысяч от государства на открытие бизнеса условия
  • Администрация краснопахорского поселения часы работы
  • Администрация михнево ступинского района часы работы
  • Администрация неманского городского округа реквизиты