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