Все хорошо, но резервирование из предстоящих поставок происходит по документом ЗаказПоставщику,Т.е. если есть ЗаявкаПокупателя на ТМЦ, то резерв под нее при оформлении документа ПоступлениеТМЦ будет произведен только в том случае, если предварительно будет оформлен документ ЗаказПоставщику, а иначе - не прокатывает. Пробуем РЕШИТЬ по просьбам трудящихся.
Соглашусь с фирмой 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);Возврат;
КонецЕсли;
У кого есть соображения и предложения по выше изложенному материалу – пишем в комментариях.
Может быть у кого есть опыт в подобных изысканиях. Весьма интересно ( я думаю не только мне) будет ознакомиться.
Может кому поможет.....