Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Проблема с сортировкой (Индексированием) в ИТ (число прочтений - 3503 )
MeSoft
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 20. Августа 2007
Проблема с сортировкой (Индексированием) в ИТ
10. Декабря 2007 :: 08:32
Печать  
Решил переписать отчет с ТЗ на ИТ, и обнаружил неприятную особенность с сортировкой текстовых значений. Написал небольшой пример для демонстрации:
Код
Выбрать все
 ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Наименование");
ТЗ.НоваяКолонка("Позиция");
ТЗ.НоваяСтрока(); ТЗ.Наименование = " "; ТЗ.Позиция = 1;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "!"; ТЗ.Позиция = 2;
ТЗ.НоваяСтрока(); ТЗ.Наименование = """"; ТЗ.Позиция = 3;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "#"; ТЗ.Позиция = 4;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "$"; ТЗ.Позиция = 5;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "%"; ТЗ.Позиция = 6;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "&"; ТЗ.Позиция = 7;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "'"; ТЗ.Позиция = 8;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "("; ТЗ.Позиция = 9;
ТЗ.НоваяСтрока(); ТЗ.Наименование = ")"; ТЗ.Позиция = 10;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "+"; ТЗ.Позиция = 11;
ТЗ.НоваяСтрока(); ТЗ.Наименование = ","; ТЗ.Позиция = 12;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "-"; ТЗ.Позиция = 13;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "."; ТЗ.Позиция = 14;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "/"; ТЗ.Позиция = 15;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "0"; ТЗ.Позиция = 16;
ТЗ.НоваяСтрока(); ТЗ.Наименование = "1"; ТЗ.Позиция = 17;
ИТ = СоздатьОбъект("ИндексированнаяТаблица");
ИТ.Загрузить(ТЗ);
ИТ.Сортировать("Наименование");
ТЗ.Сортировать("Наименование");
ТЗ.ВыбратьСтроку(, "ТЗ");
ИТ.ВыбратьСтроку(, "ИТ");
  


Почему-то сортировка в индексированной таблице на первое место ставит символ ' (апостроф) вместо пробела  Печаль Может кто сталкивался с аналогичной проблемой?
1С 25, SQL, 1C++ 2.5.0.5 от 2007.11.12
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #1 - 10. Декабря 2007 :: 08:52
Печать  
А почему вы думаете, что должно быть по другому?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
MeSoft
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 20. Августа 2007
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #2 - 10. Декабря 2007 :: 09:22
Печать  
Я думаю, что сортировка текстовых значений должна идти по кодам символов, да и 1С в ТЗ так сортирует ...
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #3 - 10. Декабря 2007 :: 11:26
Печать  
MeSoft
Вопрос интересный  Круглые глаза

Действительно стоит обратить внимание, при замене ТЗ на ИТ (в сложных алгоритмах)!
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #4 - 10. Декабря 2007 :: 14:12
Печать  
MeSoft писал(а) 10. Декабря 2007 :: 09:22:
Я думаю, что сортировка текстовых значений должна идти по кодам символов, да и 1С в ТЗ так сортирует ...

По каким кодам конкретно?

Индексация строк в ИТ сейчас может эффективно решить разные вопросы.
Но она:
1. Не ставит своей целью повторение сортировки ТЗ
2. Не является инвариантной относительно среды исполнения (на разных ОС и кодовых страницах сортировка различна)

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

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #5 - 10. Декабря 2007 :: 14:34
Печать  
kms писал(а) 10. Декабря 2007 :: 14:12:
По каким кодам конкретно?


По этим, вероятно
Код
Выбрать все
Сообщить(КодСимв(" ")); //32
Сообщить(КодСимв("'")); //39 



А как сейчас в ИТЗ организована сортировка символов?
  
Наверх
www  
IP записан
 
MeSoft
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 20. Августа 2007
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #6 - 10. Декабря 2007 :: 14:37
Печать  
я имел ввиду по кодам символов. Код пробела 32, а код апострофа 39 в ANSI кодировке, но видно ИТ индексирует текстовые поля по какому-то иному алгоритму...
Придется возвращатся к обычной ТЗ, для меня сортировка критична  Печаль
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #7 - 10. Декабря 2007 :: 17:08
Печать  
fez писал(а) 10. Декабря 2007 :: 14:34:
А как сейчас в ИТЗ организована сортировка символов?

По вычисленным для данной кодовой страницы UNICODE весам символов.

Главный плюс - это универсальность и эффективность (стандартная библиотека раз в 10 медленнее на сравнении строк без учета регистра, например).
Главное неоднозначное свойство - это привязка к LCMapString и, соответственно, зависимость от реализации в ОС.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #8 - 10. Декабря 2007 :: 17:11
Печать  
MeSoft писал(а) 10. Декабря 2007 :: 14:37:
я имел ввиду по кодам символов. Код пробела 32, а код апострофа 39 в ANSI кодировке, но видно ИТ индексирует текстовые поля по какому-то иному алгоритму...
Придется возвращатся к обычной ТЗ, для меня сортировка критична  Печаль

ОК.

А такой вариант вопросов не вызывает?
Код
Выбрать все
Процедура Сформировать()
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("Наименование");
	ТЗ.НоваяКолонка("Позиция");
	ТЗ.НоваяКолонка("Код");
	ТЗ.НоваяСтрока(); ТЗ.Наименование = ".";
	ТЗ.НоваяСтрока(); ТЗ.Наименование = "Б";
	ТЗ.НоваяСтрока(); ТЗ.Наименование = "Е";
	ТЗ.НоваяСтрока(); ТЗ.Наименование = "Ё";
	ТЗ.НоваяСтрока(); ТЗ.Наименование = "Ж";

	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСТроку() =1 Цикл
		ТЗ.Код =КодСимв(ТЗ.Наименование);
		ТЗ.Позиция =ТЗ.НомерСтроки;
	КонецЦикла;

	ИТ = СоздатьОбъект("ИндексированнаяТаблица");
	ИТ.Загрузить(ТЗ);
	ИТ.Сортировать("Наименование");
	ТЗ.Сортировать("Наименование");
	ТЗ.ВыбратьСтроку(, "ТЗ");
	ИТ.ВыбратьСтроку(, "ИТ");
КонецПроцедуры
 

« Последняя редакция: 12. Декабря 2007 :: 10:58 - kms »  

De quelle planète es-tu?
Наверх
 
IP записан
 
MeSoft
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 20. Августа 2007
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #9 - 10. Декабря 2007 :: 18:09
Печать  
Нет не пробовал  Улыбка
Я остановился на апострофе, пробеле и на знаке минус. Индескированную таблицу теперь буду использовать ТОЛЬКО для новых отчетов и обработок,  для старых только ТЗ...
Спасибо за оперативность Подмигивание
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с сортировкой (Индексированием) в ИТ
Ответ #10 - 12. Декабря 2007 :: 10:57
Печать  
MeSoft писал(а) 10. Декабря 2007 :: 18:09:
Нет не пробовал  Улыбка

Ну, мог бы и попробовать Подмигивание

Мне, собственно, было интересно, понравится ли, что ИТ отсортирует как "БЕЁЖ", а ТЗ отсортирует как "ЁБЕЖ".
Такая вот сортировка по кодам символов. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать