Как в табличной части документа выделить цветом неотгруженные товары в 1С:УТ 11?

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

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

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

Особенности работы с табличными частями в управляемых формах

Проанализируем специфику платформы. В отличие от обычных форм (где присутствовало событие ПриПолученииДанных, позволявшее делать запросы к регистрам в момент отрисовки видимых строк), в управляемом интерфейсе табличная часть документа представлена объектом ДанныеФормыКоллекция. Это накладывает следующие ограничения:

  1. Отсутствие построчной дочитки данных: механизм условного оформления формы умеет работать только с теми полями, которые уже физически загружены в реквизиты формы. Нельзя написать условие оформления, обращающееся напрямую к остаткам регистра накопления.
  2. Нецелесообразность изменения метаданных: создавать новый реквизит табличной части непосредственно в объекте конфигурации крайне нежелательно. Это приводит к раздуванию структуры таблиц СУБД, хранению избыточных данных и усложнению обновлений типовой конфигурации.

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

Пошаговая реализация подсветки строк

Рассмотрим по шагам создание функционала с помощью механизма расширений или программной доработки формы.

Шаг 1. Добавление расчетной колонки в данные формы.

Нам требуется колонка, отражающая статус позиции (например, признак Отгружен с типом Булево или числовой остаток). Сделать это можно двумя способами:

  1. В расширении конфигурации: заимствуем форму документа и добавляем новый реквизит в коллекцию Объект.Товары.
  2. Программно в обработчике ПриСозданииНаСервере с помощью метода ИзменитьРеквизиты.

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


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

Шаг 2. Расчет состояния отгрузки на сервере.

Выясним, где и как вычислять признак отгрузки. Оптимальными событиями для расчета являются ПриЧтенииНаСервере (срабатывает при открытии сохраненного документа) и ПослеЗаписиНаСервере (актуализирует состояние после проведения документа). Для нового документа расчет выполнять бессмысленно, так как движений по регистрам он еще не сформировал.

Разберем серверную процедуру расчета. В ней мы выполняем запрос к регистру остатков (например, к виртуальной таблице остатков регистра накопления ЗаказыКлиентов или ТоварыКОтгрузке) с отбором по ссылке текущего документа:


&НаСервере
Процедура РассчитатьОтгрузкуПоСтрокам()
    Если Объект.Ссылка.Пустая() Тогда
        Возврат;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Остатки.Номенклатура КАК Номенклатура,
        |   Остатки.Характеристика КАК Характеристика,
        |   Остатки.КоличествоОстаток КАК ОстатокКОтгрузке
        |ИЗ
        |   РегистрНакопления.ЗаказыКлиентов.Остатки(, ЗаказКлиента = &Ссылка) КАК Остатки";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    // Заполняем расчетную колонку формы
    Для Каждого СтрТовары Из Объект.Товары Цикл
        Отбор = Новый Структура("Номенклатура, Характеристика", СтрТовары.Номенклатура, СтрТовары.Характеристика);
        НайденныеСтроки = РезультатЗапроса.НайтиСтроки(Отбор);
        
        // Если остатка к отгрузке нет или он равен нулю - товар отгружен полностью
        Если НайденныеСтроки.Количество() = 0 ИЛИ НайденныеСтроки[0].ОстатокКОтгрузке <= 0 Тогда
            СтрТовары.Отгружен = Истина;
        Иначе
            СтрТовары.Отгружен = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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


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

Интерфейсные тонкости и типовые альтернативы

При реализации подсветки важно учитывать следующие нюансы:

  1. Выбор параметра оформления: не рекомендуется использовать параметр ЦветФона для всей строки целиком. Платформа 1С при установке фокуса на строку перекрывает пользовательский фон стандартным выделением активности, из-за чего текст часто становится нечитаемым. Гораздо надежнее менять ЦветТекста, делать шрифт полужирным или выводить отдельную иконку состояния.
  2. Интерактивное редактирование: если пользователь меняет строки или количество прямо в открытом документе, расчетные данные теряют актуальность до момента повторного проведения. Об этом следует предупреждать пользователей либо программно сбрасывать визуализацию при модификации формы.
  3. Типовой отчет «Состояние выполнения»: прежде чем перегружать форму документа сложной расчетной логикой, покажем пользователям типовой отчет «Состояние выполнения заказа» (или отчет по обеспечению). Он встроен в типовую конфигурацию 1С:Управление торговлей и выводит полную аналитику по резервам, отгрузкам и остаткам без необходимости доработки конфигурации.
  4. Работа со списком заказов: если менеджерам требуется оперативный контроль отгрузки по множеству документов, задачу эффективнее решать на уровне формы списка заказов через динамический список, где остатки соединяются в едином запросе.
← На главную