Имя: Пароль:
1C
 
Открытьформу из модуля документа (или как сделать непроведенным)
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С и ничего паралельно не запустится, не закроется и т.д
При Форма.Закрыть() -
Отжираются не все, а почти все ресурсы данной сессии, но только в том случае, ежели больше ничего не происходит.
Если паралельно происходит процесс отжирающий все ресурсы (Запись, проведение, настоящий цикл (выполнение процедуры)) - то этот процесс Форма.закрыть() тормозить не будет СОВСЕМ. Просто вход в процедуру ПриЗакрытии() будет отложен до завершения процесса.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший