Как реализовать множественные значения дополнительных реквизитов в 1С:УТ 11.4

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

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

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

Почему в типовой 1С нельзя выбрать несколько значений реквизита

Проанализируем архитектуру хранения данных. Все дополнительные реквизиты в УТ 11.4 (и других конфигурациях на базе БСП) хранятся в табличной части ДополнительныеРеквизиты объекта (справочника Номенклатура, Партнеры и т.д.). На уровне метаданных эта табличная часть имеет уникальный индекс по полю Свойство. Это означает, что система физически не позволяет записать две строки с одним и тем же свойством для одного объекта. При попытке программной записи нескольких строк БСП либо выдаст ошибку, либо "свернет" значения, оставив только последнее.

Рассмотрим способы, которыми можно обойти это ограничение.

Способ 1: Использование типа значения "Булево"

Этот метод является самым простым и не требует программирования. Если набор значений свойства ограничен и меняется редко (например, "Цвет"), мы можем создать для каждого значения отдельный дополнительный реквизит.

Разберем по шагам:

  1. Вместо одного реквизита "Цвета" создаем группу реквизитов "Цвета".
  2. Внутри группы создаем реквизиты: "Цвет: Красный", "Цвет: Синий", "Цвет: Зеленый" с типом значения Булево.
  3. В карточке номенклатуры пользователь просто ставит галочки напротив нужных цветов.

Преимущества: работает "из коробки", не требует обновлений, корректно выгружается в типовой обмен CommerceML.

Недостатки: если значений много (например, 50-100), форма карточки товара станет перегруженной, а администрирование списка превратится в кошмар. Кроме того, создание новых значений требует прав на изменение состава дополнительных реквизитов.

Способ 2: Использование характеристик номенклатуры

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

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

Способ 3: Программная доработка с хранением в строке

Это один из самых популярных методов среди разработчиков. Мы создаем один дополнительный реквизит с типом Строка, а визуальный выбор значений организуем через расширение. Для решения этой задачи можно использовать расширение для множественного выбора значений дополнительных реквизитов в УТ 11.4.

Рассмотрим алгоритм реализации:

  1. Создаем дополнительный реквизит "Цвета (множественный)" с типом Строка (неограниченная длина).
  2. С помощью расширения перехватываем событие ПриСозданииНаСервере формы карточки номенклатуры.
  3. Заменяем стандартное поле ввода строки на поле с кнопкой выбора или гиперссылку.
  4. При нажатии открываем форму со списком значений (которые можно хранить в отдельном справочнике или в настройках реквизита).
  5. Выбранные значения склеиваем в строку через разделитель (например, запятую или точку с запятой) и записываем в реквизит: "Красный; Синий; Зеленый".

Пример кода для программного заполнения такого реквизита может выглядеть так:


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

Этот способ отлично подходит для интеграции с Битрикс. На стороне сайта достаточно написать небольшой скрипт (обработчик события OnSuccessCatalogImport1C), который будет разбивать строку по разделителю и заполнять множественное свойство инфоблока.

Способ 4: Глубокая модификация механизмов БСП (через расширение)

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

Разберем основные этапы:

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

Важный нюанс при таком подходе — работа отчетов. Стандартные отчета 1С (например, "Ведомость по товарам на складах"), если в них добавить группировку по такому свойству, начнут дублировать строки. Если у товара 3 цвета, то в отчете остаток по этому товару может увеличиться в 3 раза, так как SQL-запрос выполнит соединение с тремя строками таблицы дополнительных реквизитов.

Особенности выгрузки в 1С-Битрикс

Множественные свойства в 1С часто создаются именно ради интернет-магазина. Посмотрим на пример того, как данные должны выглядеть в файле обмена import.xml для Битрикса:


<ЗначенияСвойств>
    <ЗначенияСвойства>
        <Ид>Идентификатор_Свойства</Ид>
        <Значение>Значение_1</Значение>
        <Значение>Значение_2</Значение>
    </ЗначенияСвойства>
</ЗначенияСвойств>

Если вы используете типовой модуль обмена от Битрикс, вам потребуется доработать функцию ЛогикаВыгрузкиСвойств в модуле обмена. Если в 1С вы выбрали вариант со "строкой через запятую", то в модуле обмена нужно будет добавить СтрРазделить() и в цикле сформировать несколько узлов Значение в XML-структуре. Это позволит сайту сразу "понять", что свойство множественное, и корректно отобразить его в фильтре.

Резюме

Выяснив все технические детали, можно дать следующие рекомендации:

При любом выборе помните о производительности: большое количество дополнительных реквизитов может замедлить открытие карточки номенклатуры и работу списков товаров.

← На главную