Имя: Пароль:
1C
1С v8
Возможно ли выбрать запросом?
,
0 aspirator23
 
20.01.14
10:58
Таблица состоит из одного строкового поля длиной 10 символов.
В поле хранятся номера от 1000000000 до 1999999999.
При записи номера формируются произвольным образом, поэтому есть пропуски в номерах. Пример:1000000000,1000000001, 1000000005, 1000000024....1999999999.
Всего записей около миллиона и они распределены он начала диапазона до конца.
Можно запросом выбрать первые 1000 "пропущенных" номера?
1 Maxus43
 
20.01.14
11:00
можно, предварительно сформировав таблицу Всех номеров. потом соеденить с твоеё
2 Лефмихалыч
 
20.01.14
11:01
надо соединит с самсебя, потом выбрать минимум или максимум и там тудым-сюдым.
Это то же самое по сути, что срез на каждую дату
3 aspirator23
 
20.01.14
11:03
Спасибо, попробую.
4 Лефмихалыч
 
20.01.14
11:03
только это будет первая тысяча интервалов с пропусками, а не "первые 1000 "пропущенных""
5 МихаилМ
 
20.01.14
11:14
можно.
6 aspirator23
 
20.01.14
11:24
Пример запроса бы...
7 WildSery
 
20.01.14
11:29
(2) Мне даже интересно стало, как вы этот самый "тудым-сюдым" находить в строке будете. На 1 она отличается или на 100.
8 Лефмихалыч
 
20.01.14
11:30
(7) какие строки? В задаче числа русским по белому
9 WildSery
 
20.01.14
11:32
(8) Выпейте кофе, проснитесь :)
Перечитайте первую строку.
10 2mugik
 
20.01.14
11:34
(0)Все-таки оптимальней будет в числа преоразовать наверное.
11 КонецЦикла
 
20.01.14
11:34
Какая разница числа-строки, мне тоже интересно как Михалыч найдет если сделать "само с собою"
12 КонецЦикла
 
20.01.14
11:35
Строки сравниваются так же как и числа... и соединяются
13 Ненавижу 1С
 
гуру
20.01.14
11:37
(11) для чисел гораздо проще определяется "следующее"
поэтому соединив "сам с собой" таблицу находим отсутствующие "следующие" и "предыдущие"
ну а дальше уже максимум/минимум определяем интервалы пробелов
14 Лефмихалыч
 
20.01.14
11:37
дврю


ВЫБРАТЬ
    ВТ.Номер
ПОМЕСТИТЬ ВТ
ИЗ
    &ВТ КАК ВТ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Номер КАК НомерНачало,
    МИНИМУМ(ВТ1.Номер) КАК НомерКонец
ПОМЕСТИТЬ Отрезки
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Номер < ВТ1.Номер

СГРУППИРОВАТЬ ПО
    ВТ.Номер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Отрезки.НомерНачало КАК НомерНачало,
    Отрезки.НомерКонец,
    Отрезки.НомерКонец - Отрезки.НомерНачало КАК Количество
ИЗ
    Отрезки КАК Отрезки
ГДЕ
    Отрезки.НомерНачало + 1 <> Отрезки.НомерКонец

УПОРЯДОЧИТЬ ПО
    НомерНачало
15 Лефмихалыч
 
20.01.14
11:39
(9) дык ясен пень, что строку надо расхреначить на отдельные записи, иначе при чем тут запрос?
16 WildSery
 
20.01.14
11:42
(15) Какие "отдельные записи"?
Ваш запрос (14) нерабочий (для ТС), поскольку строки нельзя вычитать и прибавлять 1.
Если же вы предлагаете сперва пихать в таблицу значений с конвертацией в число, то проще будет не запросом, а собственно по ТЗ и идти, заодно получим не диапазон, а сами пропущенные номера.
17 Лефмихалыч
 
20.01.14
11:44
а, вот теперь прочитал, да "Таблица состоит из одного строкового поля длиной 10 символов"

в ЖПО такую таблицу, т.к. задача для нее решения не имеет. В ней нет пропусков потому, что там не числа. Любой запрос обделается, когда там появится "1000-Ж-№00012"
18 Лефмихалыч
 
20.01.14
11:45
(16) а запрос всё равно офигенен, не сочиняй :)
19 aspirator23
 
20.01.14
11:46
(17) формат номера соблюдается. "1000-Ж-№00012" - такие варианты исключены.
20 Широкий
 
20.01.14
11:47
(18) Времянки то зачем юзать?
(0) Переделай номер на число или храни его отдельным полем
21 Широкий
 
20.01.14
11:48
+20 Или использовать прмое обращение к базе. Скуль строку умеет в число конвертить
22 Лефмихалыч
 
20.01.14
11:51
(20) а что ты предлагаешь? Соединения с вложенными запросами?
23 Широкий
 
20.01.14
11:54
(22) Соединить таблицу саму с собой.
Таблица как я понял все же в базе лежит
24 Cube
 
20.01.14
11:54
Да ладно, чё...
Лефмихалыч нормальный вариант предложил. Моя реализация (тестить можно ла любой конфе с номенклатурой:

ВЫБРАТЬ
    Номенклатура.Код
ПОМЕСТИТЬ ИсходнаяТаблица
ИЗ
    Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1000
    ИсходнаяТаблица1.Код КАК Код1,
    МИНИМУМ(ИсходнаяТаблица2.Код) КАК Код2
ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсходнаяТаблица КАК ИсходнаяТаблица2
        ПО ИсходнаяТаблица1.Код < ИсходнаяТаблица2.Код

СГРУППИРОВАТЬ ПО
    ИсходнаяТаблица1.Код

УПОРЯДОЧИТЬ ПО
    Код1,
    Код2
25 КонецЦикла
 
20.01.14
11:55
Да, работает для чисел, Михалыч, молодец, на sql.ru спистел, признавайся?
26 Cube
 
20.01.14
11:55
+(24) Первая 1000 интервалов включает в себя первые 1000 пропущенных... :)
27 Широкий
 
20.01.14
11:57
(24) Неправильно
28 marvak
 
20.01.14
11:57
Может как нибудь получить временную таблицу с непропущенными номерами и соединить с исходной. Записи, где после соединения будет NULL, будут искомыми. Вот тока как сгенерить таблицу с непропущенными строковыми номерами?
29 Cube
 
20.01.14
11:57
(27) Не аргументировано.
30 Лефмихалыч
 
20.01.14
11:58
(25) обижаешь. из головы достал
(27),(24) показывай свой вариант без временных таблиц
31 Cube
 
20.01.14
11:59
(28) Да, это можно, по аналогии со срезом на каждую дату, как писали в (2)
32 Широкий
 
20.01.14
12:03
(24) Я вот вижу, что запрос выдает диапазон, причем даже тот, где пропуска нет
33 GANR
 
20.01.14
12:08
(0) Теоретически можно, но не нужно, так как для этого придется нумеровать по порядку записи в запросе http://kb.mista.ru/article.php?id=703, а потом соединять пронумерованную таблицу саму с собой по условию
т1.N = т2.N - 1 И т1.НомерДокумента <> т2.т1.НомерДокумента - 1. Операция нумерации записей в запросе 1С достаточно ресурсоемкая, поэтому очень не рекомендую это делать.
34 GANR
 
20.01.14
12:10
+(33) Так оно еще и строковое - нет, не надо этого делать запросом однозначно (хотя можно легко преобразовать строку в число в рамках запроса).
35 Лефмихалыч
 
20.01.14
12:12
(34) ну, расскажи, как в запросе 1С строку в число преобразовать
36 Cube
 
20.01.14
12:17
(32) Давай пример диапазона, что обсуждать сферических коней?
37 GANR
 
20.01.14
12:17
(35) Можно просто ПОДСТРОКА и ВЫБОР КОГДА и арифметические операции применить в связке.
38 Широкий
 
20.01.14
12:21
(36) Ну раз сам не можешь проверить..
2,3,5

"2-3" выдаст - ошибка
"1" не выдаст - ошибка
39 aspirator23
 
20.01.14
12:22
(24) Запрос возвращает
Код1    Код2
            0000000000001
0000000000001    0000000000002
0000000000002    0000000000004
0000000000004    0000000000006
0000000000006    0000000000007
0000000000007    0000000000008
0000000000008    0000000000009
0000000000009    0000000000010
0000000000010    0000000000011
0000000000011    0000000000012
0000000000012    0000000000013
0000000000013    0000000000014
0000000000014    0000000000015
40 Cube
 
20.01.14
12:26
(38) (39) А, ну да, он же бе пропусков тоже выдает... Ошибочка...
41 GANR
 
20.01.14
12:44
Короче, говорю как сертифицированный специалист по SQL-запросам: НЕ НАДО ЭТО ДЕЛАТЬ ПОСРЕДСТВОМ 1С-ЗАПРОСОВ - СЕРВЕР ОБРУШИТЕ.
42 Широкий
 
20.01.14
12:46
(41) Никто и не спорит
43 WildSery
 
20.01.14
12:47
(41) Ну понятно, что получение значений "дырок" посредством запроса потребует предварительно сгенерированного биллиона записей номеров.
44 Широкий
 
20.01.14
12:50
Мой вариант бесполезного занятия:

ВЫБРАТЬ
    ИсходнаяТаблица.Код+1 КАК НачальныйКод,
    МИНИМУМ(МестаХранения.Код) - ИсходнаяТаблица.Код - 1 КАК КоличествоПропусков
ИЗ
    (ВЫБРАТЬ
        МестаХранения.Код КАК Код
    ИЗ
        Справочник.МестаХранения КАК МестаХранения
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        0) КАК ИсходнаяТаблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.МестаХранения КАК МестаХранения
        ПО ИсходнаяТаблица.Код < МестаХранения.Код

СГРУППИРОВАТЬ ПО
    ИсходнаяТаблица.Код

ИМЕЮЩИЕ
    МИНИМУМ(МестаХранения.Код) - ИсходнаяТаблица.Код - 1 > 0

УПОРЯДОЧИТЬ ПО
    НачальныйКод
45 Лефмихалыч
 
20.01.14
13:39
(44) я ж говорю - соединение с вложенными запросами...
двоешник :)
46 GANR
 
20.01.14
13:58
(44) Тооочно - хороший запрос.
47 GANR
 
20.01.14
13:59
+(46) Если минимальный номер, больший текущего больше чем текущий более, чем на 1, то имеет место дырка.
48 МихаилМ
 
20.01.14
14:03
(47)
и как (44)
адаптировать для реквизита строка ?
49 GANR
 
20.01.14
14:13
(48) А про это я пишу в (37), раз ВЫРАЗИТЬ не прокатывает.
50 WildSery
 
20.01.14
14:24
(49) И получится многоэтажная белиберда, которую только программно собрать можно.
51 bolobol
 
20.01.14
14:39
Нельзя выбрать несуществующее
52 WildSery
 
20.01.14
14:41
(51) Ну и что? Можно создать несуществующее, а затем выбрать.
53 bolobol
 
20.01.14
15:17
(52) Ожидание результата создания состарит)
54 WildSery
 
20.01.14
15:36
(53) Вероятно. Но никак не делает (51) истиной.
55 bolobol
 
20.01.14
19:28
(54) Это всё от непонимания и незнания! Создание - это не выборка - это именно создание с исключением. Непонимание здесь. А вот и незнание: вместо создания, дешевле сделать перебор, т.к. операция сравнения гораздо дешевле операции присваивания. Т.о., имея таблицу неугодных, проще и дешевле создать таблицу угодных. А выбрать её - никак. Мать, её, часть учитывайте!
56 WildSery
 
21.01.14
12:43
(55) Вы наверное что-то умное написали, но я ничего не понял. Даже возникла мысль, что это какая-то бессвязная чушь.
57 WildSery
 
21.01.14
12:54
(48) Михаил, какой же вы упёртый...
Преобразуйте строку к числу запросом, развлекайтесь.

выбрать "0" Символ, 0 Цифра
поместить СоответствиеСимволЦифра
объединить все
выбрать "1", 1
объединить все
выбрать "2", 2
объединить все
выбрать "3", 3
объединить все
выбрать "4", 4
объединить все
выбрать "5", 5
объединить все
выбрать "6", 6
объединить все
выбрать "7", 7
объединить все
выбрать "8", 8
объединить все
выбрать "9", 9;

ВЫБРАТЬ
    1000000000 + (((((((ССЦ1.Цифра * 10 + ССЦ2.Цифра) * 10 + ССЦ3.Цифра) * 10 + ССЦ4.Цифра) * 10 + ССЦ5.Цифра) * 10 + ССЦ6.Цифра) * 10 + ССЦ7.Цифра) * 10 + ССЦ8.Цифра) * 10 + ССЦ9.Цифра КАК КодЧисло
ПОМЕСТИТЬ ВТ1
ИЗ
    КакаяТоТаблица КАК Таб
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ1
        ПО (ССЦ1.Символ = ПОДСТРОКА(Таб.Номер, 2, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ2
        ПО (ССЦ2.Символ = ПОДСТРОКА(Таб.Номер, 3, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ3
        ПО (ССЦ3.Символ = ПОДСТРОКА(Таб.Номер, 4, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ4
        ПО (ССЦ4.Символ = ПОДСТРОКА(Таб.Номер, 5, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ5
        ПО (ССЦ5.Символ = ПОДСТРОКА(Таб.Номер, 6, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ6
        ПО (ССЦ6.Символ = ПОДСТРОКА(Таб.Номер, 7, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ7
        ПО (ССЦ7.Символ = ПОДСТРОКА(Таб.Номер, 8, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ8
        ПО (ССЦ8.Символ = ПОДСТРОКА(Таб.Номер, 9, 1))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоответствиеСимволЦифра КАК ССЦ9
        ПО (ССЦ9.Символ = ПОДСТРОКА(Таб.Номер, 10, 1))
;

ВЫБРАТЬ
    Ном1.КодЧисло + 1 КАК Нач,
    ЕСТЬNULL(МИНИМУМ(Ном2.КодЧисло) - 1, 1999999999) КАК Кон
ИЗ
    ВТ_Номенклатура КАК Ном1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Номенклатура КАК Ном2
        ПО Ном1.КодЧисло < Ном2.КодЧисло

СГРУППИРОВАТЬ ПО
    Ном1.КодЧисло

ИМЕЮЩИЕ
    Ном1.КодЧисло + 1 < ЕСТЬNULL(МИНИМУМ(Ном2.КодЧисло) - 1, 1999999999)

УПОРЯДОЧИТЬ ПО
    Нач
58 WildSery
 
21.01.14
12:56
(57) в последнем запросе исправить
ИЗ ВТ1 КАК Ном1 ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК Ном2
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.