Подскажите, пожалуйста. Возникла необходимость генерировать проводки по документам. Применяя функцию GenPro в разных вариантах, столкнулись со следующими трудностями:
1) При компиляции харбором для создания exe-шника вылезает ошибка о незнакомой функции GenPro, что понятно. : можно ли ее как-то подцепить в компиляторе, через какую-то библиотеку может быть?
2) При попытке запустить плагин из bat файла строкой типа
bin\sclad /fe"Папка с БЭСТОм"\PRO\PLUGINS\EXTENSNS\sclad\gen_pr.prg /L000001
во-первых, требуется при включенной авторизации БЭСТа вводить логин и пароль. : как можно ввести логин/пароль в пакетном режиме из bat файла?
NotWar пишет:
во-первых, требуется при включенной авторизации БЭСТа вводить логин и пароль. : как можно ввести логин/пароль в пакетном режиме из bat файла?
Устанавливаете новый БЭСТ, подцепляете туда базу
Никаких логинов в этом БЭСТе не делайте (выключите авторизацию) и все получится, запукайте плагин из него
Что интересно, при запуске этого же плагина через Ctrl-F5 в товарах проводки в документе генерятся.: почему через bat файл плагин не работает?
Функция предназначена для запука плагином из модуля товары.
В противном случае Вам необходимо обеспечить ее всем необходимым окружением алиасов и объявленных переменных
У меня нет по двум причинам:
1.Уже очень давно Б4 не практикую и многое надо поднимать
2.Мы никогда не решали задачи проводок внешними программами.
3.Плагин который был написан примерно больше года назад для Б5 рассчитывает проводки для несколько тысяч документов за 5 минут. Штатная генерация отдыхает....
Нет необходимости запускать это внешней программой в планировщике - ночью удобнее, конечно, но 5 минут подождать это не тот аргумент чтобы убиваться над планировщиком
nordk пишет:
3.Плагин который был написан примерно больше года назад для Б5 рассчитывает проводки для несколько тысяч документов за 5 минут. Штатная генерация отдыхает....
Запустили следующий простой hrb плагин из модуля Товары:
FUNC TION main()
Local aSet,asetkey, s
dbpush()
aSet:=SaveSet()
asetkey := SaveSetKey()
mdoc->(setscope())
mdoc->(dbgotop())
do while !mdoc->(eof())
if mdoc->vid = '2'
s:=UPPER(mdoc->SCLAD+mdoc->VID+mdoc->TYPE+mdoc->CODEDOC+mdoc->NUMDOC)
mdoc->(GenPro(,,2,1,,,{s}, .T.))
endif
mdoc->(dbskip(1))
enddo
RestSetKey(asetkey)
RestSet(aSet)
dbpop()
RETURN
Документов плагин пробегает пару тысяч, GenPro вызывается только на отгрузке (vid = '2'), и проводки должны генериться только при их отсутствии, а работает плагин почему-то вовсе не 5мин, а в несколько раз больше, причем на сервере. Что-то не так с кодом, очень неоптимальный?
Формулы проводок покажите.
В них есть старт .hrb ?
А кстати ? сколько записей в базе mdoc ?
Вы же все записи перебираете.
Делайте скоп по UPPER(vid+type)
И перебирайте только конкретно нужные документы без всяких IF
DBE VAL() также работает оптимальнее чем While do конструкция
И алиас не надо использовать текущий - откройте свой b5mdoc/
Не надо трогать штатный
nordk пишет:
Формулы проводок покажите.
В них есть старт .hrb ?
А кстати ? сколько записей в базе mdoc ?
Вы же все записи перебираете.
Делайте скоп по UPPER(vid+type)
И перебирайте только конкретно нужные документы без всяких IF
DBE VAL() также работает оптимальнее чем While do конструкция
И алиас не надо использовать текущий - откройте свой b5mdoc/
Не надо трогать штатный
Поменяли код. Открыли свой алиас, сделали setscope, вместо do while использовали dbeval :
Работать стал быстрее раза в три-четыре. nordk - спасибо большое! Строк всех в mdoc около 50000, делается за 8-10 мин.
Но почему-то проводки генерятся только в том складе, из которого запускается плагин по Ctrl-F5, хотя с индексом mdoc_o и setscope('genmdoc->vid', UPPER("2")) должны пробегатся по всем записям c vid=2, по всем складам.
Кроме того, почему то SaveSet() и RestSet(aSet) не работают: изменяется внешний шапки накладной и не видно окно проводок, если зайти в накладную сразу после окончания работы плагина. А если выйти из склада и зайти снова - вид восстанавливается и проводки видны.
Подскажите, пожалуйста, в чем причина этих двух неполадок?
NotWar пишет:
Но почему-то проводки генерятся только в том складе, из которого запускается плагин по Ctrl-F5, хотя с индексом mdoc_o и setscope('genmdoc->vid', UPPER("2")) должны пробегатся по всем записям c vid=2, по всем складам.
На старом форуме я вроде исходник этой функции выкладывал.
Есть подозрение, что там внутри все равно используется mdoc
А когда вы в реестре на нем лежит скоп конкретного реестра.
Цитата
NotWar пишет:
Кроме того, почему то SaveSet() и RestSet(aSet) не работают: изменяется внешний шапки накладной и не видно окно проводок, если зайти в накладную сразу после окончания работы плагина.
Внутри накладной если вы это делаете, то там SaveSet() не поможет, потому что там три окна созданные средствами класса TBROWSE()
И SaveSet() если и работает то применительно к одному конкретному окну
Там надо окна заново обновлять, только прямо сейчас не подскажу как, возможно кто из программистов тут вместо меня подскажет оперативно, мне надо над кодом помедитировать
nordk пишет:
На старом форуме я вроде исходник этой функции выкладывал.
Есть подозрение, что там внутри все равно используется mdoc
А когда вы в реестре на нем лежит скоп конкретного реестра.
Да, посмотрели исходник genpro, там прямое обращение к mdoc.
Поставили после SaveSetKey()в начале плагина mdoc->(setscope()) - помогло.
В отладчике индекс можно узнать, да. По ключевому выражению и по Index order можно догадаться, что это MDoc_D.
Только скоп не нашел как там посмотреть. Он же не по всему индексу может быть. Выкрутился, вставив строчку
sayandwait(scopemacro("mdoc_d"))
Хотя можно, конечно, выйти из Бэста и снова зайти...
Функция SetScope() возвращает предыдущий скоп.
Стандартный ход такой:
aScope:=SetScope() // снятие скопа (можно также сразу установить новый)
........
SetScope(aScope) //воcстановление
NotWar пишет:
Только скоп не нашел как там посмотреть. Он же не по всему индексу может быть.
Сан Саныч правильно написал, я немного затупил
А насчет отладчика:
в закладке индексы вы видите какой индекс установлен в данный момент
И значения границ скопа top и bottom к каждому конкретному тегу.
Т.е. видно на какие теги какой скоп стоит в данный момент
nordk пишет:
в закладке индексы вы видите какой индекс установлен в данный момент
И значения границ скопа top и bottom к каждому конкретному тегу.
Т.е. видно на какие теги какой скоп стоит в данный момент
В редакторе отладчика по Alt-Ins увидел скоп.
Раньше я во время отладки выполнения плагина смотрел в WorkArea.
А, кстати, если в начале и конце плагина стоят dbpush() ... dbpop() , так ли уж важно какой скоп остается в плагине на mdoc?
Ведь после dbpop() и выхода из плагина предыдущее состояние восстановится.