Имя: Пароль:
1C
1C 7.7
v7: 77 - сортировка в запросе по ПолнНаименование
0 Looking
 
27.07.15
20:23
Доброго времени суток!
Задача в том, чтобы в ТиСовском Прайс-листе изменить сортировку с наименований на сортировку по полным наименованиям.
Заменяю в тексте запроса строки
|Группировка Номенклатура Упорядочить по Номенклатура.Наименование;
|Группировка Номенклатура без групп;";
|Группировка Номенклатура без групп;

на

|Группировка Номенклатура упорядочить по Номенклатура.ПолнНаименование;
|Группировка Номенклатура упорядочить по Номенклатура.ПолнНаименование без групп;";
|Группировка Номенклатура упорядочить по Номенклатура.ПолнНаименование без групп;

Получаю какую-то тарабарскую группировку, не в алфавитном порядке. В чем моя ошибка? Прошу подсказать.
1 GreyK
 
27.07.15
20:31
(0) Реквизит Номенклатура.ПолнНаименование видимо нограниченной длины.
2 Looking
 
27.07.15
22:44
(1)да, так и есть, по неограниченным длинам сортировка не производится?
3 romix
 
27.07.15
23:12
(2) Не умеет по неограниченным. Но его копию можно ограничить и по ней сортировать, до какого-то предела.

Если поставить этой копии большую длину, то таблицу индекса раздует (там надо посмотреть, чтобы сразу не создало мега-гига индекс).
4 romix
 
27.07.15
23:12
По Наименованиям еще можно (лучше всего) сортировать.
5 Looking
 
27.07.15
23:23
(1), (3) спасибо огромное! тогда или неограниченную длину уберу, или буду предварительно выгружать в ТЗ и уже там сортировать.
6 Looking
 
27.07.15
23:23
(4)да вот как раз наименования одни, а для печати другие и нужно именно по тем, что для печати.
7 Looking
 
27.07.15
23:24
(1), (3) не знал про такой недостаток неограниченных как невозможность сортировки по ним, спасибо огромное!
8 Looking
 
27.07.15
23:25
а почему у некоторых ограниченных максимальная длина 100? это ограничение платформы? почему нельзя сделать не 100, а например 300?
9 Garykom
 
гуру
27.07.15
23:28
если список в прайсе не сильно большой, то можно выгружать в ТЗ и сортировать его
еще можно допреквизит "номер в сортировке" в "Номенклатура" и заюзать его предварительно заполненный циферками по порядку "как нуна"
10 Garykom
 
гуру
27.07.15
23:29
(9)+ но если часто и помногу добавляется новой номенклатуры то нужен будет алгоритма для быстрой "перенумерации сортировки"
11 Looking
 
28.07.15
18:43
(3), (9) если я реквизит ПолнНаименование сделаю вместо Неограниченной длины, строкой длиной 300 - 400 знаков. Это чем-то хуже для базы данных? может информация в файлах будет храниться менее оптимально или еще что-то? или это сугубо аспект удобства работы для пользователей, и если пользователям 400 знаков за глаза, то можно смело ограничивать?
12 Злопчинский
 
28.07.15
18:57
(11) ну.. если ты на это ограничееное наименование в 400 знаков поставишь сортировку и отбор в пофигураторе.. то лучше этого не делать.. ;-)
13 Looking
 
28.07.15
19:41
+(12)не, упорядочивание в отборе работает и без включенных сортировки и отбора в конфигураторе. если обрежу до 400 знаков и не буду включать в конфигураторе для этого реквизита сортировку и отбор - сильно хуже для БД, чем как было (реквизит неограниченной длины).
14 Looking
 
28.07.15
19:42
+(13)знак ? забыл в конце.
15 Злопчинский
 
28.07.15
19:45
(13) не, не сильно. вообще пофиг в таком случае. просто место будет сжираться неиспользуемое (?) но я думаю это некритично
16 Looking
 
28.07.15
19:50
(15)спасибо большое! попробую, если вдруг какая негативная побочка вылезет - отпишусь.
17 vcv
 
29.07.15
06:07
(13) "если обрежу до 400"
Индекс будет большой и неэффективный. Лучше завести новый реквизит длиной знаков 20-40-80 символов. ПриЗаписи в карточке номенклатуры его заполнять из ПолнНаименование. По нему и сортировать в запросе.
18 dk
 
29.07.15
07:58
(0) а зачем дублирование в группировке?
19 Looking
 
29.07.15
08:01
(17)спасибо за идею! правда скорее всего имеет смысл от определенного количества элементов в справочнике? позже смогу написать сколько их у меня.
20 Looking
 
29.07.15
08:03
(18)в смысле почему 3 раза? это типовой код, там условия по типу или виду номенклатуры (товар, услуга и т.д.)
21 1Сергей
 
29.07.15
08:04
(20) это не из типовой. Зачем в запросе три одинаковые группировки?
22 Looking
 
29.07.15
08:37
(21)почему не типовой-то, просто не хотел тему захламлять простынями кода, там условие при включении отбора по остаткам, а потом еще услуги с работами добавляются

    // текст запроса по выбранным ценам
    ТекстЗапроса = "//{{ЗАПРОС(ОтборЦен)
    |Период с ДатаОтчета по ДатаОтчета;
    |Номенклатура    = Справочник.Цены.Владелец;
    |Тип            = Справочник.Цены.ТипЦен;
    |Цена            = Справочник.Цены.Цена;
    |Единица        = Справочник.Цены.Единица;
    |Валюта            = Справочник.Цены.Валюта;
    |Функция ЦенаСумма    = Сумма(Цена);
    //МДВ
    //|Группировка Номенклатура Упорядочить по Номенклатура.Наименование;
    |Группировка Номенклатура упорядочить по Номенклатура.ПолнНаименование;
    //МДВ
    |Группировка Тип;
    |"//}}ЗАПРОС
    ;
    
    Если ПоНаличию = 1 Тогда
        
        ТекстЗапросаОстатков = "
        |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
        |Количество        = Регистр.ОстаткиТМЦ.Количество;
        |
        |Функция КоличествоКонОст = КонОст(Количество);
        |
        //МДВ
        |Группировка Номенклатура без групп;";
        //|Группировка Номенклатура упорядочить по Номенклатура.ПолнНаименование без групп;";
        //МДВ
        
        Если ВидРазделителя = 2 Тогда
            Если ПустоеЗначение(ВыбРазделитель1) = 0 Тогда
                // нужен фильтр по фирме
                ТекстЗапросаОстатков = "Фирма = Регистр.ОстаткиТМЦ.Фирма;" +
                                       ТекстЗапросаОстатков +
                                       "Условие(Фирма = ВыбРазделитель1);";
            КонецЕсли;
        ИначеЕсли ВидРазделителя = 3 Тогда
            Если ПустоеЗначение(ВыбРазделитель2) = 0 Тогда
                // нужен фильтр по ЮрЛицу фирмы
                ТекстЗапросаОстатков = "ЮрЛицо = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо;" +
                                       ТекстЗапросаОстатков +
                                       "Условие(ЮрЛицо = ВыбРазделитель2);";
            КонецЕсли;
        ИначеЕсли ВидРазделителя = 4 Тогда
            Если ПустоеЗначение(ВыбРазделитель3) = 0 Тогда
                // нужен фильтр по УпрАналитике фирмы
                ТекстЗапросаОстатков = "УпрАналитика = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика;" +
                                       ТекстЗапросаОстатков +
                                       "Условие(УпрАналитика = ВыбРазделитель3);";
            КонецЕсли;
        КонецЕсли;
    
        Если ПустоеЗначение(Склад) = 0 Тогда
            // нужен фильтр по складу
            ТекстЗапросаОстатков = "Скл = Регистр.ОстаткиТМЦ.Склад;" +
                                   ТекстЗапросаОстатков +
                                   "Условие(Скл = Склад);";
        КонецЕсли;
    
        ЗапросПоОстаткам = СоздатьОбъект("Запрос");
        Если ЗапросПоОстаткам.Выполнить(ТекстЗапросаОстатков) = 0 Тогда
            Возврат;
        КонецЕсли;
        
        СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
        Пока ЗапросПоОстаткам.Группировка(1) = 1 Цикл
            Если ЗапросПоОстаткам.КоличествоКонОст > 0 Тогда
                СписокНоменклатуры.ДобавитьЗначение(ЗапросПоОстаткам.Номенклатура);
            КонецЕсли;
        КонецЦикла;
        
        // Добавим услуги и работы в список номенклатуры
        ВидыУслуг = СоздатьОбъект("СписокЗначений");
        ВидыУслуг.ДобавитьЗначение(Перечисление.ВидыНоменклатуры.Услуга);
        ВидыУслуг.ДобавитьЗначение(Перечисление.ВидыНоменклатуры.Работа);
        
        ТекстЗапросаУслуг = "
        |Номенклатура = Справочник.Цены.Владелец;
        //МДВ
        |Группировка Номенклатура без групп;
        //|Группировка Номенклатура упорядочить по Номенклатура.ПолнНаименование без групп;
        //МДВ
        |Условие (Номенклатура.ВидНоменклатуры в ВидыУслуг);";
        
        ЗапросПоУслугам = СоздатьОбъект("Запрос");
        Если ЗапросПоУслугам.Выполнить(ТекстЗапросаУслуг) = 0 Тогда
            Возврат;
        КонецЕсли;
        
        Пока ЗапросПоУслугам.Группировка(1) = 1 Цикл
            СписокНоменклатуры.ДобавитьЗначение(ЗапросПоУслугам.Номенклатура);
        КонецЦикла;
            
        Если СписокНоменклатуры.РазмерСписка() = 0 Тогда
            Предупреждение("Заданным условиям фильтра не удовлетворяет ни одна позиция номенклатуры.",60);
            Возврат;
        КонецЕсли;
        
        ТекстЗапроса = ТекстЗапроса + "Условие(Номенклатура в СписокНоменклатуры);"
        
    КонецЕсли;
Ошибка? Это не ошибка, это системная функция.