База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Как получить список интервалов из списка номерованных бланков в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 дня, 3 часа назад сделано
Odin – Одинэсник.
-
АвторСообщения
-
-
1 октября 2025 в 9:30 #33559
Odineski
Участникполучить список интервалов из списка номерованных бланков
-
1 октября 2025 в 9:30 #33560
Odin – Одинэсник
УчастникIvanliba, приветствую!
Для получения списка интервалов из списка номерованных бланков в 1С можно использовать алгоритм, который группирует последовательные номера в интервалы. Например, если у вас есть список номеров: 1,2,3,5,6,8,9,10, то результатом будет список интервалов: 1-3, 5-6, 8-10.
Вот пример кода на встроенном языке 1С, который реализует такую логику:
1С (Код)12345678910111213141516171819202122232425262728293031321CФункция ПолучитьИнтервалыИзНомеров(СписокНомеров)// Сортируем список номеров по возрастаниюСписокНомеров = СписокНомеров.Скопировать();СписокНомеров.Отсортировать();Интервалы = Новый Массив;Если СписокНомеров.Количество() = 0 ТогдаВозврат Интервалы;КонецЕсли;НачалоИнтервала = СписокНомеров[0];КонецИнтервала = НачалоИнтервала;Для Индекс = 1 По СписокНомеров.Количество() - 1 ЦиклТекущийНомер = СписокНомеров[Индекс];Если ТекущийНомер = КонецИнтервала + 1 Тогда// Продолжаем текущий интервалКонецИнтервала = ТекущийНомер;Иначе// Завершаем текущий интервал и начинаем новыйИнтервалы.Добавить(Новый Структура("Начало, Конец", НачалоИнтервала, КонецИнтервала));НачалоИнтервала = ТекущийНомер;КонецИнтервала = ТекущийНомер;КонецЕсли;КонецЦикла;// Добавляем последний интервалИнтервалы.Добавить(Новый Структура("Начало, Конец", НачалоИнтервала, КонецИнтервала));Возврат Интервалы;КонецФункцииПример использования:
1С (Код)12345678910111213141516171819201CСписокНомеров = Новый Массив;СписокНомеров.Добавить(1);СписокНомеров.Добавить(2);СписокНомеров.Добавить(3);СписокНомеров.Добавить(5);СписокНомеров.Добавить(6);СписокНомеров.Добавить(8);СписокНомеров.Добавить(9);СписокНомеров.Добавить(10);Интервалы = ПолучитьИнтервалыИзНомеров(СписокНомеров);Для Каждого Интервал Из Интервалы ЦиклЕсли Интервал.Начало = Интервал.Конец ТогдаСообщить(Строка(Интервал.Начало));ИначеСообщить(Строка(Интервал.Начало) + " - " + Строка(Интервал.Конец));КонецЕсли;КонецЦикла;Результат будет:
1С (Код)1231 - 35 - 68 - 10Если у вас список бланков хранится в базе данных, то можно сначала получить список номеров через запрос, затем обработать их таким образом.
Если нужно получить интервалы непосредственно в запросе 1С, то это сложнее, так как язык запросов 1С не поддерживает оконные функции, но можно использовать прием с вычислением разницы между номером и порядковым номером, чтобы сгруппировать последовательные номера.
Пример запроса для получения интервалов из регистра или справочника с номерами:
1С (Код)123456781CВЫБРАТЬНомер,Номер - РАНГ() ПО Порядок() КАК ГруппаИЗСправочник.НомераБланковУПОРЯДОЧИТЬ ПОНомерДалее по полю “Группа” можно сгруппировать номера, так как для последовательных номеров разница “Номер – порядковый номер” будет одинаковой.
Но в 1С запросах это реализовать полностью сложно, поэтому чаще делают выборку номеров и группируют уже на встроенном языке.
Рекомендую посмотреть здесь: https://infostart.ru/public/68225/ — там есть примеры работы с интервалами и ФИФО, которые могут помочь.
Если нужна помощь с конкретным кодом или запросом — обращайтесь!
Оценка ответа: 9/10
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.