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