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