Как программно определить, что заказ в УТ 10.3 отгружен частично?

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

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

Анализ структуры данных и выбор регистра

Для начала проанализируем, где в УТ 10.3 хранится информация о состоянии заказов. Основным источником данных для нас является регистр накопления ЗаказыПокупателей. Этот регистр имеет вид «Остатки» и предназначен специально для учета выполнения заказов.

Логика работы регистра:

  1. При проведении документа ЗаказПокупателя формируется движение «Приход» — это то количество, которое клиент заказал.
  2. При оформлении документа РеализацияТоваровУслуг на основании заказа формируется движение «Расход» — это факт отгрузки.
  3. Если по заказу остались позиции, которые не будут отгружены, создается документ ЗакрытиеЗаказовПокупателей, который также делает «Расход», обнуляя остаток по регистру.

Следовательно, чтобы понять, является ли заказ частично отгруженным, нам необходимо сравнить два показателя: исходное количество по заказу и текущий остаток в регистре ЗаказыПокупателей.

Реализация алгоритма через виртуальные таблицы

Рассмотрим подробнее программную реализацию. Самый правильный и производительный способ — использование запроса к виртуальным таблицам регистра накопления. Нам потребуется соединить данные самого документа (или его оборотов) с текущими остатками.

Выясним причину, почему нельзя просто смотреть на наличие документа РеализацияТоваровУслуг. Дело в том, что реализаций может быть несколько, или они могут быть удалены, а статус заказа должен динамически меняться. Кроме того, существуют документы КорректировкаЗаказаПокупателя, которые меняют исходный объем заказа.

Алгоритм расчета:

  1. Общее количество (Заказано): Это сумма всех движений «Приход» по регистру ЗаказыПокупателей для конкретного заказа. Это позволяет автоматически учесть все корректировки заказа.
  2. Текущий остаток (Осталось отгрузить): Это значение из виртуальной таблицы Остатки регистра ЗаказыПокупателей.
  3. Статус «Частично отгружен»: Если Остаток > 0 И Остаток < Заказано.

Посмотрим на пример запроса, который реализует эту логику:


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

Учет корректировок и закрытых заказов

Проанализируем ситуацию с документом ЗакрытиеЗаказовПокупателей. Если менеджер вручную закрыл заказ, то остаток в регистре ЗаказыПокупателей станет равным нулю. В этом случае заказ технически перестает быть «Частично отгруженным» и переходит в статус «Завершен».

Если ваша задача — подсвечивать заказы, которые были отгружены не полностью, но уже закрыты, вам придется анализировать регистраторы движений «Расход» в регистре ЗаказыПокупателей. Если среди регистраторов есть ЗакрытиеЗаказовПокупателей, значит, остаток был списан принудительно.

Для этого в запросе можно использовать проверку оборотов по регистратору:


ВЫБРАТЬ
    ЗаказыОбороты.ЗаказПокупателя
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Обороты(,, Регистратор, ЗаказПокупателя = &ВыбЗаказ) КАК ЗаказыОбороты
ГДЕ
    ТИПЗНАЧЕНИЯ(ЗаказыОбороты.Регистратор) = ТИП(Документ.ЗакрытиеЗаказовПокупателей)

Оптимизация для динамических списков (раскраска строк)

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

Важно: Никогда не делайте запросы к базе данных в цикле внутри ПриВыводеСтроки. Это приведет к катастрофическому падению скорости работы интерфейса. Вместо этого используйте пакетную обработку данных.

Рассмотрим пример реализации в коде формы:


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    
    // Подготовим массив заказов, которые сейчас видны на экране
    МассивЗаказов = Новый Массив;
    Для Каждого Оформление Из ОформленияСтрок Цикл
        МассивЗаказов.Добавить(Оформление.ДанныеСтроки.Ссылка);
    КонецЦикла;
    
    // Одним запросом получаем состояние всех видимых заказов
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ЗаказыОбороты.ЗаказПокупателя КАК Ссылка,
    |    СУММА(ЗаказыОбороты.КоличествоПриход) КАК Заказано,
    |    СУММА(ЗаказыОбороты.КоличествоРасход) КАК Отгружено
    |ИЗ
    |    РегистрНакопления.ЗаказыПокупателей.Обороты(,, , ЗаказПокупателя В (&МассивЗаказов)) КАК ЗаказыОбороты
    |СГРУППИРОВАТЬ ПО
    |    ЗаказыОбороты.ЗаказПокупателя";
    
    Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    // Обходим оформление строк и применяем цвета
    Для Каждого Оформление Из ОформленияСтрок Цикл
        ТекущийЗаказ = Оформление.ДанныеСтроки.Ссылка;
        СтрокаДанных = РезультатЗапроса.Найти(ТекущийЗаказ, "Ссылка");
        
        Если СтрокаДанных <> Неопределено Тогда
            // Проверяем: отгружено больше 0, но меньше чем заказано (с учетом корректировок)
            Если СтрокаДанных.Отгружено > 0 И СтрокаДанных.Отгружено < СтрокаДанных.Заказано Тогда
                Оформление.ЦветФона = Новый Цвет(255, 250, 205); // Светло-желтый для частичной отгрузки
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Использование регистра «Продажи»

Иногда предлагают использовать регистр накопления Продажи. Проанализируем эту ситуацию. В этом регистре также есть измерение ЗаказПокупателя. Однако стоит помнить, что заполнение этого измерения зависит от настроек учетной политики и того, как именно оформлялась реализация.

Если реализация была создана без привязки к заказу (просто в поле «Сделка» указан заказ, но движения по регистру ЗаказыПокупателей не сделаны), то заказ не будет считаться отгруженным с точки зрения резервирования и обеспечения. Поэтому для контроля именно состояния заказа всегда предпочтительнее использовать ЗаказыПокупателей, так как он является «целевым» для этого бизнес-процесса.

Подведение итогов

Для программного определения частичной отгрузки в УТ 10.3 мы рекомендуем опираться на виртуальные таблицы регистра ЗаказыПокупателей. Этот метод является наиболее точным, так как он:

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

← На главную