Как настроить автоматическое снятие резервов с заказов покупателей через 7 дней в 1С:УТ 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет
← На главную

В типовой конфигурации «1С:Управление торговлей 10.3», в отличие от более современных версий (например, УТ 11 или УНФ), отсутствует простой флажок в настройках, который позволял бы автоматически освобождать зарезервированный товар по истечении определенного срока. Это часто приводит к «затовариванию» резервов: менеджеры создают заказы, товар блокируется на складе, клиент пропадает, а другие покупатели не могут купить продукцию. Рассмотрим подробно, как решить эту задачу программно и организационно.

Механизм решения проблемы в УТ 10.3

Для снятия резервов в системе предусмотрен специальный документ — ЗакрытиеЗаказовПокупателей с видом операции СнятиеРезервов. Наша задача — автоматизировать его создание так, чтобы система сама находила заказы старше 7 дней и «очищала» их от резервов. Разберем по шагам, как это реализовать.

Шаг 1. Анализ стандартной обработки

В конфигурации существует встроенная обработка (часто встроенная прямо в форму документа), которая позволяет подбирать заказы по критериям. Как мы видим из обсуждения на форуме, ключевая логика кроется в заполнении параметров ПостроительОтчета. Проанализируем фрагмент кода, который отвечает за формирование условий отбора:


// Настройка параметров для поиска просроченных резервов
ПостроительОтчета = ЗакрытиеЗаказовПокупателейФормаОтбораЗаказов.ПостроительОтчета;
ДатаОкончания = НачалоДня(ТекущаяДата()) - 1; // Берем заказы до сегодняшнего дня

// Установка количества дней просрочки (в нашем случае 7)
ПросроченоДней = 7; 

// Расчет граничной даты
Если Константы.СпособКонтроляДнейЗадолженности.Получить() = Перечисления.СпособыКонтроляДнейЗадолженности.ПоКалендарнымДням Тогда
    ТребуемаяДата = НачалоДня(ТекущаяДата() - 24*60*60 * ПросроченоДней);
Иначе
    // Если учет ведется по рабочим дням, используем производственный календарь
    ТребуемаяДата = ЗаполнениеДокументов.ОпределитьДату(НачалоДня(ТекущаяДата()), -ПросроченоДней);
КонецЕсли;

ПостроительОтчета.Параметры.Вставить("ДатаКон", ДатаОкончания);
ПостроительОтчета.Параметры.Вставить("ТекущаяДата", ТекущаяДата());

Шаг 2. Изменение логики отбора (с даты оплаты на дату заказа)

Стандартный механизм часто ориентируется на поле ДатаОплаты или ДатаОтгрузки из документа ЗаказПокупателя. Однако, как справедливо заметил автор темы, бизнес-процесс часто требует отсчета именно от даты создания самого заказа. Чтобы реализовать это, нам необходимо в запросе построителя или в собственном запросе заменить обращение к реквизиту ДатаОплаты на Дата (дата документа).

Выясним причину, почему это важно: если менеджер не заполнил планируемую дату оплаты, стандартный алгоритм может проигнорировать такой заказ, и резерв останется «висеть» вечно. Проанализируем, как программно создать документ закрытия:


НовыйДокумент = Документы.ЗакрытиеЗаказовПокупателей.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийЗакрытиеЗаказовПокупателей.СнятиеРезервов;
НовыйДокумент.Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяОрганизация");
НовыйДокумент.Ответственный = глЗначениеПеременной("глТекущийПользователь");

// Здесь должен быть код заполнения табличной части "Заказы" 
// на основании запроса к регистру "ТоварыВРезервеНаСкладах"

Шаг 3. Автоматизация через регламентное задание

Чтобы снятие резервов происходило без участия человека (например, ночью), необходимо создать РегламентноеЗадание. Разберем алгоритм его работы:

  1. Создаем новый общий модуль (например, АвтоматизацияЗаказовСервер) с включенным признаком «Сервер».
  2. Пишем процедуру, которая будет выполнять запрос к остаткам регистра ТоварыВРезервеНаСкладах.
  3. В запросе соединяем остатки с таблицей ЗаказПокупателя и накладываем условие: ЗаказПокупателя.Дата < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -7).
  4. Если по результату запроса найдены записи, программно создаем документ ЗакрытиеЗаказовПокупателей, заполняем его и проводим.

Посмотрим на пример запроса для выборки таких заказов:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|	Резервы.ЗаказПокупателя КАК Заказ
|ИЗ
|	РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК Резервы
|ГДЕ
|	Резервы.ЗаказПокупателя.Дата < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -7)
|	И Резервы.КоличествоОстаток > 0";

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить();

Важные нюансы и дополнения

Проанализируем ситуацию глубже: автоматическое снятие резервов — процедура опасная, если не предусмотреть исключения. Рассмотрим важные дополнения, которые стоит внедрить:

1. Исключения для VIP-клиентов или спецзаказов

Рекомендуем добавить в документ ЗаказПокупателя дополнительный реквизит (флажок) НеСниматьРезервАвтоматически. В коде запроса добавьте проверку этого поля. Это позволит менеджерам вручную «продлевать» важные резервы.

2. Логирование и уведомления

После того как регламентное задание проведет документ закрытия, полезно записывать информацию об этом в ЖурналРегистрации. Также можно реализовать отправку уведомлений ответственным менеджерам через механизм Задачи или электронную почту, чтобы они знали, что товар из их заказов снова поступил в свободную продажу.

3. Проверка оплаты

Если ваша компания разрешает частичную предоплату, стоит изменить логику. Проанализируем: если заказ оплачен хотя бы на 10%, возможно, резерв снимать не нужно. В этом случае запрос должен также проверять остатки по регистру ВзаиморасчетыСКонтрагентами или РасчетыСКонтрагентами.

Итог

Мы рассмотрели, как с помощью программного кода и стандартных механизмов 1С реализовать автоматическое управление складскими остатками. Основной упор стоит делать на использовании объекта ПостроительОтчета или написании прямого запроса к регистру ТоварыВРезервеНаСкладах с последующим созданием документа ЗакрытиеЗаказовПокупателей. Такой подход обеспечит актуальность складских остатков и повысит оборачиваемость товаров.

← На главную