Имя: Пароль:
1C
1С v8
Остатки регистра бухгалтерии на каждый день
,
0 MistaEr
 
18.11.13
11:47
Нужно получить остатки на каждый день из регистра бухгалтерии. В самом запросе для дальнейшей обработки в запросе. Порядки обхода По периодам и СКД не подойдет. Накидал такой запрос, но он показывает только когда были движения.

ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК День
ПОМЕСТИТЬ Календарь
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачДата И &КонДата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Период,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт
ИЗ
    Календарь КАК Календарь
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, День, ДвиженияИГраницыПериода, Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
        ПО Календарь.День = ХозрасчетныйОстаткиИОбороты.Период
1 MistaEr
 
18.11.13
11:56
обновим
2 WildSery
 
18.11.13
12:09
МАКСИМУМ(СуммаНачальныйОстатокКт) + СУММА(СуммаОборотКт) КАК СуммаНачальныйОстатокКт_НаДату
...
ПО Календарь.День >= ХозрасчетныйОстаткиИОбороты.Период
СГРУППИРОВАТЬ ПО ...
3 Maxus43
 
18.11.13
12:11
ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, День, ДвиженияИГраницыПериода, Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
        ПО Календарь.День = началоПериода(ХозрасчетныйОстаткиИОбороты.Период, День)
4 Maxus43
 
18.11.13
12:12
ну тут конечно вопрос что быстрей, полное или Левое, надо смотреть
5 Maxus43
 
18.11.13
12:12
ВЫБРАТЬ
    //ХозрасчетныйОстаткиИОбороты.Период,
    Календарь.День,
6 MistaEr
 
18.11.13
12:36
(3) он показывает только те дни, где были движения, (2) так я уже делал, он показывает несколько строк по одной дате
7 WildSery
 
18.11.13
13:00
(6) Он и должен показывать несколько строк по одной дате, поскольку Субконто1 и Субконто2 могут быть разными.
(4) При чём тут скорость, если вы не придумали, как остаток за этот день выводить?
8 MistaEr
 
18.11.13
13:13
(7)Нет я пока отбираю только по одному значению субконто. Сколько было движений до этой даты - все выводит, с разными суммами.
9 Maxus43
 
18.11.13
13:15
всё придумано за меня
http://1c-wiki.ru/wiki/Ежедневные_остатки
http://kb.mista.ru/article.php?id=579&;
10 MistaEr
 
18.11.13
13:16
(2) Почему МАКСИМУМ. движения могут быть как по Дт так и по Кь, и сальдо не только увеличивается, но может и уменьшаться.
11 Maxus43
 
18.11.13
13:16
(8) если нужны остатки - зачем используешь ОстаткиИОбороты? по русски же написано, используй Остатки
12 MistaEr
 
18.11.13
13:19
(11) в остатках нет Периода, (9) СКД не подойдет, говорю же дальше нужно обрабатывать в запросе.
13 Maxus43
 
18.11.13
13:24
(12) да, с остатками погорячился, пример нужного тебе запроса есть в http://kb.mista.ru/article.php?id=579&;
14 Maxus43
 
18.11.13
13:25
(13) + смотри там второй запрос, но вместо КурсыВалют используй производственный календарь
15 MistaEr
 
18.11.13
13:29
(14) да пробовал я так, точно так. выводит то же самое что и (2)
16 MistaEr
 
18.11.13
13:30
да и непрозрачно там все как то
17 Maxus43
 
18.11.13
13:38
(16) кто мешает потом сгруппировать по дате то?
18 MistaEr
 
18.11.13
13:45
вот смотри:
по факту:
01.10.13 - остаток 100
02.10.13 - остаток 100
03.10.13 - остаток 200
04.10.13 - остаток 500
05.10.13 - остаток 50

наш запрос выводит:
01.10.13 - остаток 100
02.10.13 - остаток 100
03.10.13 - остаток 200
03.10.13 - остаток 100
04.10.13 - остаток 300
04.10.13 - остаток 200
04.10.13 - остаток 100
05.10.13 - остаток 50
05.10.13 - остаток 300
05.10.13 - остаток 200
05.10.13 - остаток 100

что тут как группировать? ну должно же быть простое решение такой простой задачи
19 mistеr
 
18.11.13
14:01
(0) Общая идея такая. Сначала получаешь остатки на дни, когда были движения (с периодом День) и помещаешь в ВТ. А теперь представь, что ВТ это записи регистра сведений; И нужно получить срезы на каждый день. Аналогично курсу валюты на каждый день. Соединяем с календарем по Дата >= Период, группируем, берем ближайший период, соединяем еще раз с ВТ по этому периоду. Примеров таких запросов много в типовых.
20 Maxus43
 
18.11.13
14:07
(18) запрос из (13) не должен давать в таком виде... надо попробовать
21 WildSery
 
18.11.13
14:17
С максимумом я погорячился, это из другой задачи, где НачальныйОстаток всегда одинаков.

ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Период,
    ХозрасчетныйОстаткиИОбороты.Субконто1,
    ХозрасчетныйОстаткиИОбороты.Субконто2,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт
ПОМЕСТИТЬ ОстаткиИОбороты
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, День, ДвиженияИГраницыПериода, Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОстаткиИОбороты.Период,
    ОстаткиИОбороты.Субконто1,
    ОстаткиИОбороты.Субконто2,
    ОстаткиИОбороты.СуммаНачальныйОстатокКт
ИЗ
    ОстаткиИОбороты КАК ОстаткиИОбороты
ГДЕ
    ОстаткиИОбороты.Период = &НачДата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ОстаткиИОбороты.Период,
    ОстаткиИОбороты.Субконто1,
    ОстаткиИОбороты.Субконто2,
    СУММА(ОстаткиИОбороты.СуммаОборотКт)
ИЗ
    Календарь КАК Календарь
        ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиИОбороты КАК ОстаткиИОбороты
        ПО Календарь.День > ОстаткиИОбороты.Период

СГРУППИРОВАТЬ ПО
    ОстаткиИОбороты.Период,
    ОстаткиИОбороты.Субконто1,
    ОстаткиИОбороты.Субконто2
22 MistaEr
 
18.11.13
14:18
(19) вот я остановился как раз на (18), а как взять ближайший период, если на каждую дату календаря он берет все даты остатков которые меньше текущей календарной
23 Dmitry1c
 
18.11.13
14:18
Кажется, кто-то пишет отчет "Расчет сумм агентских вознаграждений"?
24 MistaEr
 
18.11.13
14:19
ага, задача похожая)) проценты по полученным кредитам нужно читать на каждый день
25 MistaEr
 
18.11.13
14:20
(24) + тут задача немного другая
26 Dmitry1c
 
18.11.13
14:21
(24) я так её и не решил. Сдал другим разом, другой отчет в билете был...
27 MistaEr
 
18.11.13
14:22
а я оба раза провалил и вообще забил на этот экзамен((
28 MistaEr
 
18.11.13
14:32
(21) нет не то, попробуй сам запусти
29 Hmster
 
18.11.13
14:33
Это если тебе для одного договора надо

ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК День
ПОМЕСТИТЬ Календарь
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачДата И &КонДата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Период,
    ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток, 0) КАК Остаток
ИЗ
    Календарь КАК Календарь
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
                &НачДата,
                &КонДата,
                День,
                ,
                Счет = &Счет,
                ,
                Организация = &Организация
                    И Субконто1 = &Контрагент
                    И Субконто2 = &Договор) КАК ХозрасчетныйОстаткиИОбороты
        ПО Календарь.День = ХозрасчетныйОстаткиИОбороты.Период
30 Холодильник
 
18.11.13
14:34
Обороты бери.
31 Hmster
 
18.11.13
14:36
ХозрасчетныйОстаткиИОбороты.Период на Календарь.День заменить надо
32 Hmster
 
18.11.13
14:39
а вот примерно так можно получить по списку контрагентов/договоров хоть и через одно место.

ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК День
ПОМЕСТИТЬ Календарь
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачДата И &КонДата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДоговорыКонтрагентов.Владелец КАК Контрагент,
    ДоговорыКонтрагентов.Ссылка КАК Договор
ПОМЕСТИТЬ ДоговорКонтрагента
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Календарь.День,
    ДоговорКонтрагента.Контрагент,
    ДоговорКонтрагента.Договор
ПОМЕСТИТЬ КалендарьДоговор
ИЗ
    Календарь КАК Календарь,
    ДоговорКонтрагента КАК ДоговорКонтрагента
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КалендарьДоговор.День,
    КалендарьДоговор.Контрагент,
    КалендарьДоговор.Договор,
    ЕСТЬNULL(ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток, 0) КАК Остаток
ИЗ
    КалендарьДоговор КАК КалендарьДоговор
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, День, , Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
        ПО КалендарьДоговор.День = ХозрасчетныйОстаткиИОбороты.Период
            И КалендарьДоговор.Контрагент = ХозрасчетныйОстаткиИОбороты.Субконто1
            И КалендарьДоговор.Договор = ХозрасчетныйОстаткиИОбороты.Субконто2
33 MistaEr
 
18.11.13
14:51
(32) все остатки показывает, так как по всем договорам, не только по определенному счету
34 Hmster
 
18.11.13
14:57
(33) и в чем проблема?
35 Hmster
 
18.11.13
15:01
в чем суть задачи? не получения данных а именно задачи?
36 WildSery
 
18.11.13
15:03
(33) У меня создаётся впечатление, что сам не понимаешь, что хочешь.
Если подойти строго к (18), то Субконто1 и Субконто2 совсем убери - и будет щасте.
37 MistaEr
 
18.11.13
15:24
(35) у меня должна получиться таблица

01.10.13 - Счет, Субконто1, Субконто1, Сальдо
02.10.13 - Счет, Субконто1, Субконто1, Сальдо
........
и т.д.
38 Hmster
 
18.11.13
15:27
(37) для чего тебе эта таблица.
огласи начальную задачу, иначе не совсем понятно что в конечном итоге надо получить.
может ты вообще не то делаешь.
39 Hmster
 
18.11.13
15:28
(37) запрос в (32) показывает то ты хочешь, но тебя это не устраивает по своим причинам, поэтому огласи задачу сначала и до конца.
40 MistaEr
 
18.11.13
15:32
мне нужно рассчитать процент кредитов на каждый день на счетах учета 66.01, 66.03 пока каждому контрагенту и договору
41 MistaEr
 
18.11.13
15:33
когда у меня получится такая таблица, я за день рассчитаю проценты, сгруппирую как нужно и все выгружу в табличную часть документа.
42 MistaEr
 
18.11.13
15:33
был бы отчет на СКД, легко можно было бы сделать давно
43 Hmster
 
18.11.13
15:35
(42) а в чем проблема получить коллекцию через скд ?
44 AugustBlack
 
18.11.13
15:35
(0) если я правильно понял, используй наращиваемый запрос. вот прим. только по месяцам, переделай по дням.
Функция СформироватьВТПоОстаткам(Запрос, НазваниеВТ,Тип = "СНД")
        
        Текст = ?(Тип = "СНД","Сальдо начальное ДТ","Сальдо конечное ДТ");
        
        Состояние("Формирование выборки остатков");
        ТекстЗапроса = "";    
        Для Каждого СтрокаМесяца Из ТаблицаМесяцев Цикл
            Ид = ТаблицаМесяцев.Индекс(СтрокаМесяца);
            Период = НачалоДня(СтрокаМесяца.Месяц);
            НазваниеПараметраПериод = "Период"+Ид+"_"+НазваниеВТ+"_"+Тип;
            Запрос.УстановитьПараметр(НазваниеПараметраПериод, Период);    
            Если ПустаяСтрока(ТекстЗапроса)  Тогда
                ТекстЗапроса =
                "ВЫБРАТЬ  
                |&"+НазваниеПараметраПериод+" КАК МесяцСписка,
                |"""+ Текст +""" КАК Документ,
                |ХозрасчетныйОстатки.Счет КАК Счет,
                |ХозрасчетныйОстатки.Субконто1 КАК Аналитика,
                |ХозрасчетныйОстатки.СуммаОстатокДт КАК Сумма
                |ПОМЕСТИТЬ " + НазваниеВТ
            Иначе
                ТекстЗапроса = ТекстЗапроса +
                " ОБЪЕДИНИТЬ ВСЕ
                |ВЫБРАТЬ
                |&"+НазваниеПараметраПериод+" КАК Период,
                |"""+ Текст +""",
                |ХозрасчетныйОстатки.Счет КАК Счет,
                |ХозрасчетныйОстатки.Субконто1 КАК Аналитика,
                |ХозрасчетныйОстатки.СуммаОстатокДт КАК Сумма";
            КонецЕсли;
            ТекстЗапроса = ТекстЗапроса +
            " ИЗ    
            |РегистрБухгалтерии.Хозрасчетный.Остатки("+?(Тип = "СКД","ДОБАВИТЬКДАТЕ(&"+НазваниеПараметраПериод+", МЕСЯЦ, 1)","&"+НазваниеПараметраПериод)+", Счет В ИЕРАРХИИ (&СписокСчетовОтчета),&ВидыСубконто, Организация = &Организация) КАК ХозрасчетныйОстатки"
            +
            ?(ЗначениеЗаполнено(Подразделение)," ГДЕ ХозрасчетныйОстатки.Подразделение В ИЕРАРХИИ(&Подразделение) " + Символы.ПС,Символы.ПС);    
        КонецЦикла;    
        
        Возврат ТекстЗапроса;
        
    КонецФункции
45 Hmster
 
18.11.13
15:39
в (32) поменяй


ВЫБРАТЬ
    ДоговорыКонтрагентов.Владелец КАК Контрагент,
    ДоговорыКонтрагентов.Ссылка КАК Договор
ПОМЕСТИТЬ ДоговорКонтрагента
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов


НА


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор
ПОМЕСТИТЬ ДоговорКонтрагента
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, , , Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
46 MistaEr
 
18.11.13
15:48
(44) да ненадо мне в цикле дни обрабатывать, тогда уж я количество дней посчитаю с одного оборота до следующего оборота.
47 MistaEr
 
18.11.13
16:04
(45) в дни без движений сальдо не показывает. Друзья Большое всем спасибо. Сам пока занят, а то получается вас задергал а сам не участвую. Что у меня получится, я напишу. Всем еще раз спасибо!!!
48 MistaEr
 
19.11.13
10:49
Все же пришлось сделать в цикле:
Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    |    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    |    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    |    ХозрасчетныйОстаткиИОбороты.Период КАК День,
    |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт + ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокКт
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, День, ДвиженияИГраницыПериода, Счет В (&СчетаКредитовИЗаймов), &ПорядокСубконто, Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
    |
    |УПОРЯДОЧИТЬ ПО
    |    Контрагент,
    |    Договор,
    |    Счет,
    |    День
    |ИТОГИ
    |    СУММА(СуммаКонечныйОстатокКт)
    |ПО
    |    Контрагент,
    |    Договор,
    |    Счет,
    |    День ПЕРИОДАМИ(ДЕНЬ, &НачДата, &КонДата)
    |АВТОУПОРЯДОЧИВАНИЕ";
    
    Запрос.УстановитьПараметр("НачДата", НачДата);
    Запрос.УстановитьПараметр("КонДата", КонДата);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("СчетаКредитовИЗаймов", СчетаКредитовИЗаймов);
    Запрос.УстановитьПараметр("ПорядокСубконто", ПорядокСубконто);
    
    Результат = Запрос.Выполнить();
    
    ВыборкаКонтрагент = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаКонтрагент.Следующий() Цикл
        
        ВыборкаДоговор = ВыборкаКонтрагент.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        Пока ВыборкаДоговор.Следующий() Цикл
            
            ВыборкаСчет = ВыборкаДоговор.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            
            Пока ВыборкаСчет.Следующий() Цикл
                
                ВыборкаДень = ВыборкаСчет.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "День", "ВСЕ");   //Проценты на каждый день
49 WildSery
 
19.11.13
17:16
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Договор,
    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    ХозрасчетныйОстаткиИОбороты.Период КАК День,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт + ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокКт
ПОМЕСТИТЬ ОстаткиОбороты
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, День, ДвиженияИГраницыПериода, Счет В (&СчетаКредитовИЗаймов), &ПорядокСубконто, Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОстаткиОбороты.Контрагент,
    ОстаткиОбороты.Договор,
    ОстаткиОбороты.Счет,
    ОстаткиОбороты.День,
    ОстаткиОбороты.СуммаКонечныйОстатокКт,
    ЕСТЬNULL(МИНИМУМ(ДОБАВИТЬКДАТЕ(ОстаткиОбороты1.День, ДЕНЬ, -1)), ОстаткиОбороты.День) КАК День1
ПОМЕСТИТЬ ОстаткиПериоды
ИЗ
    ОстаткиОбороты КАК ОстаткиОбороты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиОбороты КАК ОстаткиОбороты1
        ПО ОстаткиОбороты.Контрагент = ОстаткиОбороты1.Контрагент
            И ОстаткиОбороты.Договор = ОстаткиОбороты1.Договор
            И ОстаткиОбороты.Счет = ОстаткиОбороты1.Счет
            И ОстаткиОбороты.День < ОстаткиОбороты1.День

СГРУППИРОВАТЬ ПО
    ОстаткиОбороты.Контрагент,
    ОстаткиОбороты.Договор,
    ОстаткиОбороты.Счет,
    ОстаткиОбороты.День,
    ОстаткиОбороты.СуммаКонечныйОстатокКт
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Календарь.ДатаКалендаря КАК День,
    ОстаткиПериоды.Контрагент,
    ОстаткиПериоды.Договор,
    ОстаткиПериоды.Счет,
    ОстаткиПериоды.СуммаКонечныйОстатокКт
ИЗ
    ОстаткиПериоды КАК ОстаткиПериоды
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
        ПО (Календарь.ДатаКалендаря МЕЖДУ ОстаткиПериоды.День И ОстаткиПериоды.День1)
50 mistеr
 
19.11.13
22:45
(49) Наконец-то правильное решение
51 MistaEr
 
03.12.13
09:50
(49) Самое правильное решение. Спасибо!
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший