Случается так, что необходимо чистым запросом сгенерировать последовательность чисел, для их дальнейшего использования. Ну допустим, чтобы потом сгенерировать последовательность дат. Да и мало ли задач бывает у 1С программистов.
Можете посмотреть мою видеоинструкцию, либо прочитать статью.
Классический подход
Начнем с простого. Во первых нам нужно сгенерировать последовательность чисел. Делается это в 2 этапа.
Первый этап – создать временную таблицу с цифрами от 0 до 9.
Второй этап – объединить таблицу с цифрами с самой собой несколько раз используя, своего рода мультипликатор, для получения сотен, десятков и единиц.
Собственно готовый запрос:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Цифры.Цифра * 100 + ВТ_Цифры1.Цифра * 10 + ВТ_Цифры2.Цифра КАК Число ИЗ ВТ_Цифры КАК ВТ_Цифры, ВТ_Цифры КАК ВТ_Цифры1, ВТ_Цифры КАК ВТ_Цифры2 |
Как результат мы получаем последовательность чисел 0, 1, 2, 3…. 997, 998, 999.
Теперь давайте превратим эту последовательность в даты.
Для начала поместим результат запроса во временную таблицу и сразу будем прибавлять эти числа как дни к какой то выбранной начальной дате.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Цифры.Цифра * 100 + ВТ_Цифры1.Цифра * 10 + ВТ_Цифры2.Цифра КАК Число ПОМЕСТИТЬ ВТ_Числа // ПОМЕСТИЛИ ВО ВРЕМЕННУЮ ТАБЛИЦУ ИЗ ВТ_Цифры КАК ВТ_Цифры, ВТ_Цифры КАК ВТ_Цифры1, ВТ_Цифры КАК ВТ_Цифры2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Числа.Число) КАК Дата // ПРИБАВИЛИ К ДАТЕ КОЛИЧЕСТВО ДНЕЙ ИЗ ВТ_Числа КАК ВТ_Числа |
Теперь, если в качестве параметра запроса &ДатаНачала мы установим 01.01.2023, то получим последовательность из 1000 дней от 01.01.2023 до 26.09.2025.
Вроде хорошо, но как то много дней, что делать если мне нужно только пару месяцев? Просто добавляем в запрос ограничение в разделе “ГДЕ”
1 2 3 4 5 6 |
ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Числа.Число) КАК Дата // ПРИБАВИЛИ К ДАТЕ КОЛИЧЕСТВО ДНЕЙ ИЗ ВТ_Числа КАК ВТ_Числа ГДЕ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Числа.Число) <= &ДатаОкончания |
Результирующий запрос:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Цифры.Цифра * 100 + ВТ_Цифры1.Цифра * 10 + ВТ_Цифры2.Цифра КАК Число ПОМЕСТИТЬ ВТ_Числа ИЗ ВТ_Цифры КАК ВТ_Цифры, ВТ_Цифры КАК ВТ_Цифры1, ВТ_Цифры КАК ВТ_Цифры2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Числа.Число) КАК Дата ИЗ ВТ_Числа КАК ВТ_Числа ГДЕ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Числа.Число) <= &ДатаОкончания |
Лайфхакерский подход
Для этого нужно взять функцию АВТОНОМЕРЗАПИСИ() и соединить с чем нибудь, где есть достаточно большое количество записей. Например с регистром ЦеныНоменклатуры.
Вот так можно получить последовательность чисел от 1 до 1000.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ВЫБРАТЬ ПЕРВЫЕ 1000 АВТОНОМЕРЗАПИСИ() КАК Номер, ЦеныНоменклатуры.Период КАК Период ПОМЕСТИТЬ ВТ_Номера ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Номера.Номер - 1) КАК Номер ИЗ ВТ_Номера КАК ВТ_Номера ГДЕ ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Номера.Номер - 1) < &ДатаОкончания |
Обратите внимание, что от номера нужно отнять число 1. Так как последовательность начинается не с нуля, а с единицы