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

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

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

 

См. также

SALE! 20%

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122178    670    389    

714

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5746    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6286    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5388    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16186    skovpin_sa    14    

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


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