Имя: Пароль:
1C
1С v8
Изменение сортировки в индексируемой ТЗ
0 ASU_Diamond
 
15.03.16
15:07
Есть ТЗ со следующей структурой:
Номенклатура, НомДок, ДатаДок, Количество, Использовано.
Дальше идет поиск по ТЗ.

ТЗ.Индексы.Добавить("Номенклатура");
Для каждого Стр Из лТЗ_Результата Цикл
    Отбор=Новый Структура;
    Отбор.Вставить("Номенклатура",Стр.Номенклатура);
    НайденныеСтроки=ТЗ.НайтиСтроки(Отбор);
    Для каждого СтрДок Из НайденныеСтрокиЦикл
        КоличествоВзять=Мин(Количество,СтрДок.Количество-СтрДок.Использовано);
        Если КоличествоВзять<=0 Тогда
            Продолжить;
        КонецЕсли;
        СтрДок.Использовано=СтрДок.Использовано+КоличествоВзять;
            
    КонецЦикла;
КонецЦикла;

Когда идет отбор, то первый раз выборка выходит с сортировкой как в ТЗ, во второй раз строка, в которой изменилось "Использовано" становится в конец выборки.
Если ТЗ не индексировать, то сортировка в выборке не изменяется.
В чём проблема и как её обойти?
1 Ёпрст
 
15.03.16
15:21
второй раз, это как ?
2 Ёпрст
 
15.03.16
15:22
есть куча строк с одной номенклатурой в исходной ТЗ ?
3 ASU_Diamond
 
15.03.16
15:24
(2) да, во второй ТЗ то же несколько строк.
4 George Wheels
 
15.03.16
15:27
Вместо Продолжить нужно Прервать.
5 Ёпрст
 
15.03.16
15:29
(4) не угадал, это если бы было отсорировано по количеству, то да, прервать, а так, продолжить
6 Ёпрст
 
15.03.16
15:29
отсортировано
7 ASU_Diamond
 
15.03.16
15:33
ну там ещё в цикле пропущена строка
Количество=Количество-КоличествоВзять
8 Ёпрст
 
15.03.16
15:37
Ну, можешь делать через Скопировать подсунув туда найденныестроки + нужная сотрировка.
9 Ёпрст
 
15.03.16
15:37
сортировка
10 Ёпрст
 
15.03.16
15:37
и тогда ужо Прервать
11 ASU_Diamond
 
15.03.16
15:43
(8) я так понимаю что это баг платформы? придется обходить его (по смыслу можно по другому сделать), но тогда код усложняется и может потеряться выигрыш в скорости...
12 George Wheels
 
15.03.16
15:43
ТЗ.Индексы.Добавить("Номенклатура");

Индекс не уникальный. Не знаю как там 1С работает, но похоже она как-то последний изменённый элемент ставит в конец индекса.
13 ASU_Diamond
 
16.03.16
07:23
(12) индексируемые поля не изменялись - выборка не должна меняться. Чисто логически.
14 George Wheels
 
16.03.16
08:29
В лТЗ_Результата каждая номенклатура встречается только один раз?
15 mistеr
 
16.03.16
09:32
(0) Выборкой ты называешь результат ТЗ.НайтиСтроки()? Это массив. И порядок элементов в этом массиве не определен, его никто не гарантировал. Так что проблема в твоих неоправданных ожиданиях. Перепиши алгоритм, чтобы не зависел от этого порядка.
16 ASU_Diamond
 
16.03.16
10:29
(14) нет
(15) а как же то, что программа должна на один и тот же запрос выдавать одинаковый результат?
17 mistеr
 
16.03.16
10:39
(16) Далеко не всякая программа.
2 + 2 = 3.9999999999999999999999999999999...