Как упростить и автоматизировать резервирование и заполнение обеспечения в 1С:Управление торговлей 11?

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

При переходе с конфигурации 1С:Управление торговлей 10.3 на современную версию 1С:Управление торговлей 11 (УТ 11) пользователи часто сталкиваются с серьезным барьером — кардинальным изменением логики резервирования и обеспечения потребностей. В УТ 10.3 процесс был интуитивно понятен: в документе «Заказ покупателя» существовала удобная кнопка «Заполнить и провести», которая автоматически резервировала доступные остатки.

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

В этой статье мы подробно разберем, как упростить этот процесс, минимизировать ручные операции пользователей и автоматизировать обеспечение с помощью как штатных инструментов, так и программных доработок через механизм расширений.

Штатные механизмы УТ 11: как облегчить работу без программирования

Прежде чем приступать к доработке конфигурации, проанализируем возможности современных релизов УТ 11 (начиная с версии 11.5). Разработчики 1С доработали механизмы распределения запасов, добавив полезные статусы обеспечения.

Разберем по шагам ключевые штатные инструменты:

  1. Статус «Резервировать по мере поступления». Если товара нет в наличии на складе в момент оформления заказа клиента, менеджеру не нужно вручную отслеживать его приход. Достаточно установить для строки заказа статус Резервировать по мере поступления. При проведении документа «Приобретение товаров и услуг» (или «Приходный ордер») система автоматически распределит поступившие позиции в резерв под данный заказ. Это избавляет от необходимости вручную перезаполнять обеспечение в самом заказе.
  2. Обособленное обеспечение. Этот механизм предназначен для жесткого резервирования товара под конкретную сделку или заказ клиента. При его использовании закупаемый товар «привязывается» к назначению (конкретному заказу). Такой товар никто другой забрать со склада не сможет. При поступлении он сразу же готов к отгрузке по конкретному заказу.
  3. Рабочее место «Состояние обеспечения заказов». Хотя на первый взгляд эта обработка кажется сложной, она позволяет выполнять групповые операции. Мы можем выделить список заказов или строк и массово установить действия Резервировать или Отгрузить. Это значительно быстрее индивидуальной обработки каждого документа.

Программная автоматизация обеспечения при записи заказа

Если бизнес-процессы компании требуют максимального упрощения работы пользователя (чтобы менеджер вообще не вникал в статусы обеспечения), лучшим решением станет небольшая программная доработка. Выясним причину, по которой система требует ручного выбора, и исправим это.

Вся логика подстановки вариантов обеспечения по умолчанию сосредоточена в общем модуле ОбеспечениеКлиентСервер в функции ВариантыОбеспеченияПоУмолчанию. Мы можем использовать механизм расширений, чтобы переопределить это поведение.

Рассмотрим пример кода для расширения, который принудительно устанавливает статус «Отгрузить» или «Резервировать на складе», если товар есть в наличии на складе:


&Вместо("ВариантыОбеспеченияПоУмолчанию")
Функция Расш1_ВариантыОбеспеченияПоУмолчанию(Параметры)
    
    // Получаем стандартные варианты обеспечения, рассчитанные системой
    Результат = ПродолжитьВызов(Параметры);
    
    // Переопределяем логику для документов ЗаказКлиента
    // Если заказ согласован и товар есть на свободном остатке, 
    // устанавливаем статус "Отгрузить" по умолчанию
    Если Параметры.Свойство("СтатусЗаказа") И Параметры.СтатусЗаказа = ПредопределенноеЗначение("Перечисление.СтатусыЗаказовКлиентов.КВыполнению") Тогда
        // Здесь можно реализовать запрос к регистру накопления "СвободныеОстатки"
        // и если свободный остаток > 0, заполнять Действие как "Отгрузить"
        Результат.ДействиеПоУмолчанию = ПредопределенноеЗначение("Перечисление.ВариантыОбеспечения.Отгрузить");
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Такой подход позволяет полностью автоматизировать первичный подбор. Менеджер просто добавляет товар в табличную часть, а программа сама определяет, резервировать ли его на складе или оставлять в состоянии «К обеспечению».

Автоматическое заполнение обеспечения при создании Реализации

Еще одна частая рутинная операция — это необходимость открывать «Заказ клиента», менять там обеспечение на «Отгрузить» (так как товар наконец поступил на склад) и только потом вводить «Реализацию товаров и услуг». Мы можем обойти это ограничение, автоматизировав процесс в момент создания накладной.

Проанализируем ситуацию: когда менеджер нажимает кнопку «Создать на основании» -> «Реализация товаров и услуг», система проверяет, заполнен ли статус «Отгрузить» в исходном заказе. Если нет — документ реализации создается пустым или выдает ошибку.

Для решения этой проблемы мы можем написать обработчик в расширении для формы выбора или создания реализации на основании заказа. Алгоритм действий выглядит следующим образом:

  1. Перехватываем процедуру создания документа РеализацияТоваровУслуг на основании ЗаказКлиента.
  2. В фоновом режиме программно открываем транзакцию исходного заказа.
  3. Проверяем фактическое наличие товаров на складе по регистру остатков.
  4. Для всех доступных позиций автоматически меняем статус обеспечения в ТЧ Товары на значение Отгрузить.
  5. Записываем и проводим «Заказ клиента».
  6. Продолжаем стандартное создание «Реализации товаров и услуг», которая теперь заполнится автоматически без лишних вопросов к пользователю.

Ниже представлен пример реализации такой логики (схематично):


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

Резюме и рекомендации

Переход на 1С:Управление торговлей 11 не должен усложнять жизнь конечным пользователям. Несмотря на то, что новая концепция обеспечения в УТ 11 гораздо гибче и мощнее старой схемы из УТ 10.3, для небольших и средних компаний она часто избыточна.

Для достижения оптимального баланса мы рекомендуем использовать следующий подход:

← На главную