Как разрешить редактирование данных в ячейках табличного документа при использовании СКД?

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

При разработке интерактивных отчетов и форм ввода в платформе 1С часто возникает задача: предоставить пользователю возможность редактировать значения прямо в ячейках сформированного табличного документа. Однако разработчики сталкиваются с особенностью платформы — настройки ячеек макета СКД (такие как снятие защиты или установка признака ввода значения) не переносятся в итоговый результат компоновки.

В этой статье мы подробно проанализируем причины такого поведения системы и рассмотрим проверенные способы реализации интерактивного редактирования ячеек в отчетах на базе системы компоновки данных (СКД).

Почему СКД игнорирует свойства редактирования ячеек из макета?

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

К свойствам ячейки, которые сбрасываются процессором вывода, относятся:

  1. Защита — флаг защиты ячейки от изменения.
  2. СодержитЗначение — признак того, что ячейка хранит не просто текст, а объект или число заданного типа.
  3. ТипЗначения — описание допустимых типов данных для редактирования.

Кроме того, даже если изменить свойство Защита = Ложь у конкретной ячейки, пользователь не сможет ее отредактировать, пока у всего результирующего объекта ТабличныйДокумент включено свойство ТолькоПросмотр = Истина.

Способ 1. Управление доступностью в событии «Выбор» (Рекомендуемый вариант)

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

Особенность платформы 1С заключается в том, что событие Выбор элемента формы ТабличныйДокумент срабатывает при двойном клике мышью или нажатии клавиши Enter даже на тех ячейках, у которых установлено свойство Защита = Истина.

Разберем по шагам порядок настройки этого решения:

  1. В свойствах элемента формы, отображающего ТабличныйДокумент, отключим глобальную блокировку просмотра: выставим ТолькоПросмотр = Ложь.
  2. Для поля табличного документа на форме создадим обработчик события Выбор.
  3. Внутри обработчика проанализируем текущую выбранную область и при необходимости отключим защиту для конкретной ячейки, включив возможность ввода значения.

Посмотрим на пример реализации кода в модуле формы:


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

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

Этот способ позволяет интерактивно снимать защиту «по требованию» — в момент, когда пользователь обращается к конкретной ячейке.

Способ 2. Поэлементный программный вывод отчета через СКД

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

Проанализируем алгоритм поэлементного вывода:

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

Рассмотрим пример кода в модуле объекта или формы:


// Инициализация процессоров СКД
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(РезультатТабДок);

// Начинаем вывод
ПроцессорВывода.ВывестиЗаголовок();

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

ПроцессорВывода.ВывестиЗавершение();

// Разрешаем редактирование документа в целом
РезультатТабДок.ТолькоПросмотр = Ложь;

Архитектурные ограничения и важные особенности

При реализации интерактивного ввода в табличных документах СКД следует учитывать ключевые ограничения платформы:

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

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

← На главную