8.х Остатки по регистрам остатков помесячно

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Sert, 10 мар 2014.

  1. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    Нужно получить запросом остатки (по товарам, по взаиморасчётам...) помесячно. Т.е. остатки на конец каждого месяца в периоде.
    Подкиньте примерчик, кто делал такое. Стандартная вещь "РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, Месяц, ДвиженияИГраницыПериода, ДоговорКонтрагента.ВидДоговора = &ВидДоговораПокупатели) КАК ВзаиморасчетыСПокупателями" Возвращает таблицу в которой оказываются только те периоды, в которых были движения потрегистру.
  2. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    А что еще нужно? Если движений не было, то в регистре и записей не будет. Что именно хотите?
  3. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    если запрос в скд - пользуйтесь дополнением периодов, если программное использование - результат из виртуальной таблицы выгружаете во временную таблицу, а дальше - соединяете с таблицей периодов (можно параметром передать, можно сформировать запросом из регистра регламентированного производственного календаря), дополняя таблицу строками с конечными остатками предыдущего периода в качестве начальных и конечных для периодов, отсутствующих в виртуальной таблице.
  4. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    Ну вот когда не было движений, на выходе в этом периоде должен быть остаток (даже если ноль)
    Нужна таблица:
    ..............Январь/ февраль/ март
    Товар 1 - 10 /0 /0
    Товар 2 - 5 /5 /5
  5. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    Не СКД и формы обычные.
    Календари не хочется, не нужны эти излишества, а вот запросом бы получить и соединить, хорошо. Но ток вот примерчик и хочется.
  6. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Была тема уже. Щас найду.

    Вообщем не нашел ))))

    Вот пример запроса. Таблица дат в целом может формироваться любым способом.
    Код:
    // Данный запрос показывает возможность получения остатков на каждый день периода (хотя конкретно в этом запросе получаются остатки на даты из таблицы дат. Если нужно формировать
        // на каждый день, то следует сначала сформировать таблицу дат где будут все дни)
       
        Запрос = Новый Запрос;
        Запрос.Текст =
       
            // В первой виртуальной таблице получается таблица дат
            "ВЫБРАТЬ
            |    ПлатежиПоКредитуОстаткиИОбороты.Период,
            |    ПлатежиПоКредитуОстаткиИОбороты.КредитныйДоговор
            |ПОМЕСТИТЬ ВТТаблицаДат
            |ИЗ
            |    РегистрНакопления.ПлатежиПоКредиту.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , КредитныйДоговор = &ДоговорКонтрагента) КАК ПлатежиПоКредитуОстаткиИОбороты
            |
            |ОБЪЕДИНИТЬ ВСЕ
            |
            |ВЫБРАТЬ
            |    ДатыНачисленияПроцентов.Период,
            |    ДатыНачисленияПроцентов.КредитныйДоговор
            |ИЗ
            |    РегистрСведений.ДатыНачисленияПроцентов КАК ДатыНачисленияПроцентов
            |ГДЕ
            |    ДатыНачисленияПроцентов.Период МЕЖДУ &НачПериода И &КонПериода
            |    И ДатыНачисленияПроцентов.КредитныйДоговор = &ДоговорКонтрагента
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
           
            // Во второй таблице получаются остатки за необходимый период. При этом в ней будут только записи на дни движений в регистре. Периодичность регистра указывается как "День"
            |ВЫБРАТЬ
            |    ПлатежиПоКредитуОстаткиИОбороты.Период КАК Период,
            |    ПлатежиПоКредитуОстаткиИОбороты.КредитныйДоговор КАК КредитныйДоговор,
            |    ПлатежиПоКредитуОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток
            |ПОМЕСТИТЬ ВТОстатки
            |ИЗ
            |    РегистрНакопления.ПлатежиПоКредиту.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , КредитныйДоговор = &ДоговорКонтрагента) КАК ПлатежиПоКредитуОстаткиИОбороты
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
           
            // В третьей виртуальной таблице выбираются даты из таблицы дат и при помощи левого соединения к ней присоединяются данные остатков, при этом указывается, что
            // поля связи НЕ равны друг другу, а период таблицы дат МЕНЬШЕ ИЛИ РАВЕН периоду из таблицы остатков. Далее происходит группировка по датам таблицы дат, а периоды остатков
            // сворачиваются функцией МИНИМУМ (можно делать условие, когда период таблицы дат БОЛЬШЕ ИЛИ РАВЕН периоду таблицы остатков, но тогда агрегатную функцию нужно будет)
            // будет брать МАКСИМУМ. В результате данная таблица хранит связь периода таблицы дат и актуальную дату остатков в регистре остатков.
            |ВЫБРАТЬ
            |    МИНИМУМ(ВТОстатки.Период) КАК Период,
            |    ВТТаблицаДат.Период КАК Дата
            |ПОМЕСТИТЬ ВТВложенныйЗапрос
            |ИЗ
            |    ВТТаблицаДат КАК ВТТаблицаДат
            |        ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
            |        ПО ВТТаблицаДат.Период <= ВТОстатки.Период
            |
            |СГРУППИРОВАТЬ ПО
            |    ВТТаблицаДат.Период
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
           
            // В четвертой витруальной таблице просиходит левое соединение таблицы со связкой периодов (в которой есть дата и период регистра) по полю Период, при этом периоды равны.
            // В итоге получается таблица в которой на каждую дату таблицы дат есть остаток.
            |ВЫБРАТЬ
            |    ВТВложенныйЗапрос.Дата КАК Дата,
            |    ВТОстатки.КредитныйДоговор,
            |    ЕСТЬNULL(ВТОстатки.СуммаНачальныйОстаток, 0) КАК НачальныйОстаток
            |ПОМЕСТИТЬ ВТОстаткиПоДням
            |ИЗ
            |    ВТВложенныйЗапрос КАК ВТВложенныйЗапрос
            |        ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
            |        ПО ВТВложенныйЗапрос.Период = ВТОстатки.Период
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
    Последнее редактирование: 11 мар 2014
  7. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    Мда... Не выходит...каменная чаша...

    Код:
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        Интервалы.НачалоИнтервала КАК Период
    ПОМЕСТИТЬ Периоды
    ИЗ
        &Интервалы КАК Интервалы
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Покупатели.Период,
        Покупатели.Организация,
        СУММА(Покупатели.ЗадолженностьПокупателя) КАК ЗадолженностьПокупателя,
        СУММА(Покупатели.АвансПокупателя) КАК АвансПокупателя,
        Покупатели.ДоговорКонтрагента,
        Покупатели.Сделка
    ПОМЕСТИТЬ ВзаиморасчетыПокупателей
    ИЗ
        Периоды КАК Периоды
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ВзаиморасчетыСПокупателями.Контрагент КАК Контрагент,
                ВзаиморасчетыСПокупателями.ДоговорКонтрагента КАК ДоговорКонтрагента,
                ВзаиморасчетыСПокупателями.Сделка КАК Сделка,
                ВзаиморасчетыСПокупателями.Организация КАК Организация,
                ВЫБОР
                    КОГДА ВзаиморасчетыСПокупателями.СуммаВзаиморасчетовКонечныйОстаток > 0
                        ТОГДА ВзаиморасчетыСПокупателями.СуммаВзаиморасчетовКонечныйОстаток
                    ИНАЧЕ 0
                КОНЕЦ КАК ЗадолженностьПокупателя,
                ВЫБОР
                    КОГДА ВзаиморасчетыСПокупателями.СуммаВзаиморасчетовКонечныйОстаток < 0
                        ТОГДА -ВзаиморасчетыСПокупателями.СуммаВзаиморасчетовКонечныйОстаток
                    ИНАЧЕ 0
                КОНЕЦ КАК АвансПокупателя,
                ВзаиморасчетыСПокупателями.Период КАК Период
            ИЗ
                РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, Месяц, ДвиженияИГраницыПериода, ДоговорКонтрагента.ВидДоговора = &ВидДоговораПокупатели) КАК ВзаиморасчетыСПокупателями) КАК Покупатели
            ПО Периоды.Период = Покупатели.Период
    
    СГРУППИРОВАТЬ ПО
        Покупатели.Период,
        Покупатели.Организация,
        Покупатели.ДоговорКонтрагента,
        Покупатели.Сделка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Поставщики.Период,
        Поставщики.Организация,
        СУММА(Поставщики.ЗадолженностьПоставщика) КАК ЗадолженностьПоставщика,
        СУММА(Поставщики.АвансПоставщика) КАК АвансПоставщика,
        Поставщики.ДоговорКонтрагента,
        Поставщики.Сделка
    ПОМЕСТИТЬ ВзаиморасчетыПоставщиков
    ИЗ
        Периоды КАК Периоды
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ВзаиморасчетыСПоставщиками.Организация КАК Организация,
                ВзаиморасчетыСПоставщиками.Контрагент КАК Контрагент,
                ВзаиморасчетыСПоставщиками.ДоговорКонтрагента КАК ДоговорКонтрагента,
                ВзаиморасчетыСПоставщиками.Сделка КАК Сделка,
                ВзаиморасчетыСПоставщиками.Период КАК Период,
                ВЫБОР
                    КОГДА ВзаиморасчетыСПоставщиками.СуммаВзаиморасчетовКонечныйОстаток > 0
                        ТОГДА ВзаиморасчетыСПоставщиками.СуммаВзаиморасчетовКонечныйОстаток
                    ИНАЧЕ 0
                КОНЕЦ КАК ЗадолженностьПоставщика,
                ВЫБОР
                    КОГДА ВзаиморасчетыСПоставщиками.СуммаВзаиморасчетовКонечныйОстаток < 0
                        ТОГДА -ВзаиморасчетыСПоставщиками.СуммаВзаиморасчетовКонечныйОстаток
                    ИНАЧЕ 0
                КОНЕЦ КАК АвансПоставщика
            ИЗ
                РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, Месяц, ДвиженияИГраницыПериода, ДоговорКонтрагента.ВидДоговора = &ВидДоговораПоставщики) КАК ВзаиморасчетыСПоставщиками) КАК Поставщики
            ПО Периоды.Период = Поставщики.Период
    
    СГРУППИРОВАТЬ ПО
        Поставщики.Период,
        Поставщики.Организация,
        Поставщики.ДоговорКонтрагента,
        Поставщики.Сделка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЕСТЬNULL(ВзаиморасчетыПокупателей.Период, ВзаиморасчетыПоставщиков.Период) КАК ПериодОстатка,
        ЕСТЬNULL(ВзаиморасчетыПокупателей.Организация, ВзаиморасчетыПоставщиков.Организация) КАК Организация,
        ЕСТЬNULL(ВзаиморасчетыПокупателей.ДоговорКонтрагента, 0) КАК ДоговорКонтрагента,
        ЕСТЬNULL(ВзаиморасчетыПокупателей.Сделка, 0) КАК Сделка,
        ЕСТЬNULL(ВзаиморасчетыПокупателей.ЗадолженностьПокупателя, 0) КАК ЗадолженностьПокупателя,
        ЕСТЬNULL(ВзаиморасчетыПокупателей.АвансПокупателя, 0) КАК АвансПокупателя,
        ЕСТЬNULL(ВзаиморасчетыПоставщиков.ЗадолженностьПоставщика, 0) КАК ЗадолженностьПоставщика,
        ЕСТЬNULL(ВзаиморасчетыПоставщиков.АвансПоставщика, 0) КАК АвансПоставщика
    ПОМЕСТИТЬ ВТ_Остатки
    ИЗ
        ВзаиморасчетыПокупателей КАК ВзаиморасчетыПокупателей
            ПОЛНОЕ СОЕДИНЕНИЕ ВзаиморасчетыПоставщиков КАК ВзаиморасчетыПоставщиков
            ПО ВзаиморасчетыПокупателей.Организация = ВзаиморасчетыПоставщиков.Организация
                И ВзаиморасчетыПокупателей.Период = ВзаиморасчетыПоставщиков.Период
                И ВзаиморасчетыПокупателей.ДоговорКонтрагента = ВзаиморасчетыПоставщиков.ДоговорКонтрагента
                И ВзаиморасчетыПокупателей.Сделка = ВзаиморасчетыПоставщиков.Сделка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        МИНИМУМ(ВТ_Остатки.ПериодОстатка) КАК Период,
        Интервалы.Период КАК Дата
    ПОМЕСТИТЬ ВТВложенныйЗапрос
    ИЗ
        Периоды КАК Интервалы
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
            ПО Интервалы.Период <= ВТ_Остатки.ПериодОстатка
    
    СГРУППИРОВАТЬ ПО
        Интервалы.Период
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТВложенныйЗапрос.Дата КАК ПериодОстатка,
        ВТ_Остатки.Организация КАК Организация,
        ВТ_Остатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
        ВТ_Остатки.Сделка КАК Сделка,
        ЕСТЬNULL(ВТ_Остатки.АвансПокупателя, 0) КАК АвансПокупателя,
        ЕСТЬNULL(ВТ_Остатки.ЗадолженностьПокупателя, 0) КАК ЗадолженностьПокупателя,
        ЕСТЬNULL(ВТ_Остатки.АвансПоставщика, 0) КАК АвансПоставщика,
        ЕСТЬNULL(ВТ_Остатки.ЗадолженностьПоставщика, 0) КАК ЗадолженностьПоставщика
    ИЗ
        ВТВложенныйЗапрос КАК ВТВложенныйЗапрос
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
            ПО ВТВложенныйЗапрос.Период = ВТ_Остатки.ПериодОстатка
    
    УПОРЯДОЧИТЬ ПО
        ВТВложенныйЗапрос.Дата,
        Организация,
        ДоговорКонтрагента,
        Сделка
    ИТОГИ
        СУММА(АвансПокупателя),
        СУММА(ЗадолженностьПокупателя),
        СУММА(АвансПоставщика),
        СУММА(ЗадолженностьПоставщика)
    ПО
        ПериодОстатка,
        Организация,
        ДоговорКонтрагента,
        Сделка
    Делаю за три месяца, по одной из организаций во втором месяце нет никаких движений, и упорно пропускается, я уже каких вариантов запросов ток не перепробовал. Таблица интервалов - это таблица значений с колонкой "НачалоИнтервала" куда вбиты соответствующие даты вида "01.02.2013 00.00.00" (состав таблицы проверял, всё верно)
    Подскажите чё тут неправильно. Написано для КА 1.1. Нужно вообще в одном отчёте ввиде колонок помесячно конечные остатки по взаиморасчётам. Выводить в разрезе организаций, но не сворачивать остатки. В общем сальдо развернутое по сделкам, чтоб видно было какая сумма висит в авансах, а какая задолженности (отдельно по покупателям и поставщикам).
    --- Объединение сообщений, 13 мар 2014 ---
    Уже скоро отчаюсь, и сделаю по циклу запросы на каждый интервал, с выгрузкой в ТЗ, а потом запрос к ним. (ну как-то так).
    Но ведь должно как-то по человечески это делаться.
    Последнее редактирование: 13 мар 2014
  8. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    если нет движений, то хоть упрыгайтесь не получите данных.
  9. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    А надо :)
    Походу всётаки придётся делать запросы по количеству периодов... :(
  10. jonsony
    Offline

    jonsony Опытный в 1С Заблокирован

    Регистрация:
    16 апр 2009
    Сообщения:
    224
    Симпатии:
    25
    Баллы:
    29
    смотрите в чём различие между регистром остатков и регистром оборотов
    в оборотном нет остатков
  11. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    А эт к чему? Регистр ВзаиморасчетыСПокупателями - это остатки, но запрос выдаёт остатки только в те периоды, когда был оборот. А те периоды, где оборота не было в запрос не попадает.
  12. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Честно скажу, Ваш запрос внимательно не просматривал, но то, что получить то, получить остатки на каждую имеющуюся дату можно - это 100%. Тот запрос, что я привел - часть живого запроса работающего в данный момент в базе. Успешно все получает. Внимательно все проверьте.
  13. TopicStarter Overlay
    Sert
    Offline

    Sert Опытный в 1С

    Регистрация:
    4 фев 2011
    Сообщения:
    365
    Симпатии:
    12
    Баллы:
    29
    Да вроде всё так же. Только таблица дат у меня из ТЗ подгружается... Или я чего-то не понимаю... Нужна помощь :oops:
  14. Thelearning
    Offline

    Thelearning Профессионал в 1С Команда форума

    Регистрация:
    9 сен 2010
    Сообщения:
    701
    Симпатии:
    72
    Баллы:
    54
    Неверный запрос вообщем ))))))
    1. Получите таблицу дат на которые Вам нужно получать остатки (как я понял это первое число каждого месяца)
    2. Получите из таблицы остатков и оборотов регистра период, поле для связи (договор контрагента), Сумму начального остатка. Периодичность укажите ту, которая Вам нужна (месяц)
    3. Самое интересное. Тут нужно связать таблицу дат и таблицу регистра. Связь будет левым соединением, в котором к таблице дат присоединяется таблица регистра по полю период, НО связь не "=", а "<=", и группируете результат по периоду таблицы дат с функцией МИНИМУМ для периода таблицы остатков (см. пример выше)
    4. Все. Теперь у Вас есть таблица с датами, которые соответствуют Вашим датам. Делаете связь таблицы 3 и таблицы где получали остатки по полю период (только период тут уже будет не Ваш, а тот, что в таблице 3).

    Как-то так. Если не понятно написал - пишите )))))))
  15. jonsony
    Offline

    jonsony Опытный в 1С Заблокирован

    Регистрация:
    16 апр 2009
    Сообщения:
    224
    Симпатии:
    25
    Баллы:
    29
  16. SvetaS_Love
    Offline

    SvetaS_Love

    Регистрация:
    26 фев 2016
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1

Поделиться этой страницей