1С 8.3 Получить даты за период в запросе - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Получить даты за период в запросе

Данные > Примеры кода 1С > 1С 8.3 Дата и время
Перейти в основной раздел:
Генерация списка дат за период с настраиваемым шагом в днях в запросе
Получение даты за период в запросе в 1С 8.3:
// Возвращает текст запроса, или добавляет запрос во временную таблицу, или возвращает результат запроса, или таблицу значений с результатом запроса.
// Следует указать истина только в одном из следующих параметров:
// - ПолучитьТекстЗапроса
// - ПолучитьРезультатЗапроса
// - ПолучитьТаблицуЗначений.
//
// Параметры:
//  НачалоПериода                          - Дата - начало периода отсчета.
//  КонецПериода                            - Дата - конец периода отсчета включительно.
//  Шаг                                             - Число - шаг вывода дат в днях.
//  ПолучитьПоследнююДату          - Булево - признак вывода последнего дня, если тот не попадает по шагу.
//  ИмяКолонкиПериод                    - Строка - имя колонки с датами.
//  ПолучитьКолонкуШаг                 - Булево - признак получения колонки шага, используемой для отладки.
//  ИмяКолонкиШаг                         - Строка - имя колонки с шагом.
//  ПолучитьТекстЗапроса               - Булево - возврат текста запроса.
//  ДобавитьВоВременныеТаблицы - Булево - добавление запроса во временную таблицу.
//  МенеджерВременныхТаблиц      - МенеджерВременныхТаблиц - менеджер временных таблиц.
//  ИмяВременнойТаблицы              - Строка - имя временной таблицы.
//  ПолучитьРезультатЗапроса         - Булево - получить результат запроса.
//  ПолучитьТаблицуЗначений          - Булево - получить таблицу значений с результатом запроса.
//  УничтожитьВТ                              - Булево - если истина, в конце запроса будут уничтеженны промежуточные временные таблицы.
//
// Возвращаемое значение:
//    - Строка                      - если ПолучитьТекстЗапроса истина.
//    - Временная таблица  - если ДобавитьВоВременныеТаблицы истина.
//    - Результат запрос      - если ПолучитьРезультатЗапроса истина.
//    - Таблица значений     - если ПолучитьТаблицуЗначений истина.
//
Функция ПолучитьДатыЗаПериодВЗапросе(НачалоПериода = Неопределено, КонецПериода = Неопределено, Шаг = 1, ПолучитьПоследнююДату = Ложь, ИмяКолонкиПериод = "Период", ПолучитьКолонкуШаг = Ложь, ИмяКолонкиШаг = "Шаг",
   ПолучитьТекстЗапроса = Ложь, ДобавитьВоВременныеТаблицы = Ложь, МенеджерВременныхТаблиц = Неопределено,
   ИмяВременнойТаблицы = "#ДатыЗаПериод", ПолучитьРезультатЗапроса = Ложь, ПолучитьТаблицуЗначений = Ложь,
   УничтожитьВТ = Истина) Экспорт

   ТекстЗапроса =
   "ВЫБРАТЬ 0 КАК Цифра
    |ПОМЕСТИТЬ Цифры
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 1
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 2
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 3
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 4
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 5
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 6
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 7
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 8
    |ОБЪЕДИНИТЬ ВЫБРАТЬ 9
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, СписокДней.Дней) КАК Период
    |ПОМЕСТИТЬ НужныйПериод
    |ИЗ
    |    (ВЫБРАТЬ
    |        СотниТысяч.Цифра * 100000 + ДесяткиТысяч.Цифра * 10000 + Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 +         Единицы.Цифра КАК Дней
    |    ИЗ
    |        Цифры КАК СотниТысяч
    |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК ДесяткиТысяч
    |                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Тысячи
    |                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Сотни
    |                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Десятки
    |                            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Цифры КАК Единицы
    |                            ПО (Десятки.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
    |                                И (Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
    |                        ПО (Сотни.Цифра * 100 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
    |                    ПО (Тысячи.Цифра * 1000 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
    |                ПО (ДесяткиТысяч.Цифра * 10000 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
    |            ПО (СотниТысяч.Цифра * 100000 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ))
    |    ГДЕ
    |        СотниТысяч.Цифра * 100000 + ДесяткиТысяч.Цифра * 10000 + Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 +    Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК СписокДней
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    НужныйПериод1.Период КАК Период,
    |    СУММА(1) + (&Шаг - 1) КАК Шаг
    |ПОМЕСТИТЬ ПериодДоОбрезания
    |ИЗ
    |    НужныйПериод КАК НужныйПериод1
    |        ЛЕВОЕ СОЕДИНЕНИЕ НужныйПериод КАК НужныйПериод2
    |        ПО НужныйПериод1.Период >= НужныйПериод2.Период
    |
    |СГРУППИРОВАТЬ ПО
    |    НужныйПериод1.Период
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ПериодДоОбрезания.Период КАК Период,
    |    ПериодДоОбрезания.Шаг КАК Шаг
    |ПОМЕСТИТЬ ПериодПлюсПоследняяДата
    |ИЗ
    |    ПериодДоОбрезания КАК ПериодДоОбрезания
    |ГДЕ
    |    ПериодДоОбрезания.Шаг / &Шаг = (ВЫРАЗИТЬ(ПериодДоОбрезания.Шаг / &Шаг КАК ЧИСЛО(10, 0)))
    |
    |СГРУППИРОВАТЬ ПО
    |    ПериодДоОбрезания.Период,
    |    ПериодДоОбрезания.Шаг
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    &КонецПериода,
    |    NULL
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ПериодПлюсПоследняяДата.Период КАК " + ИмяКолонкиПериод
   +
   ?(ПолучитьКолонкуШаг,",
    |    СУММА(ПериодПлюсПоследняяДата.Шаг) КАК " + ИмяКолонкиШаг, "")
   +
   ?(ДобавитьВоВременныеТаблицы, "
    |ПОМЕСТИТЬ " + ИмяВременнойТаблицы, "")
   +
"
    |ИЗ
    |    ПериодПлюсПоследняяДата КАК ПериодПлюсПоследняяДата
    |"
   +
   ?(ПолучитьПоследнююДату,"ГДЕ
    |    НЕ ПериодПлюсПоследняяДата.Шаг ЕСТЬ NULL
    |", "")
   +
"СГРУППИРОВАТЬ ПО
    |    ПериодПлюсПоследняяДата.Период
    |"
   +
   ?(УничтожитьВТ, ";
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ Цифры
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ НужныйПериод
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ ПериодДоОбрезания
    |;
    |////////////////////////////////////////////////////////////////////////////////
    |УНИЧТОЖИТЬ ПериодПлюсПоследняяДата ", "");

   Если ПолучитьТекстЗапроса Тогда
       Возврат ТекстЗапроса;
   КонецЕсли;

   Если НачалоПериода = Неопределено Тогда
       НачалоПериода = ТекущаяДатаСеанса();
   КонецЕсли;

   Если КонецПериода = Неопределено Тогда
       КонецПериода = ТекущаяДатаСеанса();
   КонецЕсли;

   Запрос       = Новый Запрос;
   Запрос.Текст = ТекстЗапроса;

   Если ДобавитьВоВременныеТаблицы Тогда
       Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
   КонецЕсли;

   Запрос.УстановитьПараметр("КонецПериода",  НачалоДня(КонецПериода));
   Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
   Запрос.УстановитьПараметр("Шаг",           Шаг);

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

   Если ПолучитьРезультатЗапроса Тогда
       Возврат РезультатЗапроса;
   КонецЕсли;

   Если ПолучитьТаблицуЗначений Тогда
       Возврат РезультатЗапроса.Выгрузить();
   КонецЕсли;

КонецФункции
1
комментарий
Дмитрий Шаура
31 окт 2022
Я как то задался целью объединить в запросе номер документа и его дату (отчёт на СКД). Нашёл такое решение:
ВЫБОР
КОГДА Документ.Отправитель = ЗНАЧЕНИЕ(Справочник.Отделы.Лаборатория)
ТОГДА Выразить("Акт о возврате " КАК СТРОКА (20)) + Выразить(ВозвратыПокупателей.Документ.АктОВозвратеНомер КАК СТРОКА(20)) + " от " + ПОДСТРОКА("01020304050607080910111213141516171819202122232425262728293031", ДЕНЬ(ВозвратыПокупателей.Документ.АктОВозвратеДата) * 2 - 1, 2) + "." + ПОДСТРОКА("010203040506070809101112", МЕСЯЦ(ВозвратыПокупателей.Документ.АктОВозвратеДата) * 2 - 1, 2) + "." + ПОДСТРОКА("20202021202220232024202520262027202820292030", (ГОД(ВозвратыПокупателей.Документ.АктОВозвратеДата) - 2020) * 4 + 1, 4)
ИНАЧЕ ВозвратыПокупателей.Документ
КОНЕЦ,

Получается строка вида "Акт о возврате 123 от 01.10.2022"
____________________
Copyright©, «Программист 1С в г.Минске», 05.08.2022
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому