Имя: Пароль:
1C
 
Отмена проведения открытого документа
,
0 Bagirius
 
16.10.06
20:33
Я открываю документ и прямо из формы хочу снять проведение. Функция СделатьНеПроведенным() не приемлема, т.к. документ заблокирован
Делаю так.
Есть у меня Обработка, которая снимает с проведения документ, переданный как Форма.Параметр.
Т.е. Открываю из документа эту обработку и закрываю документ (Форма.Закрыть()).
а когда обработка пытается отменить проведение выдает что Документ заблокирован.
Как его отблокировать?
1 Стрелок
 
16.10.06
20:34
через попытку и обработку ожидания
2 Bagirius
 
16.10.06
20:34
+ (0) ну и потом обработка открывает опять форму документа
3 Bagirius
 
16.10.06
20:36
(1) Так я один в базе, никто не блокирут кроме меня документы
4 shura
 
16.10.06
20:36
5 Стрелок
 
16.10.06
20:44
(3) ты и блокируешь
6 Bagirius
 
16.10.06
20:45
(4) Там как-то замудрено.
Мне всего лиши надо разблокировать документ, который я закрыл как Форма.Закрыть()
7 Bagirius
 
16.10.06
20:46
(5) Сообщить(Док.Блокировка()) выдает 0
8 Стрелок
 
16.10.06
20:51
(7) поверь мне на слово - ты блокируешь документ. он не успевает закрыться. ещё раз - в обработке твоей поставь попытка исключение в процедуре, которая вызывается через обработку ожидания. а можно и просто в цикле до тех пор пока документ не распроведётся
9 Bagirius
 
16.10.06
21:12
(8) Может я не правильно обработку вызываю из документа
ОткрытьФорму("Обработка.ПровестиКак",ТЗ);
Форма.Закрыть();

Но цикл моя зациклился.
В обработке я написал:

Пока Док.Проведен()=1 Цикл
А=А+1;
Попытка
 Док.СделатьНеПроведенным();
Исключение
КонецПопытки;
Состояние(А);
КонецЦикла;

Уже А = 500000 :-(
10 Стрелок
 
16.10.06
21:16
(9) поменяй местами операторы в 9
11 Bagirius
 
16.10.06
21:17
(10) Если ты имешь ввиду:
Форма.Закрыть();
ОткрытьФорму("Обработка.ПровестиКак",ТЗ);

То тоже самое
12 у лю 427
 
16.10.06
21:26
подождать немного надо в обработке...
13 Bagirius
 
16.10.06
21:28
(12) День?
Я ждал минут 10
Счетчик зашкалил за 1 000 000
14 Bagirius
 
16.10.06
21:28
Короче хрень какая то, не могу понять в чем проблема, уже кони берут
15 Стрелок
 
16.10.06
21:32
(11) Давай процедуру Приоткрытии обработки
16 Bagirius
 
16.10.06
21:38
(15)
ТЗ - Это таблица значений

Процедура ПриОткрытии()    
   ТЗ.Загрузить(Форма.Параметр);
   Если ТЗ.КоличествоСтрок()=0 Тогда
       Предупреждение("Документ не имеет строк товара");
       СтатусВозврата(0);
       Возврат;
   Иначе        
       Док.НайтиДокумент(ТЗ.ПолучитьЗначение(1,"Док"));
               А=0;
       Пока Док.Проведен()=1 Цикл
           А=А+1;
           Попытка
               Док.СделатьНеПроведенным();                        Исключение
           КонецПопытки;
           Состояние(А);
       КонецЦикла;
               
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;        
КонецПроцедуры
17 Стрелок
 
16.10.06
21:39
(16) а ты уверен что документ находится?

покажи процедуру как ты передаёшь (заполняешь) ТЗ в документе
18 Bagirius
 
16.10.06
21:40
(17)
Находит я проверял через Сообщить()
Вот ТЗ

ТЗ=СоздатьОбъект("ТаблицаЗначений");
       ТЗ.НоваяКолонка("Док","Документ");
       ТЗ.НоваяКолонка("Фирма","Справочник.Фирмы");
       ТЗ.НоваяКолонка("Склад","Справочник.МестаХранеия");
       ТЗ.НоваяКолонка("Клиент","Справочник.Контрагенты");
       ТЗ.НоваяКолонка("Основание","Строка",50);
       ТЗ.НоваяКолонка("КЦ","Перечисление.ТипыРасхЦен");
       ТЗ.НоваяКолонка("Скидка","Число",5,1);
       ТЗ.НоваяКолонка("СР","Число",3,0);
       ТЗ.НоваяКолонка("Сотрудник","Справочник.Сотрудники");
       ТЗ.НоваяКолонка("Товар","Справочник.Номенклатура");
       ТЗ.НоваяКолонка("Кол","Число",10);
       ТЗ.НоваяКолонка("Цена","Число",15,2);
       ВыбратьСтроки();
       Пока ПолучитьСтроку()=1 Цикл
           ТЗ.НоваяСтрока();
           ТЗ.Док=ТекущийДокумент();
           ТЗ.Фирма=Фирма;
           ТЗ.Склад=Склад;
           ТЗ.Клиент=Клиент;
           ТЗ.Основание=Основание;
           ТЗ.КЦ=ТипЦен;
           ТЗ.Скидка=Скидка;
           ТЗ.СР=СрокРезервирования;
           ТЗ.Сотрудник=СчетВыписал;
           ТЗ.Товар=Товар;
           ТЗ.Кол=Количество;
           ТЗ.Цена=Цена;        
       КонецЦикла;
19 Стрелок
 
16.10.06
21:41
и ещё - где создание объекта "Док"? чсего то не увидел?
20 Bagirius
 
16.10.06
21:41
+(1)
ну и потом

Форма.Закрыть(0);
ОткрытьФорму("Обработка.ПровестиКак",ТЗ);
21 Bagirius
 
16.10.06
21:42
Док как переменная во всей обработке
Перем Док;
и в самом нузу
Док=СоздатьОбъект("Документ.СчетТ");
22 Лефмихалыч
 
16.10.06
21:43
А давайте спросим у автора, зачем ему этот велосипед! Может он просто не знает про расчет регистров или еще про что-нить?...
23 Стрелок
 
16.10.06
21:43
(21) ТЗ тоже в теле модуля объявлено?
24 Bagirius
 
16.10.06
21:44
(23) Да
25 Стрелок
 
16.10.06
21:44
систему отпусти - поставь через обработку ожидания
26 Bagirius
 
16.10.06
21:47
(25)
Написал так
Пока Док.Проведен()=1 Цикл
А=А+1;
Попытка
ОбработкаОжидания(Док.СделатьНеПроведенным(),1);
Исключение
КонецПопытки;
Состояние(А);
КонецЦикла;

таже хрень :-(
27 Лефмихалыч
 
16.10.06
21:50
Кстати, контекст формы не всегда очищается после вызова форма::закрыть(). Тут надо бы ЖКК покурить, но чудится мне, что контекст сразу чистится только если вызван СтатусВозврата(0) в ПриОткрытии().
Но может, мне это только чудится
28 Стрелок
 
16.10.06
21:51
(26) не парь мозги... иди по ссылке
29 Bagirius
 
16.10.06
21:52
(22) Мне надо, что бы именно этот документ, СчетТ был всегда на рабочую дату. Т.е. если редактируют документ созданный вчера, то при проведении он сначала снимается с проведения, потом меняется его дата, сохраняется и проводится текущей датой.
30 Bagirius
 
16.10.06
21:52
Сделал как в ссылке, тоже самое. Что то я не так вызываю из документа явно.
31 Стрелок
 
16.10.06
21:52
(29) а если на основании счёта вчера была введена накладная? дурацкая метода
32 Стрелок
 
16.10.06
21:53
(30) значит руки+мозги
33 Bagirius
 
16.10.06
21:54
+ (29) Короче для тупых пользователей, для которых Сделать руками не проведенным документ сложно, и потом поменять дату и перепровести
34 Bagirius
 
16.10.06
21:55
(31) если есть расходные по счету, то создается новый счет, а тот снимается из резерва полностью.
Короче это все прописано в обработке и работает, а вот если резерв не использовался, то надо док-т перекинуть, а у меня стопор :-(
35 Vippi
 
16.10.06
22:06
(0) При использовании эмуляции внешнего события (0) легко решается.
36 Bagirius
 
16.10.06
22:10
(35) А это как?
37 Vippi
 
16.10.06
22:11
(36) Использование ВК религия допускает?
38 Bagirius
 
16.10.06
22:12
(37) ???
39 Лефмихалыч
 
16.10.06
22:13
(29) лучше сразу яду 100 грамм...
Используй ввод одного счета на основании другого и там проверки поставь на то, о чем Стрелок в (31) говорит. А свою методу с отменой проведения убери куда-нить подальше...
40 Bagirius
 
16.10.06
22:13
Если ВнешниеКомпоненты - то ДА
41 Vippi
 
16.10.06
22:14
(38) Использование внешних компонент допускаешь в своей работе?
А то отдельные товарисчи будут сутками лепить то, что при помощи ВК уложится в три строчки.
42 Bagirius
 
16.10.06
22:15
(41) Да
43 Vippi
 
16.10.06
22:19
(40) FormEx
В модуле формы документа.
Процедура СделатьНеПроведенным0()
глТекДок=ТекущийДокумент();    //глобальная переменная
Форма.Закрыть();    
Сервис.ВнешнееСобытие("СделатьНеПроведенным","","");    
КонецПроцедуры

В глобальном модуле.
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
Если Источник="СделатьНеПроведенным" Тогда
   Д=СоздатьОбъект("Документ");
   Если Д.НайтиДокумент(ТекДок)=1 Тогда
       Д.СделатьНепроведенным();
       ОткрытьФорму(ТекДок);
   КонецЕсли;
КонецЕсли;  
КонецПроцедуры    

В силу асинхронности внешнего события, работает гарантировано.
Не хочешь FormEx, у romix'а есть эмуляция внешнего события. А хочешь свою ВК под это дело нарисуй. Дело пяти минут.
44 Vippi
 
16.10.06
22:21
(43+) В проц. глобальника поменяй ТекДок на глТекДок.
ОписАлся.
45 Bagirius
 
16.10.06
22:29
(43)
Если Д.НайтиДокумент(глТекДок)=1 Тогда
{Глобальный модуль(1080)}: Недопустимая операция

Я в ГлМодуле
сначало создаю Перем глТекДок
потом глТекДок=создатьОбъект("Документ");
так же?
46 Vippi
 
16.10.06
22:33
(45) Не так.
В глобальнике.

Перем глТекДок Экспорт;

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
Если Источник="СделатьНеПроведенным" Тогда
   Д=СоздатьОбъект("Документ");
   Если Д.НайтиДокумент(глТекДок)=1 Тогда
       Д.СделатьНепроведенным();
       ОткрытьФорму(глТекДок);
   КонецЕсли;
КонецЕсли;  
КонецПроцедуры
47 Bagirius
 
16.10.06
22:35
(46) СПАСИБО ТЕБЕ БОЛЬШОЕ!!!
ВСЕ ПОЛУЧИЛОСЬ.
УРА-УРА-УРА
48 Vippi
 
16.10.06
22:40
(47) Использование эмуляции внешнего события спасает во многих случаях (так же, как вообще использование ВК).
ЗЫ. Ща поборники "штатных" средств навалятся.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.