При разработке обработок для массового заполнения, проверки или выгрузки номенклатуры на сайт часто возникает необходимость вывести список товаров вместе с их дополнительными реквизитами и характеристиками в единую табличную форму. Основная сложность заключается в том, что у разных категорий товаров (например, «Ботинки» и «Рубашки») набор свойств различается, а наименования свойств могут содержать пробелы, спецсимволы или даже совпадать по названию, принадлежа при этом разным видам характеристик.
Разберем подробно, как правильно спроектировать такую таблицу значений, избежать ошибок при именовании колонок, настроить динамическое интерактивное редактирование ячеек и организовать сохранение данных в базу.
В платформе 1С к идентификаторам колонок объекта ТаблицаЗначений предъявляются жесткие требования: имя должно начинаться с буквы или знака подчеркивания, не содержать пробелов, дефисов и спецсимволов. Если попытаться назвать колонку напрямую именем свойства (например, "Размер (см)" или "Состав / Материал"), платформа выдаст ошибку выполнения.
Кроме того, если у двух разных групп номенклатуры есть свойства с одинаковым названием, использование наименований в качестве ключей приведет к дублированию имен колонок.
Для решения этой проблемы разделим понятие имени колонки (системного идентификатора) и заголовка колонки (текста, который видит пользователь на экране).
Рассмотрим два основных подхода к созданию динамической таблицы значений.
В таблицу предварительно добавляется скрытый запас колонок, например от ЗначениеСвойства1 до ЗначениеСвойства30. При выборе текущей группы номенклатуры мы программно управляем их видимостью, заголовками и доступными типами данных.
Колонки создаются «на лету» при смене контекста. Системное имя колонки генерируется из уникального идентификатора элемента Плана Видов Характеристик (ПВХ) или справочника свойств, а заголовок выводится из наименования свойства.
Рассмотрим по шагам реализацию более универсального второго подхода:
Запросом получаем все свойства и характеристики, назначенные для выбранной группы номенклатуры, и сохраняем их во вспомогательный массив или соответствие.
Для каждого свойства генерируем уникальное имя колонки без запрещенных символов:
// Формирование уникального имени колонки на основе ГУИД свойства
ИмяКолонки = "Свойство_" + СтрЗаменить(Строка(СсылкаНаСвойство.УникальныйИдентификатор()), "-", "_");
ТаблицаФормы.Колонки.Добавить(ИмяКолонки, СсылкаНаСвойство.ТипЗначения, СсылкаНаСвойство.Наименование);
Динамически собираем текст запроса с левыми соединениями к регистру сведений ЗначенияСвойствОбъектов для каждого полученного свойства, чтобы значения подставлялись в соответствующие колонки.
Чтобы пользователь мог выбирать значения корректного типа (например, число, булево или значения из конкретного справочника), при формировании элементов управления колонки явно задается ОписаниеТипов:
ЭлементКолонки = ЭлементыФормы.ТаблицаПоля.Колонки[ИмяКолонки];
ЭлементКолонки.ЭлементУправления.ОграничениеТипа = СсылкаНаСвойство.ТипЗначения;
Когда пользователь меняет значение в ячейке таблицы, необходимо определить, какое именно свойство было отредактировано, и записать новое значение в базу данных.
Проанализируем порядок действий при изменении ячейки:
ПриИзменении элемента управления ячейки или самой колонки получаем текущую строку таблицы и имя редактируемой колонки.Соответствие).РегистрСведенийНаборЗаписей с установкой отбора по объекту (номенклатуре или характеристике).
// Пример записи значения свойства через Набор Записей
НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ТекущаяНоменклатура);
НаборЗаписей.Отбор.Свойство.Установить(ТекущееСвойство);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = ТекущаяНоменклатура;
НоваяЗапись.Свойство = ТекущееСвойство;
НоваяЗапись.Значение = НовоеЗначение;
НаборЗаписей.Записать();
Если количество динамических колонок превышает 30–50 штук, прямая работа с объектом ТаблицаЗначений может замедлить перерисовку интерфейса. В таких случаях выгодно использовать ПолеТабличногоДокумента:
Расшифровка записывается структура с контекстом (ссылки на номенклатуру, характеристику и свойство).Расшифровка.Использование описанных подходов позволяет создать удобную интерактивную форму для работы с произвольными характеристиками и свойствами номенклатуры, полностью сохраняя гибкость конфигурации и быстродействие интерфейса.