Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Странно отрабатывает "Проведен"

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

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

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


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

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

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

            Для Нмр = 0 По (Выборка.Количество()-1) Цикл
                СтрВыборка = Выборка.Получить(Нмр);
                СтрВыборкаКол_во = СтрВыборка.КоличествоОстаток;// Остаок на складе 

                            
                Если СтрВыборкаКол_во >= КоличествоСпис И СтрВыборкаКол_во > 0 Тогда  
                    
                    //РС УстановленноеОборудование

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

                    
                    //Расход со склада монтажника

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.