Как в 1С выделить номенклатуру цветом в зависимости от наличия на остатке?

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

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

Способ 1: Использование стандартных возможностей интерфейса (без программирования)

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

  1. Настройка формы подбора: В большинстве типовых решений (УТ 10.3, БП 2.0) при подборе товара в документ можно установить флаг «Только остатки». Это не раскрасит список, но мгновенно скроет лишние позиции, упрощая работу.
  2. Отображение панели остатков: В конфигурации «Управление торговлей 10.3» в списке номенклатуры можно включить отображение остатков по текущему складу через меню «Действие» — «Остатки товаров на складах».
  3. Условное оформление в управляемых формах (8.3): Если вы используете современную версию программы (например, БП 3.0 или УТ 11), выделим нужные строки без программиста. Зайдем в меню «Ещё» — «Настройка списка» (или «Изменить форму»). На вкладке «Условное оформление» добавим правило: установим цвет фона, если поле Остаток больше 0.

Способ 2: Программная раскраска в «Обычных формах» (платформа 8.2)

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

Для реализации раскраски в списках используются два основных события табличного поля: ПриВыводеСтроки и ПриПолученииДанных.

Метод «ПриВыводеСтроки» выполняется для каждой строки отдельно. Рассмотрим пример кода, который проверяет остаток и закрашивает строку:


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

Важное предостережение: Метод ПриВыводеСтроки с прямым запросом к базе данных внутри значительно замедлит работу системы при прокрутке списка. Программа будет «тормозить», так как на каждую отрисованную строку выполняется отдельное обращение к серверу БД.

Способ 3: Оптимизированная раскраска через «ПриПолученииДанных»

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

Выясним алгоритм действий:

  1. Соберем все ссылки на номенклатуру, которые система собирается отобразить.
  2. Одним запросом получим по ним остатки.
  3. Распределим цвета в цикле оформления строк.

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    // Массив для хранения ссылок на номенклатуру видимых строк
    СоответствиеНоменклатуры = Новый Соответствие;
    Для Каждого Оформление Из ОформленияСтрок Цикл
        СоответствиеНоменклатуры.Вставить(Оформление.ДанныеСтроки.Ссылка, Оформление);
    КонецЦикла;

    // Массив ссылок для параметра запроса
    МассивСсылок = Новый Массив;
    Для Каждого КлючИЗначение Из СоответствиеНоменклатуры Цикл
        МассивСсылок.Добавить(КлючИЗначение.Ключ);
    КонецЦикла;

    // Запрос к остаткам по списку
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура В (&МассивСсылок)) КАК ТоварыНаСкладахОстатки";
    
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    Выборка = Запрос.Выполнить().Выбрать();

    // Раскрашиваем строки на основании результата запроса
    Пока Выборка.Следующий() Цикл
        ТекОформление = СоответствиеНоменклатуры.Получить(Выборка.Номенклатура);
        Если ТекОформление <> Неопределено Тогда
            Если Выборка.Остаток > 0 Тогда
                ТекОформление.ЦветФона = WebЦвета.Бежевый;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Способ 4: Использование Динамических списков (Управляемые формы 8.3)

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

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

  1. Откроем форму списка номенклатуры в конфигураторе.
  2. Установим у основного реквизита Список свойство «Произвольный запрос».
  3. В тексте запроса напишем соединение справочника с виртуальной таблицей остатков.

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

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

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

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

← На главную