Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 дек 2024, 03:11

Страховой запас

Автор Дарья Пахомова, 29 июл 2022, 11:36

0 Пользователей и 1 гость просматривают эту тему.

Дарья Пахомова

Нужно чтобы выводилось сообщение при контроле допустимого остатка. так вообще можно делать?(не гневитесь аналитик сказал именно таким образом сделать) Задача учебная Понимаю  в чём ошибка (текст выдаёт только если на момент записи страховой запас меньше необходимого, а если он чуть выше хоть 100 товаров проводи одним доком он всё спишет и ошибку выдаст только при следующем документе), но никак не пойду как исправить ui;;t;
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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


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

   
   
   
   
   
   
         //////////////////////////////////////////////
         
   
       
КонецПроцедуры

LexaK

Дарья Пахомова, не знаю поможет ли, поймете ли, у вас совсем неправильно написана (добавлена) проверка на Допустимые Остатки
лучше ее встроить в основной запрос и обрабатывать в общем цикле в условие (примерно)


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

Дарья Пахомова

LexaK, я знаю что её лучше туда встроить я пробовала, но ума не хватает пока что работать с таким большим кодом ((поэтому решила вторым запросом(первый работает всё ок)
может легче во втором запросе всё же что то поменять и будет ок :(

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск