Имя: Пароль:
1C
1С v8
Контроль остатка
0 malex18
 
06.09.17
17:08
Есть подразделение и торговая точка. как сделать,если пользователь вводит в реализации количество товара(оно превышает количество на точке), ВЫВОДИЛОСЬ ДИАЛОГОВОЕ окно с вариантом ответов(Да,Нет),Если "ДА"- то проводит , нет - не проводит.

Сделал вывод сообщения на общий остаток. а как режимдиалога.данет организовать ?
в модуле формы?или я не туда копаю?


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    
    МетодСписания = РегистрыСведений.МетодСписанияТоваров.ПолучитьПоследнее(Дата).МетодСписания;
    
    Если МетодСписания.Пустая()Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не указан метод списания! Проведение не возможно";
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    Движения.Продажи.Записывать=Истина;
    
    Движения.ОстаткиНоменклатуры.Записать();
    Движения.Продажи.Записать();
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
    |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
    |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Стоимость
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
    |ГДЕ
    |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ.Номенклатура КАК Номенклатура,
    |    ВТ.Количество КАК КоличествоВДокументе,
    |    ВТ.Стоимость КАК СуммаВДокументе,
    |    ОстаткиНоменклатурыОстатки.Партия,
    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
    |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СуммаОстаток
    |ИЗ
    |    ВТ КАК ВТ
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |                &МоментВремени,
    |                Склад = &Склад
    |                    ИЛИ Склад = &Подразделение) КАК ОстаткиНоменклатурыОстатки
    |        ПО ВТ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |    ОстаткиНоменклатурыОстатки.Партия.МоментВремени ВОЗР
    |ИТОГИ
    |    МАКСИМУМ(КоличествоВДокументе),
    |    МАКСИМУМ(СуммаВДокументе),
    |    СУММА(КоличествоОстаток),
    |    СУММА(СуммаОстаток)
    |ПО
    |    Номенклатура";
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    Запрос.УстановитьПараметр("Склад", Подразделение);
    Запрос.УстановитьПараметр("Подразделение", Подразделение.Родитель);
    
    Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВОЗР", "УБЫВ");
    КонецЕсли;  
    
    ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
    Пока ВыборкаНоменклатура.Следующий() Цикл
        
        
        
        Если НЕ ВыборкаНоменклатура.Номенклатура.Услуга и ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.КоличествоВДокументе Тогда            
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не хватает " + Строка(ВыборкаНоменклатура.КоличествоВДокументе - ВыборкаНоменклатура.КоличествоОстаток) + " единиц номенклатуры " + ВыборкаНоменклатура.Номенклатура + ". Проведение невозможно.";
            Сообщение.Сообщить();
            Отказ = Истина;            
        КонецЕсли;                 
        
        
        
        Если Отказ Тогда
            Продолжить;
        КонецЕсли;
        
        ОсталосьСписать  = ВыборкаНоменклатура.КоличествоВДокументе;
        
        ВыборкаДетЗаписи = ВыборкаНоменклатура.Выбрать();             
        Пока ВыборкаДетЗаписи.Следующий() И ОсталосьСписать <> 0 Цикл
            
            Если НЕ ВыборкаДетЗаписи.Номенклатура.Услуга Тогда
                
                КСписанию = Мин(ОсталосьСписать, ВыборкаДетЗаписи.КоличествоОстаток);
                
                СуммаСписания = ?(ВыборкаДетЗаписи.КоличествоОстаток = КСписанию,
                ВыборкаДетЗаписи.СуммаОстаток,
                ВыборкаДетЗаписи.СуммаОстаток / ВыборкаДетЗаписи.КоличествоОстаток * КСписанию);
                НовоеДвижение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
                НовоеДвижение.Период = Дата;
                НовоеДвижение.Регистратор = Ссылка;
                НовоеДвижение.Количество = КСписанию;
                НовоеДвижение.Номенклатура = ВыборкаДетЗаписи.Номенклатура;
                НовоеДвижение.Партия = ВыборкаДетЗаписи.Партия;
                НовоеДвижение.Склад = Подразделение;
                Если ВыборкаДетЗаписи.КоличествоОстаток > ОсталосьСписать Тогда
                    НовоеДвижение.Склад = Подразделение.Родитель;    
                КонецЕсли;
                НовоеДвижение.Стоимость = СуммаСписания;
            КонецЕсли;                
            
            НовоеДвижение = Движения.Продажи.Добавить();
            НовоеДвижение.Активность = Истина;
            НовоеДвижение.Период = Дата;
            НовоеДвижение.Регистратор = Ссылка;    
            НовоеДвижение.Номенклатура = ВыборкаДетЗаписи.Номенклатура;
            НовоеДвижение.Сумма = ВыборкаДетЗаписи.СуммаВДокументе;
            
            Если НовоеДвижение.Номенклатура.Услуга Тогда
                НовоеДвижение.Количество = ВыборкаНоменклатура.КоличествоВДокументе;
            Иначе
                НовоеДвижение.Количество = КСписанию;
                ОсталосьСписать = ОсталосьСписать - КСписанию;
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЦикла;
КонецПроцедуры
1 Beduin
 
06.09.17
17:10
(0) В ОбработкеПроведения это делать крайне не рекомендуется
2 malex18
 
06.09.17
17:18
Так это и не сработает же в обработке проведения.в модуле формы надо писать? и там на клинете-сервере создавать.да?
на кленте режим диалогвого окна
а на сервере остатки получать на точке,складе?
или как?
3 lodger
 
06.09.17
17:18
1) задавать вопросы из ОбработкаПроведения = г..нокод.
2) для этого есть Отказ = Истина, все остальное реализуется реквизитами, параметрами, сообщениями ошибок.
3) 2 раза трясти регистр на остатки тоже так себе архитектурное решение. (если вы решите посчитать влезаете в остаток или нет перед проведением).
4 Ненавижу 1С
 
гуру
06.09.17
17:21
а смысл? все эти вопросы сводятся к тому, что пользователь будет не думая постоянно жать "ДА"
5 lodger
 
06.09.17
17:23
(4) я видел еще лучше. вешается таймаут и выбирается ответ по дефолту...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.