Почему в УТ 11 формируется расходный ордер при неполном обеспечении заказа с признаком отгрузки одной датой?

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

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

Архитектурная причина поведения программы

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

  1. Он скрывает колонку индивидуальных дат отгрузки в табличной части Товары документа Заказ клиента.
  2. Система рассчитывает единую планируемую дату отгрузки всего заказа, ориентируясь на наиболее позднюю дату обеспечения среди строк с вариантами К обеспечению или Резервировать к дате.
  3. Этот флаг не накладывает системных блокировок на оформление складских или финансовых документов, если часть позиций переведена к непосредственной выдаче.

Рассмотрим, как формируются распоряжения на отгрузку. В 1С действует построчный принцип: движения по регистрам накопления Товары к отгрузке и Заказы клиентов формируются индивидуально по каждой строке табличной части. Как только строке с имеющимся остатком присваивается действие Отгрузить, документ фиксирует потребность к немедленной выдаче товара. Если в настройках склада включена автоматическая генерация расходных ордеров регламентным заданием или кладовщик открывает рабочее место отгрузки, система видит зарегистрированное движение и немедленно создает ордер на доступную часть заказа. Аналогично ведет себя и документ Реализация товаров и услуг при вводе на основании: накладная заполняется теми строками, по которым дано прямое распоряжение на отгрузку.

Методологическое решение проблемы без доработки конфигурации

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

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

  1. Резервирование вместо отгрузки: Для имеющегося в наличии товара менеджер устанавливает вариант обеспечения Резервировать на складе. При таком значении товар надежно закрепляется за данным заказом и не будет списан под нужды других контрагентов, однако запись в регистр Товары к отгрузке не формируется. Соответственно, автоматическое создание расходного ордера не инициируется, а при попытке ввода накладной строка не попадет в отгрузку.
  2. Обособление заказной позиции: Для отсутствующего товара, заказываемого у поставщика, выбираем вариант обеспечения Обособленно или формируем строку с действием К обеспечению. Использование обособленного обеспечения гарантирует, что поступивший от поставщика товар закрепится строго под данный заказ покупателя и не будет перехвачен другими заказами.
  3. Массовый перевод в отгрузку по факту поступления: Когда недостающая номенклатура поступила на склад по документу Приобретение товаров и услуг, менеджер открывает Заказ клиента и выполняет команду «Обеспечение» — «Заполнить обеспечение» (или использует сочетание клавиш Shift + F10). В открывшейся обработке система определяет доступность всех позиций и централизованно переводит все строки заказа в статус Отгрузить. Только после этого заказ становится доступен к оформлению ордера и накладной в полном объеме.
  4. Управление через статусы расходных ордеров: Если на складе используются статусы расходных ордеров, рекомендуется выставить порядок оформления документов, при котором ордер создается кладовщиком вручную после полной готовности заказа, либо настроить бизнес-процесс так, чтобы ордер переводился в статус К отбору только после комплектации всех позиций.

Техническое решение: контроль целостности заказа через расширение

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

Наиболее надежный подход — реализовать программный контроль непосредственно в модуле документа Заказ клиента в событии ОбработкаПроверкиЗаполнения или через подписку на событие ПередЗаписью. Алгоритм проверяет: если флаг ОтгружатьОднойДатой включен, и хотя бы в одной строке выбрано действие Отгрузить, система должна убедиться в отсутствии строк в статусах ожидания (К обеспечению, Резервировать к дате).

Посмотрим на пример программной проверки, которую можно разместить в расширении конфигурации:


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

Также при автоматическом формировании ордеров регламентным заданием полезно добавить фильтрацию в обработчик формирования распоряжений, чтобы заказы с признаком ОтгружатьОднойДатой отбирались для сборки исключительно при условии, что все активные строки документа переведены в состояние фактической готовности к передаче покупателю.

← На главную