Как в документе 1С программно скрыть Вес или Количество в зависимости от выбранного товара?

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

При разработке интерфейсов в 1С часто возникает задача динамического управления элементами формы. Одной из типовых задач является изменение состава доступных полей в табличной части документа в зависимости от того, какой товар выбрал пользователь. Например, если в строке выбран «Сахар», нам нужно заполнять «Вес», а поле «Количество» должно стать недоступным или скрыться, и наоборот.

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

Способ 1: Использование Условного оформления (Управляемые формы)

Проанализируем ситуацию: в управляемом интерфейсе 1С 8.3 мы не можем скрыть колонку только для одной конкретной строки. Если мы установим свойство Видимость в значение Ложь, колонка исчезнет у всей таблицы целиком. Поэтому для работы внутри строк используется механизм Условного оформления. Он позволяет управлять Доступностью, Только просмотром или Цветом текста для каждой ячейки индивидуально на основании заданных условий.

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


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

КонецПроцедуры

В данном примере мы программно запрещаем редактирование поля Вес для всех товаров, кроме сахара. Этот метод хорош тем, что он работает на уровне платформы и не требует написания кода в событиях каждой строки, что положительно сказывается на производительности формы.

Способ 2: Динамическое управление видимостью всей колонки

Если бизнес-логика подразумевает, что при выборе определенного режима или типа документа колонки должны скрываться полностью для всех строк, мы используем прямое управление свойствами элементов формы. Проанализируем, как это реализовать в обработчике события ПриИзменении номенклатуры.

Рассмотрим пример кода, который будет переключать видимость колонок в зависимости от данных в текущей строке:


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

Важный нюанс: использование свойства Видимость в интерактивной работе может раздражать пользователя, если в таблице много разных товаров, так как колонки будут постоянно "прыгать". В таких случаях Условное оформление (Способ 1) является более предпочтительным.

Способ 3: Работа с Табличным документом (Печатная форма)

Если под "табличным документом" вы имели в виду именно печатную форму (объект ТабличныйДокумент), то логика построения здесь совершенно иная. Здесь мы управляем выводом областей макета. Выясним, как использовать методы Вывести() и Присоединить() для формирования динамических колонок.

Посмотрим на пример алгоритма формирования печатной формы:

  1. Создаем макет с отдельными вертикальными секциями для "Количества" и "Веса".
  2. В цикле обхода строк документа проверяем условие.
  3. Если товар весовой, сначала выводим начало строки, а затем методом Присоединить() добавляем колонку с весом.
  4. Если товар штучный — присоединяем колонку с количеством.

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Печать");

// Выводим шапку
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
    
    // Выводим начало строки (Номенклатура, Номер)
    ОбластьСтрокаНачало = Макет.ПолучитьОбласть("Строка|Начало");
    ТабДок.Вывести(ОбластьСтрокаНачало);
    
    Если СтрокаТЧ.Номенклатура.Весовой Тогда
        // Присоединяем область с Весом
        ОбластьВес = Макет.ПолучитьОбласть("Строка|Вес");
        ОбластьВес.Параметры.Заполнить(СтрокаТЧ);
        ТабДок.Присоединить(ОбластьВес);
    Иначе
        // Присоединяем область с Количеством
        ОбластьКол = Макет.ПолучитьОбласть("Строка|Количество");
        ОбластьКол.Параметры.Заполнить(СтрокаТЧ);
        ТабДок.Присоединить(ОбластьКол);
    КонецЕсли;
    
КонецЦикла;

Рекомендации по реализации

Проанализировав оба подхода, можно дать несколько практических советов:

Таким образом, выбор метода зависит от вашей конечной цели: если нужно помочь пользователю при вводе данных в документ — используйте Условное оформление; если нужно сформировать красивый отчет или накладную — используйте секции макета и метод Присоединить.

← На главную