Решение задач 1С:Предприятие 8 на примерах

Запрос 1С, который генерирует даты по дням за период

ЗапросыОпубликовано Обновлено

Список дней за период нужен, когда отчёт должен показать строку даже за день без движений. Запрос ниже строит такой список прямо в языке запросов — из временной таблицы цифр и функции ДОБАВИТЬКДАТЕ.

Текст запроса

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

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

Актуальность для новых версий

Запрос использует только базовые возможности языка запросов и одинаково работает на любой версии платформы 8.3, в файловом и клиент-серверном вариантах. Для отчётов на СКД есть и встроенный вариант: дополнение периода в настройках группировки по дате.

Частые вопросы

Сколько дней может сгенерировать запрос?

Не более 10 000: четыре соединения таблицы из десяти цифр дают 10 000 комбинаций. Для большего периода добавьте ещё одно соединение.

Как получить месяцы вместо дней?

Замените ДЕНЬ на МЕСЯЦ в функциях ДОБАВИТЬКДАТЕ и НАЧАЛОПЕРИОДА.

Как соединить результат с данными регистра?

Поместите даты во временную таблицу и соедините её левым соединением с таблицей регистра по дате — дни без движений останутся в результате.

Соединения в запросах 1С: левое, внутреннее, полное и ОБЪЕДИНИТЬ ВСЕ

Запросы

Виды соединений языка запросов 1С с наглядным результатом, соединение с виртуальными и временными таблицами, отличие ОБЪЕДИНИТЬ от ОБЪЕДИНИТЬ ВСЕ и приёмы, которые защищают от размножения строк и медленных запросов.

Значение в запросе 1С: ЗНАЧЕНИЕ, ВЫБОР, ЕСТЬNULL и группировка

Запросы

Как сравнивать с перечислениями и предопределёнными элементами через ЗНАЧЕНИЕ(), обрабатывать NULL после левого соединения и считать количество и суммы с группировкой и условием ИМЕЮЩИЕ.

Строка в запросе 1С: ПОДОБНО, ПОДСТРОКА и строки неограниченной длины

Запросы

Как работать со строками в языке запросов 1С: искать по шаблону через ПОДОБНО, вырезать часть строки, сравнивать поля неограниченной длины и склеивать текст без ошибок с NULL.

Ссылка в запросе 1С: разыменование, ВЫРАЗИТЬ, пустая ссылка и GUID

Запросы

Практический разбор ссылок в языке запросов 1С: разыменование и его цена, ВЫРАЗИТЬ и ТИПЗНАЧЕНИЯ для составных типов, пустая ссылка и NULL, представление и уникальный идентификатор.