BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Создание документов прихода/расхода.

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2 3 След.
RSS
Создание документов прихода/расхода., Практическое применение классов разработчиков.
 
Цитата

Подождите Вы как-то смешиваете все.
Если наряд задания и ПСН это одно.
Если производственные заказы и ПСН это другое.

Для создания ПСН Вам по сути нужен механизм разузлования, по которому Вы собственно и сможете программно создавать свою ПСН.

Я правильно понимаю - Вас интересует функция, которая сделает разузлование ?
В случае наряд-задание - разузлование уже сделано причем пооперационное. И мы берем оттуда.
В случае производственных заказов - просто делается разузлование по заказу и формируется ПСН.

Наверное, именно она интересует. Даже не знаю.
Скорее даже интересует создание_собственного/изменение_существующего механизма разузлования.
Изменено: Саак Шахламджян - 01.11.2008 14:50:55
 
Механизм посмотрю но делать свой не стоит.
Можете сразу весь модуль свой писать.
Это точно также как не стоит самому стремится работать
с остатками на складе и так далее.
Основнополагающие механизмы надо брать из БЭСТа, чтобы
потом не искать причину расхождения в таблицах.
Тем более что Ваши уверения об ошибках будут проверять на
демобазе и там они могут не подтвердится.
 
Цитата
Механизм посмотрю но делать свой не стоит.
Можете сразу весь модуль свой писать.
Это точно также как не стоит самому стремится работать
с остатками на складе и так далее.
Основнополагающие механизмы надо брать из БЭСТа, чтобы
потом не искать причину расхождения в таблицах.
Тем более что Ваши уверения об ошибках будут проверять на
демобазе и там они могут не подтвердится.

По поводу ошибки я код привел и он как раз для демо базы. С остатками, думаю конечно будет перегиб самому работать. Писать свой модуль, наверное, просто физически почти невозможно. Почитал то, что есть в СП11. Думаю, что стоит на F8 поставить свою обработку и всё. Хотя, не очень-то это и надежно.
 
Цитата
формат AddRow(). Он такой:и METHOD AddRow(cGrup,cNNum,cMDim,cPartia,nKolOut,cEd1,nR,cNNOPERM,aAuto,aSerNo,; //10cPrd_Grup, cPrd_NNUM, cPrd_Bom, cDef_Grup, cDef_NNUM, cDef_mDim, cNZ_ID, cCommentM )


Я в параметрах AddRow() не вижу возможности задать цену и/или сумму цены отпускной (CenaOut, SumOut). А они нужны!
 
Цитата
Денис пишет:

Я в параметрах AddRow() не вижу возможности задать цену и/или сумму цены отпускной (CenaOut, SumOut). А они нужны!


Скорее всего там нет такого параметра.
Такой параметр есть в классе ScladRow, например, параметр SumFact - фактическая сумма товара... И через DATA ROWS (массив) класса ScladDoc можно получить доступ к цене конкретной строки документа...
Изменено: Саак Шахламджян - 25.12.2008 08:54:59
 
Цитата
Саак Шахламджян пишет:
Такой параметр есть в классе ScladRow, например, параметр SumFact - фактическая сумма товара... И через DATA ROWS (массив) класса ScladDoc можно получить доступ к цене конкретной строки документа...


Подскажите, плз, на примере. Как надо исправить код, чтобы в строке стояла сумма отпускная 1500 рублей.

Код
   Local oDocs
   Local oDoc1

   oDocs := ScladDocs():New()
   oDocs:Task := "03"
   oDoc1:= ScladDoc():New()
   oDocs:Hidden := 3
   oDocs:Protokol := tempfile('c:\bests','txt')
   oDoc1:Vid := "2"
   oDoc1:Type := "1"
   oDoc1:CodeDoc := "001"
   oDoc1:NumDoc := "000018"
   oDoc1:Sclad := "Центр."
   oDoc1:Part_type := '1'    
   oDoc1:Part_Code := "000019"

   oDoc1:AddRow("00003","0000000000002",,,10) 

   oDocs:AddDoc(oDoc1)
   oDocs:Run()

 
Я делал документы оприходования ГП-товары. Исходя из Вашего кода по идее должно быть так:

Код

Local oDocs 
   Local oDoc1 

   oDocs := ScladDocs():New() 
   oDocs:Task := "03" 
   oDoc1:= ScladDoc():New() 
   oDocs:Hidden := 3 
   oDocs:Protokol := tempfile('c:\bests','txt') 
   oDoc1:Vid := "2" 
   oDoc1:Type := "1" 
   oDoc1:CodeDoc := "001" 
   oDoc1:NumDoc := "000018" 
   oDoc1:Sclad := "Центр." 
   oDoc1:Part_type := '1'     
   oDoc1:Part_Code := "000019" 

   oDoc1:AddRow("00003","0000000000002",,,10)
//заметьте тут нужно знать к какому элементу массива rows требуется обращение.
//Т.е. либо счетчик, либо по длине.

   oDoc1:ROWS[1]:SumOutR:=5000//осн валюта

/*   oDoc1:ROWS[1]:SumOut:=5000 - сумма во 2й валюте
Аналогично: oDoc1:ROWS[1]:SumFact, oDoc1:ROWS[1]:SUMOUT, oDoc1:ROWS[1]:SUM, oDoc1:ROWS[1]:SUMN - налог стоим.
Из последних свойств необходимо смотреть какие Вам нужны, а какие нет. Для этого нужно в документах Б-5 поковыряться и поэкспериментировать со свойствами.*/



   oDocs:AddDoc(oDoc1) 
   oDocs:Run()


В любом случае нужно смотреть класс ScladRow. И "ставить опыты":)
Т.е. сделать проверку, получился ли правильно требуемый документ или нет.
Лично я не могу сказать определенно точно какие свойства за что отвечают. (Такие как TZR1MN...)

Там еще параметр по НДС есть, кажется этот:
data NDS init 0 // Значение параметра NDS товара...
Т.е. для кода, приведенного выше будет так:
Код
oDoc1:ROWS[1]:NDS:=900
Изменено: Саак Шахламджян - 25.12.2008 11:07:54
 
Цитата
Саак Шахламджян пишет:
Исходя из Вашего кода по идее должно быть так:


Спасибо! Работает. Причем НДС и т.д. похоже сам считает. Осталось разобраться с нумерацией...
 
Цитата
Денис пишет:

Спасибо! Работает. Причем НДС и т.д. похоже сам считает. Осталось разобраться с нумерацией...


Для нумерации есть функция WDOC. Правда с ключем уникальности я толком не разобрался. Написал еще свою WDOC1 "для надежности", на боевой машине проблем не было. А потом как оказалось, что одинаковые номеру могут быть, просто вид документов д.б. разный, я был не в курсе. Лично по мне все равно как-то не удобно...
Вот тема:
WDOC-нумерация
 
К стати бОльшие проблемы и волнения у меня возникали по поводу того, что не возвращается код ошибки (кажется вообще никогда), я от nordik так и не смог добиться помощи, сделал проверку на наличие/отсутсвие ошибки (причина останется неизвестной), да и то, собственно косвено. Код где-то выше есть.
 
Цитата
Саак Шахламджян пишет:
Для нумерации есть функция WDOC.


На старом форуме еще обсуждалась функция NewNumDoc. Правда применяли ее там для БЭСТ4. Вы про WDOC откуда узнали? Интересно для каких случаев лучше применять NewNumDoc, а для каких WDOC?

Пока сделал так:
Код
...
  ucNumDoc := NewNumDoc(cSclad, cVid, cType, cCodeDoc)
...
  oDoc1:NumDoc := ucNumDoc
...
   If aResult[1][1]
//     SayAndWait('Импорт прошел успешно!')
   Else
//Отмена сгенерированного значения NWDOC()
     NControlMem(UPPER(cSclad+cVid+cType+cCodeDoc),"NOM_DOC",,.T.)
   EndIf


И Вопрос возник Len(aResult) всегда равно 1? Ведь зачем-то сделали двухмерный массив ...

Цитата
Саак Шахламджян пишет:
не возвращается код ошибки (кажется вообще никогда)


Если остаток по какой-то номенклатуре из сгенерированной накладной меньше 0, то aResult[1][1] = .F.
 
А aResult - это:
Код
aResult:=oDocs:Run()

?

Откуда массив?

Есил это он, туда аписывается результат исполнения. Как раз то, о чем я долбал тут довольно долго...
При возникновении ошибки туда нч не запис...

Описание массива есть в исходниках. WDOC тоже.

А разницы, наверное, никакой. Просто либо идет по индесу таблицы проверка, либо где-то (я не пытался выяснить) дополнительно храниться последний номер и тогда использование wdoc актуально...
При попытке сохранить документ с существующим номером должна быть ошибка в результирующем массиве, но он оказывается пустым!!!!

Я так делаю проверку:
Код
oErr:=oDocs:Run()
        if (!Empty(oErr))
          //сделать проверку....
          if (oErr[1][1])
            lResult:=.T.
          else
            lResult:=.F.
          endif
        else
          lResult:=.F.
        endif

отсюда тоже видно как с нм работать. А 2хмерный он потому, что в oDocs м\б несколько oDoc и первая размерность, как раз для номера документа в списке документов объекта oDocs, если мне не изменяет память.
 
Цитата
Саак Шахламджян пишет:
А aResult - это: Код aResult:=oDocs:Run()
?
Откуда массив?


Цитата из scladobj.prg
Цитата

Метод RUN() возвращает массив, каждый элемент которого описывает результат попытки сохранения документа:
{lResult,::NNoper,::Sclad,::Vid,::Type,::TypeEx,::Date,::CodeDoc,::NumDoc, nRecNo}
 
Цитата
Саак Шахламджян пишет:
При попытке сохранить документ с существующим номером должна быть ошибка в результирующем массиве, но он оказывается пустым!!!!


Это не ошибка !!!
При попытке сохранить документ с существующим номером
система считает что Вам надо этот документ исправить.
И вносит туда изменения.

А уж надо ли Вам его исправлять или вы создаете новый в объекте такого признака нет - это уже решайте внутри Вашего плагина
 
Цитата
nordk пишет:



Цитата

Саак Шахламджян пишет:
При попытке сохранить документ с существующим номером должна быть ошибка в результирующем массиве, но он оказывается пустым!!!!

Это не ошибка !!!
При попытке сохранить документ с существующим номером
система считает что Вам надо этот документ исправить.
И вносит туда изменения.

А уж надо ли Вам его исправлять или вы создаете новый в объекте такого признака нет - это уже решайте внутри Вашего плагина

Я извиняюсь, а ОНА вносит изменения и сохраняет по-Вашему? (с другим нумером)

И в любом случае очень интересно как узнать в этом случае (пустой массив результата) о результатах RUN()?
Изменено: Саак Шахламджян - 29.12.2008 16:52:50
 
Контроль номера это локальная задача Вашего плагина.
Не вешайте это на объект.
Объект увидев номер переходит в режим редактирования и позволяет дополнять Ваш документ новыми строками.
 
Цитата
nordk пишет:
Контроль номера это локальная задача Вашего плагина.
Не вешайте это на объект.
Объект увидев номер переходит в режим редактирования и позволяет дополнять Ваш документ новыми строками.

Я что-то совсем не понял.
Какой еще режим редактирования? Вообще ничего не происходит при существовании такого же номера, понимаете? НИЧЕГО. Нуль эмоций, никаких признаков действий или чего-либо еще...
 
У МЕНЯ в плагине происходит.
Есть возможность ADDROW(). И при редактировании документа
мы добавляем в существующий документ строки в нашем плагине.
Мы планируем в перспективе задачу удаления строки получить от КБ. Но так или иначе работа с документом это не только его создание.
 
Цитата
nordk пишет:
У МЕНЯ в плагине происходит.
Есть возможность ADDROW(). И при редактировании документа
мы добавляем в существующий документ строки в нашем плагине.
Мы планируем в перспективе задачу удаления строки получить от КБ. Но так или иначе работа с документом это не только его создание.

Очень интересно у Вас, значит происходит, а у меня значит нет. Позвольте полюбопытсвовать кусочек кода и что у вас в таблице в этот момент!?
Я свой код приводил здесь и не раз. При котором НИЧЕГО не происходит...
 
Цитата
Саак Шахламджян пишет:



Цитата


Дак все правильно !!!!
Записей и не должно прибавиться - она уже есть !!!!
Программа открыла документ на редактирование.
Обнаружила что запись такая есть.
Никаких изменений нет - делать ничего не надо.
А вот если Вы измените содержимое - посмотрите

А вот и нет!!!
Во-первых. Перед повторным запуском поменяйте содержимое. Результат будет тотже самый!!!

Во-вторых. Даже если и так, почему нет "сообщения" об ошибке в oErr, возвращаемым методом Run? Тем более, что было бы Хорошо "по здравому" смыслу его выдавать! Например, с сообщением, что такой номер уже есть....


Повторяю еще раз мы уже задачу сдали и ОНА РАБОТАЕТ у клиента.
Во вторых - это не ошибка.
И там ничего и не должно быть
 
Цитата
nordk пишет:
Повторяю еще раз мы уже задачу сдали и ОНА РАБОТАЕТ у клиента.Во вторых - это не ошибка.И там ничего и не должно быть

Ну, Хорошо, тогда объясните пожалуйста это:
Цитата
Метод RUN() возвращает массив, каждый элемент которого описывает результат попытки сохранения документа:
{lResult,::NNoper,::Sclad,::Vid,::Type,::TypeEx,::Date,::CodeDoc,::NumDoc, nRecNo}

Цитата из описания объектов склада.

Скажите мне внятно, ТОЧНО и ДОСТОВЕРНО что именно и когда возвращает RUN!?
 
Точно и достоверно пока на сегодня можно сказать
что RUN должен отражать результат работы с документом.
КРоме перечисленных Вами свойств, там добавилось в последнем пакете еще и свойство Cargo.
У нас в плагине RUN возвращает информацию всегда.
Но мы импользуем это в товарах в расходе !!!!
Даже принципы работы с приходом и расходом в товарах разные.
А Вы вообще в производстве делаете.
Пустой массив также говорит о том, что изменений не было.

Вообще по логике вещей менять шапку через AddDoc()
наверно все-таки некорректно. Добавлять информацию в
состав документа наверно единственная причина его повторного применения. Но в этом случае на ADDROW()
в массив ничего не должно писаться.

Отдельные виды движения с пустым массивом при повторном создании документа будем смотреть,
но к контролю номера документа средствами объекта это никакого отношения иметь не будет.
Хотите создавать свой номер - контролируйте в коде своей программы самостоятельно. Хотите доверить номер объекту,
тогда не надо туда в нумерацию ничего писать.

Для корректировки документов есть планы развития работы с объектом "накладная" и тут разработка будет и дальше двигаться.
Изменено: nordk - 14.01.2009 17:09:03
 
Саак в дополнение хочу сказать.
Кое-что из Ваших рассуждений было почерпнуто.
Планируется работа по улучшению работы с объектом, но надо все не спеша взвесить.
 
Цитата
nordk пишет:
У нас в плагине RUN возвращает информацию всегда.

У меня тоже всегда все прекрасно. Только 1н случай с пустым массивом был. Из-за него весь шум-гам. Логика простая - если есть один случай почему не быть второму?

Цитата
nordk пишет:
Но мы импользуем это в товарах в расходе !!!!Даже принципы работы с приходом и расходом в товарах разные.А Вы вообще в производстве делаете.

Весело. Надо было в описании объектов с этого и начинать... (Хотя там кажется файлик склад называется, но я бы ни за что не подумал, что это ограничение...)

Цитата
nordk пишет:
Пустой массив также говорит о том, что изменений не было.

Ну вот, вот этого тоже, собственно не хватало...
По Вашему описанию получается что пустой массив не ошибка. Но если все же "опасаться" таких случаев, то я бы все же назвал небольшим недочетом. Парадокс: с одной стороны у разработчиков все верно, но с другой из-за отсутствовшего описания данный класс был "черным ящиком". И если не учитывать этот самый пустой массив, то, чисто гипотетичеки можно нарваться на ошибку.
Ведь теперь с данным описанием Удачное сохранение проверяется так:
Код
         oErr:=oDocs:Run()
        if (!Empty(oErr))
          if (oErr[1][1])//случай с одним док.
            lResult:=.T.
          else
            lResult:=.F.
          endif
        else
          lResult:=.F.
        endif
Изменено: Саак Шахламджян - 15.01.2009 16:54:37
 
А еще, я думаю, дело в том, что в описании метода RUN сказано, что данный метод выполняет сохранение. Хотя теперь понимаю, что это не так.
Отсюда и пошли все неточности...

В приведенном случае я выполняю RUN, полагая, что он сохраняет, чего не происходит...
Изменено: Саак Шахламджян - 15.01.2009 17:12:21
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)