Имя: Пароль:
1C
1C 7.7
v7: Отмена проведения в модуле документа
,
0 Масянька
 
14.04.17
14:57
День добрый!
Если проведенный документ изменить (заведомо с ошибкой), то вываливается сообщение об ошибке + сообщение, что док-т не проводится, НО сам док-т остается проведенным.
Почему?
ТиС (в данном случае - стандарт).
Спасибо.
1 АЛьФ
 
14.04.17
14:59
Транзакция?
2 Ёпрст
 
14.04.17
14:59
(0) А что не устраивает ?
3 Ёпрст
 
14.04.17
15:00
Документ просто при ошибке НЕ меняет своего исходного состояния
4 Ёпрст
 
14.04.17
15:00
так и должно быть
5 Масянька
 
14.04.17
15:01
(1) Да, нет там тран... короче.
(2) Логично, что должно отмениться проведение. Не?
6 Масянька
 
14.04.17
15:02
(3) При проведении проведенного: отмена проведения, новое проведение. Не?
7 АЛьФ
 
14.04.17
15:02
2(5) А куда же делась транзакция?
8 АЛьФ
 
14.04.17
15:03
2(6) Не.
9 Ёпрст
 
14.04.17
15:03
(6) Проведение - это всегда одна транзакция, которая не завершилась, что там унутри - фиолетово
10 Масянька
 
14.04.17
15:05
(7) Откуда я знаю.
Процедура ОбработкаПроведения(ВидыДвижений)
    
    // Проверка заполненности обязательных реквизитов.
       Если глВсеРеквизитыДокументаЗаполнены(Контекст,
        "Фирма,Склад,Валюта,Контрагент,Договор")=0 Тогда
        Возврат;
    КонецЕсли;
                  
    Если (Склад.РозничныйСклад = 1) Тогда
        глНеПроводить(Контекст,"Документ """+ глНазваниеДокументаВЖурнале(Контекст)+""" можно
        |оформлять только с оптового склада!");
        Возврат;
    КонецЕсли;

    // Проведение по регистрам оперативного учета.    
    Если (ПустоеЗначение(ВидыДвижений) = 1) ИЛИ (Найти(ВидыДвижений, "Регистр") <> 0) Тогда
        ПроведениеПоРегистрам();
11 Масянька
 
14.04.17
15:07
Ладно...
В модуле док-та - как отменить проведение?
12 АЛьФ
 
14.04.17
15:08
2(10) Так 1С сама транзакция открывает перед вызовом обработки проведения.
2(11) При проведении? Никак.
13 Злопчинский
 
14.04.17
15:09
(12) не, извернутьяс можно, но это некузявый вариант
14 АЛьФ
 
14.04.17
15:10
2(13) Не надо. Только еще больше ее запутаем.
15 Злопчинский
 
14.04.17
15:12
(11) какое проведение?

если нужно отменить текущее проведение - то или ошибкой или СтатусВозврата(0)

если отменить ранее выполненное проведение - это тогда "извне"

еще есть (но я никогда не использовал)

НеПроводитьДокумент();
Синтаксис:
НеПроводитьДокумент()
Назначение:
Отмена проведения документа.
Замечание:
Метод доступен только в Модуле документа в предопределенной процедуре ОбработкаПроведения.
Подробнее см. в документации, глава 'Работа с Документами'
16 Злопчинский
 
14.04.17
15:13
(11) в модуле проведения генеришь формексом асинхронное событие (?). Оно отрабатывает после окончания транзакции проведения (т.е. тпа как подписка на событие, у меня таких прилично). То есть когда сработает событие - ты уже будешь ВНЕ документа и можешь его распровести.
17 Масянька
 
14.04.17
15:15
(15) Еще раз: док-т проведен, открыли, изменили, ошибка, но док-т остается проведенным.
НеПроводить.. - не арбайтен.
18 Масянька
 
14.04.17
15:16
+ (17) А хочу, чтобы стал не проведенным. Вот.
19 Злопчинский
 
14.04.17
15:16
(17) ошибка - не зафиксировалась. документ был проведенным норм? был! остался норм.проведенным - да!
20 Злопчинский
 
14.04.17
15:16
(18) а я хочу мороженку лизнуть и еще кое что.. но - Пост...
21 Злопчинский
 
14.04.17
15:19
(18) По кнопке проведения - хватай ссылку на документ. документ закрывай программно. по ссылке - проводи.

Если мойМажорныйДокумент.Провести()=0 Тогда
  Если мойМажорныйДокумент.Проведен()=1 Тогда
      мойМажорныйДокумент.СделатьНепроведенным();
      ОткрытьФорму(мойМажорныйДокумент);
  КонецЕсли;
КонецВсемЕсли;
22 Ёпрст
 
14.04.17
15:40
Это какой-то неправильный мёд
Масяня, прекращай есть всякую гадость
23 Масянька
 
14.04.17
15:43
(22) Я мёд не люблю.
А гадость едят - пользователи. Причем, на мой взгляд, гадость абсолютно логичная.
24 Злопчинский
 
14.04.17
15:45
(23) Обоснуй насчет "логичная"
25 Это_mike
 
14.04.17
15:46
(22) может, она использует "ту" ложку? :-)
26 Злопчинский
 
14.04.17
15:47
(23) на основании текущего правильного документа вводи "корректировочны" - проводи его - если не провелся - (__.__)

проведение дока по сложившимся соглашениям - отражение свершившегося факта хоз.жизни.

то есть кто-то "мухлюет" отражая то чего не было а потом ой.. либо у вас очень специфический колумбийский м.б. конопляный мед.
27 Irbis
 
14.04.17
15:51
Логика автора реализуется путём насильной отмены проведения и повторным проведением. Нелогично давать править проведённый документ. Сначала отмена проведения, а потом редактирование.
28 Масянька
 
14.04.17
15:52
(24) А чего обосновывать?
(26) В таком случае - изначально нужно было запрещать проведение проведенного. От слов "совсем никак".
А насчет мухлевки - не надо мерять по себе.
29 Это_mike
 
14.04.17
15:52
(27) причем отмена не ПКМ-"отменить проведение", а бизнес-процессом, с аудиторским следом и всеми остальными причиндалами.
30 Это_mike
 
14.04.17
15:53
(28) вся рота идет не в ногу?
31 Злопчинский
 
14.04.17
15:54
(29) угу, так я про это и говорю когда про "корректировку"...
32 Злопчинский
 
14.04.17
15:55
(28) это у вас там мухлюют. а у мну отмена проведенного документа = форсмажор и голова по таким поводам не болит.

и чем (21) не устраивает?
33 Злопчинский
 
14.04.17
15:56
(30) у них там полуразвалившийся мост... поэтому все лазят как хотят наверное ;-)
34 Масянька
 
14.04.17
15:57
(30) (31) Забавно...
А когда расчетчик не правильно начислит ЗП (в меньшую сторону) - будете ждать следующей выплаты?
35 АЛьФ
 
14.04.17
15:57
2(28) Так и что же тебе мешает запретить проведение проведенного?
36 Это_mike
 
14.04.17
16:00
(34) почему? отмена. через соответсвующую процедуру. если ошибки редкие - то ничего страшного. а если частые - нужно что-то поправлять в консерватории
37 Злопчинский
 
14.04.17
16:11
(34) подожду. с возмещением задержки. и кучей гемора для конторы и расчетчика. ибо нехрен.
38 Злопчинский
 
14.04.17
16:12
(34) так в итоге - (21) - чем не подходит?
39 Масянька
 
14.04.17
16:13
(38) Костылем.
40 Злопчинский
 
14.04.17
16:19
(39) ну извините, если система у вас переломана - то тут только костылями.. или в больничку на излечение...
41 Злопчинский
 
14.04.17
16:19
ладно, скучно тут с нами, кремонами невменяемыми, борите дальше, я в спортзал мозги проветрить
42 Смотрящий
 
14.04.17
16:20
(0)Праvами заруби корректироvку проvеденного документа.
43 АЛьФ
 
14.04.17
16:20
А вот мне все же интересно что мешает запретить редактирование проведенного документа и требовать отмену проведения перед редактированием?
44 Irbis
 
14.04.17
16:25
(43)Религия
45 Масянька
 
14.04.17
16:28
(42) Зачем? Человеческий фактор никто (пока) не отменял.
(43) При открытии док-та спрашивать: "Просто посмотреть или будете ломать?" :)
46 Irbis
 
14.04.17
16:30
(45) Нет. Проведённые документы открываются только на просмотр.
47 Смотрящий
 
14.04.17
16:55
(45) Глюпая. Так ответственность на тебе, что порождает ветки типа этой (и юзера будут включать дурака); а сяк - юзер распровел док, вся ответственность на нем. Вон у Злопа ваще форсмажор.
48 Масянька
 
14.04.17
17:07
(47) В данном случае: с юзерами полное взаимопонимание (сама поражаюсь :) ).
И мне вот все же интересно - что мешает при перепроведении сделать отмена проведения и провести по новой? Как я понимаю - вопрос риторический :)
А по поводу форс-мажоров - опять-таки, в данном случае не возникают (сама поражаюсь :) ).
49 NSSerg
 
14.04.17
17:08
Как всё запущено.
СтатусВОзврата(0); пропущен.

Процедура ОбработкаПроведения(ВидыДвижений)
    
    // Проверка заполненности обязательных реквизитов.

       Если глВсеРеквизитыДокументаЗаполнены(Контекст,
        "Фирма,Склад,Валюта,Контрагент,Договор")=0 Тогда

   // NS
   // Тут либо глНеПроводить() по аналогии с кодом ниже
   // А в глНеПроводить написано Статусвозврата(0);
   // Либо прямо написать
        Статусвозврата(0);  
        Возврат;
  // Но естественно если документ был проведен, то просто
  // будет отменена транзакция, а документ останется проведенным
    КонецЕсли;
                  
    Если (Склад.РозничныйСклад = 1) Тогда
        глНеПроводить(Контекст,"Документ """+ глНазваниеДокументаВЖурнале(Контекст)+""" можно
        |оформлять только с оптового склада!");
        Возврат;
    КонецЕсли;
50 Это_mike
 
14.04.17
17:10
(40) думаешь, это излечимо?
51 NSSerg
 
14.04.17
17:11
Виноват, скорей всего в глВсеРеквизитыЗаполнены() есть глНеПроводить()
Так что всё нормально, ветку можно закрывать.
(48) Кому мешает?
52 Масянька
 
14.04.17
17:14
(51)
Процедура глНеПроводить(Конт,Сообщение) Экспорт

    СтатусВозврата(0);  
    глСообщениеПроведения(Сообщение, Конт.ТекущийДокумент(), 1,,1);
    глСообщениеПроведения("Документ не проводится!", Конт.ТекущийДокумент(), 1,,1);
    глПоказатьТрассировку(глСообщенияТрассировки);  
    глСообщенияТрассировки = 0;
КонецПроцедуры // глНеПроводить()

Функция глВсеРеквизитыДокументаЗаполнены(Конт,СписокРеквизитов) Экспорт
    
    Если Константа.РазрешитьПроводитьБудущейДатой = 0 Тогда
        Если Конт.ДатаДок>РабочаяДата() Тогда
            глНеПроводить(Конт,"Нельзя проводить документ будущей датой!");
            Возврат (0);
        КонецЕсли;                                            
    КонецЕсли;    
                
    Пока СтрДлина(СписокРеквизитов)>0 Цикл
        ПозЗапятой = Найти (СписокРеквизитов,",");
        Если ПозЗапятой = 0 Тогда
            ИдентРеквизита = СписокРеквизитов;
            СписокРеквизитов = "";
        Иначе
            ИдентРеквизита = Сред(СписокРеквизитов,1,ПозЗапятой-1);
            СписокРеквизитов = Сред(СписокРеквизитов,ПозЗапятой+1);
        КонецЕсли;
        Если ПустоеЗначение(Конт.ПолучитьАтрибут(ИдентРеквизита))=1 Тогда
            ВидДок = Конт.Вид();
            Если Метаданные.Документ(ВидДок).РеквизитШапки(ИдентРеквизита).Выбран()=1 Тогда
                Объект = Метаданные.Документ(ВидДок).РеквизитШапки(ИдентРеквизита);    
                
            ИначеЕсли Метаданные.ОбщийРеквизитДокумента(ИдентРеквизита).Выбран()=1 Тогда
                Объект = Метаданные.ОбщийРеквизитДокумента(ИдентРеквизита);
                
            ИначеЕсли Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита).Выбран()=1 Тогда
                Объект = Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ИдентРеквизита);
                
            Иначе
                глНеПроводить(Конт,"ВсеРеквизитыДокументаЗаполнены(): Неверный реквизит:"+ИдентРеквизита);
                Возврат (0);
            КонецЕсли;
            ПредставлениеРеквизита = ?(ПустоеЗначение(Объект.Синоним)=0,Объект.Синоним,Объект.Идентификатор);
            глНеПроводить(Конт,"Не заполнен реквизит """+ПредставлениеРеквизита+"""");
            Возврат (0);
        КонецЕсли;
    КонецЦикла;
    
    Возврат (1);
    
КонецФункции // глВсеРеквизитыДокументаЗаполнены()

Ткни - где отмена проведения?
53 NSSerg
 
14.04.17
17:17
(52) Тыкаю - статусвозврата(0) видишь?

И про какую отмену проведения идет речь?

Ты хочешь чтоб при перепроведении документа с ошибкой он становился непроведенным? Это уже не ко мне.
54 Масянька
 
14.04.17
17:18
(53) А зачем пришел?
55 NSSerg
 
14.04.17
17:22
(54) Ну если уж заставляешь ответить - ИМХО за тем же за чем и остальные пришли. Посмотреть на очередную клоунаду.

Если у тебя при перепроведении документа с ошибками он будет становиться непроведенным - то ты потом концов не сыщешь.
56 Масянька
 
14.04.17
17:26
(55) То есть - если отменить проведение - с концами всё норм будет?
57 Смотрящий
 
14.04.17
17:33
С концами и так все норм
58 АЛьФ
 
14.04.17
17:38
2(56) Есть три осмысленных действия с документом:
- проведение
- отмена проведения
- перепроведение
Это абсолютно разные действия.
Ты хочешь, чтобы одно из действий вело себя, как составное из двух других. Так возьми и реализуй четвертое действие, которое будет состоять из двух транзакций: сначала отмена проведения, а потом проведение.
59 Масянька
 
14.04.17
17:39
(58) Расскажи, что происходит при перепроведении.
60 X Leshiy
 
14.04.17
17:42
(59) При перепроведении отмена и проведение в одной транзакции. Естественно, что при ошибке откатывает назад.
61 Масянька
 
14.04.17
17:44
(60) То бишь все-таки - оно составное?
62 X Leshiy
 
14.04.17
17:46
Да без разницы.

Хоть пятисоставное, хоть десяти.

Начинается транзакция, происходит всякое, если ошибка на любом этапе, откатывает назад.
63 АЛьФ
 
14.04.17
17:49
2(59) При перепроведении происходит перепроведение. Это единый процесс.
64 АЛьФ
 
14.04.17
17:51
2(61) Единое.
65 NSSerg
 
14.04.17
21:39
(56) да, если отмена проведения будет происходить при отмене проведения - с концами будет всё ок.