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