Как вывести статус реализации в списке заказов клиента в 1С:КА 2.5?

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

Часто при работе в конфигурациях «1С:Комплексная автоматизация 2.5» или «1С:ERP 2.5» возникает потребность визуально отслеживать состояние отгрузки прямо в списке документов ЗаказКлиента. Разберем ситуацию: нам необходимо добавить колонку со статусом (например, «РСтатус»), которая будет принимать значения «Заказан» (если реализации нет), «Не реализовано» (если реализация создана, но не проведена) или «Реализовано» (если реализация проведена).

Многие разработчики совершают распространенную ошибку — пытаются перебирать строки в цикле в обработчике ПриОткрытии. Это приводит к катастрофическому падению производительности и зависанию формы. Проанализируем правильные способы решения этой задачи.

Способ 1: Доработка запроса динамического списка

Самый производительный и правильный метод — это добавление вычисляемого поля непосредственно в запрос динамического списка. Давайте разберем по шагам, как это реализовать. Для этой задачи можно использовать пример реализации дополнительной вычисляемой колонки в динамическом списке.

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

  1. Соединение с виртуальной таблицей оборотов: Оптимально использовать регистр накопления ЗаказыКлиентов. По оборотам можно понять, был ли факт отгрузки.
  2. Использование вложенного запроса: Мы можем соединиться со вложенным запросом к реализациям, используя оператор ВЫБРАТЬ ПЕРВЫЕ 1 с группировкой по заказу.

Логику заполнения текстового значения статуса реализуем с помощью конструкции ВЫБОР КОГДА и функции ЕСТЬNULL. Посмотрим на примерный кусок запроса, который можно встроить в динамический список:


ВЫБРАТЬ
    ЗаказКлиента.Ссылка КАК Заказ,
    // ... другие поля ...
    ВЫБОР
        КОГДА ЕСТЬNULL(РеализацииПоЗаказу.Проведен, ЛОЖЬ) = ИСТИНА ТОГДА "Реализовано"
        КОГДА РеализацииПоЗаказу.Ссылка ЕСТЬ НЕ NULL И ЕСТЬNULL(РеализацииПоЗаказу.Проведен, ЛОЖЬ) = ЛОЖЬ ТОГДА "Не реализовано"
        ИНАЧЕ "Заказан"
    КОНЕЦ КАК РСтатус
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
        ЛЕВОЕ СОЕДИНЕНИЕ (
            ВЫБРАТЬ ПЕРВЫЕ 1
                Реализация.Ссылка КАК Ссылка,
                Реализация.ЗаказКлиента КАК ЗаказКлиента,
                Реализация.Проведен КАК Проведен
            ИЗ
                Документ.РеализацияТоваровУслуг КАК Реализация
            ГДЕ
                Реализация.ПометкаУдаления = ЛОЖЬ
            УПОРЯДОЧИТЬ ПО
                Реализация.Дата УБЫВ
        ) КАК РеализацииПоЗаказу
        ПО ЗаказКлиента.Ссылка = РеализацииПоЗаказу.ЗаказКлиента

Способ 2: Использование события ПриПолученииДанныхНаСервере

Если запрос динамического списка усложнять не хочется, либо логика определения статуса слишком сложна для SQL-запроса, воспользуемся обработчиком события списка ПриПолученииДанныхНаСервере.

В отличие от ПриОткрытии, это событие обрабатывает только те строки, которые сейчас отображаются на экране пользователя (обычно это 30–45 строк). Это работает быстро. Разберем алгоритм действий:

  1. Добавляем колонку в форму списка (без привязки к реквизитам данных).
  2. В обработчике ПриПолученииДанныхНаСервере собираем массив ссылок на заказы из коллекции оформлений.
  3. Выполняем один пакетный запрос к базе данных, передав этот массив параметром, чтобы получить статусы связанных реализаций.
  4. В цикле обходим коллекцию строк и заполняем нашу колонку нужным текстом.

Способ 3: Использование дополнительных сведений

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

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

Почему стандартные статусы 1С могут отображаться некорректно?

Часто пользователи задаются вопросом: зачем "городить" свои статусы, если в системе есть процент отгрузки и стандартные статусы? Проанализируем причины, по которым штатный статус может «зависать» в состоянии «В процессе отгрузки» или показывать восклицательные знаки, даже если документ РеализацияТоваровУслуг проведен на 100%.

В 1С:КА 2.5 статус заказа — это сложное вычисляемое поле. Оно зависит от ряда факторов:

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

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

← На главную