Имя: Пароль:
1C
1C 7.7
v7: Бухгалтерия 7.7 Конечное сальдо по заданным счету, контрагенту и договору?
0 Mikhail Volkov
 
05.02.19
18:04
Попросили в отчете добавить колонку с остатками. В каждой строке отчета есть контрагент и его договор. Сейчас остатки они смотрят по ОСВ по счету. Смотрел ОСВ, но ничего не понял: как получить Конечное сальдо по заданным счету, контрагенту и договору?
1 Джинн
 
05.02.19
18:11
Бухзапросом не предлагать?
2 azernot
 
05.02.19
18:11
Через бухгалтерские итоги! Ваш Кэп.
Лучше сразу, при построении отчёта через запрос к бухгалтерским итогам.
Но можно и через функции типа СКК()-СКД()
3 HawkEye
 
05.02.19
18:34
(0) а чем остатки в ОСВ не нравятся? не те цифры показывают? ))
4 Mikhail Volkov
 
05.02.19
18:46
(3) Нравятся, но хотят их видеть сразу в одном отчете "Реестр договор".
(2) А сам запрос как?
(1) Не знаю как...
5 DobrovVadym
 
05.02.19
19:03
(4)а если в ОСВ задать развертывание по договорам? Возможно их только сальдо конечное интересует, а в ОСВ попадают и те контрагенты и договора, у которых есть сальдо начальное и обороты?
6 DobrovVadym
 
05.02.19
19:05
Контрагент ведь и по 60, и по 62, и по 76 счету может быть. Их все вместе интересуют? Или раздельно? Или чтобы выбирать можно было?
7 zak555
 
05.02.19
19:49
В 7ке один договор может быть на нескольких счетах: 60,62,76
8 Mikhail Volkov
 
05.02.19
19:52
(6) Счета только 76 .К .1 и 76 .К .4 в зависимости от вида договора. В каждой строке отчета "Реестр договор" есть контрагент и его договор. Нужно добавить колонку Остаток. Нужна функция получения Конечного сальдо по заданным счету, контрагенту и договору. Как?
9 Looking
 
05.02.19
21:48
(8)счета не типовые, как называются? по какому критерию осуществляют деление по субсчетам? разделят по субсчетам, то скорее всего и сальдо нужно раздельное? иначе зачем делят по ним? счета активно-пассивные?

примерно в таком ключе
Ит = СоздатьОбъект("БухгалтерскиеИтоги");
Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,,1);
Ит.ИспользоватьСубконто(ВидыСубконто.Договоры,,1);
Ит.ВыполнитьЗапрос(НачДата, КонДата, СписокСчетов);
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
Ит.ВыбратьСубконто(1);
Пока Ит.ПолучитьСубконто(1)=1  Цикл
    Ит.ВыбратьСубконто(2);
Пока Ит.ПолучитьСубконто(2)=1  Цикл
СКД=Ит.СКД("С");
СКК=Ит.СКК("С");
КонецЦикла;
КонецЦикла;
КонецЦикла;
10 azernot
 
05.02.19
23:38
БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
    БухИт.Актуальность(1);
    БухИт.ПериодМ(ДатаРасчета);
    
    АвансВыданный = БухИт.СКД(СчетПоКоду("60.2"),,, ТекКонтрагент.ТекущийЭлемент(), ТекДоговор.ТекущийЭЛемент());
    Задолженность = БухИт.СКК(СчетПоКоду("60.1"),,, ТекКонтрагент.ТекущийЭлемент(), ТекДоговор.ТекущийЭЛемент());

и т.п.
11 Mikhail Volkov
 
06.02.19
07:17
(10) Ваш вариант более привлекателен в сравнении с (9):
//*******************************************
//+МВ 06.02.2018
Функция Остаток(Договор)
    
    Счет = ?(Договор.Вид = Перечисление.ПС_ВидыДоговоров.ДоговорВзноса,СчетПоКоду("76 .К .1"),СчетПоКоду("76 .К .4"));
    ТипСуммы  = ?(Договор.ВалютаДоговора.Код = "643",1,2);
    Субконто1 = Договор.Контрагент.ТекущийЭлемент();
    Субконто2 = Договор;
    
    БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
    БухИт.Актуальность(1);
    БухИт.ПериодМ(КонДата);
    
    Если ПустоеЗначение(Договор.ВалютаДоговора) = 1 Тогда
        ОстатокНач = БухИт.СКД(Счет,,, Субконто1, Субконто2);
        ОстатокКон = БухИт.СКК(Счет,,, Субконто1, Субконто2);
        Сообщить("Счет: "+Счет+", Субконто1: "+Субконто1+", Субконто2: "+Субконто2+", ОстатокКон = "+ОстатокКон+", КонДата = "+КонДата);
    Иначе
        ОстатокНач = БухИт.СКД(Счет,ТипСуммы,Договор.ВалютаДоговора, Субконто1, Субконто2);
        ОстатокКон = БухИт.СКК(Счет,ТипСуммы,Договор.ВалютаДоговора, Субконто1, Субконто2);
        Сообщить("Счет: "+Счет+", ТипСуммы: "+ТипСуммы+", Валюта: "+Договор.ВалютаДоговора+", Субконто1: "+Субконто1+", Субконто2: "+Субконто2+", ОстатокКон = "+ОстатокКон);
    КонецЕсли;
    Возврат ОстатокКон - ОстатокНач;
КонецФункции

//*******************************************

но результат нулевой:
Счет: 76.К.1, Субконто1: Погодина Е.Ю., Субконто2: Заключение договора 01276, ОстатокКон = 0, КонДата = 31.01.19
Счет: 76.К.1, Субконто1: Медведева Ю.Г., Субконто2: Заключение договора 01277, ОстатокКон = 0, КонДата = 31.01.19
Счет: 76.К.1, Субконто1: Сыркина Н.Г., Субконто2: Заключение договора 01278, ОстатокКон = 0, КонДата = 31.01.19
Счет: 76.К.1, Субконто1: Карягина Т.Н., Субконто2: Заключение договора 01279, ОстатокКон = 0, КонДата = 31.01.19

А по ОСВ он есть. Что-то упустил?
12 Mikhail Volkov
 
06.02.19
07:56
(9) 76 .К .1 - Личные сбережения, 76 .К .4 - Займы
Мне нужен Остаток в каждом конкретном случае по одному счету, одному Субконто1, одному Субконто2. Зачем циклы?
13 Looking
 
06.02.19
08:02
(12)"Мне нужен Остаток в каждом конкретном случае по одному счету, одному Субконто1, одному Субконто2. Зачем циклы?"

Вы собираетесь по каждому контрагенту запрос к базе делать? Не проще ли сделать 1 запрос по всем контрагентам и затем по его результатам сформировать список с остатками? У Вас сейчас список по справочнику заполняется? Раз в нем остатков нет? А в моем варианте список контрагентов появляется из запроса к остаткам, без обращения к справочнику.
14 Looking
 
06.02.19
08:10
Ит = СоздатьОбъект("БухгалтерскиеИтоги");
Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,,1);
Ит.ИспользоватьСубконто(ВидыСубконто.Договоры,,1);
Ит.ВыполнитьЗапрос(НачДата, КонДата, СписокСчетов);
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
Ит.ВыбратьСубконто(1);
Пока Ит.ПолучитьСубконто(1)=1  Цикл
    Ит.ВыбратьСубконто(2);
Пока Ит.ПолучитьСубконто(2)=1  Цикл

Контрагент=Ит.Субконто(1);
Договор=Ит.Субконто(2);

СКД=Ит.СКД("С");
СКК=Ит.СКК("С");
КонецЦикла;
КонецЦикла;
КонецЦикла;
15 Looking
 
06.02.19
08:10
+(14)добавил

Контрагент=Ит.Субконто(1);
Договор=Ит.Субконто(2);
16 Looking
 
06.02.19
08:11
+(15)то есть контрагент и договор берутся не из справочников, а из обращения к итогам
17 Looking
 
06.02.19
08:19
поправлюсь

Ит = СоздатьОбъект("БухгалтерскиеИтоги");
Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,,1);
Ит.ИспользоватьСубконто(ВидыСубконто.Договоры,,1);
Ит.ВыполнитьЗапрос(НачДата, КонДата, СписокСчетов);
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
Ит.ВыбратьСубконто(1);
Пока Ит.ПолучитьСубконто(1)=1  Цикл

Контрагент=Ит.Субконто(1);
СКДПоКонтрагенту=Ит.СКД("С");
СККПоКонтрагенту=Ит.СКК("С");
Таб.ВывестиСекцию("СтрокаКонтрагента");

Ит.ВыбратьСубконто(2);
Пока Ит.ПолучитьСубконто(2)=1  Цикл

Договор=Ит.Субконто(2);
СКДПоДоговору=Ит.СКД("С");
СККПоДоговору=Ит.СКК("С");
Таб.ВывестиСекцию("СтрокаДоговора");

КонецЦикла;
КонецЦикла;
КонецЦикла;
18 Mikhail Volkov
 
06.02.19
08:27
(13) Да, именно так, по каждому контрагенту и договору запрос к базе делать. Потому что мне нужен остаток для другого отчета (а не ОСВ).
19 Looking
 
06.02.19
08:31
(18)
Ит = СоздатьОбъект("БухгалтерскиеИтоги");
Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,Контрагент,2);
Ит.ИспользоватьСубконто(ВидыСубконто.Договоры,Договор,2);
Ит.ВыполнитьЗапрос(КонДата, КонДата, СписокСчетов);
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
СКДПоДоговору=Ит.СКД("С");
СККПоДоговору=Ит.СКК("С");
Таб.ВывестиСекцию("СтрокаДоговора");
КонецЦикла;
20 HawkEye
 
06.02.19
08:44
(18) если хочешь делать именно так, то запрос все равно надо делать один, а к конкретному контрагенту/договору обращаться через последний (третий) параметр в получитьСубконто()
21 Looking
 
06.02.19
08:49
(20)спасибо!
22 Pit0n_08
 
06.02.19
09:27
Тренироваться в кодинге - вещь хорошая, но почему бы просто не использовать стандартный отчет "Анализ субконто"?
23 Mikhail Volkov
 
06.02.19
09:45
(13) > У Вас сейчас список по справочнику заполняется? Раз в нем остатков нет?
Оказалось, что Договор не справочник, который поставляется в Субконто2, а Документ кредитного договора. Заменил в (11) на:

    Спр = СоздатьОбъект("Справочник.Договоры");
    Спр.ИспользоватьВладельца(Договор.Контрагент);
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.ТекущийЭлемент().ПС_Документ = Договор Тогда
            Субконто2 = Спр.ТекущийЭлемент();
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Спр = 0;

И все заработало! Спс.
24 HawkEye
 
06.02.19
09:49
(23) я так понимаю скорость работы отчета тебя не сильно волнует, да? ))
25 Mikhail Volkov
 
06.02.19
10:23
(24) Это 7-ка, в ней летает все!