Имя: Пароль:
1C
1С v8
Сортировать выделенные документы в форме списка по возрастанию даты?
,
0 pvase
 
22.03.19
17:44
Есть одна проблема. В Управляемой форме списка документов человек выделяет некоторый список документов. Как этот список отсортировать по дате для последовательного проведения?
Пробую так:
СписокДок = Новый ТаблицаЗначений;
    //ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100));
    СписокДок.Колонки.Добавить("МоментВремени");
    СписокДок.Колонки.Добавить("Документ");
    Для Каждого ТекСтр Из ЭтаФорма.ПодчиненныеЭлементы.Список.ВыделенныеСтроки Цикл
        СтрТЗ = СписокДок.Добавить();
        СтрТЗ.Документ = ТекСтр.Регистратор.Ссылка;
        СтрТЗ.МоментВремени = Новый МоментВремени(СтрТЗ.Документ.Дата,СтрТЗ.Документ);
    КонецЦикла;
    СписокДок.Свернуть("МоментВремени,Документ",);
    СписокДок.Сортировать("МоментВремени Убыв");
Но чего то не сортирует по дата+Время. Подскажите, в чем может быть проблема? Спасибо.
1 Cyberhawk
 
22.03.19
17:48
Как понимаешь, что не сортирует?
2 pvase
 
22.03.19
17:59
(1) Хочу чтобы сортировало документы в порядке Дата+Время + Момент времени. В общем в том порядке, в котором они идут в журнале при сортировке по колонке Период.
3 Cyberhawk
 
22.03.19
18:24
Ты точно отвечаешь на мой вопрос?
4 pvase
 
22.03.19
18:39
(3) Смотрю в отладчике СписокДок и вижу что не отсортировало.
5 pvase
 
22.03.19
18:39
+так как надо.
6 mistеr
 
22.03.19
18:40
(2) При сортировке по колонке Период (надеюсь это Дата документов?) момент времени не учитывается. При отсутствии сортировки будет по моменту.
7 mistеr
 
22.03.19
18:42
(0) Предлагаю сортировать запросом, с условием "ГДЕ Ссылка В (&МассивСсылок)".
8 pvase
 
22.03.19
18:42
(6) Не проходит,  Для Каждого ТекСтр Из ЭтаФорма.ПодчиненныеЭлементы.Список.ВыделенныеСтроки Цикл в порядке выбора пользователем.
9 pvase
 
22.03.19
18:42
(7) Спасибо, уже так и делаю.
10 pvase
 
22.03.19
18:44
(9) Только проблема в том, что типов документов может бвть не 1, и даже не 10.
11 pvase
 
22.03.19
18:45
Предполагаю, что Сортировка в таблице значений не может сортировать по МоментВремени, а по "Документ" сортирует как по строке, сначала имя документа, а потом его дата.
12 mistеr
 
22.03.19
18:50
(8) Это я не про твой список, а про то, как сортируется в форме.
13 pvase
 
25.03.19
10:54
Может в 1С 8 можно как то получить ДатуВремя документа с миллисекундами? Думаю, что это может решить вопрос.
14 SleepyHead
 
гуру
25.03.19
10:56
Момент времени же содержит ссылку, оттого твоя сортировка и слетает.
15 mistеr
 
25.03.19
11:10
(13) Что, (7) не получается?
16 pvase
 
25.03.19
12:36
(15) Не получается отсортировать. Делаю так:

СписокДок = Новый ТаблицаЗначений;
    //ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100));
    СписокДок.Колонки.Добавить("МоментВремени");
    СписокДок.Колонки.Добавить("Документ");
    СписокДок.Колонки.Добавить("ДокументТип");
    Для Каждого ТекСтр Из ЭтаФорма.ПодчиненныеЭлементы.Список.ВыделенныеСтроки Цикл
        СтрТЗ = СписокДок.Добавить();
        СтрТЗ.Документ = ТекСтр.Регистратор.Ссылка;
        СтрТЗ.МоментВремени = СтрТЗ.Документ.МоментВремени();
        СтрТЗ.ДокументТип = ТипЗнч(СтрТЗ.Документ);
    КонецЦикла;
    СписокДок.Свернуть("МоментВремени,Документ,ДокументТип",);
    МассивТипов = Новый Массив;
    Для каждого СтрТЗ Из СписокДок Цикл
        Если МассивТипов.Найти(СтрТЗ.ДокументТип) = Неопределено Тогда
            МассивТипов.Добавить(СтрТЗ.ДокументТип);
        КонецЕсли;
    КонецЦикла;
    СписокДок.Колонки.Добавить("Ссылка",Новый ОписаниеТипов(МассивТипов));
    Для каждого СтрТЗ Из СписокДок Цикл
        СтрТЗ.Ссылка = СтрТЗ.Документ;
    КонецЦикла;
    //СписокДок.Сортировать("МоментВремени Убыв");
    ЗапросДок = Новый Запрос(
    
    "ВЫБРАТЬ
    |    ТЗ.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    |    &ТабДок КАК ТЗ
    |;
    |
    |///////////////////////////////////////////////
    |ВЫБРАТЬ
    |   Таблица.Ссылка
    |ИЗ
    |   Таблица КАК Таблица
    |
    |СГРУППИРОВАТЬ ПО
    |   Таблица.Ссылка
    |УПОРЯДОЧИТЬ ПО
    |    Таблица.Ссылка"
    );
    ЗапросДок.УстановитьПараметр("ТабДок",СписокДок);
    
    РезультатЗапрос = ЗапросДок.Выполнить().Выгрузить();

В результате все та же сортировка по Типу (сортирует по имени метаданных) + Внутренний идентификатор (не дата+время).
17 mistеr
 
25.03.19
12:44
(16) АВТОУПОРЯДОЧИВАНИЕ
18 pvase
 
25.03.19
12:57
(17) Спасибо, то что надо.
19 Cyberhawk
 
25.03.19
13:32
Которое конечно же не гарантирует, что два документа, имеющие одну и ту же дату, будут упорядочены как надо автору. Иначе бы и порядок по дате подошел.
20 pvase
 
25.03.19
14:37
(19) Вполне достаточно, ведь 1С при групповом перепроведении скорее так же получит список документов.
21 Cyberhawk
 
25.03.19
14:40
(20) Конечно же нет, т.к. сортировка с автоупорядочиванием - это просто / доступно для нубов, но не для хайлоада. В общем случае даже вендор не рекомендует использовать это.
22 pvase
 
26.03.19
09:52
(21) Допустим, но чтобы картина была полной желательно предложить правильное решение. Буду очень признателен за такое решение.
23 Cyberhawk
 
26.03.19
10:04
(22) Достаточно знать / помнить один постулат: документы, созданные в одну и ту же секунду, располагаются на временной оси в произвольном порядке. Даже одного и того же типа. Т.е. взглянув в БД на пару документов, имеющих одинаковую дату-время, ты никак не можешь _всегда_ установить, в какой последовательности их ввели. Да, зачастую в пределах одного сеанса и одного вида документов их УИДы будут возрастать, но это частный случай, не покрывающий и поэтому не дающий гарантию 100% узнать последовательность ввода.
Из этого постулата следует, что упорядочивание по моменту времени тоже не имеет смысла там, где нужно достоверное управление порядком.
Из этого следует, что достаточно упорядочивания по дате-времени, плюс ручное управление порядком по типу документа.
24 mistеr
 
26.03.19
16:14
(23) Упорядочивание по моменту имеет смысл, т.к. будет совпадать с порядком в разных стандартных процедурах перепроведения, а также с визуальным порядком в журналах.

А вот введение ручного управления там, где оно не требуется, по-моему смысла не имеет. Если оно все же потребуется пользователю, он легко сдвинет док на +/- секунду.
Основная теорема систематики: Новые системы плодят новые проблемы.