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

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

При работе с объемными документами, такими как «Коммерческое предложение» или «Заказ клиента», пользователям часто требуется логически разделять строки товаров на группы (например, по этапам работ, по помещениям или категориям). В типовых решениях 1С табличная часть обычно представляет собой плоский список. В данной статье мы разберем по шагам, как реализовать механизм визуальных разделителей и комментариев непосредственно внутри табличной части документа.

Метод 1: Использование специального реквизита и служебного справочника

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

Для начала нам необходимо добавить в табличную часть (например, Товары) следующие реквизиты:

  1. ЭтоРазделитель (Тип: Булево) — определяет, является ли строка технической.
  2. ТекстРазделителя (Тип: Строка или СправочникСсылка.Разделители) — для хранения самого комментария.

Посмотрим на пример кода для добавления такой строки на клиенте:


&НаКлиенте
Процедура ДобавитьРазделитель(Команда)
    // Устанавливаем признак модифицированности формы
    ЭтаФорма.Модифицированность = Истина;
    
    // Создаем новую строку в табличной части
    НоваяСтрока = Объект.Товары.Добавить();
    НоваяСтрока.ЭтоРазделитель = Истина;
    
    // Позволяем пользователю ввести текст комментария
    ТекстКомментария = "";
    Если ВвестиЗначение(ТекстКомментария, "Введите текст разделителя", "Строка") Тогда
        НоваяСтрока.НоменклатураНаименование = ТекстКомментария; // Или другой реквизит для текста
    КонецЕсли;
    
    // Активизируем строку для пользователя
    Элементы.Товары.ТекущаяСтрока = НоваяСтрока.НомерСтроки - 1;
КонецПроцедуры

Метод 2: Расширение функционала через «Тип строки»

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

Это позволит нам гибко управлять поведением формы. Проанализируем преимущества:

Метод 3: Визуальное оформление (создание иллюзии объединения ячеек)

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

  1. Перейдем в свойства формы на закладку «Условное оформление».
  2. Добавим новое правило оформления.
  3. В «Оформляемых полях» выберем все колонки, кроме той, где выводится текст комментария (например, Номенклатура).
  4. В «Условии» укажем: Объект.Товары.ЭтоРазделитель Равно Истина.
  5. В «Оформлении» установим свойство Видимость = Ложь или Текст = "".
  6. Для всей строки установим особый цвет фона (например, светло-серый) и шрифт (жирный).

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

Технические нюансы: расчет итогов и нумерация

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

В модуле объекта в процедуре ПриЗаписи или при расчете итогов необходимо добавить условие:


Процедура РассчитатьИтогиДокумента()
    ОбщаяСумма = 0;
    Для Каждого СтрокаТЧ Из Товары Цикл
        // Пропускаем строки-разделители при подсчете суммы
        Если СтрокаТЧ.ЭтоРазделитель Тогда
            Продолжить;
        КонецЕсли;
        
        ОбщаяСумма = ОбщаяСумма + СтрокаТЧ.Сумма;
    КонецЦикла;
    СуммаДокумента = ОбщаяСумма;
КонецПроцедуры

Также проанализируем вопрос нумерации. Если для печатной формы требуется сквозная нумерация только товаров (1, 2, 3...), игнорируя разделители, рекомендуем добавить скрытый реквизит НомерДляПечати. Этот реквизит должен пересчитываться программно при каждом изменении состава табличной части.

Использование «Служебной номенклатуры»

Если ваша конфигурация находится на поддержке и вы не хотите менять структуру табличной части, рассмотрим способ со «Служебной номенклатурой». Вы можете создать в справочнике Номенклатура специальный элемент с наименованием «--- РАЗДЕЛИТЕЛЬ ---».

Пропишем в событии ПриИзменении колонки номенклатуры следующий код:


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

Выводы

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

← На главную