markdown Остаткисразбивкойпопериодамвзапросе1С
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown Остаткисразбивкойпопериодамвзапросе1С相关的知识,希望对你有一定的参考价值。
Часто перед программистом 1с возникает следующая задача: в запросе требуется взять остатки регистра бухгалтерии или накопления по периодам.
Пример: Есть определенный временной интервал (полгода к примеру) и на начало каждого месяца нужно получить остатки по дебиторской задолженности с разрезами Организация, Контрагент, Договор контрагента.
Казалось бы сделать это внутри запроса несложно: нужно взять виртуальную таблицу ОстаткиИОбороты, выбрать разбивку на нужные периоды и все. Но такой метод не сработает из-за одной неприятной особенности ОстатковИОборотов, в ней не хранятся остатки по периодам для тех позиций, по которым не было оборотов.
Пример: Контрагент Иванов должен нам 100 рублей на начало года, в январе, феврале и марте его задолженность оставалась неизменной. Берем таблицу Остатки и обороты регистра бухгалтерии Хозрасчетный по счету 62 за первый квартал, в периодичности указываем значение Месяц. Выполняем запрос и получаем следующий результат:
| Месяц | Нач. остаток | Приход | Расход | Кон. остаток |
| ------ | ------ | ------ | ------ | ------ |
|Январь |100 |0 |0 |100 |
|Март |100 |0 |0 |100 |
Как мы видим взялись остатки только крайних периодов, а остатки февраля выпали. Что бы решить данную проблему, остатки на каждый период придется рассчитывать.
Ниже приведен запрос для конфигурации Бухгалтерия 2.0 (он также заработает для Бухгалтерии 3.0 если в запросе заменить регистр РегламентированныйПроизводственныйКалендарь на регистр ДанныеПроизводственногоКалендаря) в котором считаются остатки с разбивкой по месяцам по счету 62.
```
ВЫБРАТЬ РАЗЛИЧНЫЕ
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяц
ПОМЕСТИТЬ Календарь
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Календарь.Месяц КАК Месяц,
СУММА(ХозрасчетныйОстатки.СуммаОстатокДт - ХозрасчетныйОстатки.СуммаОстатокКт) КАК СуммаОстатокНаНачало,
ХозрасчетныйОстатки.Организация,
ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
ХозрасчетныйОстатки.Субконто2 КАК ДоговорКонтрагента
ПОМЕСТИТЬ ОстаткиНаНачало
ИЗ
Календарь КАК Календарь,
РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаНач, Счет В ИЕРАРХИИ (&Счет62), , Организация = &Организация) КАК ХозрасчетныйОстатки
СГРУППИРОВАТЬ ПО
Календарь.Месяц,
ХозрасчетныйОстатки.Организация,
ХозрасчетныйОстатки.Субконто1,
ХозрасчетныйОстатки.Субконто2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Календарь.Месяц,
0,
ХозрасчетныйОбороты.Организация,
ХозрасчетныйОбороты.Субконто1,
ХозрасчетныйОбороты.Субконто2
ИЗ
Календарь КАК Календарь,
РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, Месяц, Счет В ИЕРАРХИИ (&Счет62), , Организация = &Организация, , ) КАК ХозрасчетныйОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаНач, Счет В ИЕРАРХИИ (&Счет62), , Организация = &Организация) КАК ХозрасчетныйОстатки
ПО ХозрасчетныйОбороты.Организация = ХозрасчетныйОстатки.Организация
И ХозрасчетныйОбороты.Субконто1 = ХозрасчетныйОстатки.Субконто1
И ХозрасчетныйОбороты.Субконто2 = ХозрасчетныйОстатки.Субконто2
ГДЕ
ХозрасчетныйОстатки.Организация ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
Календарь.Месяц,
ХозрасчетныйОбороты.Организация,
ХозрасчетныйОбороты.Субконто1,
ХозрасчетныйОбороты.Субконто2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ХозрасчетныйОбороты.Период, МЕСЯЦ) КАК Месяц,
ХозрасчетныйОбороты.Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборот) КАК СуммаОборот,
ХозрасчетныйОбороты.Субконто2 КАК ДоговорКонтрагента,
ХозрасчетныйОбороты.Субконто1 КАК Контрагент
ПОМЕСТИТЬ ОборотыЗаПериод
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, Месяц, Счет В ИЕРАРХИИ (&Счет62), , Организация = &Организация, , ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ХозрасчетныйОбороты.Период, МЕСЯЦ),
ХозрасчетныйОбороты.Организация,
ХозрасчетныйОбороты.Субконто2,
ХозрасчетныйОбороты.Субконто1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиНаНачало.Организация,
СУММА(ОборотыЗаПериодНаНачало.СуммаОборот) КАК СуммаОборотНаНачало,
МАКСИМУМ(ОстаткиНаНачало.СуммаОстатокНаНачало) КАК СуммаОстатокНаНачало,
ОстаткиНаНачало.Месяц,
ОстаткиНаНачало.Контрагент,
ОстаткиНаНачало.ДоговорКонтрагента
ПОМЕСТИТЬ РасчетОстатковНаНачало
ИЗ
ОстаткиНаНачало КАК ОстаткиНаНачало
ЛЕВОЕ СОЕДИНЕНИЕ ОборотыЗаПериод КАК ОборотыЗаПериодНаНачало
ПО ОстаткиНаНачало.Организация = ОборотыЗаПериодНаНачало.Организация
И (ОборотыЗаПериодНаНачало.Месяц МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНач, МЕСЯЦ) И ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ОстаткиНаНачало.Месяц, МЕСЯЦ), СЕКУНДА, -1))
И ОстаткиНаНачало.Контрагент = ОборотыЗаПериодНаНачало.Контрагент
И ОстаткиНаНачало.ДоговорКонтрагента = ОборотыЗаПериодНаНачало.ДоговорКонтрагента
СГРУППИРОВАТЬ ПО
ОстаткиНаНачало.Организация,
ОстаткиНаНачало.Месяц,
ОстаткиНаНачало.Контрагент,
ОстаткиНаНачало.ДоговорКонтрагента
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиНаНачало.Организация,
МАКСИМУМ(ОстаткиНаНачало.СуммаОстатокНаНачало) КАК СуммаОстатокНаНачало,
ОстаткиНаНачало.Месяц,
СУММА(ОборотыЗаПериодНаКонец.СуммаОборот) КАК СуммаОборотНаКонец,
ОстаткиНаНачало.Контрагент,
ОстаткиНаНачало.ДоговорКонтрагента
ПОМЕСТИТЬ РасчетОстатковНаКонец
ИЗ
ОстаткиНаНачало КАК ОстаткиНаНачало
ЛЕВОЕ СОЕДИНЕНИЕ ОборотыЗаПериод КАК ОборотыЗаПериодНаКонец
ПО ОстаткиНаНачало.Организация = ОборотыЗаПериодНаКонец.Организация
И (ОборотыЗаПериодНаКонец.Месяц МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНач, МЕСЯЦ) И КОНЕЦПЕРИОДА(ОстаткиНаНачало.Месяц, МЕСЯЦ))
И ОстаткиНаНачало.Контрагент = ОборотыЗаПериодНаКонец.Контрагент
И ОстаткиНаНачало.ДоговорКонтрагента = ОборотыЗаПериодНаКонец.ДоговорКонтрагента
СГРУППИРОВАТЬ ПО
ОстаткиНаНачало.Организация,
ОстаткиНаНачало.Месяц,
ОстаткиНаНачало.Контрагент,
ОстаткиНаНачало.ДоговорКонтрагента
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РасчетОстатковНаНачало.Организация КАК Организация,
РасчетОстатковНаНачало.Месяц КАК Месяц,
РасчетОстатковНаНачало.СуммаОстатокНаНачало + ЕСТЬNULL(РасчетОстатковНаНачало.СуммаОборотНаНачало, 0) КАК ОстатокНаНачало,
NULL КАК ОстатокНаКонец,
РасчетОстатковНаНачало.Контрагент КАК Контрагент,
РасчетОстатковНаНачало.ДоговорКонтрагента КАК ДоговорКонтрагента
ПОМЕСТИТЬ ОбщиеОстатки
ИЗ
РасчетОстатковНаНачало КАК РасчетОстатковНаНачало
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РасчетОстатковНаКонец.Организация,
РасчетОстатковНаКонец.Месяц,
NULL,
РасчетОстатковНаКонец.СуммаОстатокНаНачало + ЕСТЬNULL(РасчетОстатковНаКонец.СуммаОборотНаКонец, 0),
РасчетОстатковНаКонец.Контрагент,
РасчетОстатковНаКонец.ДоговорКонтрагента
ИЗ
РасчетОстатковНаКонец КАК РасчетОстатковНаКонец
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОбщиеОстатки.Организация КАК Организация,
ОбщиеОстатки.Месяц КАК Месяц,
СУММА(ОбщиеОстатки.ОстатокНаНачало) КАК ОстатокНаНачало,
СУММА(ОбщиеОстатки.ОстатокНаКонец) КАК ОстатокНаКонец,
ОбщиеОстатки.Контрагент КАК Контрагент,
ОбщиеОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
ОбщиеОстатки КАК ОбщиеОстатки
СГРУППИРОВАТЬ ПО
ОбщиеОстатки.Организация,
ОбщиеОстатки.Месяц,
ОбщиеОстатки.Контрагент,
ОбщиеОстатки.ДоговорКонтрагента
УПОРЯДОЧИТЬ ПО
Организация,
Контрагент,
ДоговорКонтрагента,
Месяц
```
Разберем приведенный запрос по пакетам:
1. КалендарьЗдесь мы используя регистр РегламентированныйПроизводственныйКалендарь получаем все нужные нам периоды.
2. ОстаткиНаНачалоПолучаем остатки на начало выбранного периода, а так же если остатков не было, а обороты за весь период были, добавляем нулевые остатки.
3. ОборотыЗаПериодПолучаем обороты за весь период с разбивкой по месяцам.
4. РасчетОстатковНаНачалоСводим в одну таблицу начальный остаток и обороты за каждый месяц для расчета начальных остатков по периодам.
5. РасчетОстатковНаКонецСводим в одну таблицу начальный остаток и обороты за каждый месяц для расчета конечных остатков по периодам.
6. ОбщиеОстаткиРассчитываем начальные и конечные остатки по периодам путем прибавления оборотов.
以上是关于markdown Остаткисразбивкойпопериодамвзапросе1С的主要内容,如果未能解决你的问题,请参考以下文章
markdown Поискобъектовполюбымреквизитам(БСП)
markdown Настройкабезопасностисервера
text КлассдляудобнойвыборкипользовательскихсвойстввБитриксиочисткаPROPERTY_ _VALUE
php Созданиелидаиотправкаutmметоквcrmbitrix24битрикс
php Созданиелидаиотправкаutmметоквcrmbitrix24битрикс
sql Выбратьвсеполявзаголовкеиописаниикоторыхестьрусскиебуквы