В оптовой торговле нередко встречается сценарий, когда долгосрочный договор с клиентом имеет жестко оговоренную спецификацию: конкретный перечень номенклатуры и фиксированный объем поставки. При этом отгрузка выполняется частями на протяжении длительного времени по мере поступления товара на склад или по заявкам покупателя. Возникает типовая управленческая задача: менеджер единожды фиксирует общий согласованный объем заказа, а операторы склада или учетчики выписывают документы реализации строго в пределах этого объема, не имея права отгрузить лишнее.
В типовой подсистеме закупок связка документа Заказ поставщику и последующих документов Приобретение товаров и услуг (или Поступление товаров и услуг) решает эту задачу штатно: накладная не позволяет оприходовать больше позиций, чем указано в заказе. Однако при попытке настроить зеркальную схему в продажах многие специалисты сталкиваются с неочевидными ограничениями программы. Разберем по шагам, почему типовые настройки контроля не дают ожидаемого результата и как правильно организовать контроль отгрузок.
Проанализируем типовую попытку решения задачи через администрирование прав и параметров учета:
РеализацияСверхЗаказа (или снимается соответствующее право).Реализация товаров и услуг с количеством, превышающим указанное в заказе клиента. Документ успешно проводится без каких-либо предупреждений и блокировок со стороны системы.Выясним причину такого поведения конфигурации. В прикладных решениях 1С (УТ 11, КА 2, ERP) подсистемы закупок и продаж концептуально разделены:
Заказы клиентов и действия в табличной части (действие Отгрузить).Заказ клиента полностью исключается из подсистемы обеспечения. Он перестает формировать остаточные движения по регистру Заказы клиентов. Механизм проведения накладной реализации в этом режиме в принципе пропускает проверку на превышение объемов. Соответственно, роль РеализацияСверхЗаказа физически не задействуется в коде проведения, и запрет не срабатывает.Рассмотрим альтернативную типовую идею: вернуться к полному варианту работы с заказами, но не резервировать товар сразу на весь объем договора. В таком случае в строках долгосрочного заказа устанавливается действие «Не обеспечивать».
Здесь возникает административный тупик в распределении прав сотрудников:
Наиболее надежный и удобный способ решения — сохранить режим «Заказ как счет» (избавив пользователей от механизма резервирования) и реализовать контроль лимитов через расширение конфигурации без снятия с поддержки.
Разберем логику проверки по шагам:
РеализацияТоваровУслуг (событие ОбработкаПроверкиЗаполнения или подписка на событие ОбработкаПроведения).ЗаказКлиента, формируем запрос к информационной базе.Посмотрим на пример реализации запроса для контроля лимитов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТекНакладная.Номенклатура КАК Номенклатура,
| ТекНакладная.Характеристика КАК Характеристика,
| СУММА(ТекНакладная.Количество) КАК КоличествоВДокументе
|ПОМЕСТИТЬ ВТ_ТекущиеСтроки
|ИЗ
| &ТаблицаТоваров КАК ТекНакладная
|СГРУППИРОВАТЬ ПО
| ТекНакладная.Номенклатура,
| ТекНакладная.Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗаказТовары.Номенклатура КАК Номенклатура,
| ЗаказТовары.Характеристика КАК Характеристика,
| СУММА(ЗаказТовары.Количество) КАК ЛимитПоЗаказу
|ПОМЕСТИТЬ ВТ_ЛимитыЗаказа
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказТовары
|ГДЕ
| ЗаказТовары.Ссылка = &ЗаказКлиента
|СГРУППИРОВАТЬ ПО
| ЗаказТовары.Номенклатура,
| ЗаказТовары.Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РеализацияТовары.Номенклатура КАК Номенклатура,
| РеализацияТовары.Характеристика КАК Характеристика,
| СУММА(РеализацияТовары.Количество) КАК УжеОтгружено
|ПОМЕСТИТЬ ВТ_ИсторияОтгрузок
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
|ГДЕ
| РеализацияТовары.Ссылка.ЗаказКлиента = &ЗаказКлиента
| И РеализацияТовары.Ссылка.Проведен = ИСТИНА
| И РеализацияТовары.Ссылка <> &ТекущаяРеализация
|СГРУППИРОВАТЬ ПО
| РеализацияТовары.Номенклатура,
| РеализацияТовары.Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТекущиеСтроки.Номенклатура КАК Номенклатура,
| ВТ_ТекущиеСтроки.Характеристика КАК Характеристика,
| ЕСТЬNULL(ВТ_ЛимитыЗаказа.ЛимитПоЗаказу, 0) КАК ЛимитПоЗаказу,
| ЕСТЬNULL(ВТ_ИсторияОтгрузок.УжеОтгружено, 0) КАК УжеОтгружено,
| ВТ_ТекущиеСтроки.КоличествоВДокументе КАК КоличествоВДокументе,
| ЕСТЬNULL(ВТ_ИсторияОтгрузок.УжеОтгружено, 0) + ВТ_ТекущиеСтроки.КоличествоВДокументе - ЕСТЬNULL(ВТ_ЛимитыЗаказа.ЛимитПоЗаказу, 0) КАК Превышение
|ИЗ
| ВТ_ТекущиеСтроки КАК ВТ_ТекущиеСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЛимитыЗаказа КАК ВТ_ЛимитыЗаказа
| ПО ВТ_ТекущиеСтроки.Номенклатура = ВТ_ЛимитыЗаказа.Номенклатура
| И ВТ_ТекущиеСтроки.Характеристика = ВТ_ЛимитыЗаказа.Характеристика
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИсторияОтгрузок КАК ВТ_ИсторияОтгрузок
| ПО ВТ_ТекущиеСтроки.Номенклатура = ВТ_ИсторияОтгрузок.Номенклатура
| И ВТ_ТекущиеСтроки.Характеристика = ВТ_ИсторияОтгрузок.Характеристика
|ГДЕ
| ЕСТЬNULL(ВТ_ЛимитыЗаказа.ЛимитПоЗаказу, 0) < ЕСТЬNULL(ВТ_ИсторияОтгрузок.УжеОтгружено, 0) + ВТ_ТекущиеСтроки.КоличествоВДокументе
Проанализируем результат запроса: если выборка содержит записи, это однозначно указывает на попытку отгрузить товар сверх спецификации. В процедуре проверки мы устанавливаем признак Отказ = Истина и выводим детальное сообщение: какая номенклатурная позиция превышена, сколько доступно к отгрузке и на какую величину допущен перерасход.
Если на предприятии принципиально используется штатный режим ведения заказов («Заказ со склада и под заказ»), но операторам нельзя давать права на открытие и редактирование заказов, можно применить программное обновление статусов:
ЗаказКлиента, программно разбивает строки и переводит нужное количество в действие «Отгрузить», после чего записывает заказ.Таким образом, для строгого контроля отгрузок в рамках долгосрочных контрактов без навязанного резервирования оптимально использовать режим «Заказ как счет» с точечным контролем остатков спецификации через механизм расширений.