Как сформировать таблицу значений с динамическими колонками для редактирования свойств и характеристик номенклатуры в 1С?

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

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

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

Главная проблема: корректное именование колонок в 1С

В платформе 1С к идентификаторам колонок объекта ТаблицаЗначений предъявляются жесткие требования: имя должно начинаться с буквы или знака подчеркивания, не содержать пробелов, дефисов и спецсимволов. Если попытаться назвать колонку напрямую именем свойства (например, "Размер (см)" или "Состав / Материал"), платформа выдаст ошибку выполнения.

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

Для решения этой проблемы разделим понятие имени колонки (системного идентификатора) и заголовка колонки (текста, который видит пользователь на экране).

Варианты реализации динамических колонок

Рассмотрим два основных подхода к созданию динамической таблицы значений.

  1. Использование фиксированного пула колонок со смещением.

    В таблицу предварительно добавляется скрытый запас колонок, например от ЗначениеСвойства1 до ЗначениеСвойства30. При выборе текущей группы номенклатуры мы программно управляем их видимостью, заголовками и доступными типами данных.

  2. Динамическое формирование колонок на основе ГУИД.

    Колонки создаются «на лету» при смене контекста. Системное имя колонки генерируется из уникального идентификатора элемента Плана Видов Характеристик (ПВХ) или справочника свойств, а заголовок выводится из наименования свойства.

Алгоритм реализации через ГУИД и настройку заголовков

Рассмотрим по шагам реализацию более универсального второго подхода:

  1. Определяем список применимых свойств.

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

  2. Формируем системные имена и заголовки.

    Для каждого свойства генерируем уникальное имя колонки без запрещенных символов:

    
    // Формирование уникального имени колонки на основе ГУИД свойства
    ИмяКолонки = "Свойство_" + СтрЗаменить(Строка(СсылкаНаСвойство.УникальныйИдентификатор()), "-", "_");
    ТаблицаФормы.Колонки.Добавить(ИмяКолонки, СсылкаНаСвойство.ТипЗначения, СсылкаНаСвойство.Наименование);
    
  3. Заполняем данные запросом.

    Динамически собираем текст запроса с левыми соединениями к регистру сведений ЗначенияСвойствОбъектов для каждого полученного свойства, чтобы значения подставлялись в соответствующие колонки.

  4. Настраиваем типы данных ячеек для ввода.

    Чтобы пользователь мог выбирать значения корректного типа (например, число, булево или значения из конкретного справочника), при формировании элементов управления колонки явно задается ОписаниеТипов:

    
    ЭлементКолонки = ЭлементыФормы.ТаблицаПоля.Колонки[ИмяКолонки];
    ЭлементКолонки.ЭлементУправления.ОграничениеТипа = СсылкаНаСвойство.ТипЗначения;
    

Обработка изменений и сохранение данных

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

Проанализируем порядок действий при изменении ячейки:

  1. В событии ПриИзменении элемента управления ячейки или самой колонки получаем текущую строку таблицы и имя редактируемой колонки.
  2. По имени колонки восстанавливаем ссылку на свойство (например, извлекая ГУИД из имени колонки или обращаясь к предварительно подготовленному объекту Соответствие).
  3. Записываем полученные данные в регистр сведений. Для максимальной производительности рекомендуется использовать РегистрСведенийНаборЗаписей с установкой отбора по объекту (номенклатуре или характеристике).

// Пример записи значения свойства через Набор Записей
НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ТекущаяНоменклатура);
НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство);

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = ТекущаяНоменклатура;
НоваяЗапись.Свойство = ТекущееСвойство;
НоваяЗапись.Значение = НовоеЗначение;

НаборЗаписей.Записать();

Альтернативный вариант: Поле Табличного Документа

Если количество динамических колонок превышает 30–50 штук, прямая работа с объектом ТаблицаЗначений может замедлить перерисовку интерфейса. В таких случаях выгодно использовать ПолеТабличногоДокумента:

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

← На главную