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