Как подсветить строки с прослеживаемым товаром в документе "Заказ клиента" в 1С?

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

Мы сталкиваемся с задачей, когда необходимо визуально выделить строки в табличной части документа "Заказ клиента", содержащие прослеживаемый товар. Стандартные интерактивные настройки условного оформления, которые мы привыкли использовать "через три точки" в пользовательском режиме, в данном случае могут оказаться недостаточными или неудобными. Давайте разберем, как реализовать эту функциональность с помощью программного подхода в 1С.

Понимание прослеживаемого товара в 1С

Прежде чем приступить к подсветке, нам необходимо выяснить, как система 1С определяет, является ли товар прослеживаемым. Это ключевой момент для формирования условия подсветки.

  1. Признаки прослеживаемости в карточке номенклатуры: Мы знаем, что в Карточке номенклатуры (элементе справочника "Номенклатура") прослеживаемый товар имеет особые признаки. В поле Маркировка и контроль для такого товара обычно устанавливается тип Прослеживаемый товар. Кроме того, для него указываются Страна происхождения и Код ТН ВЭД (Товарной номенклатуры внешнеэкономической деятельности).
  2. Регистрационный номер партии товара (РНПТ): При работе с прослеживаемыми товарами в документах (например, "Поступление товаров", "Реализация товаров") обязательно указывается Регистрационный номер партии товара (РНПТ). Наличие или отсутствие этого номера также может служить индикатором.
  3. Комплекты: Если прослеживаемый товар входит в состав комплекта, то в табличной части документа рядом с ним также появится индикатор прослеживаемости и поле для заполнения РНПТ.

Эти признаки помогут нам сформировать логику для определения прослеживаемости каждой строки.

Основные подходы к программной подсветке строк

Для табличных частей документов, таких как "Заказ клиента", условное оформление чаще всего настраивается программно с использованием встроенного языка 1С. Мы будем работать со свойством формы УсловноеОформление. Важно помнить, что настройка условного оформления задается на сервере. Чтобы подсветить всю строку, нам потребуется перечислить все поля табличной части, к которым мы хотим применить оформление. Рассмотрим два основных метода реализации.

  1. Метод 1: Использование вспомогательного реквизита в табличной части

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

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

    2. Заполнение вспомогательного реквизита:

      Теперь нам нужно обеспечить заполнение этого реквизита. Мы будем проверять номенклатуру в каждой строке и устанавливать флаг ПрослеживаемыйТовар в зависимости от ее свойств. Это можно делать в нескольких местах:

      • При изменении номенклатуры в строке: Это гарантирует актуальность флага при интерактивном вводе.
      • При загрузке документа: Для уже существующих документов или при открытии формы.

      Рассмотрим пример кода, который можно разместить в обработчике события ПриИзменении для поля Номенклатура в табличной части:

      
      &НаСервере
      Процедура ТоварыНоменклатураПриИзмененииНаСервере(Элемент)
          // Получаем текущую строку табличной части
          ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
          Если ТекущаяСтрока <> Неопределено Тогда
              // Проверяем, является ли номенклатура прослеживаемой
              // Для этого обратимся к справочнику "Номенклатура"
              Если ТекущаяСтрока.Номенклатура.ВидНоменклатуры.ИспользоватьПрослеживаемость Тогда
                  ТекущаяСтрока.ПрослеживаемыйТовар = Истина;
              Иначе
                  ТекущаяСтрока.ПрослеживаемыйТовар = Ложь;
              КонецЕсли;
          КонецЕсли;
      КонецПроцедуры
      
      &НаКлиенте
      Процедура ТоварыНоменклатураПриИзменении(Элемент)
          ТоварыНоменклатураПриИзмененииНаСервере(Элемент);
      КонецПроцедуры
      

      Обратите внимание, что мы используем свойство ВидНоменклатуры.ИспользоватьПрослеживаемость, которое является одним из возможных способов определения прослеживаемости в 1С. В зависимости от вашей конфигурации, это может быть прямое свойство Номенклатура.ПрослеживаемыйТовар или более сложная проверка.

    3. Настройка программного условного оформления:

      Теперь, когда у нас есть реквизит ПрослеживаемыйТовар, мы можем использовать его для настройки условного оформления. Этот код обычно размещается в обработчике события формы ПриСозданииНаСервере или в отдельной серверной процедуре, которая вызывается при открытии формы.

      
      &НаСервере
      Процедура УстановитьУсловноеОформлениеПрослеживаемости()
          // Создаем новый элемент условного оформления
          ЭлементОформления = УсловноеОформление.Элементы.Добавить();
      
          // Определяем условие оформления
          // Мы используем наш вспомогательный реквизит ПрослеживаемыйТовар
          ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
          ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.ПрослеживаемыйТовар");
          ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
          ЭлементОтбора.ПравоеЗначение = Истина;
          ЭлементОтбора.Использование = Истина;
      
          // Определяем параметры оформления
          // Например, установим цвет фона
          ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЖелтый);
      
          // Указываем поля, к которым применяется оформление.
          // Чтобы подсветить всю строку, перечисляем все поля табличной части,
          // которые мы хотим включить в подсветку.
          ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
          ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыНоменклатура");
          ПолеОформления.Использование = Истина;
      
          ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
          ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыКоличество");
          ПолеОформления.Использование = Истина;
      
          // Добавьте сюда все остальные поля табличной части "Товары",
          // которые вы хотите подсветить, например:
          // ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
          // ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");
          // ПолеОформления.Использование = Истина;
          // и так далее для всех колонок, которые должны быть подсвечены
      КонецПроцедуры
      
      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
          УстановитьУсловноеОформлениеПрослеживаемости();
      КонецПроцедуры
      

      Мы используем WebЦвета.СветлоЖелтый для примера, вы можете выбрать любой другой цвет. Для применения оформления ко всей строке, нам необходимо явно указать все поля табличной части, которые должны быть подсвечены. Это важный момент при работе с программным условным оформлением.

  2. Метод 2: Программное условное оформление без вспомогательного реквизита (прямая проверка)

    В этом подходе мы не создаем дополнительный реквизит. Вместо этого, условие прослеживаемости проверяется непосредственно в настройках условного оформления. Это может быть немного менее производительно, если проверка сложная, но избавляет от необходимости добавлять реквизит в метаданные.

    Принцип похож на предыдущий, но условие отбора будет выглядеть иначе:

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

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

Детали реализации и важные моменты

Разберем по шагам некоторые нюансы, которые помогут нам в работе:

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

← К списку