Как в 1С 8.3 сделать табличную часть документа с фиксированными строками и предопределенной колонкой

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

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

Рассмотрим подробно несколько способов реализации подобной логики в платформе 1С:Предприятие 8.3 — от настройки стандартной табличной части до более гибких архитектурных решений.

Способ 1. Программное заполнение табличной части и блокировка структуры на форме

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

Шаг 1. Инициализация строк при создании документа

В модуле объекта документа или в обработчике события формы ПриСозданииНаСервере заполняем табличную часть нужным списком строк, если документ еще не записан в базу данных:


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

Шаг 2. Настройка свойств таблицы на форме

Чтобы пользователь не мог нарушить предопределенную структуру строк бланка, в свойствах элемента формы (таблицы) отключаем стандартные механизмы изменения состава:

  1. Снимаем флаг ИзменятьСоставСтрок (запрещает добавление и удаление строк через командную панель и контекстное меню).
  2. Снимаем флаг ИзменятьПорядокСтрок (запрещает перемещение строк вверх и вниз).
  3. Для элемента формы, связанного с предопределенной колонкой (например, ПоказателиОтчетаНаименованиеПоказателя), устанавливаем свойство ТолькоПросмотр = Истина или Доступность = Ложь.
  4. Для ускорения ручного ввода данных в свойствах этой же нередактируемой колонки включаем флаг ПропускатьПриВводе. Это позволит курсору при нажатии Enter или Tab сразу переходить к ячейкам ввода значений.

Шаг 3. Защита через события таблицы формы

Проанализируем события таблицы формы, чтобы исключить возможность добавления или удаления строк горячими клавишами (Insert, Delete):


&НаКлиенте
Процедура ПоказателиОтчетаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа)
    Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПоказателиОтчетаПередУдалением(Элемент, Отказ)
    Отказ = Истина;
КонецПроцедуры

Способ 2. Использование условного оформления для сложных иерархических бланков

Если форма содержит группировочные строки (заголовки, строки «Итого», «в том числе»), их можно визуально выделить и выборочно заблокировать от редактирования с помощью механизма УсловноеОформление.

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


&НаСервере
Процедура НастроитьУсловноеОформлениеТаблицы()
    
    // Блокировка ячеек для строк-заголовков
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ПоказателиОтчетаЗначение");
    
    ОтборОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПоказателиОтчета.ЭтоЗаголовок");
    ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборОформления.ПравоеЗначение = Истина;
    
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоСерый);
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Полужирный
    
КонецПроцедуры

Способ 3. Отображение через ПолеТабличногоДокумента

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

В этом случае разработчики размещают на форме элемент ПолеТабличногоДокумента:

  1. Макет бланка выводится в табличный документ на форме.
  2. Ячейки с предопределенным текстом защищаются свойством области Защита = Истина.
  3. Для ввода данных пользователю открываются только определенные ячейки с параметром Защита = Ложь.
  4. При изменении ячеек обрабатывается событие ПриИзмененииСодержимогоОбласти, где происходит валидация и автоматический пересчет итогов.
  5. Хранение введенных данных организуется либо в реквизите документа с типом ХранилищеЗначений (целиком табличный документ), либо данные разбираются и записываются в плоский регистр сведений по кодам показателей.

Рекомендации по проектированию структуры данных

Проанализируем важные архитектурные нюансы при хранении статических бланков:

1. Идентификация показателей по коду, а не по наименованию
Крайне не рекомендуется идентифицировать строки отчета только по текстовому представлению («Педагогические работники...»). При изменении формулировок, пробелов или регистра символов алгоритмы построения сводных отчетов перестанут находить нужные показатели. Используйте отдельный реквизит табличной части КодПоказателя (число или предопределенный элемент справочника/перечисления).

2. Версионирование структуры бланка
Если со временем бланк отчета может измениться законодательно, добавьте в шапку документа реквизит ВерсияШаблона. При открытии сохраненного документа проверяйте его версию и не перезаполняйте табличную часть структурой нового бланка, чтобы не исказить исторические данные прошлых периодов.

← На главную