Как реализовать подсветку документов в динамическом списке при нехватке остатков товаров

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача визуального выделения документов в списке (например, «Счетов на оплату» или «Заказов клиентов»), по которым на складе недостаточно товара. На первый взгляд задача кажется простой: достаточно написать запрос в динамическом списке. Однако при росте объема данных такой подход превращается в техническую ловушку. Разберем подробно, почему классический запрос «в лоб» не работает и как реализовать эту задачу правильно, используя современные архитектурные подходы.

Проблема «наивного» подхода через запрос динамического списка

Рассмотрим стандартную логику, которую часто пытаются применить начинающие разработчики. Чтобы определить нехватку товара, необходимо выполнить ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы документов с табличной частью товаров, а затем еще одно ЛЕВОЕ СОЕДИНЕНИЕ с виртуальной таблицей остатков. После этого в условии ВЫБОР проверяется, что Количество > Остаток.

Проанализируем, почему этот метод (упомянутый в сообщении №3 форума) считается «дико неоптимальным»:

  1. Построчное вычисление: Динамический список считывает данные порциями (обычно по 20-45 строк). При наличии соединений с виртуальными таблицами остатков СУБД вынуждена рассчитывать итоги на лету для каждой строки при каждом скроллинге списка.
  2. Нагрузка на сервер: Виртуальные таблицы остатков — это сложные запросы к базе данных. Соединение их с табличными частями внутри динамического списка приводит к тому, что 1С не может эффективно использовать механизм быстрого считывания, и производительность интерфейса падает до критических значений.
  3. Блокировки: При интенсивной работе пользователей с документами прихода и расхода расчет остатков в реальном времени для списка может создавать дополнительные очереди ожидания в СУБД.

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

Решение 1: Использование вспомогательного регистра сведений (Оптимальный путь)

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

Структура регистра:

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

Проанализируем механизм обновления данных в этом регистре:

Решение 2: Обновление статусов через подписки на события

Чтобы подсветка обновлялась автоматически при приходе товара, мы не можем полагаться только на проведение самого счета. Нам нужно отслеживать все документы «товародвижения».

Рассмотрим алгоритм реализации через Подписки на события:

  1. Создадим подписку на событие ОбработкаПроведения для документов ПриходнаяНакладная.
  2. В обработчике подписки пропишем логику: при поступлении товара программа находит все «незакрытые» или «необеспеченные» счета, в которых есть данный товар.
  3. Для найденных счетов вызывается процедура пересчета статуса в нашем регистре СтатусыНаличияТоваров.

Пример кода для записи в регистр сведений может выглядеть так:


МенеджерЗаписи = РегистрыСведений.СтатусыНаличияТоваров.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = ТекущийДокумент;
МенеджерЗаписи.Состояние = Перечисления.СостоянияНаличия.Нехватка;
МенеджерЗаписи.Записать(Истина);

Решение 3: Использование фоновых заданий (подход БСП)

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

Разберем, как это работает:

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

Решение 4: Настройка динамического списка и условного оформления

Когда данные в регистре или реквизите документа актуализированы, остается настроить визуальную часть. В форме списка документа «Счет на оплату» выполним следующие шаги:

  1. Откроем свойства динамического списка и добавим ЛЕВОЕ СОЕДИНЕНИЕ с нашим регистром статусов в тексте запроса.
  2. Перейдем в настройки списка, вкладка Условное оформление.
  3. Создадим новое правило оформления:
    • Оформление: ЦветТекста — Красный.
    • Условие: Список.Состояние Равно ПредопределенноеЗначение("Перечисление.СостоянияНаличия.Нехватка").
    • Оформляемые поля: выберем необходимые колонки или всю строку.

Как обеспечить автоматическое обновление списка (Refresh)

Пользователи часто жалуются, что «товар пришел, а счет всё еще горит красным». Динамический список обновляет данные только при интерактивных действиях или изменении основной таблицы. Чтобы список «узнал» об изменениях в регистре сведений без перезагрузки формы, можно использовать механизм оповещений.

Рассмотрим пример кода в форме документа прихода:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    // Оповещаем систему, что данные по остаткам изменились
    Оповестить("ОбновитьСтатусыОстатков", , "Обновление");
КонецПроцедуры

А в форме списка счетов добавим обработчик события ОбработкаОповещения:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ОбновитьСтатусыОстатков" Тогда
        Элементы.Список.Обновить();
    КонецЕсли;
КонецПроцедуры

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

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

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

← На главную