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