Имя: Пароль:
1C
1С v8
Странно отрабатывает "Проведен"
0 Nillos
 
10.10.19
17:23
Почему, Если отменить проведенный документ, при проверке на Документ.Проведен выдает Истину?

Процедура ОбработкаПроведения(Отказ, Режим)
     Если ЭтотОбъект.Проведен Тогда Отказ = Истина; КонецЕсли;
КонецПроцедуры

Отменил проведение, Документ в статусе "Записан" (Без галочки), пытаюсь провести снова, выдает ошибку (Отказ).
Ведь документ не проведен по идее.
1 Волшебник
 
10.10.19
17:24
Убери эту строчку. Дай ему нормально провестись повторно.
2 dka80
 
10.10.19
17:28
При записи с проведением, кроме обычных действий, выполняемых при записи, выполняется установка значения Истина в поле Проведен и вызов обработчика ОбработкаПроведения().
Т.е сначала устанавливается признак, а потом обработка проведения
https://its.1c.ru/db/metod8dev#content:2713:hdoc
3 hhhh
 
10.10.19
17:28
(0) ты не поверишь, сначала заполняется поле Проведен, а потом уже запускается ОбработкаПроведения(). Поэтому твой метод не прокатит.
4 RomanYS
 
10.10.19
17:30
(0) проверяй ПередЗаписью или в обработке проверки заполнения (только для проведения из форм)
5 Nillos
 
10.10.19
17:30
(1) При проведении у меся списывается оборудование со склада. если повторно провести, то оно спишется еще на одну позицию. И так можно списать одним проведенным документом весь склад. Поэтому и хочу ограничить повторное проведение.
6 dka80
 
10.10.19
17:32
(5) эээ как бы логика хромает. При отмене проведения движения не отменяются что ли? Я бы над логикой подумал сначала
7 RomanYS
 
10.10.19
17:34
(5) оригинально. Поставь флаг очищать движения
8 Nillos
 
10.10.19
17:37
(6) При отмене проведения, движения очищаются. Дело в другом. Если документ проведен и перепровести его ещё раз, то оборудование списывается со склада и так до бесконечности, пока оборудование не закончится.
9 dka80
 
10.10.19
17:39
(8) значит не очищаются. Посмотри твой регистр накопления
10 Nillos
 
10.10.19
17:40
Вот код:
Просто документ записывает не в один регистр. При отмене проведения один регистр очищается, второй нет.


Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.РСЗаявки.Записывать = Истина;
    Движение = Движения.РСЗаявки.Добавить();
    Движение.Статус = Статус;
    Движение.Мастер = Мастер;
    Движение.ДатаВыполнения = ДатаВыполнения;
    Движение.Комментарий = Комментарий;    
    Движение.Период = Дата;

    
    Если Статус = Перечисления.СтатусЗаказа.Выполнен Тогда
        
         
        Для Каждого    Строка Из Оборудование Цикл      
            Запрос = Новый Запрос;
            Запрос.Текст =
                    "ВЫБРАТЬ
                    |    РНСкладаМонтажниковОстатки.Монтажник КАК Монтажник,
                    |    РНСкладаМонтажниковОстатки.Оборудование КАК Оборудование,
                    |    РНСкладаМонтажниковОстатки.КоличествоОстаток КАК КоличествоОстаток,
                    |    РНСкладаМонтажниковОстатки.ЦенаОстаток КАК Цена,
                    |    РегистрНЗакупок.ЗакупочнаяЦена КАК ЗакупочнаяЦена
                    |ИЗ
                    |    РегистрНакопления.РНСкладаМонтажников.Остатки КАК РНСкладаМонтажниковОстатки,
                    |    РегистрНакопления.РегистрНЗакупок КАК РегистрНЗакупок
                    |ГДЕ
                    |    РНСкладаМонтажниковОстатки.Оборудование = &Оборудование
                    |    И РНСкладаМонтажниковОстатки.Монтажник = &Монтажник
                    |    И РегистрНЗакупок.Оборудование = &Оборудование";
            
            Запрос.УстановитьПараметр("Оборудование", Строка.Оборудование);               
            Запрос.УстановитьПараметр("Монтажник", Мастер);  
            Выборка = Запрос.Выполнить();    
            
            Если Выборка.Пустой() Тогда                                        
                Сообщить(Строка.Оборудование.Наименование + " нет на складе " + Мастер);
                Отказ = Истина; Возврат;
            Иначе
                Выборка = Запрос.Выполнить().Выгрузить();    
            КонецЕсли;
            
            КоличествоСпис = Строка.Количество;              // Списываемое количество
            Для Нмр = 0 По (Выборка.Количество()-1) Цикл
                СтрВыборка = Выборка.Получить(Нмр);
                СтрВыборкаКол_во = СтрВыборка.КоличествоОстаток; // Остаок на складе
                            
                Если СтрВыборкаКол_во >= КоличествоСпис И СтрВыборкаКол_во > 0 Тогда  
                    
                    //РС УстановленноеОборудование
                    Движения.РСУстановленноеОборудование.Записывать = Истина;
                    Движение = Движения.РСУстановленноеОборудование.Добавить();     
                    Движение.Мастер = Мастер;
                    Движение.ДатаВыполнения = ДатаВыполнения;
                    Движение.Оборудование = СтрВыборка.Оборудование;
                    Движение.Количество = КоличествоСпис;
                    Движение.ЦенаПродажи = СтрВыборка.Цена;
                    Движение.ЦенаЗакупочная = СтрВыборка.ЗакупочнаяЦена;
                    Движение.Период = Дата;

                    
                    //Расход со склада монтажника
                    Движения.РНСкладаМонтажников.Записывать = Истина;
                    Движение = Движения.РНСкладаМонтажников.Добавить();
                    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                    Движение.Период = Дата;
                    Движение.Монтажник = Мастер;
                    Движение.Оборудование = СтрВыборка.Оборудование;
                    Движение.ДатаПеремещения = Дата;
                    Движение.Количество = КоличествоСпис;
                    Движение.СоСклада = Ссылка;
                    Прервать;    
                    
                    Сообщить("Оборудование списано со склада  " + Мастер);
                    
                Иначе
                    
                    НеХватает = КоличествоСпис - СтрВыборкаКол_во;
                    Сообщить("Для списания оборудования не хватает " + Строка.Оборудование + " в количестве " + НеХватает + " шт!");
                    Отказ = Истина; Возврат;    
                КонецЕсли;
                
            КонецЦикла;
        КонецЦикла;            
            
    КонецЕсли;    
    
КонецПроцедуры

&НаКлиенте
Процедура ПриЗаписи(Отказ)
    Оповестить("ОбновлениеОтчетов", "Обновить", "Заявки");
    Если ЭтотОбъект.Ссылка.ПолучитьОбъект().Проведен Тогда
        Отказ = Истина;
        Сообщение("Для повторного проведения необходимо сначала снять документ с проведения"); Возврат; КонецЕсли;
КонецПроцедуры
11 3achem
 
10.10.19
17:40
(5) уволен
12 RomanYS
 
10.10.19
17:41
(8) У тебя стоит "Удалять автоматически при отмене проведения", нужно "Удалять автоматически". Если конечно нет другой логики расчитанной на ручное удаление движений
13 Жан Пердежон
 
10.10.19
17:42
(10) на курсы сходи, книжки почитай, в типовых посмотри примеры
14 H A D G E H O G s
 
10.10.19
17:48
А хлопец хорош, отличную западлюху закопал будущему прогу.
Если это выйдет в продакшн, это прям, ммммм, персик!
15 Nillos
 
10.10.19
17:50
(11) Да я это для себя делаю для развития, а не для кого-то.
Наткнулся на проблему, интересно, как она решается.
Вот и спрашиваю у мастеров 1С
16 Nillos
 
10.10.19
17:54
(12) Спасибо за решение проблемы! Как раз было "Удалять автоматически при отмене проведения".
"Удалять автоматически" - работает, как мне нужно.
17 RomanYS
 
10.10.19
17:59
(16) Пожалуйста. Столько новых костылей не выросло))