1с получить остатки на каждый день в запросе
Получение актуальных данных из регистра сведений на дату, получаемую в самом запросе
Примечание apas: Для получения остатков регистра накопления в первом варианте используем реальную таблицу регистра накопления и агрегатную функцию сумма(приход-расход) (требуется условие по виду движения) Второй вариант может быть полезен и в других случаях, когда виртуальная таблица задается только параметром и никак иначе (например виртуальная таблица "критерии отбора") |
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов -
основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с маскимальной датой (периодом).
Для общего развития:
Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Для общего развития:
Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)
Код 1C v 8.х
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
"Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ)
В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени
Для получения Остатков, Движений:
МоментВремени - это момент непосредственно перед позицией документа!
Если Вам необходимо получить момент непосредственно после позиции документа, то через объект Граница:
Код 1C v 8.х
Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х
Пример получения остатков на дату документа, включая его движения
Код 1C v 8.х
Похожие FAQ
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению 2
При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: . по причине: Ошибка компоновки данных по причине: Ошибка получени Альтернативный перенос остатков между 7.7 и 8.1 (обработкой с ИТС ЗагрузкаДанныхИзТаблДокум) 2
Нашел альтернативный, практически моментальный способ переноса остатков между семерой и восьмерой (так и между восмерками). Не требуется никаких дополнительных усилий, программирования, писания обработок и т.д. и т.п. На ИТС есть обработка под наз Посмотреть все результаты поиска похожих
Еще в этой же категории
Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Для общего развития:
Что есть срез последних в платформе?
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, . секунда)
Код 1C v 8.х
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Предлагается новый способ расчета остатков на каждый день (час, минуту, секунду) в запросе. Способ не требует предварительного формирования таблицы дат и также подходит для расчета курсов валют, цен номенклатуры и других периодических сведений на каждую дату периода. На больших объемах данных предлагаемый способ может превосходить по быстродействию ранее известные методы из-за линейной (в лучшем случае) зависимости трудоемкости от длины периода.
Разработчики платформы "1С: Предприятие 8" постарались сделать все, чтобы при решении рядовых задач не приходилось ломать голову, придумывая сложные алгоритмы. Но несколько нетривиальных задач все же осталось. Одной из них является задача расчета остатков на каждый день в запросе.
Появление этой задачи связано с тем, что виртуальная таблица остатков и оборотов с периодом "день" (например) не содержит записей для периодов, в которых не было оборотов. Очевидно, это было сделано умышленно. Из-за того, что определение значения остатков внутри периода хранения итогов связано с решением задачи интегрирования оборотов (расчета нарастающего итога). При использовании базового набора команд реляционных СУБД (без оконных функций) это довольно ресурсоемкая задача. Поэтому отказ от расчета в виртуальной таблице остатков и оборотов повторяющихся (а значит, в определенном смысле, избыточных) значений в большинстве случаев экономит время выполнения запроса. В тех, более редких, случаях, когда эти данные оказываются нужны, предлагается решать эту задачу дополнительными построениями на языке запросов или средствами СКД.
Хотя кажется, что все решают задачу расчета остатков на каждый день "кто во что горазд" и вариантов решения очень много, все известные решения в целом можно разделить всего на два класса.
В первом основой является таблица оборотов. Исходные дневные обороты суммируются в интервале от начала до каждой даты периода. Этот подход в точности воспроизводит работу платформы по определению остатков внутри периода их хранения для формирования виртуальной таблицы остатков и оборотов. Отличие только в том, что суммирование выполняется для каждого дня. Примером такого подхода является решение задачи 6 из статьи [Минимализмы].
Во втором подходе основой является таблица остатков тех периодов, где были обороты. Остатки для пропущенных дней находятся по принципу срезов последних: для каждой даты находится ближайший в прошлом остаток. Примером этого подхода является решение из статьи [Остатки на каждый день периода одним запросом - универсальный].
И в первом и во втором подходе требуется предварительно сформировать таблицу всех дат периода. Для этого обычно используются: производственный календарь, таблица курсов валют или искусственная таблица дат периода, сформированная одним из общеизвестных способов [Работаем с датами в запросе, Порождающий запрос].
Новый способ, предлагаемый в данной статье, опирается на таблицу остатков, но НЕ ТРЕБУЕТ ПРЕДВАРИТЕЛЬНОГО ФОРМИРОВАНИЯ ТАБЛИЦЫ ДАТ. За счет многократного повторения одного простого запроса остаток одного дня распространяется (по принципу домино) на следующие дни. За счет этого пропуски в таблице остатков быстро заполняются.
Вот предлагаемый запрос:
Единственным отличием каждого повторяющегося фрагмента от следующего является в два раза больший интервал, прибавляемый к дате. Для заполнения интервала из 32 дней достаточно пятикратного , а для интервала из 1024 дней - десятикратного повторения ключевого фрагмента. Принцип, наверное, понятен. Повторы можно реализовать, построив текст запроса динамически или взяв их количество с запасом.
Возможно, кому-то приведенный запрос покажется похожим на "машину Руби Голдберга" (она изображена на картинке в анонсе). Сходство действительно есть. Тут тоже используется принцип домино. Но вот с точки зрения эффективности все наоборот: приведенный запрос очень экономен. Наилучшим случаем является большая разреженность таблицы остатков. Когда, например, оборот (и остаток) задан в исходной таблице оборотов и остатков только за один день периода, потребуется ровно N операций для заполнения пропусков на интервале из N дней. В наихудшем случае отсутствия пропусков для работы алгоритма потребуется примерно N/2 * log (N) времени. Оно уйдет на безуспешные попытки распространить остаток на уже "занятые" периоды.
Наверное, понятно, что тот же запрос может быть применен и для решения задачи расчета курсов валют на каждый день, цен номенклатуры на каждый день и других задач интерполяции периодических сведений. Для этого исходную таблицу остатков потребуется заменить на таблицу соответствующего периодического регистра сведений.
Таким образом, этот подход работает при решении любой задачи линейно-ступенчатой интерполяции в запросе. Для определенности и из-за сходства принципов можно назвать предложенный способ методом домино.
Для примера к статье приложен отчет на базе СКД, решающий одновременно задачи нахождения остатков и цен на каждый день. Интересно, что предложенный прием позволяет решать эти задачи одновременно. Отчет проверен на конфигурации 1С:ERP Управление предприятием 2.1, но должен работать и в УТ11 и в КА2.
Специального сравнительного тестирования производительности нового способа и обычных способов в данном случае не проводилось. В других случаях [Быстрое определение интервалов в запросе] похожие подходы начинают выигрывать у традиционных при достаточно больших значениях N. Обычно это сотни и тысячи дат в периоде. Поэтому решающих преимуществ у данного способа перед уже известными на обычных средних объемах данных как будто бы нет. Кроме своеобразной красоты регулярности итогового запроса.
Арт-объект, упражнение по языку запросов, средство развития кругозора или инструмент анализа больших данных - хотя бы одно из этих применений для приведенного нового способа, надеюсь, найдется.
Читайте также: