База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Как получить список интервалов из списка номерованных бланков в 1С? › RE: Как получить список интервалов из списка номерованных бланков в 1С?

Ivanliba, приветствую!
Для получения списка интервалов из списка номерованных бланков в 1С можно использовать алгоритм, который группирует последовательные номера в интервалы. Например, если у вас есть список номеров: 1,2,3,5,6,8,9,10, то результатом будет список интервалов: 1-3, 5-6, 8-10.
Вот пример кода на встроенном языке 1С, который реализует такую логику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
1C Функция ПолучитьИнтервалыИзНомеров(СписокНомеров) // Сортируем список номеров по возрастанию СписокНомеров = СписокНомеров.Скопировать(); СписокНомеров.Отсортировать(); Интервалы = Новый Массив; Если СписокНомеров.Количество() = 0 Тогда Возврат Интервалы; КонецЕсли; НачалоИнтервала = СписокНомеров[0]; КонецИнтервала = НачалоИнтервала; Для Индекс = 1 По СписокНомеров.Количество() - 1 Цикл ТекущийНомер = СписокНомеров[Индекс]; Если ТекущийНомер = КонецИнтервала + 1 Тогда // Продолжаем текущий интервал КонецИнтервала = ТекущийНомер; Иначе // Завершаем текущий интервал и начинаем новый Интервалы.Добавить(Новый Структура("Начало, Конец", НачалоИнтервала, КонецИнтервала)); НачалоИнтервала = ТекущийНомер; КонецИнтервала = ТекущийНомер; КонецЕсли; КонецЦикла; // Добавляем последний интервал Интервалы.Добавить(Новый Структура("Начало, Конец", НачалоИнтервала, КонецИнтервала)); Возврат Интервалы; КонецФункции |
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
1C СписокНомеров = Новый Массив; СписокНомеров.Добавить(1); СписокНомеров.Добавить(2); СписокНомеров.Добавить(3); СписокНомеров.Добавить(5); СписокНомеров.Добавить(6); СписокНомеров.Добавить(8); СписокНомеров.Добавить(9); СписокНомеров.Добавить(10); Интервалы = ПолучитьИнтервалыИзНомеров(СписокНомеров); Для Каждого Интервал Из Интервалы Цикл Если Интервал.Начало = Интервал.Конец Тогда Сообщить(Строка(Интервал.Начало)); Иначе Сообщить(Строка(Интервал.Начало) + " - " + Строка(Интервал.Конец)); КонецЕсли; КонецЦикла; |
Результат будет:
1 2 3 |
1 - 3 5 - 6 8 - 10 |
Если у вас список бланков хранится в базе данных, то можно сначала получить список номеров через запрос, затем обработать их таким образом.
Если нужно получить интервалы непосредственно в запросе 1С, то это сложнее, так как язык запросов 1С не поддерживает оконные функции, но можно использовать прием с вычислением разницы между номером и порядковым номером, чтобы сгруппировать последовательные номера.
Пример запроса для получения интервалов из регистра или справочника с номерами:
1 2 3 4 5 6 7 8 |
1C ВЫБРАТЬ Номер, Номер - РАНГ() ПО Порядок() КАК Группа ИЗ Справочник.НомераБланков УПОРЯДОЧИТЬ ПО Номер |
Далее по полю “Группа” можно сгруппировать номера, так как для последовательных номеров разница “Номер – порядковый номер” будет одинаковой.
Но в 1С запросах это реализовать полностью сложно, поэтому чаще делают выборку номеров и группируют уже на встроенном языке.
Рекомендую посмотреть здесь: https://infostart.ru/public/68225/ — там есть примеры работы с интервалами и ФИФО, которые могут помочь.
Если нужна помощь с конкретным кодом или запросом — обращайтесь!
Оценка ответа: 9/10