gifts2017

Резервирование по заявкам в ТиС

Опубликовал Михаил (mdzen) в раздел Программирование - Практика программирования

В типовой ТиС 9.2 резервирование по заявкам покупателя производится или из текущего остатка на складе и из предстоящих поставок.
Все хорошо, но резервирование из предстоящих поставок происходит по документом ЗаказПоставщику, т.е. если есть ЗаявкаПокупателя на ТМЦ, то резерв под нее при оформлении документа ПоступлениеТМЦ будет произведен только в том случае, если предварительно будет оформлен документ ЗаказПоставщику, а иначе - не прокатывает. Пробуем РЕШИТЬ по просьбам трудящихся.
В типовой ТиС 9.2 резервирование по заявкам покупателя производится или из текущего остатка на складе и из предстоящих поставок.
Все хорошо, но резервирование из предстоящих поставок происходит по документом ЗаказПоставщику,Т.е. если есть ЗаявкаПокупателя на ТМЦ, то резерв под нее при оформлении документа ПоступлениеТМЦ будет произведен только в том случае, если предварительно будет оформлен документ ЗаказПоставщику, а иначе - не прокатывает. Пробуем РЕШИТЬ по просьбам трудящихся.

Соглашусь с фирмой 1С:
-"Это позволяет организовывать схемы «торговли по заказам», когда ТМЦ закупается только под уже сделанные заявки покупателей." С успехом можно планировать предстоящие поставки. И это правильно.
Но в ситуации, когда есть ЗаявкаПокупателя и под нее надо резервировать поступающие ТМЦ, при этом неизвестно от кого будет поступление, что делать?

Вариант 1: (тупой и бестолковый)
- постоянно перепроводить ЗаявкуПокупателя, изменяя ее дату и время на текущие чтобы подхватывать в резерв поступившие до сего момента ТМЦ.
А если заявок много? Запаришься, да и гемороя хватает. ( Таким способом насколько мне известно, "колдует" процентов 60, при этом весьма недовольны.
Конечно сидит два юзера и заявки собирают.Ну вот все у одного сростается - красота, но вот поступает товар - он перепроводит заявку, в этот момент второй юзер успел-таки провести свою заявку чуть раньше и, о чудо, у второго все скомплектовалось!!!, а у первого все наперекосяк - опять чего-то нехватает. Мат стоит в три этажа).

Вариант 2: (красивый и правильный)
- Чтобы все работало правильно прежде чем формировать документ ПоступлениеТМЦ надо сформировать ЗаказПоставшику.Тогда все правильно резервируется и распределяется, тем более, что можно сделать привязку ТМЦ к конкретной заявке.

НО... Многие юзеры просто не знают межанизмы работы конфигурации ТиС и тупо бьют ПоступлениеТМЦ, при этом удивляясь:
" - А почему это товар не резервируется по заявкам?"
Многим просто лень делать дополнительные телодвижения, просто хотят " бить ПоступлениеТМЦ" и чтобы все
резирвировалось под заявки и т.п...
Что бы удовлетворить последних решил усовершенствовать процесс, т.е. убрать из цепочки документов ЗаказПоставщику ( хотя не считаю, что это есть хорошо. В стандартном решении можно делать конкретную закупку под конкретную заявку, например, под одну заявку можно брать по 50 руб., а под другую не выше 45. Так что придется юзерам следить – кому с какой партии товар торгуют. Но это уже другая проблема..).
И так, чтобы использовать сокращенный механизм делаем следующее:
Что бы клиент мог вернуться к стандарной схеме предложенной в стантартной ТиС введена дополнительная константа "ИспользоватьЗаказПоставщику" и перечисление Булево со значениями "Да" и "Нет".
Если клиент использует стандартную схему - константа имеет значение "Да", если по сокращенной схеме - "Нет". Не будем лишать клиента свободы выбора. Так как у нас не будет задействован документ ЗаказПоставщику, то все действия по резервированию поступающих ТМЦ по заявкам делаем в модуле документа ПоступлениеТМЦ :

Добавим в модуль документа переменную:

Перем  ФирмаДляОстатковТМЦ; 

В Процедуре ПроведениеПоРегистрам() изменяем следующие строки:

//Просмотр заказов и заявок
    ВремРегистры     = СоздатьОбъект("Регистры");
    ВремЗаказы         = ВремРегистры.Заказы;
    ВремЗаказыЗаявки = ВремРегистры.ЗаказыЗаявки;
    //Установка фильтра по заказам
    ФильтрЗаказов(ТаблицаДокумента, ВремЗаказы, ВремЗаказыЗаявки);



...........
...........
ДвижениеЗаказов(ТаблицаДокумента, ВремЗаказы, ВремЗаказыЗаявки);



...........
...........





документ проводится в зависимости от значения константы ИспользоватьЗаказПоставщику, пишем так:
 
 //Просмотр заказов и заявок
    ВремРегистры     = СоздатьОбъект("Регистры");
  //здесь выбираем вариант исходя из выранного состояния константы ИспользоватьЗаказПоставщику
     Если Константа.ИспользоватьЗаказПоставщику=Перечисление.Булево.Да Тогда
    ВремЗаказы         = ВремРегистры.Заказы;
    ВремЗаказыЗаявки = ВремРегистры.ЗаказыЗаявки;
     Иначе
    ВремЗаявки         = ВремРегистры.Заявки;
    ВремРезервыТМЦ   = ВремРегистры.РезервыТМЦ;
     КонецЕсли;
    Если Константа.ИспользоватьЗаказПоставщику=Перечисление.Булево.Да Тогда
    //Установка фильтра по заказам
    ФильтрЗаказов(ТаблицаДокумента, ВремЗаказы, ВремЗаказыЗаявки);
    Иначе
    //Установка фильтра по заявкам
    ФильтрПоЗаявкам(ТаблицаДокумента, ВремЗаявки, ВремРезервыТМЦ);
    КонецЕсли;


............
............

     Если Константа.ИспользоватьЗаказПоставщику=Перечисление.Булево.Да Тогда
    ДвижениеЗаказов(ТаблицаДокумента, ВремЗаказы, ВремЗаказыЗаявки);
    Иначе
    ПогашениеРезервЗаявок(ТаблицаДокумента, ВремЗаявки, ВремРезервыТМЦ)
    КонецЕсли;


............
............




Добавляем две дополнительные процедуры в начало модуля документа , после функции ВидДолгаПоТМЦ():
 
// ФильтрПоЗаявкам(ТаблицаТМЦ, ВремЗаявки)
//
// Параметры:
//  ТаблицаТМЦ, ВремЗаявки
// Описание:
//  устанавливает фильтр для отбора итогов регистра Заявки
//

Процедура ФильтрПоЗаявкам(ТаблицаТМЦ, ВремЗаявки, ВремРезервыТМЦ)
    ФирмаДляОстатковТМЦ = глФирмаДляОстатковТМЦ(Фирма);
    ВремЗаявки.УстановитьЗначениеФильтра("Фирма", ФирмаДляОстатковТМЦ , 2);
    ВремРезервыТМЦ.УстановитьЗначениеФильтра("Фирма", ФирмаДляОстатковТМЦ , 2);

    Если ИтогиАктуальны()=0 Тогда
        СписокТМЦ = СоздатьОбъект("СписокЗначений");
        ТаблицаТМЦ.Выгрузить(СписокТМЦ,,,"Номенклатура");

        ВремЗаявки.      УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
        ВремРезервыТМЦ.  УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);

        ВремЗаявки.      ВременныйРасчет();
        ВремРезервыТМЦ.  ВременныйРасчет();
    КонецЕсли;
КонецПроцедуры // ФильтрПоЗаявкам()
//******************************************************************************
// ПогашениеРезервЗаявок(ТаблицаТМЦ, ВремЗаявки,ВремРезервыТМЦ)
//
// Параметры:
//  ТаблицаТМЦ - подготовленная таблица документа.
//  ВремЗаявки       - объект "Регистр.Заявки"
//  ВремРезервыТМЦ       - объект "Регистр.РезервыТМЦ"
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Производит списание по регистру "Заявки"  и резервирование по регистру "РезвыТМЦ"
//
Процедура  ПогашениеРезервЗаявок(ТаблицаДокумента,ВремЗаявки,ВремРезервыТМЦ)

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

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



Чтобы исключить использование документа ЗаказПоставщику в модуль формы документа в процедуре
ПриОткрытии() пишем следующий код:

 
Если Константа.ИспользоватьЗаказПоставщику = Перечисление.Булево.Нет Тогда
        Предупреждение("Документ "+Вид()+" при выбраном варианте резервирования не используется ");
            СтатусВозврата(0);Возврат;
          КонецЕсли;



У кого есть соображения и предложения по выше изложенному материалу – пишем в комментариях.
Может быть у кого есть опыт в подобных изысканиях. Весьма интересно ( я думаю не только мне) будет ознакомиться.
Может кому поможет.....

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Михаил (mdzen) 02.08.06 19:04
Первая статья. Чего- то текст разъехался.Сам что-ли не форматируется?
2. Сhe Burashka (CheBurator) 02.08.06 19:58
О! Приду домой - напишу... На первый взгляд - не все гладко именно во введении к коду...
Подробнее - из дома...
3. Сhe Burashka (CheBurator) 03.08.06 04:43
Как обещал - не успеваю, откладываю на след.вечер...
Для затравки (молчать не могу ;-) - опыт в изысканиях в этой области есть...
Могу ошибаться (это моя стандартная отмазка): но утверждение
>Т.е. если есть ЗаявкаПокупателя на ТМЦ, то резерв под нее при оформлении документа ПоступлениеТМЦ будет произведен только в том случае, если предварительно будет оформлен документ ЗаказПоставщику,
неверно в корне. В качестве примера могу сказать только то, что по схеме заказы-заявки работаю плотно 3 года (торговля смешанная и со склада и по заказам и прочее...) - все пучком, процент отклонений, когда надо подправлять руками - ну.. за последние 3 месяца что-то и не припомню... При этом у меня используется весь спектр и корректировочные заявки, и корректировочные заказы, и снятие частично выполненых и прочее.. как пример - см. http://www.infostart.ru/file.php?0,file=17 - внутри MXL дерево подчиненности начиная от неподтвержденки (анализ, разбиение, заказы разным поставщикам ну и т.д.) Подробнее разобрать статью попытаюсь успеть завтра... Пожелайте мне, чтобы я не облажался ... ;-)
4. Михаил (mdzen) 03.08.06 07:43
Если проанализаровать код модуля документа Поступления ТМЦ стандартной ТИС , то при его проведении резервирование происходит
в Процедуре ДвижениеЗаказов(). Здесь в стандартной используются регистры Заказы и ЗаказыЗаявки, т.е. если при поступлении
не будет сначала создан и проведен ЗаказПоставщику, который двинет регистры Заказы и ЗаказыЗаявки, то при проведении ПоступленияТМЦ
в резерв ничего не упадет.
P.S. Подразумевается резервирование по поступлениям, произведенным после оформления заявки, вплоть до даты отгрузки.
Все это в ТиС 9.2 рел.941
5. Доржи Цыденов (support) 03.08.06 08:43
+1, но вставлю пять копеек :). Вообще, есть такой принцип построения документов, чтобы все необходимые данные для проведения хранились в самом документе. Что любые изменения вне документа не влияют на проведение конкретно взятого документа. В данной случае используется константа, значение которой используется при проведении, что немного методически неверно, хотя сам грешу подобными вещами. Но лучше конечно, в таком случае, создать реквизит шапки, например, "РезервироватьПодЗаявки", значение которой по умолчанию равно значению константы.
6. Сhe Burashka (CheBurator) 03.08.06 13:09
Mdzen прав, а я - облажался (но у меня отмазка есть! ;-)
Когда нет заказа - резервы не делаются. Кладется просто в свободный остаток на склад.
И почему? Имхо потому, что раз заказа не было - никаких планов на поступления не было, вот что-то свалилось вдруг, легло на склад - ну и хватайте на конкурсной основе - кто первый схватил, тот и выиграл... победит расторопный...
Можно, конечно, в таком случае по Фифо гасить непогашенные заявки - однако ж тут ор может начаться - а чего это ему под резерв легло? у меня клиент более важный!...
Спсб mdzen - напомнил и поучил...
7. Михаил (mdzen) 03.08.06 10:03
Согласен с support.
Лучше создать реквизит шапки. При этом можно будет манипулировать приходами, что под заявку - в резерв, а если закупка не под заявку - на склад и в продажу.
Спасибо за конструктив.
8. Сhe Burashka (CheBurator) 03.08.06 12:56
Возможно... Вечером гляну.
9. Сhe Burashka (CheBurator) 03.08.06 13:15
При таком подходе: хотелось бы узнать - как у вас вообще заказывается товар у поставщика?
Почему кпить 1000 штук? а не 100?
10. Михаил (mdzen) 03.08.06 14:33
Поставщиков море - менеджеры выискивают выгодные условия и тут-же покупают, так-что запланировать поступления
от конкретного поставщика не реально, а как я уже писал при покупке делать два дока ЗаказПоставщику и Поступление клиентам ну в лом просто. Так что планируется только отгрузка.
Вот такие вот пироги.
А вообще сколько клиентов- столько мнений.
11. Иван (Ioann) 03.08.06 15:35
Да, есть такая проблема в типовой ТиС. В целом нормальное решение - достаточно простое, поэтому +1. Я сложнее делал и не факт, что оно лучше оказалось... Исходил из попытки совмещения и текущей схемы, и своей. Сейчас той конфы под рукой нет, но суть следующая. В заявке на поставку добавлен флажок резерв из поступлений, таким образом оператор определяет будет резерв для этой заявки или нет. Соорудил целый регистр остатков "ПредварительныйРезерв", в который приходуются недостающие позиции по этой заявке (это зависит от выбранного способа резервирования). При свободном поступлении, по регистру "ПредварительныйРезерв" происходит резервирование в порядке даты отгрузки заявок. Пришлось во многих местах отслеживать этот регистр - в отмене заявок понятно, но и в других местах тоже, в общем везде, где списываем по заявке нужно и предварительный резерв списать, если он остался.
12. Сhe Burashka (CheBurator) 03.08.06 16:40
mdzenu: в принципе, нормальное решение...
однако у меня например: проще потратить время на ввод заказов, потому как времени на ввод поступления мало! грузить надо! ;-)
А заказы без указания поставщика - 2-5 строчек в алгоритме поправить... у меня так и сделан, заказываем у одного, может придти от другого дружественного - и все ок.
При схеме, которая в статье - при темпе поступления заявок большем чем темп поступления приходов - старые заявки будут "умирать" по дате отгрузки...
13. Михаил (mdzen) 03.08.06 19:40
Che писал : "..старые заявки будут "умирать" по дате отгрузки... "
В принципе к этому все и писалось.
По ЗаказамПоставщику в принципе также работает - старые заявки "умирают" по дате отгрузки.
Описанная схема хороша, когда заявки выполняются по дате отгрузки в порядке очередности.
Если же есть типа "любимые клиенты" и под них надо конкретно делать конкретный резерв - без ЗаявкиПоставщику
не обойтись - там можно настроить связку "Заявка" - "Заказ".
Короче выбор за клиентом - какой вариант ему больше по душе.
Поэтому и ввел выбор по константе ИспользоватьЗаказПоставщику.
Можно было бы автоматом создавать при проведении документа Поступления ЗаказПоставщику с ранней позицией по времени и прикручивать его в качестве основания к Поступлению. Но смысла не вижу, хотя может быть...
14. Юсупов Саша (SAS_Chelny) 04.08.06 15:45
+1 Я бы тоже так сделал :) Не попадалось только у клиентов. Все без резерва под поставку работают, может не знают просто...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа