|   |   | 
| 
 | v7: Как рассчитать конечный остаток регистра | ☑ | ||
|---|---|---|---|---|
| 0
    
        exec11 02.06.23✎ 12:41 | 
        V.77 !!!
 Все доброго дня ! Есть регистр "ПоПартиям" по типу Остатки. У него есть Ресурсы : Остаток Как при проведение документа, в модуле документа, рассчитать конечный "Остаток" на момент проведения документа ? | |||
| 1
    
        dedmoroz777 02.06.23✎ 12:49 | 
        Остаток(<?>,)
 Синтаксис: Остаток(<Измерен1>,<Измерен2>...,<ИмяРесурса>) Назначение: Возвращает значение остатка заданного ресурса регистра. Параметры: <Измерен1>,<Измерен2>... - значения измерений регистра; <ИмяРесурса> - название требуемого ресурса регистра. Замечание: Метод используется только для регистров остатков. | |||
| 2
    
        Bigbro 02.06.23✎ 12:50 | 
        рассчитатьрегистрына документ
 и добавить то что в документе. | |||
| 3
    
        exec11 02.06.23✎ 13:00 | 
        (1)
 РенПоПартиям=СоздатьОбъект("Регистр.ПоПартиям"); Если ИтогиАктуальны()=0 Тогда РенПоПартиям.ВременныйРасчет(1); РассчитатьРегистрыПо(ТекущийДокумент()); КонецЕсли; РенПоПартиям.Договор = Договор; РенПоПартиям.Номенклатура = Товар; ТекОстаток = РенПоПартиям.Остаток(,,Товар,,,,Договор,"Остаток"); Сообщить(" ТекОст "+ТекОстаток); ---- ТекОст 0 | |||
| 4
    
        Bigbro 02.06.23✎ 13:05 | 
        (3) в этом случае у вас будет разный результат
 когда проводим новый документ и перепроводим уже проведенный. | |||
| 5
    
        exec11 02.06.23✎ 13:08 | 
        (4)
 Как сделать ? | |||
| 6
    
        Builder 02.06.23✎ 13:12 | 
        (5) РассчитатьРегистрыНа(ТекущийДокумент())     | |||
| 7
    
        exec11 02.06.23✎ 13:16 | 
        (6)
 Исправил. Конечный остаток не рассчитывается: ---- ТекОст 0 | |||
| 8
    
        Bigbro 02.06.23✎ 14:16 | 
        я же написал в (2)
 что непонятного? | |||
| 9
    
        Харлампий Дымба 02.06.23✎ 14:25 | 
        .СводныйОстаток(     | |||
| 10
    
        exec11 05.06.23✎ 11:25 | 
        (8)
 Не рассчитывает. Мой код в (3) Код верный ? (9) Тоже что то не получилось. Можете написать пример кода ? Из ИТС (наверное) есть отчет по регистрам. Там много строк. Те строки где поле документ (все) КонОст не ноль. Те строки где есть документ указан, КонОст равен нулю. В код этого отчета залезть пробовал, но там все динамическое. Пока уровень феншуя не позволяет понять, как этот отчет высчитывает КонОст. | |||
| 11
    
        uno-group 05.06.23✎ 11:38 | 
        (10) Если не указываешь все измерения то получаешь не остатком а сводным остатком.
 Или устанавливаешь фильтры по измерениям и делаешь выгрузить итоги. | |||
| 12
    
        Злопчинский 05.06.23✎ 11:58 | 
        почему РассчитатьРегистрыПо
 а не РассчитатьРегистрыНа ? | |||
| 13
    
        Злопчинский 05.06.23✎ 12:00 | 
        открой типовую ТиС, посмотри модуль проведения Реализации или Заяки
 . РенПоПартиям.Договор = Договор; РенПоПартиям.Номенклатура = Товар; - это для получеия остатка - зачем? | |||
| 14
    
        exec11 05.06.23✎ 12:08 | 
        (12) Исправил На - результат тот же.
 (13) Часть кода осталась с другого варианта рассчитать остаток. Не знаю как теперь поправить удалить эти все строки. Заметил только когда отправил. | |||
| 15
    
        exec11 05.06.23✎ 12:10 | 
        (14) не "эти все строки", а "эти две строки"     | |||
| 16
    
        Харлампий Дымба 05.06.23✎ 13:15 | 
        Просто не видно же что ТС нужно. Так-то в модуле проведения СводныйОстаток() очень редко когда нужен, ну может для контроля остатков только в целом по холдингу. А для работы с себестоимостью или нормальным закрытием регистров нужен Остаток(). Ну или можно через ВыгрузитьИтоги(), или ОстаткиПолучить(). Тут уже вкусовщина - удобство - скорость - конкретные условия. Мне вот удобнее было использование ОстактиПолучить(). Ну навскидку по памяти:
 Регистры=СоздатьОбъект("Регистры"); Регистры.Актуальность(1); Рег=Регистры.Остатки; Если ИтогиАктуальны()=0 Тогда Рег.УстановитьЗначениеФильтра("Фирма",Фирма,1); Рег.УстановитьЗначениеФильтра("Склад",Склад,1); СписокТоваров = СоздатьОбъект("СписокЗначений"); ВыгрузитьТабличнуюЧасть(СписокТоваров, "Товар"); Рег.УстановитьЗначениеФильтра("Товар",СписокТоваров,2); Рег.ВременныйРасчет(); Регистры.РассчитатьРегистрыНа(ТекущийДокумент()); КонецЕсли; //либо: порядок не важен, заполненность можно важна/не важна (можно пропускать измерения), удобнее если ресурсов несколько. Рег.Фирма=Фирма; Рег.Товар=Товар; Рег.Склад=Склад; Рег.ОстаткиПолучить();//удобно, что рассчитываешь остатки по всем ресурсам сразу Остаток=Рег.Количество; СтоимостьОстатка=Рег.Стоимость; //либо: порядок и заполненность важны! быстро Остаток=Рег.Остаток(Фирма,Товар,Склад,"Количество"); //либо: порядок важен, заполненность неважна! долго Остаток=Рег.СводныйОстаток(Фирма,Товар,Склад,"Количество"); | |||
| 17
    
        Харлампий Дымба 05.06.23✎ 13:24 | 
        //через таблицу значений, вот ещё кусок кода нашел где-то
 Регистры=СоздатьОбъект("Регистры"); Рег=Регистры.Остатки; Рег.УстановитьЗначениеФильтра("Фирма",Фирма,1); Рег.УстановитьЗначениеФильтра("Склад",Склад,1); СписокТоваров = СоздатьОбъект("СписокЗначений"); ВыгрузитьТабличнуюЧасть(СписокТоваров, "Товар"); Рег.УстановитьЗначениеФильтра("Товар",СписокТоваров,2); Если (СравнитьТА()=-2)и(ДатаДок<ПолучитьДатуТА()) Тогда // новый Рег.ВременныйРасчет(); Регистры.РассчитатьРегистрыПо(ДатаДок); ИначеЕсли СравнитьТА()=-1 Тогда // док раньше ТА Рег.ВременныйРасчет(); Регистры.РассчитатьРегистрыНа(ТекущийДокумент()); КонецЕсли; ТаблицаИтогов=СоздатьОбъект("ТаблицаЗначений"); Рег.ВыгрузитьИтоги(ТаблицаИтогов,НужныЛиКолонкиСоЗначениямиИзмерений); | |||
| 18
    
        exec11 05.06.23✎ 14:10 | 
        (16)
 Адаптировал под себя. // ------ Регистры=СоздатьОбъект("Регистры"); Регистры.Актуальность(1); Рег=Регистры.ПоПартиям; Если ИтогиАктуальны()=0 Тогда Рег.УстановитьЗначениеФильтра("Договор",Договор,1); Рег.УстановитьЗначениеФильтра("Номенклатура",Товар,1); //СписокТоваров = СоздатьОбъект("СписокЗначений"); //ВыгрузитьТабличнуюЧасть(СписокТоваров, "Товар"); //Рег.УстановитьЗначениеФильтра("Товар",СписокТоваров,2); Рег.ВременныйРасчет(); Регистры.РассчитатьРегистрыНа(ТекущийДокумент()); КонецЕсли; Рег.Договор=Договор; Рег.Номенклатура=Товар; Рег.ОстаткиПолучить(); ТекОстаток1 = Рег.Остаток; ТекОстаток2 = Рег.Остаток(,,Товар,,,,Договор,"Остаток"); Сообщить("ТекОстаток1 "+ТекОстаток1) Сообщить("ТекОстаток2 "+ТекОстаток2); ---- ТекОстаток1 0 ТекОстаток2 0 | |||
| 19
    
        exec11 05.06.23✎ 14:16 | 
        (18) Должно рассчитывать. Но все по нулям. Вот сижу смотрю, что не так. Пока не вижу.
 Переходить к варианту (17) ? | |||
| 20
    
        uno-group 05.06.23✎ 14:16 | 
        Рег.Остаток(,,Товар,,,,Договор,"Остаток"); не допускает пустых измерений
 Рег.СводныйОстаток() Допускает пустые измерения в конце тоесть указываешь измерение 1,2,3 а 4, 5 может быть пустым | |||
| 21
    
        uno-group 05.06.23✎ 14:18 | 
        Тоесть ты фактически получаешь сейчас остатки по фирме="" и по складу равному="". конечно у тебя на такой фирме и складе ничего не числиться     | |||
| 22
    
        exec11 05.06.23✎ 14:28 | 
        (20)
 (,,Товар,,,,Договор,"Остаток") Может, что то я не до понимаю. Уточню: Регист ПоПартия: Измерения: Счет ВидТовара Номенклатура Документ вРамкахСчета СчетУчета Договор Ресурсы: Остаток НакоплСтоимость (,1,Товар,,,,Договор,"Остаток") Место где стоит "1" - это "Счет" имеется ввиду. В моем фильтре он может быть любой. Поэтому ничего не указываем. Получается ,, | |||
| 23
    
        exec11 05.06.23✎ 14:33 | 
        Запись в регистр производится так, из модуля документа :
 ------------------- Регистр.ПоПартиям.вРамкахСчета = вРамкахСчета; Регистр.ПоПартиям.Счет = Счет; Регистр.ПоПартиям.Договор = Договор; Регистр.ПоПартиям.СчетУчета = СчетУчета; Регистр.ПоПартиям.ВидТовара = ВидТовара; Регистр.ПоПартиям.Номенклатура = Товар; Регистр.ПоПартиям.Документ = ТекущийДокумент(); Регистр.ПоПартиям.Остаток = Количество; Регистр.ПоПартиям.НакоплСтоимость = Количество*ЦенаРуб; Регистр.ПоПартиям.ДвижениеПриходВыполнить(); | |||
| 24
    
        uno-group 05.06.23✎ 14:34 | 
        (22) тогда только через выгрузку итогов в таблицу. и подсчет отстатков по списку всех счетов или через ТзОстатки.итог("Остаток);
 Изначально созданна неправильная структура регистра первыми должны идти измерения которые извесетны потом те которые плавают | |||
| 25
    
        uno-group 05.06.23✎ 14:38 | 
        Если так во всех документах то у тебя еще этот регистр нефига не закрывается и пухнуть будет со страшной силой.
 Регистр.ПоПартиям.Документ = ТекущийДокумент(); Половина из этих измерений вообще в реквизиты проситься. | |||
| 26
    
        uno-group 05.06.23✎ 14:42 | 
        Может тебе к этому регистру подтянуть регистр остатков и остаток по нему контролировать?
 там измерений меньше должно быть | |||
| 27
    
        exec11 05.06.23✎ 15:10 | 
        Измерения создавались по мере необходимости. 
 Сам код зависит от последовательности измерений. Поэтому получается так. Не, можно конечно пересортировать все измерения. А надо ? Можно создать другой регистр. Но. Сейчас я хочу высчитать среднюю цену товара на каждый приход и расход самого товара. Нужен регистр по партия. Ну он и есть. Добавили ресурс Накопленная стоимость. Теперь по сути надо высчитать при проведении остаток и накопленную стоимость, поделить их друг на друга и должно быть счастье. А его нету. Что то не высчитывается как должен. Сейчас все таки по мучаюсь чуток, и что нибудь через костыль приделаем. Ну чо он не рассчитывается !! Должен ведь. Заводить новый регистр с меньшим числом измерений ? | |||
| 28
    
        uno-group 05.06.23✎ 15:15 | 
        Что такое Счет, Договор, СчетУчета зачем они тут. такое впечатление что человек который только бух знает создавал регистр по аналогии.     | |||
| 29
    
        exec11 05.06.23✎ 15:30 | 
        Это поля для запросов в отчетах, по ним нужны итоги. Их можно было считать в ручную, кодом. А можно в запрос за один проход. Отчетов много. Разрезов и детализаций тоже много. Вот и подросли измерения.
 Конфигурация самописная. Художник я сам. Решаю задачи по мере поступления. | |||
| 30
    
        Харлампий Дымба 05.06.23✎ 16:20 | 
        (18) Выглядит нормально... А точно есть ненулевой остаток по количеству по договору и товару?
 Ну и попробуй 17 Рег.ВыгрузитьИтоги(ТаблицаИтогов,1); ТаблицаИтогов.ВыбратьСтроку(); - покажет что-нибудь? Ну и (25) люто плюсую. 7 измерений, причем потенциально последнее (Документ) вряд ли закрывается, судя по исходному вопросу. Итого 7 факториал записей в таблице итогов на каждый товар каждый месяц. А если ещё "для скорости" стоят галки "Отбор итогов" или период оперативных итогов 5 дней... Не очень хорошо будет. | |||
| 31
    
        Харлампий Дымба 05.06.23✎ 16:22 | 
        к (30) не, про факториал я погорячился. Ну суть та же     | |||
| 32
    
        Злопчинский 05.06.23✎ 16:23 | 
        Счёт и Договор также несколько напрягают... Да ещё ВРамкахСчета     | |||
| 33
    
        Харлампий Дымба 05.06.23✎ 16:24 | 
        (32) Голосую за "в реквизиты!"     | |||
| 34
    
        Харлампий Дымба 05.06.23✎ 16:25 | 
        (32) а ВидТовара при живом Товаре?     | |||
| 35
    
        uno-group 05.06.23✎ 16:52 | 
        (29) что мешает в запросе написать. ВидТовара=Регистр.Партии.ВидТовара или запихнуть это в измерение в крайнем случае. Попробуй почитать хотя бы 1 книжку по теории баз данных чем что то программировать.     | |||
| 36
    
        uno-group 05.06.23✎ 16:53 | 
        +35 ВидТовара=Регистр.Партии.Товар.ВидТовара     | |||
| 37
    
        Bigbro 05.06.23✎ 21:09 | 
        ТекОстаток = РенПоПартиям.Остаток(,,Товар,,,,Договор,"Остаток");
 Сообщить(" ТекОст "+ТекОстаток); это тоже в модуле проведения? | |||
| 38
    
        exec11 06.06.23✎ 11:30 | 
        (37) Да, весь код в модуле проведения.
 Попробовал сделать как в (17), дописал это. ТаблИтогов=СоздатьОбъект("ТаблицаЗначений"); Рег.ВыгрузитьИтоги(ТаблИтогов,1,1); ТаблИтогов.ВыбратьСтроки(); КонОст =0; КонСтоимость =0; Пока ТаблИтогов.ПолучитьСтроку()>0 Цикл КонОст =КонОст + ТаблИтогов.Остаток; КонСтоимость = КонСтоимость + ТаблИтогов.НакоплСтоимость; КонецЦикла; КонОст = КонОст +Количество; КонСтоимость = КонСтоимость + Количество*Цена; Сообщить("КонОст "+КонОст); Сообщить("КонСтм "+КонСтоимость); Сообщить("СрЦен "+КонСтоимость/КонОст); В принципе, как то считает. Полазил в инет, нашел : Временный расчет регистра остатков Кто то так же как я бился еще в 2013 году. Костыль - ну да ладно. Кто то скажет ну это ж 77. Другого расчета так понимаю нету ? | |||
| 39
    
        Bigbro 06.06.23✎ 11:37 | 
        (38) а что ты ожидал увидеть в модуле проведения когда движения текущего документа еще не сформированы?
 ты там и получаешь конечный остаток на момент ДО проведения документа. потому что момент проведения документа - еще не наступил. тут нет процедуры ПослеПроведения по итогу ты сделал ровно то что я написал в (2) получил остаток на документ и добавил то что в документе. | |||
| 40
    
        exec11 06.06.23✎ 12:03 | 
        (39) Ну скажем так, хотелось бы ПолучитьКонОст() на предыдущий документ. Это же регистр ! 
 В запрос есть функция Конечный остаток ? Ну вот что то вроде этого хотелось. А в итоге все свелось к пересчету в цикле. То же конечно вариант. Но мы ж художники, нам подавай красоту решений ! :) | |||
| 41
    
        Харлампий Дымба 06.06.23✎ 12:26 | 
        (40) Так ты и получаешь конечные остатки по предыдущий документ включительно. Ну или начальные остатки на текущий документ. А вот какой смысл в остатке после проведения документа в модуле проведения документа - я не знаю, и восхищён  Bigbro, который уже в (2) увидел то, что я и сейчас не вижу в исходном вопросе: желание получить итоги с учетом проведения текущего документа. 
 Ну и в любом случае в 7.7 всё это есть: Регистры.Актуальность(1) будет поддерживать остатки в актуальном состоянии. То есть получил остаток до, сделал движение регистра, получил остаток уже с учетом этого движения. | |||
| 42
    
        uno-group 06.06.23✎ 12:54 | 
        (38) При чем тут 7.7 если у тебя знаний не хватает и криво создана структура базы данных. и вместо того чтобы ее исправить ты делаешь очередные костыли.
 Нафига цикл если ты складываешь без дополнительных условий. КонОст=ТаблИтогов.Итог("Остаток"); КонСтоимость=ТаблИтогов.Итог("НакоплСтоимость"); СрЦен =?(КонОст=0,0,КонСтоимость/КонОст); | |||
| 43
    
        uno-group 06.06.23✎ 13:00 | 
        Тебе 20 раз написали, что если пропускаешь и не указываешь какие то измерение, то надо писать не "остаток", а "сводный остаток"
 ТекОстаток2 = Рег.СводныйОстаток(,,Товар,,,,Договор,"Остаток"); | |||
| 44
    
        exec11 06.06.23✎ 13:24 | 
        (42) Да, со всеми утверждениями согласен.
 Заменил цикл на Итог. | |||
| 45
    
        Bigbro 06.06.23✎ 13:29 | 
        (41) просто я видел много разного... ;%ма, и самому порой такое колхозить приходилось.. что только обнять и плакать)
 и задача получить результат проведения до проведения - это еще не самое яркое) | |||
| 46
    
        exec11 06.06.23✎ 14:34 | 
        (45) Так обычно и бывает.
 В какой то момент начинаешь задумываться о цикле жизни проекта (на пример базы в нашем случае) Все начиналось с екселя. Замучилась. Взяли 77 как ексель чуть по сложнее. Пошли от простого. Так и так. Ага появились новые вводные. Надо переделать. Вот так. А то удалить ? А если удалить, то и то перестанет работать. Надо переделать на новый регистр. Не охота. Много ресурсов ? Криво ? Да. Но пока не прижмет, не хочется править. Так и живем. Что будет дальше ? Какие законы финансовые примут ? Никто не знает. Поэтому из ходим из того что есть. | |||
| 47
    
        Злопчинский 06.06.23✎ 14:53 | 
        (46) "Хрен ли думать, трясти надо!"     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |