Подождите Вы как-то смешиваете все.
Если наряд задания и ПСН это одно.
Если производственные заказы и ПСН это другое.
Для создания ПСН Вам по сути нужен механизм разузлования, по которому Вы собственно и сможете программно создавать свою ПСН.
Я правильно понимаю - Вас интересует функция, которая сделает разузлование ?
В случае наряд-задание - разузлование уже сделано причем пооперационное. И мы берем оттуда.
В случае производственных заказов - просто делается разузлование по заказу и формируется ПСН.
Наверное, именно она интересует. Даже не знаю.
Скорее даже интересует создание_собственного/изменение_существующего механизма разузлования.
Механизм посмотрю но делать свой не стоит.
Можете сразу весь модуль свой писать.
Это точно также как не стоит самому стремится работать
с остатками на складе и так далее.
Основнополагающие механизмы надо брать из БЭСТа, чтобы
потом не искать причину расхождения в таблицах.
Тем более что Ваши уверения об ошибках будут проверять на
демобазе и там они могут не подтвердится.
Механизм посмотрю но делать свой не стоит.
Можете сразу весь модуль свой писать.
Это точно также как не стоит самому стремится работать
с остатками на складе и так далее.
Основнополагающие механизмы надо брать из БЭСТа, чтобы
потом не искать причину расхождения в таблицах.
Тем более что Ваши уверения об ошибках будут проверять на
демобазе и там они могут не подтвердится.
По поводу ошибки я код привел и он как раз для демо базы. С остатками, думаю конечно будет перегиб самому работать. Писать свой модуль, наверное, просто физически почти невозможно. Почитал то, что есть в СП11. Думаю, что стоит на F8 поставить свою обработку и всё. Хотя, не очень-то это и надежно.
Я в параметрах AddRow() не вижу возможности задать цену и/или сумму цены отпускной (CenaOut, SumOut). А они нужны!
Скорее всего там нет такого параметра.
Такой параметр есть в классе ScladRow, например, параметр SumFact - фактическая сумма товара... И через DATA ROWS (массив) класса ScladDoc можно получить доступ к цене конкретной строки документа...
Саак Шахламджян пишет:
Такой параметр есть в классе 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)
//заметьте тут нужно знать к какому элементу массива 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 товара...
Т.е. для кода, приведенного выше будет так:
Спасибо! Работает. Причем НДС и т.д. похоже сам считает. Осталось разобраться с нумерацией...
Для нумерации есть функция WDOC. Правда с ключем уникальности я толком не разобрался. Написал еще свою WDOC1 "для надежности", на боевой машине проблем не было. А потом как оказалось, что одинаковые номеру могут быть, просто вид документов д.б. разный, я был не в курсе. Лично по мне все равно как-то не удобно...
Вот тема:
WDOC-нумерация
К стати бОльшие проблемы и волнения у меня возникали по поводу того, что не возвращается код ошибки (кажется вообще никогда), я от nordik так и не смог добиться помощи, сделал проверку на наличие/отсутсвие ошибки (причина останется неизвестной), да и то, собственно косвено. Код где-то выше есть.
Саак Шахламджян пишет:
Для нумерации есть функция WDOC.
На старом форуме еще обсуждалась функция NewNumDoc. Правда применяли ее там для БЭСТ4. Вы про WDOC откуда узнали? Интересно для каких случаев лучше применять NewNumDoc, а для каких WDOC?
Есил это он, туда аписывается результат исполнения. Как раз то, о чем я долбал тут довольно долго...
При возникновении ошибки туда нч не запис...
Описание массива есть в исходниках. 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 пишет:
Контроль номера это локальная задача Вашего плагина.
Не вешайте это на объект.
Объект увидев номер переходит в режим редактирования и позволяет дополнять Ваш документ новыми строками.
Я что-то совсем не понял.
Какой еще режим редактирования? Вообще ничего не происходит при существовании такого же номера, понимаете? НИЧЕГО. Нуль эмоций, никаких признаков действий или чего-либо еще...
У МЕНЯ в плагине происходит.
Есть возможность ADDROW(). И при редактировании документа
мы добавляем в существующий документ строки в нашем плагине.
Мы планируем в перспективе задачу удаления строки получить от КБ. Но так или иначе работа с документом это не только его создание.
nordk пишет:
У МЕНЯ в плагине происходит.
Есть возможность ADDROW(). И при редактировании документа
мы добавляем в существующий документ строки в нашем плагине.
Мы планируем в перспективе задачу удаления строки получить от КБ. Но так или иначе работа с документом это не только его создание.
Очень интересно у Вас, значит происходит, а у меня значит нет. Позвольте полюбопытсвовать кусочек кода и что у вас в таблице в этот момент!?
Я свой код приводил здесь и не раз. При котором НИЧЕГО не происходит...
Дак все правильно !!!!
Записей и не должно прибавиться - она уже есть !!!!
Программа открыла документ на редактирование.
Обнаружила что запись такая есть.
Никаких изменений нет - делать ничего не надо.
А вот если Вы измените содержимое - посмотрите
А вот и нет!!!
Во-первых. Перед повторным запуском поменяйте содержимое. Результат будет тотже самый!!!
Во-вторых. Даже если и так, почему нет "сообщения" об ошибке в oErr, возвращаемым методом Run? Тем более, что было бы "по здравому" смыслу его выдавать! Например, с сообщением, что такой номер уже есть....
Повторяю еще раз мы уже задачу сдали и ОНА РАБОТАЕТ у клиента.
Во вторых - это не ошибка.
И там ничего и не должно быть
nordk пишет:
Повторяю еще раз мы уже задачу сдали и ОНА РАБОТАЕТ у клиента.Во вторых - это не ошибка.И там ничего и не должно быть
Ну, , тогда объясните пожалуйста это:
Цитата
Метод RUN() возвращает массив, каждый элемент которого описывает результат попытки сохранения документа:
{lResult,::NNoper,::Sclad,::Vid,::Type,::TypeEx,::Date,::CodeDoc,::NumDoc, nRecNo}
Цитата из описания объектов склада.
Скажите мне внятно, ТОЧНО и ДОСТОВЕРНО что именно и когда возвращает RUN!?
Точно и достоверно пока на сегодня можно сказать
что RUN должен отражать результат работы с документом.
КРоме перечисленных Вами свойств, там добавилось в последнем пакете еще и свойство Cargo.
У нас в плагине RUN возвращает информацию всегда.
Но мы импользуем это в товарах в расходе !!!!
Даже принципы работы с приходом и расходом в товарах разные.
А Вы вообще в производстве делаете.
Пустой массив также говорит о том, что изменений не было.
Вообще по логике вещей менять шапку через AddDoc()
наверно все-таки некорректно. Добавлять информацию в
состав документа наверно единственная причина его повторного применения. Но в этом случае на ADDROW()
в массив ничего не должно писаться.
Отдельные виды движения с пустым массивом при повторном создании документа будем смотреть,
но к контролю номера документа средствами объекта это никакого отношения иметь не будет.
Хотите создавать свой номер - контролируйте в коде своей программы самостоятельно. Хотите доверить номер объекту,
тогда не надо туда в нумерацию ничего писать.
Для корректировки документов есть планы развития работы с объектом "накладная" и тут разработка будет и дальше двигаться.
Саак в дополнение хочу сказать.
Кое-что из Ваших рассуждений было почерпнуто.
Планируется работа по улучшению работы с объектом, но надо все не спеша взвесить.
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
А еще, я думаю, дело в том, что в описании метода RUN сказано, что данный метод выполняет сохранение. Хотя теперь понимаю, что это не так.
Отсюда и пошли все неточности...
В приведенном случае я выполняю RUN, полагая, что он сохраняет, чего не происходит...