Как реализовать сохранение данных, введенных пользователем прямо в ячейки отчета

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

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

Выбор места для хранения данных

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

  1. Производительность: Регистры сведений оптимизированы для быстрой записи и получения данных по набору измерений.
  2. Гибкость: Мы можем создать измерения для привязки комментария к конкретному объекту (например, контрагенту), пользователю или дате.
  3. Отсутствие ссылочной целостности: В отличие от справочников, удаление или изменение записей в регистре сведений меньше влияет на общую структуру базы данных и не создает "битых" ссылок.

Рекомендуется создать непериодический независимый регистр сведений (например, ДополнительныеКомментарииОтчетов) со следующей структурой:

Подготовка макета для интерактивного ввода

Чтобы пользователь мог что-то написать в ячейку сформированного отчета, нам нужно правильно настроить свойства области в макете. Рассмотрим основные настройки:

Во-первых, для ячейки, предназначенной для ввода комментария, необходимо снять флаг Только просмотр. Если весь табличный документ защищен, то для конкретной области нужно установить свойство Защита = Ложь.

Во-вторых, крайне важно использовать свойство СодержитЗначение. Если мы установим его в Истина и укажем тип данных Строка, ячейка начнет вести себя как полноценное поле ввода. Это позволит пользователю редактировать текст привычным способом.

Идентификация строк: использование Расшифровки

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

Рассмотрим алгоритм заполнения:


// При выводе строки отчета
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
// Заполняем параметры
ОбластьМакета.Параметры.Номенклатура = Выборка.Номенклатура;
// В расшифровку ячейки комментария пишем уникальный ключ (ссылку)
ОбластьМакета.Области.Комментарий.Расшифровка = Выборка.Номенклатура;
ТабДок.Вывести(ОбластьМакета);

Теперь в каждой ячейке комментария "спрятана" ссылка на объект, к которому этот комментарий относится.

Алгоритм сохранения введенных данных

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

  1. Проходим циклом по всем строкам ТабличногоДокумента.
  2. Находим ячейку в колонке "Комментарий".
  3. Извлекаем значение из свойства Расшифровка — это наш ключ.
  4. Извлекаем введенный текст из свойства Текст.
  5. Записываем данные в регистр сведений.

Пример кода для сохранения данных:


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

Восстановление данных при повторном формировании

Чтобы отчет не "затирал" поле комментария при каждом формировании, мы должны модифицировать запрос или алгоритм вывода. Выясним, как это сделать эффективнее.

Самый правильный путь — подтянуть сохраненные комментарии прямо в запросе отчета, используя ЛЕВОЕ СОЕДИНЕНИЕ основной таблицы с нашим регистром сведений по ключу (например, по ссылке на номенклатуру или контрагента).

Посмотрим на пример логики вывода:


// В цикле вывода данных
ЗаписьИзРегистра = РегистрыСведений.ДополнительныеКомментарииОтчетов.Получить(Новый Структура("ОбъектСвязки, ИмяОтчета", Выборка.Ссылка, "МойОтчетПоПродажам"));

Если ЗаписьИзРегистра.ТекстКомментария <> Неопределено Тогда
    ОбластьМакета.Параметры.Комментарий = ЗаписьИзРегистра.ТекстКомментария;
Иначе
    ОбластьМакета.Параметры.Комментарий = ""; // Оставляем пустым для ввода
КонецЕсли;

Автоматизация через события (Advanced)

Для создания максимально удобного интерфейса можно использовать событие табличного документа ПриИзмененииСодержимогоОбласти. Это позволит сохранять комментарий в базу данных сразу же, как только пользователь закончил редактирование ячейки и нажал Enter. В этом случае нам не нужно обходить весь отчет циклом, достаточно обработать одну измененную область, получив её координаты и расшифровку.

Визуальные акценты для пользователя

Проанализируем ситуацию: пользователь может запутаться, какие ячейки можно редактировать, а какие нет. Рекомендуем использовать визуальную индикацию:

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

← На главную