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