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

Момент времени при не оперативном проведении документа

Момент времени при не оперативном проведении документа
Я
   krpolina1996
 
18.12.18 - 15:33
Здравствуйте!Помогите,пожалуйста, нужно сделать чтобы документ когда проводится задним числом смотрел остатки и не разрешал проведение документа, при недостачи товара на складе

Процедура ОбработкаПроведения(Отказ, Режим)
    // регистр ТоварыНаСкладах Расход
    Движения.ТоварыНаСкладах.Записывать = Истина;
    
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
        |    РасходнаяНакладнаяТовары.Склад КАК Склад,
        |    РасходнаяНакладнаяТовары.Количество КАК КоличествоВДокументе,
        |    РасходнаяНакладнаяТовары.Сумма КАК СуммаВДокументе
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
        |ГДЕ
        |    РасходнаяНакладнаяТовары.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Запрос2=Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;//ТОВАРЫ ОСТАТКИ НЕ ПРАВИЛЬНО ПОЛУЧЕНЫ ГДЕ АПРОС ПО СКЛАДУ? учись получать товары по складам!
    //ПРИМЕР ПОСТАВЬ 200 ТОВАРОВ НА СКЛАД 1
    //СПИШИ По 100 С КАЖДОГО СКЛАДА ОДНИМ ДОКУМЕНТОМ ПРОЖИ
    
    Запрос2.Текст =  "ВЫБРАТЬ
                     |    НоменклатураДокумента.Номенклатура КАК Номенклатура,
                     |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                     |    НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
                     |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                     |    НоменклатураДокумента.Склад КАК Склад,
                     |    ЕСТЬNULL(ТоварыНаСкладахОстатки.СуммаОстаток, 0) КАК СуммаОстаток
                     |ИЗ
                     |    НоменклатураДокумента КАК НоменклатураДокумента
                     |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                     |                ,
                     |                (Номенклатура, Склад) В
                     |                    (ВЫБРАТЬ
                     |                        НоменклатураДокумента.Номенклатура,
                     |                        НоменклатураДокумента.Склад
                     |                    ИЗ
                     |                        НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                     |        ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
                     |            И НоменклатураДокумента.Склад = ТоварыНаСкладахОстатки.Склад";
    Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина;
    ////
    Движения.ТоварыНаСкладах.Записать();    
    ////
    РезультатЗапроса = Запрос2.Выполнить();
    
    //ТЗ = РезультатЗапроса.Выгрузить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура =ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад =ВыборкаДетальныеЗаписи.Склад;
        Если ВыборкаДетальныеЗаписи.КоличествоОстаток <> 0 Тогда
            Движение.Сумма = (ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток)*ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        КонецЕсли;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
        
        
    КонецЦикла;
    
    Движения.Записать();    
    
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда //ТУТ ПРОВЕРКА ТОКА ПО 1МУ СКЛАДУ А НУЖНО ПО ТЕМ КОТОРЫЕ В ДОКУМЕНТЕ И НОМЕНКЛАТУРЕ КОТОРАЯ В ДОКУМЕНТЕ(номенклатура верно, а вот склады нет)
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
                        |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
                        |ИЗ
                        |    РегистрНакопления.ТоварыНаСкладах.Остатки(
                        |            ,
                        |            (Номенклатура, Склад) В
                        |                (ВЫБРАТЬ
                        |                    НоменклатураДокумента.Номенклатура,
                        |                    НоменклатураДокумента.Склад
                        |                ИЗ
                        |                    НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
                        |ГДЕ
                        |    ТоварыНаСкладахОстатки.КоличествоОстаток < 0";//КОНТРОЛЬ БЕЗ УЧЕТА СКЛАДА ТУТ, ОШИБКА  !!!!!!!!!!!!!!!!!!!
        Запрос3.УстановитьПараметр("Склад",ВыборкаДетальныеЗаписи.Склад);
        
        РезультатЗапроса = Запрос3.Выполнить();
        
        ТЗ = РезультатЗапроса.Выгрузить();

        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Не хватает "+Строка(-ВыборкаДетальныеЗаписи.КоличествоОстаток)+
            "Единиц материала " + ВыборкаДетальныеЗаписи.Номенклатура+"";
            Сообщение.Сообщить();
            
        Отказ = Истина;
    
            
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры
 
 
   Eiffil123
 
1 - 18.12.18 - 16:56
Проверяйте остатки на пустую дату.
Причем нет смысла проверять оперативный/неоперативный режим, т.к. это не совсем корректно (могут быть будущей датой изменения по регистру)

И вот этот код очень странный. Зачем блокировать пустой набор?
Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина;
Движения.ТоварыНаСкладах.Записать();

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