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