Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Быстрой способ получения долга контрагента

Я
   zenon46
 
23.08.18 - 13:03
Доброго дня!
Подскажите пожалуйста, какой самый быстрый способ (программный), получить долг контрагента, дело в том что нужно выводить эту информацию на печатной форме, да еще в разных местах, пытаюсь выяснить каков способ/алгоритм будет наиболее эффективный?
База 7.7 комплексная.
 
 
   abibas
 
1 - 23.08.18 - 13:14
Самый простой и довольно быстрый - использовать функцию глобального модуля глТекущийДолг(Фирма, Договор, Роль). Самый быстрый - прямой запрос.
   zenon46
 
2 - 23.08.18 - 13:31
(1) глТекущийДолг - тут засада в том что с контрагентом может быть огромное количество договоров, придется в цикле их все перебирать.
   DexterMorgan
 
3 - 23.08.18 - 13:34
"Быстрой способ получения долга контрагента"

Имхо, лучше пистолета ничего не придумали
   zenon46
 
4 - 23.08.18 - 13:36
(3) ))))) как вариант
   Масянька
 
5 - 23.08.18 - 13:40
(2) В таком варианте:

Функция глТекущийДолг(Фирма, Договор, Роль) Экспорт
    Перем Рез;
    
    Если (ПустоеЗначение(Фирма)  =1) или
         (ПустоеЗначение(Договор)=1) Тогда
        Рез = 0;
    Иначе
        
        Если нРег(Роль) = "поставщик" Тогда
            РабРег = Регистр.Поставщики;
            Рез    = РабРег.СводныйОстаток(Фирма, Договор, , , "СуммаВал");  
            
        ИначеЕсли нРег(Роль) = "покупатель" Тогда
            РабРег = Регистр.Покупатели;                                      
            Рез    = РабРег.СводныйОстаток(Фирма, , , , ,"СуммаВал");
            //Рез    = РабРег.СводныйОстаток(Фирма, Договор, , , ,"СуммаВал");

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

КонецФункции// глТекущийДолг()



выводит общий долг.
   zenon46
 
6 - 23.08.18 - 14:38
(5) а как в таком варианте определить контрагента ?
   Базис
 
7 - 23.08.18 - 14:54
(6) По договору. И вообще, открой почти любой документ в пользовательском режиме, увидишь рядом с полем "Контрагент" кнопку вывода текущего долга.
   zenon46
 
8 - 23.08.18 - 14:59
(7) в том и дело, долг скопом получить по ВСЕМ договорам сразу, возможно ли такое? Без перебора договоров в цикле.
   Базис
 
9 - 23.08.18 - 15:08
Блин! Ну посмотри же ты структуру данных, если там в разрезе договоров - то нет, только суммировать по всем. А уж кто будет суммировать - готовый код, твой запрос или Маринка - выбор за тобой.
   zenon46
 
10 - 23.08.18 - 15:09
(9) в регистрах только в разрезе договоров. Вопрос в том и состоял найти самый быстрый способ.
 
 Рекламное место пустует
   zenon46
 
11 - 23.08.18 - 15:10
(5) а в (5) закоментили строку, кинули строку с убранным договором, так будет только по всем контрагентам скопом.
   Aleksey
 
12 - 23.08.18 - 16:15
(8) Получи список договоров запросом, раз не нравиться перебор в цикле
   Glup0sti
 
13 - 23.08.18 - 16:20
утюг..., но правда не программный
   unregistered
 
14 - 23.08.18 - 16:22
ОФФ.

(0) > Быстрой способ получения долга контрагента

Быта, утюг и паяльник.
Иногда легче переуступить право долга пацанам, которые в совершенстве владеют этими инструментами.
   zenon46
 
15 - 23.08.18 - 17:00
А вот этот запрос можно как то ускорить? Суть его в том что бы получить все НЕПРОВЕДЕННЫЕ документы за период. Может кто подскажет как его на прямой переписать, и будет ли в этом толк.
        Запрос = СоздатьОбъект("Запрос");
        ТекстЗапроса = "
        |Период с НачДата по КонДата;
        |ОбрабатыватьДокументы Непроведенные;
        |ТекДок                        = Документ.Реализация.ТекущийДокумент;
        |ФирмаЗ                       = Документ.Реализация.ТекущийДокумент.Фирма;
        |Контр                         = Документ.Реализация.ТекущийДокумент.Контрагент;
        |СумОтгруз                    = Документ.Реализация.ТекущийДокумент.СуммаВзаиморасчетов;
        |Группировка ТекДок;
        |Условие (ТекДок.ПометкаУдаления() = 0);
        |Условие (ФирмаЗ = Фирма);
        |Условие (Контр = Контрагент);
        |";
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Возврат(0);
        КонецЕсли;
   Карст
 
16 - 23.08.18 - 17:08
ахренеть , долг по документам Оо
   Карст
 
17 - 23.08.18 - 17:08
блин аж напугал ))))
   Базис
 
18 - 23.08.18 - 17:20
(17) И нормально работало. Ну, если первичка вносилась своевременно, а порядок закрытия по ФИФО. Взяли сумму долг  а из регистра и пошли складывать-вычитать с конца.
   Масянька
 
19 - 23.08.18 - 17:34
Если в регистре, где ведутся взаиморасчеты, нет контрагента и ведете по договорам - не просто.
Как вариант, смотреть по счету - не знаю, есть в комплексной план счетов и регистр бухгалтерии.
   zenon46
 
20 - 23.08.18 - 19:58
(16) ты не понял, долг по регистрам, а это что бы прибавить непроведенные документы (есть нюансы в учете, документы проводятся в конце месяца, ибо в конфигурации реализована работа схема агент-принципал).
   Kigo_Kigo
 
21 - 23.08.18 - 20:30
не я все понимаю, но суммировать движение регистра взаиморасчетов с не проведенными документами- тот еще гемор, договора запихнуть в список значений и по нему делать запрос, проблем ноль
   Злопчинский
 
Ведущий
22 - 23.08.18 - 20:48
//Здесь сформировать выборкой СЗ с договорами контрагента, СЗдоговор

Рег.УстановитьЗначениеФильтра("Договор",СЗдоговор,2);
Рег.СводныйОстаток(Фирма,,,,"Сумма");//количество неуказанных измерений по зпт


По идее - должно работать... Договор с водном остатке не задаем, типа получаем ПО ВСЕМ ДОГОВОРАМ вообще всех контрагентов.. но тут - чебурашечный - финт список договоров ограничиваем !фильтром!

Но сам я такую конструкцию не применял, так что надо потестить, тест простейший
   Злопчинский
 
Ведущий
23 - 23.08.18 - 20:52
Ставлю процентов 80, что проканает
   Злопчинский
 
Ведущий
24 - 23.08.18 - 21:09
.. потестил.. хрен нам.. не работает такой финт.. пичалька...
   NSSerg
 
25 - 23.08.18 - 22:30
(22)
рег.УстановитьЗначениеФильтра(  
рег.ВыгрузитьИтоги(ТабИтогов
ТабИтогов.Итог(
   NSSerg
 
26 - 23.08.18 - 22:46
//*******************************************

Процедура Сформировать()    
    СЗДоговор=создатьобъект("СписокЗначений");
    Запрос=создатьобъект("Запрос");
    ТекстЗапроса="обрабатывать все;
    |дог=справочник.договоры.текущийэлемент;
    |контр=справочник.Договоры.владелец;
    |Условие (контр=Контрагент);
    |группировка дог без групп;";
    Запрос.Выполнить(ТекстЗапроса);    
    ТЗ=создатьОбъект("ТаблицаЗначений");
    Запрос.выгрузить(ТЗ,0,0);  
    ТЗ.выгрузить(СЗДоговор,,,"дог"); 
    ОбщРег = СоздатьОбъект("Регистры");
    Рег = ОбщРег.Покупатели;   
    Рег.УстановитьЗначениеФильтра("Договор",СЗдоговор,2);
    ВремТабл=создатьобъект("ТаблицаЗначений");
    Рег.ВыгрузитьИтоги(ВремТабл,1,1);
    Долг = ВремТабл.Итог("СуммаРуб");
    сообщить(Долг);
КонецПроцедуры
   Попытка1С
 
27 - 23.08.18 - 22:48
(0) подключи класс прямойзапрос.

у меня выводится прямым, в УПД.
   NSSerg
 
28 - 23.08.18 - 22:53
Но запрос должен быть быстрее
Вряд ли у тебя база больше чем у меня.
По контрагенту с несколькими сотнями договоров.
//*******************************************

Процедура Сформировать()    
    Запрос=создатьобъект("Запрос");   
    ТекстЗапроса="
    |контр=регистр.покупатели.Договор.Владелец;
    |сумруб=регистр.Покупатели.СуммаРуб;
    |Условие (контр=Контрагент);
    |Функция Долг=Коност(сумруб);";
    Запрос.Выполнить(ТекстЗапроса);    
    сообщить(Запрос.Долг);
КонецПроцедуры
У меня выполняется 0,5 секунды
   NSSerg
 
29 - 23.08.18 - 22:55
Только у меня на измерении договор стоит галочка "отбор итогов" - индекс.
И в покупатели, и в поставщики.
   zenon46
 
30 - 24.08.18 - 09:24
(28) база 40 гигов, только в запросе получим долг по "покупателю", а где гарантии что нет его в "поставщиках", думаю еще туда надо включить регистр поставщики.
   NSSerg
 
31 - 25.08.18 - 02:22
(30) Так включи, хотя ИМХО это не совсем верно.
главное, чтоб быстро работало - (29) - отбор итогов по договору.
   Cthulhu
 
32 - 25.08.18 - 11:30
Переписать (5) с возможностью пустых дефолтов (кроме, ясенпень, контрагента) - с их анализом и получением сводных значений по не указанным в параметре отборам. и получать по контрагенту сводный если надо.
прим.: только для скорости нужно иметь ввиду тот факт, что индекс регистра строится в порядке следования измерений, и если в вызове сводного остатка есть пропуск фильтров измерений (пустые значения а после них непустые) - вычисление сводного остатка сильно замедляется (т.к. вываливается в перебор а не по индексу), и для таких случаев может оказаться, что тупой перебор+подсуммировка по сводным остаткам по всем возможным значениям "пропущенного" измерения будет работать гораздо быстрее, чем разовое вычисление сводного остатка с таким пропуском (т.к. будут не перебором а по индексам).
   AliAksA
 
33 - 30.08.18 - 14:35
ну может не так понял, но это шуршит за милую душу:

Перем БухИтоги;

Процедура ПриОткрытии()
    БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги");
    БухИтоги.ПериодМ(ТекущаяДата());
КонецПроцедуры

Функция ТекущийДолг(перКонтрагент)
    Если ПустоеЗначение(перКонтрагент) = 0 Тогда
        Если перКонтрагент.ЭтоГруппа() = 0 Тогда
            Возврат Формат(БухИтоги.СКД(СчетПоКоду("62"), "С" , , перКонтрагент), "Ч018.2.'");
        КонецЕсли;
    КонецЕсли;
    Возврат "";
КонецФункции
 
 



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует