Имя: Пароль:
1C
1С v8
Выбрать пропущенные числа последовательности
0 Про100Филя
 
16.06.15
11:56
Есть справочник
Код Наименование Число
001    Имя1        1
002    Имя2        2
003    Имя3        3
004    Имя4        4
005    Имя5        5

"Число" при создании заполняется с инкрементом 1 (Ну как нумерация кода)
При пометке на удаление число становится равным нулю.

Код Наименование Число
001    Имя1        1
002    Имя2        2
003    Имя3        0 <---- Объект помечен на удаление
004    Имя4        4
005    Имя5        5

Нужно запросом узнать пропущенные числа в последовательности.
Как найти пропущенное число 3?
1 Liova
 
16.06.15
11:58
А разрядность этого Числа какая?
2 Про100Филя
 
16.06.15
12:00
(1) Целое число
3 Liova
 
16.06.15
12:00
Вообще делается виртуалка со всеми числами диапазона и левое соединение к твоей таблице с условием есть NULL.

Вообще задача странная.
4 Гёдза
 
16.06.15
12:01
если код = число, то элементарно ватсон
5 Liova
 
16.06.15
12:03
(2) Понятно, что целое, но есть разница 5 там разрядов или 14

Я говорил про это примерно:

Книга знаний: Генерация числовой последовательности и последовательности дат при помощи языка запросов.
6 Liova
 
16.06.15
12:04
Чем воротить такой запрос может быть проще переделать, чтобы такой задачи не возникало?

Или при присвоении 0 коду в отдельный реквизит писать этот свободный код, который был.
7 Про100Филя
 
16.06.15
12:10
(3) Ну задачу упростил, для простоты понятия. Разрядоность как в коде 8.
(4) Если бы.
(6) В реальной задаче не все так просто, это уже есть и количество объектов в справочнике около 25 000.
8 Liova
 
16.06.15
12:13
(7) Ну так 1 раз перебрать эти 25 тысяч и поставить им этот реквизит, а у остальных перед записью. И получается тривиальный запрос с условием по СвободныйКод <> 0
9 Широкий
 
16.06.15
12:13
Вот например: ищет пропущенное число, но не числа:

ВЫБРАТЬ
    1 КАК Число
ПОМЕСТИТЬ ТаблицаЧисел

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(ТаблицаЧисел.Число + 1) КАК Поле1
ИЗ
    ТаблицаЧисел КАК ТаблицаЧисел
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЧисел КАК ТаблицаЧисел1
        ПО ТаблицаЧисел.Число+1 = ТаблицаЧисел1.Число
ГДЕ
    ТаблицаЧисел1.Число ЕСТЬ NULL
10 Про100Филя
 
16.06.15
12:19
(9) Спасибо!
(8) Тогда в регистр сведений это перенести(В разрезе чисел), и при пометке на удаление ставить пустую ссылку.
11 palpetrovich
 
16.06.15
12:36
дык
выбрать ссылка ИЗ справочник.Твой
где справочник.Число=0
12 Про100Филя
 
16.06.15
12:53
(11) Выбрать пропущенные числа последовательности, а не нули.
13 13_Mult
 
16.06.15
13:18
(9) Если сделать (-1) можно выбрать все числа
14 Широкий
 
16.06.15
13:22
(13) Разницы нет. Только вот два пропущенных не найдет
15 13_Mult
 
16.06.15
13:23
(14) два подряд пропущенных )
16 palpetrovich
 
17.06.15
11:50
(12) ну дык :)

|ВЫБРАТЬ НужныйСправочник.Код,
|ИЗ
|Справочник.НужныйСправочник КАК НужныйСправочник
|ГДЕ
|НужныйСправочник.Число = 0
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    сообщить("Пропущенно число " +  Число(Выборка.Код));
КонецЦикла;
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn