1с остаток на каждый день в запросе
Остатки на каждый день в запросе
Запрос формирует остатки товаров на каждый день в пределах выбранного периода.
(9) Прогнал запрос у себя. Да есть такое дело. Решение Вы уже описали. Если нужны остатки взаиморасчетов по дням например с 2.01.2017 по 1.27.2017 тогда параметр НачалоПериода устанавливаем на конец предыдущего дня, то есть 1.01.2017 23:59:59. В таком случае в результирующей таблице мы будем видеть корректные остатки начиная с 2.01.2017.
Это конечно не глюк, скорее специфика работы системы. Я когда-то разбирался, пытался понять из-за чего так происходит. Если память мне не изменяет, то такое поведение образуется из-за
Остаток на каждый месяц по счету 02 для бух корп
ни запрос из статьи ни запрос из (18) не работают в случае отсутствия товара на остатках на НачалоПериода, но его появления на остатках потом. Такой возможностью не стоит пренебрегать
вот вроде рабочий запрос
таким же образом (казалось бы!) можно получить и Начальный остаток. и Приход/ Расход
но тут есть свои подводные камни.
1-ый далеко НЕ во всех конфигурациях есть РегистрСведений.РегламентированныйПроизводственныйКалендарь
«легко» заменяем на Таблицу Значений. не забывая определить тип поля и правильно посчитав число нужных дней!
2-ой Совсем не такие условия нужны для Начального остатка. помучаться придётся. чтоб ещё 2-ое условие добавить
3-ий остатки и движения по Товарам на складах (о ужас!) не всегда совпадают с движениями по Партиям товаров на складах, а нам, например, надо сравнивать эти движения с Продажами и Поступлениями!
(при ордерной схеме, как «обычно» и бывает у многих, Закупка и Продажи НЕ совпадают с движением по складу!)
АйТиБложик
Маленький IT блог с характером 1С.
Получение остатков и оборотов по каждому товару на каждый день запросом
Как-то на собеседовании мне прилетело тестовое задание, в котором одним из пунктов было получение остатков и оборотов по каждому товару на каждый день одним запросом. Делюсь своим вариантом решения в надежде что кто-то в комментариях поделится своим вариантом решения.
Вся соль задачи состоит в том, что обращения к виртуальной таблице остатков и оборотов в запросе не достаточно, так как эта виртуальная таблица содержит периоды, по которым были движения, если так можно выразиться (см. рисунок 1). Иными словами, если Товар №1 поступил в магазин в начале недели (в понедельник) в количестве 5ти штук и за неделю не было ни одной продажи, то виртуальная таблица по этому товару за эту неделю выдаст лишь одну запись за понедельник, которая будет отражать остатки на начало и конец дня, приход (+5), расход (0) и оборот (0).
Данную задачу я решил разделить на несколько подзадач, ведь слона легче есть кусками, чем сразу целиком. Получились такие подзадачи:
Первая подзадача решается довольно просто. Создаем таблицу значений с колонкой Дата. Зная границы периода, в цикле заполняем таблицу датами на каждый день.
Получившуюся таблицу значений помещаем во временную таблицу запроса с последующим выводом содержимого временной таблицы через основной запрос.
В результате выполнения запроса получим даты на каждый день, что нам и нужно было. Так же на просторах интернета можно найти получение дат на каждый день только одним запросом, не прибегая к написанию дополнительного программного кода, но это уже больше отдельная тема для обсуждения. Если же в конфигурации имеется регистр сведений, который хранит какие-то данные на каждый день, то смело можно использовать его и задача упрощается до обычной выборки дат из этого регистра.
Вторая подзадача не сложнее первой, необходимо создать запрос, в котором обращаемся к таблице товаров и к виртуальной таблице остатков и оборотов, главное правильно указать параметры виртуальной таблицы и выбрать нужный тип соединения таблиц.
Рисунок 1. Остатки и обороты по товару «Стол дуб.» за 2015 год |
А вот и самое интересное, решение третьей подзадачи. Соединяем таблицы первой и второй подзадачи таким образом, что бы в результате каждому дню соответствовал необходимый период остатков и оборотов, результат помещаем во временную таблицу (см. рисунок 2).
Рисунок 2. Промежуточная таблица с ключом соединения по товару и периоду |
Полученную временную таблицу соединяем с таблицей второй подзадачи по составному ключу , на поля выборки НачальныйОстаток, КонечныйОстаток, Приход, Расход и Оборот накладываем условие по периоду остатков и оборотов для правильного расчета значений (см. последний запрос в пакете запросов), в итоге получаем остатки и обороты на каждый день.
Конечный текст пакета запросов:
Скорость выполнения запроса на реальных данных не замерял, по оптимальности ничего не скажу. Если убрать из запроса обороты, то можно получить только остатки на каждый день, причем на начало и на конец дня.
Как получить остатки на каждый день по регистру накопления?
Как Вы обычно решаете эту проблему?
(1) barm, Подобный запрос, для получения остатков на каждый день, для бухгалтерии, смысл, я думаю, уловите:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Период,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.Валюта,
ХозрасчетныйОстаткиИОбороты.Субконто1,
ХозрасчетныйОстаткиИОбороты.Субконто2,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
&ДатаНачала,
&ДатаОкончания,
День,
ДвиженияИГраницыПериода,
Счет В ИЕРАРХИИ (&Счет),
,
Субконто1 = &Контрагент
И Субконто2 = &Договор
И Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
;
X
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
ВложенныйЗапрос.Субконто1,
ВложенныйЗапрос.Субконто2,
ВложенныйЗапрос.Валюта
ПОМЕСТИТЬ ВТ_Календарь
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь,
(ВЫБРАТЬ
ВТ_Остатки.Субконто1 КАК Субконто1,
ВТ_Остатки.Субконто2 КАК Субконто2,
ВТ_Остатки.Валюта КАК Валюта
ИЗ
ВТ_Остатки КАК ВТ_Остатки
СГРУППИРОВАТЬ ПО
ВТ_Остатки.Субконто1,
ВТ_Остатки.Субконто2,
ВТ_Остатки.Валюта) КАК ВложенныйЗапрос
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
;
X
ВЫБРАТЬ
ВложенныйЗапрос.Субконто1 КАК Контрагент,
ВложенныйЗапрос.Субконто2 КАК Договор,
ВложенныйЗапрос.Дата КАК Дата,
ЕСТЬNULL(ВТ_Остатки.ВалютнаяСуммаНачальныйОстатокДт, 0) КАК ВалютныйОстатокНачалоДт,
ЕСТЬNULL(ВТ_Остатки.ВалютнаяСуммаНачальныйОстатокКт, 0) КАК ВалютныйОстатокНачалоКт,
ЕСТЬNULL(ВТ_Остатки1.ВалютнаяСуммаКонечныйОстатокДт, 0) КАК ВалютныйОстатокКонецДт,
ЕСТЬNULL(ВТ_Остатки1.ВалютнаяСуммаКонечныйОстатокКт, 0) КАК ВалютныйОстатокКонецКт,
ЕСТЬNULL(ВТ_Остатки.СуммаНачальныйОстатокДт, 0) КАК РублевыйОстатокНачалоДт,
ЕСТЬNULL(ВТ_Остатки.СуммаНачальныйОстатокКт, 0) КАК РублевыйОстатокНачалоКт,
ЕСТЬNULL(ВТ_Остатки1.СуммаКонечныйОстатокДт, 0) КАК РублевыйОстатокКонецДт,
ЕСТЬNULL(ВТ_Остатки1.СуммаКонечныйОстатокКт, 0) КАК РублевыйОстатокКонецКт
ИЗ
(ВЫБРАТЬ
МИНИМУМ(ВТ_Остатки.Период) КАК ПериодНач,
МАКСИМУМ(ВТ_Остатки1.Период) КАК ПериодКон,
ВТ_Календарь.ДатаКалендаря КАК Дата,
ВТ_Календарь.Субконто1 КАК Субконто1,
ПРЕДСТАВЛЕНИЕ(ВТ_Календарь.Субконто1) КАК Субконто1Представление,
ВТ_Календарь.Субконто2 КАК Субконто2,
ПРЕДСТАВЛЕНИЕ(ВТ_Календарь.Субконто2) КАК Субконто2Представление,
ВТ_Календарь.Валюта КАК Валюта,
ПРЕДСТАВЛЕНИЕ(ВТ_Календарь.Валюта) КАК ВалютаПредставление
ИЗ
ВТ_Календарь КАК ВТ_Календарь
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ВТ_Календарь.ДатаКалендаря = ВТ_Остатки1.Период
И ВТ_Календарь.Субконто2 >= ВТ_Остатки1.Субконто2
СГРУППИРОВАТЬ ПО
ВТ_Календарь.ДатаКалендаря,
ВТ_Календарь.Субконто1,
ВТ_Календарь.Субконто2,
ВТ_Календарь.Валюта) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ВложенныйЗапрос.ПериодНач = ВТ_Остатки.Период
И ВложенныйЗапрос.Субконто2 = ВТ_Остатки.Субконто2
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки1
ПО ВложенныйЗапрос.ПериодКон = ВТ_Остатки1.Период
И ВложенныйЗапрос.Субконто2 = ВТ_Остатки1.Субконто2
УПОРЯДОЧИТЬ ПО
Контрагент,
Договор,
Дата
Остаток на каждый день, средний остаток
Наиболее быстрый способ выбрать остаток на любой период с любыми группировками.
На основе данного запроса можно:
— просто вывести остаток, себестоимость, цену на каждый день (или месяц, час, неделю и т. д.)
— рассчитать средний запас
— расчитать количество дней провала (сколько дней товара не было на складе)
Наиболее быстрый способ выбрать остаток на любой период с любыми группировками.
На основе данного запроса можно:
Приложен пример отчета.
Скачать файлы
Специальные предложения
В СКД такой проблемы б не было.
Обновление 23.07.12 16:06
Код открыт Не указано
См. также
FormCodeGenerator Программная доработка форм. Часть 2 (Режим работы «Режим сравнения форм») на примере ERP 2.5 Промо
Данная публикация является продолжением описания функционирования обработки «FormCodeGenerator » в режиме сравнения форм и генерирования кода на основании сравнения. Подходит для перевода уже доработанных форм с интерактивной доработки на программную. Данный режим работы обработки снизит издержки при дальнейших обновлениях конфигураций.
21.12.2020 9728 27 huxuxuya 11
Интерактивная справка по объектам 1С (подключаемое расширение)
База знаний, подключаемая к объектам основной базы. Пополняется интерактивно, формируется в виде статей прямо в 1С (текст, картинки, таблицы, ссылки). Есть возможность прикрепления файлов, привязки к объектам 1С, возможности рейтинга и комментирования пользователями.
29.09.2020 15438 80 sapervodichka 45
Конвейер проверки качества кода
Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.
04.09.2019 37439 27 Stepa86 46
Вам нравятся запросы в 1С?
Речь не только о том, что простейший запрос с «легальным» оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать «в нагрузку» к тексту запроса. Все эти «Новый Запрос», «УстановитьПараметр» и последующие пляски с обработкой результата. Пора с этим заканчивать!
03.07.2019 28207 7 m-rv 91
[Расширение] Контроль отрицательных остатков по регистру бухгалтерии при проведении Промо
Расширение позволяет без изменений конфигурации проверять остатки по регистру бухгалтерии при проведении каждого документа и запрещает проведение при появлении отрицательных остатков после проведения.
17.08.2015 54565 170 ekaruk 32
Отправка электронной почты с помощью локального почтового клиента из 1С, развернутой под удаленным рабочим столом
Решение для интерактивной (нажал-отредактировал) отправки электронных писем и печатных форм через почтовый клиент (Thunderbird, Outlook) находящийся на локальном компьютере, из конфигурации 1С, развернутой под удаленным рабочим столом (RDP, remote-app). Подходит также для локального развертывания 1С. Представлен пример быстрой интеграции с конфигурациями «Управление торговлей 10.3», «Управление производственным предприятием 1.3», «Комплексная автоматизация 1.1», «Бухгалтерия предприятия 2.0».
21.09.2018 30885 24 stvorl 1
Работа с публикациями «Инфостарт»
Работа с рублевыми публикациями на сайте «Инфостарт»: ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.
13.09.2018 28948 14 RocKeR_13 16
HTTP Сервисы: Путь к своему сервису. Часть 3
Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.
27.08.2018 55087 68 dsdred 17
ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ («001», «Новый товар») Промо
Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.
01.06.2018 37110 96 m-rv 58
Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции
09.08.2018 36735 31 informa1555 30
Работа с данными выбора
17.07.2018 67765 25 kalyaka 17
Как запросом получить остаток товара на каждый день выбранного периода?
Как запросом получить остаток товара на каждый день выбранного периода? Ну примерно в таком виде
01.01.2011 120
02.01.2011 120
03.01.2011 0
04.01.2011 0
05.01.2011 50
.
31.01.2011 32
А вообще нужно еще остаток на первую и последнюю дату в выборке поделить пополам, это возможно?
Если нет, то хотя бы просто остатки в таком вот виде выдернуть.
Используй ОстаткиИОбороты, в параметрах виртуальной таблицы поставь «День», как остатки бери «КонечныйОстаток».
Что-то вроде этого:
А можно пример запроса?
(5)Там на примере СКД, а мне в запросе это получить надо по каждой номенклатуре для дальнейшей обработки
Если в запросе, то тоже есть вариант, примерно так:
А средние запасы в указанной обработке расчитаны иначе, чем мне нужно, насколько я понимаю. Вот выдержка из моего ТЗ:
«Правильная формула для подсчета среднего товарного запаса такая:
n – количество дат в периоде.»
Из за этого и весь сыр-бор.
(12)
Если я правильно понял смысл формулы,то он в том, что при усреднении остатков по периодам внутри интервала мы усредняем не остатки на конец каждого периода,а среднее остатков на начало и конец каждого периода. То есть мы не можем решить, что есть остаток для, например,заданного дня: остаток на начало дня или остаток на конец дня. Поэтому остатком считаем среднее остатка на начало и конец. Отсюда и следует предложенная формула. Для выкладок и написания запроса ее удобнее записать так:
= So*n + Сумма по i=1,n Di*(n+1/2-i).
Разделив на n, получим
В итоге запрос должен выглядеть так:
Конечно, желательно все еще раз проверить и протестировать на проверяемых вручную данных.