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