Резервирование продукции - альтернативный подход

20.01.10

Разработка - Запросы

У нас в конторе долго шли баталии по поводу резервов, все сводилось к тому, что складкие товарищи, не желали своевременно указывать заказы в поступлении, а уж когда шел предворительный документ заказ поставщику да еще со ссылкой на заказ покупателя, то все труба... Решил я найти альтернативу предложенный в штатной торговле. Принцип алгоритма такой:

Правда реализованный только в документе поступления, остальные движения прихода я не трогал (оприходование, перемещение, возвраты)

Анализируется приход продукции, по каждой номенклатуре ищем заказы покупателя, если поле склад не заполнено, значит имеем предзаказ, тут важно что при проведении поступлении анализируются остатки итоговые, т.е. приход + то что было (+ вычеты уже текущих резервов, т.е. получаем свободный остаток), что позволяет раскидать реальный остаток продукции по заказам. Предположим на остатках 5 штук, в заказе 6, тогда дублируется строка, в первой будет 5 под резерв, 6 будет ожидать поступления. (принцип как при Заполнить и провести, в заказе покупателя)

Есть один существенный минус, в принципе тут ничего нового, при отмене поступелния, резервы пойдут в минус, но они и при штатной операции отмены, в минус уйдут.

Также  у меня в документах заказы покупателея, стоит новый реквизит "НапоминаниеРезерва", в котром менегеры ставят дату, по какое число контролировать резерв, забыли поставить, не будет резерва, а такж есть обработка, которые им выводит эти резервы 2 раза в день, просроченныые красным, текущие зеленым, и там же они могут закрыть эти заказы, в случае их необходимости (кому надо могу выложить)

вот процедура, у меня стоит в обработке проведения, но можно поставить просто на кнопку.

НЕ забудьте в заказе добаить реквизит "НапоминаниеРезерва" и выставить дату выше текущий, либо уберите проверку этого реквизита из кода.

 

Процедура РезервированиеПродукции()
// Если нужно вызвать диалог утверждение в операции, то разкомментирвать ниже
///ОтветНаВопрос = Вопрос("Провести автоматическое резервирование товара?", РежимДиалогаВопрос.ДаНет);
СвободноДляРезервов = 0;
//Если ОтветНаВопрос = КодВозвратаДиалога.Нет
//        Тогда
//            Возврат
//    КонецЕсли;
   
   
Для каждого СтрокаТЧ Из Товары Цикл
       
    ПотребностьОстатков = 0;   
    ЗапросОстатков = Новый Запрос;
    запросОстатков.УстановитьПараметр("Номенклатура",СтрокаТЧ.Номенклатура);
    запросОстатков.УстановитьПараметр("ХарактеристикаНоменклатуры",СтрокаТЧ.ХарактеристикаНоменклатуры);

    ЗапросОстатков.Текст =
    "ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    |    ТоварыНаСкладахОстатки.КоличествоОстаток,
    |    ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток1,
    |    ВЫБОР
    |        КОГДА ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток ЕСТЬ NULL
    |            ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток
    |        ИНАЧЕ ВЫБОР
    |                КОГДА ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток < 0
    |                    ТОГДА -1
    |                ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток - ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток
    |            КОНЕЦ
    |    КОНЕЦ КАК ИтогоСвободно
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
    |        ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
    |            И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры
    |ГДЕ
    |    ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура
    |    И ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры";

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

    Запрос= Новый Запрос;   
    запрос.УстановитьПараметр("Номенклатура",СтрокаТЧ.Номенклатура);
    запрос.УстановитьПараметр("ХарактеристикаНоменклатуры",СтрокаТЧ.ХарактеристикаНоменклатуры);
    запрос.УстановитьПараметр("Размещение", Неопределено );
    запрос.УстановитьПараметр("НапоминаниеРезерва", ТекущаяДата() );

   
   
        Запрос.Текст =     
        "ВЫБРАТЬ
        |    ЗаказыПокупателейОстатки.ЗаказПокупателя,
        |    ЗаказыПокупателейОстатки.Номенклатура,
        |    ЗаказыПокупателейОстатки.КоличествоОстаток,
        |    ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
        |ГДЕ
        |    ЗаказыПокупателейОстатки.Номенклатура = &Номенклатура
        |    И ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
        |    И ЗаказыПокупателейОстатки.ЗаказПокупателя.Товары.Размещение = &Размещение
        |    И ЗаказыПокупателейОстатки.ЗаказПокупателя.НапоминаниеРезерва >= &НапоминаниеРезерва";

   
    Результат = Запрос.Выполнить().Выбрать();
         Пока Результат.Следующий() Цикл
             ЗаписатьЗаказ = ложь;
                     Заказ = Результат.ЗаказПокупателя.ПолучитьОбъект();
                    ЗаказФорма = Заказ.ПолучитьФорму();
                    ТоварыЗаказаПокупателя = Заказ.Товары.Выгрузить();
                   
                                   
                      Для каждого СтрокаТЧЗазаков Из ТоварыЗаказаПокупателя Цикл
                          Если (СтрокаТЧЗазаков.Размещение = Неопределено) И (СтрокаТЧЗазаков.Номенклатура = СтрокаТЧ.Номенклатура) И (СтрокаТЧЗазаков.ХарактеристикаНоменклатуры = СтрокаТЧ.ХарактеристикаНоменклатуры) 
                              Тогда
                               
                                  Если СтрокаТЧЗазаков.Количество                                       Тогда
                                        СтрокаТЧЗазаков.Размещение = Ссылка.СкладОрдер;   //Справочники.Склады.НайтиПоКоду("00001");
                                        СвободноДляРезервов = СвободноДляРезервов - СтрокаТЧЗазаков.Количество;
                                        ЗаписатьЗаказ = Истина;
                                        Заказ.Товары.Загрузить(ТоварыЗаказаПокупателя);
                                        Сообщить("Номенклатура " + СтрокаТЧЗазаков.Номенклатура +  " | " + СтрокаТЧЗазаков.ХарактеристикаНоменклатуры + "В заказе № " + Заказ.Номер +  " от " + Заказ.Дата + " ," + Заказ.Организация + " ," + Заказ.Контрагент);
                                        Сообщить("Полностью зарезервирована");
                                        Сообщить("--------------------------------------------------------------------------------------------");                           
                                       
                                        Иначе
                                          Если СвободноДляРезервов <> 0
                                              Тогда
                                                 НаОстатках  = СвободноДляРезервов;
                                                 ОстатокДляРезерва = СтрокаТЧЗазаков.Количество - СвободноДляРезервов;
                                                 Требуется = СтрокаТЧЗазаков.Количество;
                                                 
                                                 СтрокаТЧЗазаков.Количество = СтрокаТЧЗазаков.Количество - ОстатокДляРезерва;
                                                 СтрокаТЧЗазаков.Размещение = Ссылка.СкладОрдер;
                                                 СтрокаТЧЗазаков.Сумма = СтрокаТЧЗазаков.Количество * СтрокаТЧЗазаков.Цена;
                                                 КоличествоМест = ?((СтрокаТЧЗазаков.ЕдиницаИзмеренияМест.Коэффициент = 0) ИЛИ (СтрокаТЧЗазаков.Количество = 0), 0, СтрокаТЧЗазаков.Количество / СтрокаТЧЗазаков.ЕдиницаИзмеренияМест.Коэффициент);
                                                 СтрокаТЧЗазаков.КоличествоМест = ?((КоличествоМест % 2 = 0) ИЛИ (КоличествоМест % 2 = 1), КоличествоМест, 0);
                                                 
                                                  ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТЧЗазаков, Заказ);
                                                 Заказ.Товары.Загрузить(ТоварыЗаказаПокупателя);
                                                 
                                                 
                                                 
                                                 
                                               
                                                 НоваяЗапись =  Заказ.Товары.Добавить();
                                                 ЗаполнитьЗначенияСвойств(НоваяЗапись,СтрокаТЧЗазаков);
                                                 НоваяЗапись.Количество = ОстатокДляРезерва;
                                                 НоваяЗапись.Сумма = НоваяЗапись.Количество * СтрокаТЧЗазаков.Цена;
                                               
                                                 
                                                 КоличествоМест = ?((НоваяЗапись.ЕдиницаИзмеренияМест.Коэффициент = 0) ИЛИ (НоваяЗапись.Количество = 0), 0, НоваяЗапись.Количество / НоваяЗапись.ЕдиницаИзмеренияМест.Коэффициент);
                                                 НоваяЗапись.КоличествоМест = ?((КоличествоМест % 2 = 0) ИЛИ (КоличествоМест % 2 = 1), КоличествоМест, 0);
                                                 ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НоваяЗапись, Заказ);
                                                 НоваяЗапись.Размещение = Неопределено;
                                                 ЗаписатьЗаказ = Истина;
                                             
                                                 Сообщить("Номенклатура " + СтрокаТЧЗазаков.Номенклатура + " | " + СтрокаТЧЗазаков.ХарактеристикаНоменклатуры +  " в заказе № " + Заказ.Номер + " от " + Заказ.Дата + " ,организация: " + Заказ.Организация + " ,контрагент: " + Заказ.Контрагент + " | недостаточно на складе" );
                                                 Сообщить("Для резерва требуется: " + Требуется + " , на складе доступно: " + НаОстатках + ".");
                                                 Сообщить("В заказе произошли изменения: "  + СтрокаТЧЗазаков.Номенклатура +  " | " + СтрокаТЧЗазаков.ХарактеристикаНоменклатуры + " в резерве, в количестве: " + СтрокаТЧЗазаков.Количество + ". Недостающая продукция, в количестве: " + НоваяЗапись.Количество + " ожидает нового поступления");
                                                 Сообщить("--------------------------------------------------------------------------------------------");
                                             Иначе
                                                 Сообщить("В заказе: " + Заказ.Номер + " требуется " + СтрокаТЧЗазаков.Количество);
                                                 Сообщить("Остатков по номенклатуре " + СтрокаТЧ.Номенклатура +  " | " + СтрокаТЧ.ХарактеристикаНоменклатуры +  " = " + СвободноДляРезервов + " Резервирование по данной позиции остановлено");
                                                 
                                             КонецЕсли;
                                                 
                                  КонецЕсли;
                               
                           КонецЕсли;
                        КонецЦикла;
                 
                 
           
             Если ЗаписатьЗаказ
                 Тогда
                      Попытка
                     
                      Заказ.Записать(РежимЗаписиДокумента.Проведение);
                      Сообщить(Заказ);
                      Сообщить("СОХРАНЕН");
                      Сообщить("*********************************************")
                      Исключение
                      Сообщить("Произошла ошибка при сохранении заказа");
                      Сообщить("*********************************************")     
                    КонецПопытки
            КонецЕсли;
           КонецЦикла;
   
       КонецЦикла;
      

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

 

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    176697    979    403    

939

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    1667    10    XilDen    24    

35

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    12300    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    7309    XilDen    36    

88

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9942    user1840182    5    

29

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2983    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    11717    implecs    6    

48
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cyberboy 119 20.01.10 12:11 Сейчас в теме
Автор выложило пару скринов, что бы было наглядно видно, как у тебя в базе это работает.
2. ZLG07 168 20.01.10 12:26 Сейчас в теме
сейчас, 5 мин сделаю! вывод результат, и как оно в обработке напоминания просроченных заказов
3. ZLG07 168 20.01.10 13:04 Сейчас в теме
Выложил, на первом скрине, заказ покупателя, выделено поле Напоминание резерва, оно у меня автоматом при создании нового документа, ставит дату на 2 недели вперед, также можно корректировать вручную
Второй скрин, результат при проведении, как раз там видно, что на одиз заказ продукции не хватило, и в заказе была создана дублирующая позиция, с нехваткой продукции
Третий скрин обработка, которая выводит заказы, там же можно сразу все заказы закрыть, вот в ближайшее время сделаю. чтобы можно было продлить с выбором периода.
4. tango 546 20.01.10 14:59 Сейчас в теме
(0) "складкие товарищи, не желали своевременно указывать заказы в поступлении"
А разве это их дело?
Чем заняты снабженцы в это время? то бишь "логисты"... А продажные товарищи-манагеры?
**
ну, т.е. не имеет ли здесь место автоматизация бардака, я хочу сказать?
распределять поступление по заказам несколько задним числом... сирэме, блин!
5. ZLG07 168 20.01.10 15:07 Сейчас в теме
(4) насчет бардака, полностью согласен, но компания не очень большая (по количеству кадров), а вот объемы продаж высокие, о том что не хватает людей, говорят давно и часто, но руководство вешает часто на отгрузку задачи, которые по сути не их проблема, поэтому и приходиться вот таким путем извращаться.
6. v.razzorenov 31 14.07.14 15:20 Сейчас в теме
Также у меня в документах заказы покупателея, стоит новый реквизит "НапоминаниеРезерва", в котром менегеры ставят дату, по какое число контролировать резерв, забыли поставить, не будет резерва, а такж есть обработка, которые им выводит эти резервы 2 раза в день, просроченныые красным, текущие зеленым, и там же они могут закрыть эти заказы, в случае их необходимости (кому надо могу выложить)


Мне надо :-) Сможешь явить миру?
Оставьте свое сообщение