|
v7: Быстрой способ получения долга контрагента | ☑ | ||
---|---|---|---|---|
0
zenon46
23.08.18
✎
13:03
|
Доброго дня!
Подскажите пожалуйста, какой самый быстрый способ (программный), получить долг контрагента, дело в том что нужно выводить эту информацию на печатной форме, да еще в разных местах, пытаюсь выяснить каков способ/алгоритм будет наиболее эффективный? База 7.7 комплексная. |
|||
1
abibas
23.08.18
✎
13:14
|
Самый простой и довольно быстрый - использовать функцию глобального модуля глТекущийДолг(Фирма, Договор, Роль). Самый быстрый - прямой запрос.
|
|||
2
zenon46
23.08.18
✎
13:31
|
(1) глТекущийДолг - тут засада в том что с контрагентом может быть огромное количество договоров, придется в цикле их все перебирать.
|
|||
3
DexterMorgan
23.08.18
✎
13:34
|
"Быстрой способ получения долга контрагента"
Имхо, лучше пистолета ничего не придумали |
|||
4
zenon46
23.08.18
✎
13:36
|
(3) ))))) как вариант
|
|||
5
Масянька
23.08.18
✎
13:40
|
(2) В таком варианте:
Функция глТекущийДолг(Фирма, Договор, Роль) Экспорт Перем Рез; Если (ПустоеЗначение(Фирма) =1) или (ПустоеЗначение(Договор)=1) Тогда Рез = 0; Иначе Если нРег(Роль) = "поставщик" Тогда РабРег = Регистр.Поставщики; Рез = РабРег.СводныйОстаток(Фирма, Договор, , , "СуммаВал"); ИначеЕсли нРег(Роль) = "покупатель" Тогда РабРег = Регистр.Покупатели; Рез = РабРег.СводныйОстаток(Фирма, , , , ,"СуммаВал"); //Рез = РабРег.СводныйОстаток(Фирма, Договор, , , ,"СуммаВал"); ИначеЕсли нРег(Роль) = "все" Тогда РабРег = Регистр.Поставщики; Рез = РабРег.СводныйОстаток(Фирма, Договор, , , "СуммаВал"); РабРег = Регистр.Покупатели; Рез = Рез + РабРег.СводныйОстаток(Фирма, Договор, , , ,"СуммаВал"); Иначе Рез = 0; КонецЕсли; КонецЕсли; Возврат Рез; КонецФункции // глТекущийДолг() выводит общий долг. |
|||
6
zenon46
23.08.18
✎
14:38
|
(5) а как в таком варианте определить контрагента ?
|
|||
7
Базис
naïve
23.08.18
✎
14:54
|
(6) По договору. И вообще, открой почти любой документ в пользовательском режиме, увидишь рядом с полем "Контрагент" кнопку вывода текущего долга.
|
|||
8
zenon46
23.08.18
✎
14:59
|
(7) в том и дело, долг скопом получить по ВСЕМ договорам сразу, возможно ли такое? Без перебора договоров в цикле.
|
|||
9
Базис
naïve
23.08.18
✎
15:08
|
Блин! Ну посмотри же ты структуру данных, если там в разрезе договоров - то нет, только суммировать по всем. А уж кто будет суммировать - готовый код, твой запрос или Маринка - выбор за тобой.
|
|||
10
zenon46
23.08.18
✎
15:09
|
(9) в регистрах только в разрезе договоров. Вопрос в том и состоял найти самый быстрый способ.
|
|||
11
zenon46
23.08.18
✎
15:10
|
(5) а в (5) закоментили строку, кинули строку с убранным договором, так будет только по всем контрагентам скопом.
|
|||
12
Aleksey
23.08.18
✎
16:15
|
(8) Получи список договоров запросом, раз не нравиться перебор в цикле
|
|||
13
Glup0sti
23.08.18
✎
16:20
|
утюг..., но правда не программный
|
|||
14
unregistered
23.08.18
✎
16:22
|
ОФФ.
(0) > Быстрой способ получения долга контрагента Быта, утюг и паяльник. Иногда легче переуступить право долга пацанам, которые в совершенстве владеют этими инструментами. |
|||
15
zenon46
23.08.18
✎
17:00
|
А вот этот запрос можно как то ускорить? Суть его в том что бы получить все НЕПРОВЕДЕННЫЕ документы за период. Может кто подскажет как его на прямой переписать, и будет ли в этом толк.
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Период с НачДата по КонДата; |ОбрабатыватьДокументы Непроведенные; |ТекДок = Документ.Реализация.ТекущийДокумент; |ФирмаЗ = Документ.Реализация.ТекущийДокумент.Фирма; |Контр = Документ.Реализация.ТекущийДокумент.Контрагент; |СумОтгруз = Документ.Реализация.ТекущийДокумент.СуммаВзаиморасчетов; |Группировка ТекДок; |Условие (ТекДок.ПометкаУдаления() = 0); |Условие (ФирмаЗ = Фирма); |Условие (Контр = Контрагент); |"; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат(0); КонецЕсли; |
|||
16
Карст
23.08.18
✎
17:08
|
ахренеть , долг по документам Оо
|
|||
17
Карст
23.08.18
✎
17:08
|
блин аж напугал ))))
|
|||
18
Базис
naïve
23.08.18
✎
17:20
|
(17) И нормально работало. Ну, если первичка вносилась своевременно, а порядок закрытия по ФИФО. Взяли сумму долг а из регистра и пошли складывать-вычитать с конца.
|
|||
19
Масянька
23.08.18
✎
17:34
|
Если в регистре, где ведутся взаиморасчеты, нет контрагента и ведете по договорам - не просто.
Как вариант, смотреть по счету - не знаю, есть в комплексной план счетов и регистр бухгалтерии. |
|||
20
zenon46
23.08.18
✎
19:58
|
(16) ты не понял, долг по регистрам, а это что бы прибавить непроведенные документы (есть нюансы в учете, документы проводятся в конце месяца, ибо в конфигурации реализована работа схема агент-принципал).
|
|||
21
Kigo_Kigo
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
|
.. потестил.. хрен нам.. не работает такой финт.. пичалька...
|
|||
25
NSSerg
23.08.18
✎
22:30
|
(22)
рег.УстановитьЗначениеФильтра( рег.ВыгрузитьИтоги(ТабИтогов ТабИтогов.Итог( |
|||
26
NSSerg
23.08.18
✎
22:46
|
//*******************************************
Процедура Сформировать() СЗДоговор=создатьобъект("СписокЗначений"); Запрос=создатьобъект("Запрос"); ТекстЗапроса="обрабатывать все; |дог=справочник.договоры.текущийэлемент; |контр=справочник.Договоры.владелец; |Условие (контр=Контрагент); |группировка дог без групп;"; Запрос.Выполнить(ТекстЗапроса); ТЗ=создатьОбъект("ТаблицаЗначений"); Запрос.выгрузить(ТЗ,0,0); ТЗ.выгрузить(СЗДоговор,,,"дог"); ОбщРег = СоздатьОбъект("Регистры"); Рег = ОбщРег.Покупатели; Рег.УстановитьЗначениеФильтра("Договор",СЗдоговор,2); ВремТабл=создатьобъект("ТаблицаЗначений"); Рег.ВыгрузитьИтоги(ВремТабл,1,1); Долг = ВремТабл.Итог("СуммаРуб"); сообщить(Долг); КонецПроцедуры |
|||
27
Попытка1С
23.08.18
✎
22:48
|
(0) подключи класс прямойзапрос.
у меня выводится прямым, в УПД. |
|||
28
NSSerg
23.08.18
✎
22:53
|
Но запрос должен быть быстрее
Вряд ли у тебя база больше чем у меня. По контрагенту с несколькими сотнями договоров. //******************************************* Процедура Сформировать() Запрос=создатьобъект("Запрос"); ТекстЗапроса=" |контр=регистр.покупатели.Договор.Владелец; |сумруб=регистр.Покупатели.СуммаРуб; |Условие (контр=Контрагент); |Функция Долг=Коност(сумруб);"; Запрос.Выполнить(ТекстЗапроса); сообщить(Запрос.Долг); КонецПроцедуры У меня выполняется 0,5 секунды |
|||
29
NSSerg
23.08.18
✎
22:55
|
Только у меня на измерении договор стоит галочка "отбор итогов" - индекс.
И в покупатели, и в поставщики. |
|||
30
zenon46
24.08.18
✎
09:24
|
(28) база 40 гигов, только в запросе получим долг по "покупателю", а где гарантии что нет его в "поставщиках", думаю еще туда надо включить регистр поставщики.
|
|||
31
NSSerg
25.08.18
✎
02:22
|
(30) Так включи, хотя ИМХО это не совсем верно.
главное, чтоб быстро работало - (29) - отбор итогов по договору. |
|||
32
Cthulhu
25.08.18
✎
11:30
|
Переписать (5) с возможностью пустых дефолтов (кроме, ясенпень, контрагента) - с их анализом и получением сводных значений по не указанным в параметре отборам. и получать по контрагенту сводный если надо.
прим.: только для скорости нужно иметь ввиду тот факт, что индекс регистра строится в порядке следования измерений, и если в вызове сводного остатка есть пропуск фильтров измерений (пустые значения а после них непустые) - вычисление сводного остатка сильно замедляется (т.к. вываливается в перебор а не по индексу), и для таких случаев может оказаться, что тупой перебор+подсуммировка по сводным остаткам по всем возможным значениям "пропущенного" измерения будет работать гораздо быстрее, чем разовое вычисление сводного остатка с таким пропуском (т.к. будут не перебором а по индексам). |
|||
33
AliAksA
30.08.18
✎
14:35
|
ну может не так понял, но это шуршит за милую душу:
Перем БухИтоги; Процедура ПриОткрытии() БухИтоги = СоздатьОбъект("БухгалтерскиеИтоги"); БухИтоги.ПериодМ(ТекущаяДата()); КонецПроцедуры Функция ТекущийДолг(перКонтрагент) Если ПустоеЗначение(перКонтрагент) = 0 Тогда Если перКонтрагент.ЭтоГруппа() = 0 Тогда Возврат Формат(БухИтоги.СКД(СчетПоКоду("62"), "С" , , перКонтрагент), "Ч018.2.'"); КонецЕсли; КонецЕсли; Возврат ""; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |