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