Как реализовать поле ввода нескольких комментариев в 1С:ERP без создания множества реквизитов

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

В процессе разработки в 1С:ERP часто возникает задача организовать удобную историю комментариев к документу или справочнику. Стандартное текстовое поле позволяет хранить лишь одну запись, а создание множества отдельных реквизитов («Комментарий1», «Комментарий2» и так далее) — это тупиковый путь, который усложняет структуру базы данных и интерфейс. Рассмотрим, как реализовать механизм, при котором пользователь вводит текст в одно поле, нажимает Enter (или кнопку), и данные сохраняются в историю, очищая поле ввода.

Вариант 1. Использование расширения и регистра сведений

Проанализируем наиболее надежный с точки зрения архитектуры подход — хранение данных в отдельном регистре сведений (РС). Это позволит не раздувать основную таблицу документа и легко строить отчеты по истории изменений. Разберем шаги реализации:

  1. Создадим в расширении новый Регистр Сведений (например, ЛогКомментариев).
  2. В качестве измерений укажем Объект (тип ЛюбаяСсылка) и ДатаПериод (тип Дата).
  3. В ресурсы добавим Автор (тип СправочникСсылка.Пользователи) и собственно ТекстКомментария (тип Строка неограниченной длины).

Теперь проанализируем программную часть. На форме объекта нам понадобится текстовое поле (реквизит формы, а не объекта), в которое пользователь будет писать текст. В обработчике события ПриИзменении или при нажатии кнопки выполним следующий код:


&НаСервере
Процедура ДобавитьКомментарийНаСервере(СсылкаНаОбъект, Текст)
    НоваяЗапись = РегистрыСведений.ЛогКомментариев.СоздатьМенеджерЗаписи();
    НоваяЗапись.Объект = СсылкаНаОбъект;
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.Автор = Пользователи.ТекущийПользователь();
    НоваяЗапись.ТекстКомментария = Текст;
    НоваяЗапись.Записать();
КонецПроцедуры

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

Вариант 2. Использование штатных подсистем БСП (Заметки и Обсуждения)

Рассмотрим ситуацию, когда мы не хотим писать много кода. 1С:ERP базируется на Библиотеке стандартных подсистем (БСП), в которой уже есть готовый функционал. Посмотрим на два варианта:

Подсистема «Заметки»: позволяет пользователям создавать произвольные текстовые блоки, привязанные к объекту. Выясним, как это включить. В расширении необходимо добавить ваш документ в префикс состава типов для подсистемы заметок. Это даст возможность вызывать окно заметок прямо из командной панели документа. Каждая заметка — это отдельная сущность со своим автором и временем создания.

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

Вариант 3. Хранение истории в одном реквизите через сериализацию (JSON)

Если по каким-то причинам использование регистра невозможно, проанализируем метод хранения «всего в одном поле». Чтобы данные оставались структурированными, используем формат JSON. Это позволит хранить массив структур (Дата, Автор, Текст) внутри одной строки неограниченной длины.

Разберем пример кода для добавления комментария в такое поле:


&НаСервере
Процедура ЗаписатьКомментарийВJSON(НовыйТекст)
    // Читаем текущий массив из реквизита объекта
    МассивКомментариев = Новый Массив;
    Если ЗначениеЗаполнено(Объект.СлужебныйРеквизитХранения) Тогда
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(Объект.СлужебныйРеквизитХранения);
        МассивКомментариев = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
    КонецЕсли;

    // Добавляем новый элемент
    СтруктураЗаписи = Новый Структура;
    СтруктураЗаписи.Вставить("Дата", ТекущаяДата());
    СтруктураЗаписи.Вставить("Автор", Строка(Пользователи.ТекущийПользователь()));
    СтруктураЗаписи.Вставить("Текст", НовыйТекст);
    МассивКомментариев.Добавить(СтруктураЗаписи);

    // Записываем обратно
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, МассивКомментариев);
    Объект.СлужебныйРеквизитХранения = Запись.Закрыть();
КонецПроцедуры

Для отображения такой истории на форме лучше всего использовать Поле HTML-документа. Проанализируем почему: это позволит нам красиво форматировать вывод, например, подсвечивать имя автора жирным шрифтом, а дату — серым цветом. При открытии формы мы будем генерировать HTML-строку из нашего JSON-массива и выводить её в данное поле.

Вариант 4. Визуализация через Табличную Часть

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

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

Вариант 5. Дополнительные сведения

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

Однако, проанализируем ситуацию: если нам нужна именно история, то обычное дополнительное сведение будет перезаписываться. Чтобы этого избежать, можно использовать Версионирование объектов. Если включить версионирование для документа, система сама будет хранить историю изменения поля «Комментарий». Мы всегда сможем открыть отчет «История изменений» и увидеть, кто, когда и какой текст вписал в это поле в прошлый раз.

Рекомендации по выбору решения

Подведем итог и выберем оптимальный путь:

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

← На главную