Odin | База знаний 1С

Как в 1С вывести номера документов, идущие подряд, через тире?


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

есть запрос, который выводит номера документов. Как в этом запросе номера идущие подряд вывести через тире.
К примеру запрос вывел 101, 102 , 103 , 104, 105, 107, 109, 110,111, 115.
Нужно, что бы было: 100-105, 107, 109-111, 115



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

Привет! Чтобы вывести номера документов, идущие подряд, через тире, можно использовать SQL-запрос с группировкой и оконными функциями. Однако, в 1С:Предприятии нет прямой поддержки таких функций, поэтому придется использовать более сложный подход.

Вот пример, как это можно реализовать на языке 1С:

1C
Запрос = Новый Запрос;
Запрос.Текст = "
ВЫБРАТЬ
    НомераДокументов.Номер
ИЗ
    (ВЫБРАТЬ
        Документ.Номер
    ИЗ
        Документ.НазваниеДокумента) КАК НомераДокументов
УПОРЯДОЧИТЬ ПО
    НомераДокументов.Номер";

Результат = Запрос.Выполнить();
Номера = Новый Массив;

Пока Результат.ПолучитьСтроку() = 1 Цикл
    Номера.Добавить(Результат.Номер);
КонецЦикла;

РезультатСтрока = "";
ТекущийДиапазон = "";
ПредыдущийНомер = 0;

Для каждого Номер Из Номера Цикл
    Если ПредыдущийНомер = 0 Тогда
        ТекущийДиапазон = Номер;
    КонецЕсли;

    Если Номер - ПредыдущийНомер = 1 Тогда
        // Продолжаем диапазон
    Иначе
        Если ТекущийДиапазон  "" Тогда
            Если ТекущийДиапазон  ПредыдущийНомер Тогда
                РезультатСтрока = РезультатСтрока + ТекущийДиапазон + "-" + ПредыдущийНомер + ", ";
            Иначе
                РезультатСтрока = РезультатСтрока + ТекущийДиапазон + ", ";
            КонецЕсли;
        КонецЕсли;
        ТекущийДиапазон = Номер;
    КонецЕсли;

    ПредыдущийНомер = Номер;
КонецЦикла;

// Добавляем последний диапазон
Если ТекущийДиапазон  "" Тогда
    Если ТекущийДиапазон  ПредыдущийНомер Тогда
        РезультатСтрока = РезультатСтрока + ТекущийДиапазон + "-" + ПредыдущийНомер;
    Иначе
        РезультатСтрока = РезультатСтрока + ТекущийДиапазон;
    КонецЕсли;
КонецЕсли;

Сообщить(РезультатСтрока);

Этот код собирает номера документов в массив, а затем обрабатывает их, чтобы сформировать строку с диапазонами. В результате вы получите строку, где номера, идущие подряд, будут объединены через тире.

Если у вас есть конкретный запрос, который вы используете, дайте знать, и я помогу адаптировать его под ваши нужды.



   
ОтветитьЦитата