ПОдкинули тут интересную задачку. Имеется набор целых чисел. Некоторые из чисел образуют последовательности вроде 3,4,5 или 112,113. Как бы обнаружить такие последовательности? Сам алгоритм ясен, сортируем по возрастанию и идем по массиву, проверяя дельту с предыдущим значением. А можно ли как-то задействовать запрос для оптимизации?
---
PLAstic, вот запрос из "минимализмов", переделанный применительно к вашему случаю (для чисел). В начале запроса вводится таблица ВТЧисла, чтобы можно было проверить в консоли. У себя ВТЧисла потребуется заменить на обращение к необходимой табличной части.
```1c
    ВЫБРАТЬ 1 КАК Икс
    ПОМЕСТИТЬ ВТЧисла
    ОБЪЕДИНИТЬ ВЫБРАТЬ 2
    ОБЪЕДИНИТЬ ВЫБРАТЬ 3
    ОБЪЕДИНИТЬ ВЫБРАТЬ 5
    ОБЪЕДИНИТЬ ВЫБРАТЬ 6
    ОБЪЕДИНИТЬ ВЫБРАТЬ 8
    ОБЪЕДИНИТЬ ВЫБРАТЬ 9
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Числа.Икс,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЧислаДо.Икс) КАК Номер
    ПОМЕСТИТЬ НомераЧисел
    ИЗ
    ВТЧисла КАК Числа
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЧисла КАК ЧислаДо
    ПО (ЧислаДо.Икс <= Числа.Икс)

    СГРУППИРОВАТЬ ПО
    Числа.Икс
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    МИНИМУМ(НомераЧисел.Икс) КАК ИксНач,
    МАКСИМУМ(НомераЧисел.Икс) КАК ИксКон
    ИЗ
    НомераЧисел КАК НомераЧисел

    СГРУППИРОВАТЬ ПО
    НомераЧисел.Икс - НомераЧисел.Номер
```
Уточнение в (13) говорит о том, что использовать хитроумные запросы нахождения интервалов здесь не нужно. Поскольку в ТЧ обычно тысяч строк не бывает. Также обратите внимание на задачу 2 из той же статьи. Она показывает как решить точно такую же задачу, как у вас (сжато распечатать колонку чисел) в коде.
---
PLAstic, что нужно получить?
---
PLAstic, Можно использовать запрос для деоптимизации(усложнения).
---
PLAstic, задача не такая простая, как кажется, но есть уже известное решение. Оно опубликовано в статье Минимализмы под номером 14. Там речь идет о датах, но числа также будут обрабатываться.
Вычислительная сложность запроса имеет оценку O(N^2), поскольку в запросе есть тэта-соединение.

Если чисел много, то лучше сделать так:
1. Найти ОТСУТСТВУЮЩИЕ числа (соединением с искусственной таблицей 1 - МАКС(Число));
2. Построить интервалы между отсутствующими числами методом из статьи Быстрое определение интервалов в запросе;
3. Взять в качестве ответа открытые интервалы, которые больше одного.
Трудоемкость описанного подхода O(N).
Если опишите РЕАЛЬНУЮ исходную задачу, то взамен могу написать готовый работающий запрос.
---
ildarovich, спасибо. Про поиск отсутствующих значений я тоже думал.
Реальная задача такая и есть: на входе есть массив целых чисел (1,3,4,5,9). Надо получить его строковое представление, объединив непрерывные диапазоны ("1", "3-5", "9").
Количество элементов исходного массива может составлять несколько тысяч.
---
Чувствую скоро будут коды типа:

```1c
    Функция ДваПлюсТри()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | 2 КАК Число1
    |ПОМЕСТИТЬ Шаг1
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ ПЕРВЫЕ 1
    | 3 КАК Число2
    |ПОМЕСТИТЬ Шаг2
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Шаг1.Число1 + Шаг2.Число2 КАК Ответ
    |ИЗ
    | Шаг1 КАК Шаг1,
    | Шаг2 КАК Шаг2";
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    Возврат Выборка.Ответ
    Иначе
    Возврат 0
    КонецЕсли
    КонецФункции
```
---
Мне было интересно, можно ли это как-то запросом проанализировать, потому, что входные данные получаются в запросе. Только и всего. Чего-то более оптимального, чем перебор в цикле, я не нашёл, поэтому запросил мыслей остальных. Юродствовать неуместно, имхо.
---
PLAstic, пока не понятно - что вам нужно на выходе? Ответ: да есть последовательности, или посчитать количество таких последовательностей??? что надо -то?
---
пронумеровать по порядку имеющуюся последовательность, вычислить разницу между между этими двумя числами, в последовательностях эта разница будет одинаковой, дальше для каждой "разницы" находим min и max.... мысли вслух...
---
user_2010, в ссылке из (7) именно так и сделано. Проблема в "пронумеровать по порядку". Это очень затратная операция. Ее трудоемкость растет как N^2 от числа номеров. Поэтому лучше как описано во второй части (7).
---
ildarovich, это же, наверняка, отчет... может воспользоваться данными СКД - там номер по порядку как системное поле - может его можно использовать в выражениях пользовательских полей? а еще для пользовательских полей есть куча агрегатных функций типа ВычислитьВыражениеСГруппировкойМассив....
---
user_2010, вопрос был А можно ли как-то задействовать запрос для оптимизации?Был бы вопрос: А можно ли как-то задействовать СКД для оптимизации, можно было бы про агрегатные функции СКД думать. Но, вообще все нужно сравнивать. Взять достаточно большой тестовый набор чисел и найти ответ тремя способами: код, СКД, запрос. Сравнить время. Правда, непонятно, стоит ли этим заниматься. Задача довольно экзотическая. Фактуру (в чем практический смысл задачи, откуда берутся числа, сколько их, насколько важна скорость и прочее) автор вопроса так и не дал.
---
ildarovich, я не думаю, что эта детализация на что-то влияет. Это серийные номера некой сущности. Скажем, детали какой-то. У каждого экземпляра свой номер. Номера даются по порядку, но детали могут передаваться не сплошными пулами, а как со склада подобрали - с перерывами. Мне при выводе на печать надо группировать их в удобоваримое представление. Это не СКД, а запрос к ТЧ документа.
---
ildarovich, Основная проблема возникла при попытке заменить ДОБАВИТЬКДАТЕ . Для чисел функции нет, а выполнять арифметические операции нельзя.
---
PLAstic, вот запрос из "минимализмов", переделанный применительно к вашему случаю (для чисел). В начале запроса вводится таблица ВТЧисла, чтобы можно было проверить в консоли. У себя ВТЧисла потребуется заменить на обращение к необходимой табличной части.
```1c
    ВЫБРАТЬ 1 КАК Икс
    ПОМЕСТИТЬ ВТЧисла
    ОБЪЕДИНИТЬ ВЫБРАТЬ 2
    ОБЪЕДИНИТЬ ВЫБРАТЬ 3
    ОБЪЕДИНИТЬ ВЫБРАТЬ 5
    ОБЪЕДИНИТЬ ВЫБРАТЬ 6
    ОБЪЕДИНИТЬ ВЫБРАТЬ 8
    ОБЪЕДИНИТЬ ВЫБРАТЬ 9
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Числа.Икс,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЧислаДо.Икс) КАК Номер
    ПОМЕСТИТЬ НомераЧисел
    ИЗ
    ВТЧисла КАК Числа
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЧисла КАК ЧислаДо
    ПО (ЧислаДо.Икс <= Числа.Икс)

    СГРУППИРОВАТЬ ПО
    Числа.Икс
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    МИНИМУМ(НомераЧисел.Икс) КАК ИксНач,
    МАКСИМУМ(НомераЧисел.Икс) КАК ИксКон
    ИЗ
    НомераЧисел КАК НомераЧисел

    СГРУППИРОВАТЬ ПО
    НомераЧисел.Икс - НомераЧисел.Номер
```
Уточнение в (13) говорит о том, что использовать хитроумные запросы нахождения интервалов здесь не нужно. Поскольку в ТЧ обычно тысяч строк не бывает. Также обратите внимание на задачу 2 из той же статьи. Она показывает как решить точно такую же задачу, как у вас (сжато распечатать колонку чисел) в коде.