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