|
Открытьформу из модуля документа (или как сделать непроведенным) | ☑ | ||
|---|---|---|---|---|
|
0
NS
04.08.05
✎
12:30
|
Как из Модуля документа, при непакетном проведении сделать проведенный документ непроведенным ????
|
|||
|
1
Diter
04.08.05
✎
12:31
|
Это ты спрашиваешь? Или это не тот NS, которого я знаю.....
|
|||
|
2
ДенисЧ
04.08.05
✎
12:31
|
Через обработку ожидания :-)
|
|||
|
3
Ёжик в тумане
04.08.05
✎
12:32
|
Ну вот, а ещё говорят, что птичий грипп на людей не действует..
|
|||
|
4
NS
04.08.05
✎
12:33
|
(1) Это тот NS.
Есно нужно сделать штатными средствами. Как делать понятно, я не так вопрос задал. я провожу из Формы документа методом провести, далее открытьФорму, Форма.Закрыть() Как КОРРЕКТНО проверить из формы обработки, что документ уже закрылся. Блокировка() предлагать не надо - она врет. |
|||
|
5
Валенок
04.08.05
✎
12:34
|
Зачем из модуля, ПриЗаписи() нельзя?
|
|||
|
6
ДенисЧ
04.08.05
✎
12:34
|
(4) Э... А, что, читать описание ОктрытьФорму() уже немодно?
|
|||
|
7
NS
04.08.05
✎
12:35
|
(4) Уже который день ложусь в три утра, встаю в восемь.
Голова не варит - вопрос не так формулирую... В модуле формы - Если Условие Тогда провести(); Иначе ОткрытьФорму(); Форма.Закрыть(0); КонецЕсли; .... Либо Если Условие Тогда провести(); Иначе Форма.Закрыть(0); КонецЕсли; а в процедуре приЗакрытии ОткрытьФорму() Но как мне красиво в этой обработке узнать, что док уже закрылся? |
|||
|
8
NS
04.08.05
✎
12:36
|
(6) И чего я там увижу?
|
|||
|
9
Diter
04.08.05
✎
12:37
|
(6) Ты на модальность намекаешь?
(4) Насколько я помню была такая ветка типа "как подожать пока отработает другая обработка и закроется". Решение - игра контекстами и "ПриПовторномОткрытии()" |
|||
|
10
ДенисЧ
04.08.05
✎
12:37
|
(8)
Замечание: Пока форма открыта, тип значения параметра <КонтекстФормы> равен 100, когда закрыта - 0. |
|||
|
11
NS
04.08.05
✎
12:37
|
(10) Я это знаю, что дальше?
|
|||
|
12
ДенисЧ
04.08.05
✎
12:38
|
(11) т.е. тебе это ни о чём не сказало? Мда. Ладно, сиди медитируй.
|
|||
|
13
NS
04.08.05
✎
12:40
|
Сижу медитирую... причем тут контекст открытой обработки - мне её проверять не надо, мне нужно проверить документ, её открывший.
Контекст документа я передать могу. А дальше что? |
|||
|
14
Ёжик в тумане
04.08.05
✎
12:43
|
(13) Расскажи лучше поподробнее про "Блокировка() предлагать не надо - она врет"
|
|||
|
15
NS
04.08.05
✎
13:02
|
(14) Объясню подробней.
Сейчас у меня сделано через Форма.ОбработкаОжидания() в форме обработки. Если в обработке написать даже цикл... (док - объект типа создатьОбъект, спозиционированный на нужном документе) Флаг=0; Пока Флаг=0 Цикл Флаг=1; Попытка Если Док.СделатьНеПроведенным(); Исключение Флаг=0; сообщить("Еще одна неудачная попытка"); КонецПопытки; КонецЦикла; то просто зацикливается... Если пишу - ТекДок.Блокировка(0) - возвращает 1 Если док.Блокировка(0) - возвращает 1 Если Блокировка() - возвращает 0 ;-) всё дело в том, что меня не устраивает пауза в секунду (Форма.ОбработкаОжидания()). |
|||
|
16
Ёжик в тумане
04.08.05
✎
13:10
|
(15) Мдяяя..
Во-первых, не совсем понятно, что есть ТекДок, и что есть Док. Во-вторых, если сделать ?(Док.Блокировка(1)=0,"Док заблокирован","Док свободен") - то что возвращает? |
|||
|
17
NS
04.08.05
✎
13:15
|
ТекДок - это переданный в обработку текущийДокумент()
Док=создатьобъект("Документ"); Док.НайтиДокумент(ТекДок); |
|||
|
18
lexa
04.08.05
✎
13:19
|
а если действительно через параметр передавать некий флаг, который будет обрабатываться
например в доке при закрытии будет повторно открывать фориу обработки а на следующий шаг цикла переходить в ПриПовторномОткрытии |
|||
|
19
NS
04.08.05
✎
13:22
|
В окне сообщений
ТекДок.Блокировка(0) 1 ТекДок.Блокировка() 0 ТекДок.Блокировка(1) 0 ТекДок.Блокировка(0) 1 ТекДок.Блокировка() 0 ТекДок.Блокировка(1) 0 ТекДок.Блокировка(0) 1 ТекДок.Блокировка() 0 ТекДок.Блокировка(1) 0 ТекДок.Блокировка(0) 1 Модуль обработки Процедура ПриОткрытии() СтатусВозврата(0); Текдок=Форма.Параметр; Док=создатьобъект("Документ"); Док.найтиДокумент(ТекДок); Флаг=0; Пока Флаг=0 Цикл Флаг=1; Попытка Док.Сделатьнепроведенным(); Исключение Флаг=0; Сообщить("Док.Блокировка(0) "+Док.Блокировка(0)); Сообщить("Док.Блокировка() "+Док.Блокировка()); Сообщить("Док.Блокировка(1) "+Док.Блокировка(1)); КонецПопытки; КонецЦикла; КонецПроцедуры Модуль документа (всё экперементальные куски) Процедура ЗаписатьИПровести() Если Выбран()=0 Тогда ПриЗаписиПерепроводить(0); Записать(); ПриЗаписиПерепроводить(1); КонецЕсли; Если проведен()=1 тогда Форма.Закрыть(0); ОткрытьФорму("Обработка.ИзменитьДокумент",ТекущийДокумент()); КонецЕсли; КонецПроцедуры |
|||
|
20
NS
04.08.05
✎
13:29
|
Неа.... Через ОткрытьФорму() обработки, из самой обработки - то же не получается, док всё равно блокирован.
(16) Мне это ничего не дает. Это не помогает убрать паузу в секунду, Даже если Блокировка(1) - правильно выдает 0... Плюс последующие релизы могут форма.ОбработкаОжидания() не поддерживать. Можно конечно использовать глобальную обработку ожидания... |
|||
|
21
NS
04.08.05
✎
13:40
|
Ладно, тема закрыта.
Пущай будет пауза. |
|||
|
22
NS
04.08.05
✎
13:44
|
Открываю ветку обратно - не нравится мне так...
|
|||
|
23
NS
04.08.05
✎
13:48
|
Сейчас модуль формы обработки примерно такой -
перем док; перем можнозакрыть; Процедура Выполнить() КонецПроцедуры Процедура СнятьПроведение() попытка Если Док.Проведен()=1 тогда док.сделатьнепроведенным(); КонецЕсли; можнозакрыть=1; исключение конецпопытки; Форма.Закрыть(0); док.провести(); Форма.ОбработкаОжидания("",0); ОткрытьФорму(Док.ТекущийДокумент()); КонецПроцедуры Процедура ПриОткрытии() Текдок=Форма.Параметр; Док=создатьобъект("Документ"); Док.найтиДокумент(ТекДок); Форма.ОбработкаОжидания("СнятьПроведение",1); КонецПроцедуры Процедура ПриЗакрытии() Если МожноЗакрыть=0 тогда СтатусВозврата(0); КонецЕсли; КонецПроцедуры МожноЗакрыть=0; |
|||
|
24
Ёжик в тумане
04.08.05
✎
13:58
|
Короче, достал ты меня.
Только что попробовал - да, документ остаётся заблокирован. А вот если работать с ним при закрытии обработки, то сперва он (документ) закрывается, а потом - сама обработка. Процедура ОбработкаПроведения() Если Проведен()=1 Тогда ОткрытьФорму("Обработка.Измена",ТекущийДокумент()); КонецЕсли; Сообщить("Конец проведения."); КонецПроцедуры * далее - модуль обработки Процедура ПриОткрытии() Форма.Закрыть(); КонецПроцедуры Процедура ПриЗакрытии() Документик=СоздатьОбъект("Документ"); Документик.НайтиДокумент(Форма.Параметр); Пока Документик.Блокировка(1)=0 Цикл Сообщить("Документ пока заблокирован."); КонецЦикла; Попытка Документик.СделатьНепроведенным(); Если Документик.Проведен()=1 Тогда Чушь=СоздатьОбъект("Чушь"); КонецЕсли; Сообщить("Документ сделан непроведёным."); Исключение Сообщить("Документ не сделан непроведёным."); КонецПопытки; КонецПроцедуры |
|||
|
25
Ёжик в тумане
04.08.05
✎
14:00
|
+24 в результате в окне сообщений вижу:
Конец проведения. Документ сделан непроведёным. |
|||
|
26
NS
04.08.05
✎
14:07
|
(24,25) Спасибо, точно. Через Форма.Закрыть()
Блин - нужно идти домой, выспаться, засыпаю на ходу... Вообще ничего не соображаю. Даже толком написать, чего хочу не могу... + А может быть такое, что всё-таки блокировка в призакрытии еще останется? |
|||
|
27
Ёжик в тумане
04.08.05
✎
14:14
|
(26) Сомневаюсь. Но если и останется - то ненадолго.
Просто команда ОткрытьФорму() считается выполненной после того, как форма открыта, а точнее - после того, как отработала ПП ПриОткрытии() этой формы. После того, как из процедуры ПриОткрытии произошёл возврат - выполнение возвращается в "первичный" модуль документа. Только что наблюдал это в отладчике. |
|||
|
28
NS
04.08.05
✎
14:20
|
(27) Прикольно то, что -
1) я сам рекомендовал на форумах через форма.Закрыть() 2) Ковырял это какое-то время назад дома (про блокировку оттуда знаю), и в итоге сделал через Форма.Закрыть() А сейчас, из-за аврала - вообще ничего не соображаю. Забываю, чего хотел сделать... И еще раз Огромное спасибо. |
|||
|
29
Ёжик в тумане
04.08.05
✎
14:25
|
(28) Ага. Иди отсыпайся. ;)
P.S. Если честно, то лично мне моя религия не позволяет делать проведённый документ не проведённым путём его проведения. =) |
|||
|
30
NS
04.08.05
✎
14:31
|
(29) А как иначе?
Доп. расходы на поступление вбиваются намного позже поступления и реализации товара (запаздывает информация) + информация искажена (дата доп расходов может быть больше даты реализации) Самый простой способ, при проведении - сделать документ непроведенным, поменять его позицию (поставить перед расходами), сообщить об этом пользователю, и перепровести расходы с партиями, связанными с документом. По уму нужно делать отдельную обработку для ввода расходов - но это дольше, а времени впритык. Аврал. |
|||
|
31
Ёжик в тумане
04.08.05
✎
14:46
|
Да, особенно интересно, как в таких случаях расчитывается наценка, поскольку получается, что на момент продажи ПОЛНАЯ себестоимость ещё неизвестна, а значит, теоретически при такой практике можно и в убыток продать.
|
|||
|
32
NS
04.08.05
✎
14:50
|
(31) С этим проблем нет. Ориентировочно затраты на тонну известны заранее.
Насчет цены продажи - тоже проблем нет - долго объяснять, но она в данном случае абсолютно не зависит от себестоимости - можно и в убыток продавать. Блин надо не забыть про запись проведенного документа, И что ГП нужно запоминать, и возвращать после всех действий обратно. |
|||
|
33
Ёжик в тумане
04.08.05
✎
15:00
|
(32) В принципе, при такой практике, IMHO, было бы рациональнее отказаться от расчёта остатков на позицию документа (отталкиваться от сводных), выкинуть последовательности, и просто перепроводить документы, двигавшие содержимое данной партии (и оперировать с датами уже не пришлось бы).
|
|||
|
34
NS
04.08.05
✎
15:32
|
(33) Ну не совсем так. Наценка по товарам и товарным группам считается, и она нужна, хотя продажная цена от себестоимости не зависит. ЕПросто эти цифры нужны не сразу, а только при составлении Упр. Баланса.
Последовательности тоже нужны, так как могут править приходы задним числом, а по ним движений много - долго перепроводить. А по доп. расходам движений мало (а если они прийдут до продажи, то совсем нет) - и перепроводить особо не нужно. Причем - при проведении доп. расходов - количество не меняется, и не меняется соответственно партии в реализации, то есть нужно перепроводить реализации только с данной партии, данным МОЛ-ом и данной фирмой. При изменении приходов - меняется распределение количества по партиям, меняются партии в реализациях, перемещениях и т.д. - в итоге необходимо перепроводить все документы по данному товару. От партионного учета отказываться нельзя. Невозможно будет строить отчеты (Импорт, товары в пути и т.д.) Плюс возможна закупка под конкретную реализацию - реализация должна брать себестоимость с той накладной. И есно партионный учет не чистое ФИФО, а ФИФО по МОЛ-ам с приоритетным выбором поставки(партии). |
|||
|
35
NS
04.08.05
✎
15:33
|
(+34) Есно насчет МОЛ-а я приврал. Реализации нужно перепроводить по данной партии и фирме(партия может быть перемещена на другой склад)
|
|||
|
36
NS
05.08.05
✎
12:01
|
(26,27) Бывает, Что не успевает форма закрыться. ;-)
Правде решается вопрос достаточно легко. |
|||
|
37
Юрикс
05.08.05
✎
12:26
|
ИМХО помогало что-то вроде
док.Удалить(0); док.СнятьПометкуУдаления(); |
|||
|
38
NS
05.08.05
✎
12:30
|
(37) Удалить(0) Работает с заблокированным документом?
|
|||
|
39
Юрикс
05.08.05
✎
12:34
|
(38) я видимо неправильно понял, что тебе нужно распровести другой документ
|
|||
|
40
NS
05.08.05
✎
12:37
|
(39) Мне нужно распровести документ в форме которого я нахожусь.
Вопрос давно уже снят. (раньше сделано было некрасиво - через Форма.ОбработкаОжидания() Теперь переделано под Форма.Закрыть() - есно всё это в распроводящей обработке) Я говорю о том, что после Форма.Закрыть() и перехода в ПриЗакрытии() обработки - Документ может быть еще блокирован. Но решается это легко через СтатусВозврата(0); Форма.Закрыть(0); Возврат; |
|||
|
41
Юрикс
05.08.05
✎
12:39
|
я делал возможность изменения даты проведенного документа, через обработку все нормально работало без задержек и т.д. Т.е. юзер менял дату, жал ОК и все. Кода к сожалению нет под рукой
|
|||
|
42
Юрикс
05.08.05
✎
12:40
|
(40) вроде бы так и делал :)
|
|||
|
43
Ёжик в тумане
05.08.05
✎
12:41
|
(40) А цикл не спасает?
|
|||
|
44
NS
05.08.05
✎
12:43
|
(43) Цикл подвештвает систему, и в момент выполнения цикла ничего кроме него не происходит. Все остальные действия останавливаются.
см. 15 (40) Есно в форме обработки, в ПриЗакрытии() При неудаче в СделатьНепроведенным() |
|||
|
45
Ёжик в тумане
05.08.05
✎
12:55
|
(44) По-моему, Форма.Закрыть() в процедуре ПриЗакрытии() - тот же цикл получается.
|
|||
|
46
NS
05.08.05
✎
13:01
|
(45) ИМХО нет. при форма.Закрыть() - возникает пауза...
(выставляется Флаг закрытия, но в процедуру приЗакрытии сразу не заходит) Но сейчас проверю точно. |
|||
|
47
NS
05.08.05
✎
13:07
|
Блин. А чего тут проверять.
Процедура ПриОткрытии() Форма.Закрыть(0); КонецПроцедуры Процедура ПриЗакрытии() СтатусВозврата(0); Форма.Закрыть(0); КонецПроцедуры При цикле - даже менюшки работают. |
|||
|
48
Ёжик в тумане
05.08.05
✎
13:21
|
(47) Да, прикольно.
Правда, всё равно процессор при этом занят на 100% |
|||
|
49
NS
05.08.05
✎
13:36
|
(48) Не у всех один проц.
Бывает гипертрейдинг. Процессор занят на 100% этой задачей, если нет других... Паралельно запусти еще одну обработку, например Процедура Сформировать() А=1; Пока 1=1 цикл сообщить(А); А=А+1; КонецЦикла; КонецПроцедуры |
|||
|
50
NS
05.08.05
✎
13:37
|
не то сказал - две таких обработки паралельно лучше -
перем к; Процедура ПриОткрытии() Форма.Закрыть(0); КонецПроцедуры Процедура ПриЗакрытии() к=к+1; Если к<1000 тогда сообщить(""+к+" "+ТекущееВремя()); СтатусВозврата(0); Форма.Закрыть(0); КонецЕсли; КонецПроцедуры к=0; |
|||
|
51
Ёжик в тумане
05.08.05
✎
13:42
|
Да это понятно всё.
Просто этот переход Закрыть()-ПриЗакрытии() точно так же жрёт ресурсы, как и обычный цикл. |
|||
|
52
NS
05.08.05
✎
14:14
|
(51) Что значит точно так-же?
При Цикле отжираются ВСЕ ресурсы данной сессии 1С и ничего паралельно не запустится, не закроется и т.д При Форма.Закрыть() - Отжираются не все, а почти все ресурсы данной сессии, но только в том случае, ежели больше ничего не происходит. Если паралельно происходит процесс отжирающий все ресурсы (Запись, проведение, настоящий цикл (выполнение процедуры)) - то этот процесс Форма.закрыть() тормозить не будет СОВСЕМ. Просто вход в процедуру ПриЗакрытии() будет отложен до завершения процесса. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |