Как реализовать привязку одной номенклатуры к нескольким группам в 1С:УНФ

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

В стандартной архитектуре 1С справочник Номенклатура имеет иерархическую структуру типа «дерево», где у каждого элемента может быть только один «Родитель». Это классическая связь «один ко многим». Однако современные интернет-магазины требуют связи «многие ко многим», когда один и тот же товар (например, «Поилка») должен отображаться одновременно в категориях «Товары для кроликов» и «Оборудование для шиншилл». Разберем подробно, как реализовать такую задачу в 1С:УНФ 1.6 и 3.0, не создавая дублей номенклатуры и не нарушая логику системы.

Метод 1. Создание виртуальной иерархии через Регистр сведений

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

1. Создание справочника «Категории сайта». Нам необходимо создать новый иерархический справочник, который будет полностью повторять структуру разделов вашего сайта. Это позволит маркетологам менять вложенность категорий, не затрагивая учетную политику 1С.

2. Создание регистра сведений. Создадим непериодический независимый регистр сведений, например, РазделыНоменклатурыНаСайте. В нем определим два измерения:

Это и есть наша таблица связей М:М. Теперь одна номенклатура может иметь столько записей в регистре, в скольких группах она должна состоять.

3. Изменение интерфейса формы подбора. Чтобы менеджер видел товары «как на сайте», нам нужно модифицировать форму списка или форму подбора. Рассмотрим алгоритм: Слева на форме размещаем дерево справочника КатегорииСайта. Справа — динамический список номенклатуры. Нам нужно настроить отбор в динамическом списке при выборе узла в дереве.

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


&НаСервере
Процедура ПриУстановкеПараметровДинамическогоСписка()
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка,
    |	Номенклатура.Код,
    |	Номенклатура.Артикул
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Ссылка В (
    |		ВЫБРАТЬ РС.Номенклатура 
    |		ИЗ РегистрСведений.РазделыНоменклатурыНаСайте КАК РС 
    |		ГДЕ РС.Категория В ИЕРАРХИИ(&ВыбраннаяКатегория)
    |	)";
    
    Список.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры

При активации строки в дереве категорий мы будем передавать параметр &ВыбраннаяКатегория и обновлять список. Это обеспечит мгновенную фильтрацию товаров по виртуальным группам.

Метод 2. Использование штатного механизма сегментов

Если вы не хотите вносить значительные изменения в код, проанализируем возможности механизма Сегментации. Сегменты в УНФ позволяют объединять товары в логические группы по любым правилам.

Рассмотрим порядок действий при использовании сегментов:

  1. Включите использование сегментов в настройках программы.
  2. Создайте сегменты, соответствующие папкам на сайте.
  3. В карточке номенклатуры на вкладке «Сегменты» укажите все необходимые вхождения. Один товар может входить в неограниченное количество сегментов.
  4. В форме подбора используйте стандартный фильтр по сегментам.

Важный нюанс: Сегменты могут формироваться динамически на основе свойств. Например, если у товара стоит галочка «Для грызунов» и «Оборудование», он автоматически попадет в соответствующие сегменты. Это значительно упрощает работу контент-менеджера.

Метод 3. Дополнительные реквизиты и свойства

Разберем ситуацию, когда групп немного. Можно воспользоваться механизмом ДополнительныеРеквизиты. Создадим для номенклатуры несколько дополнительных свойств типа Булево: «Группа_Кролики», «Группа_Шиншиллы», «Группа_Распродажа».

В форме подбора менеджер сможет настроить быстрые отборы по этим флагам. Преимущество: Это решение вообще не требует программирования. Недостаток: При добавлении новой категории на сайт придется добавлять новый реквизит в 1С, что неудобно при часто меняющейся структуре.

Метод 4. Настройка на стороне модуля обмена с CMS (Битрикс и др.)

Часто задача стоит так: «в 1С мне удобно видеть товары по производителям, а на сайте — по назначению». В этом случае выясним, нужно ли вообще менять что-то в базе 1С. Если вы используете стандартный модуль обмена (например, с Bitrix), рассмотрим его возможности:

В модуле обмена существует функционал «Произвольная иерархия». Вы можете настроить дерево групп прямо в модуле. Вы выбираете раздел сайта и «набрасываете» в него товары из разных папок 1С. При выгрузке модуль сам сформирует нужную структуру XML/JSON для сайта, а в 1С товар останется в своей единственной папке. Это идеальный вариант, если множественная иерархия нужна только для интернет-магазина, а не для работы менеджеров в самой 1С.

Метод 5. Использование «Тегов» (Меток) в новых версиях УНФ

В последних версиях 1С:УНФ и 1С:Розница появился мощный механизм Теги. Разберем, как применить его для нашей задачи:

Теги работают по принципу пересечения множеств. Если мы выберем тег «Кролики», система покажет всех кроликов. Если добавим тег «Поилки», останутся только поилки для кроликов. Это наиболее современный и удобный для пользователя UI-подход.

Технические рекомендации по реализации

Выясним причины, почему решение через Регистр Сведений (Метод 1) считается эталонным для программиста: Во-первых, это не нарушает целостность типовой конфигурации. Вы можете вынести весь функционал в расширение. Во-вторых, производительность. Индексированный регистр сведений работает быстрее, чем поиск по строковым свойствам или сложным условиям сегментов. В-третьих, масштабируемость. Вы можете добавить в регистр дополнительные поля, например, ПриоритетТовараВКатегории или ОсновнаяКатегория (для формирования хлебных крошек на сайте).

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Разделы.Категория.Наименование КАК НазваниеГруппы
    |ИЗ
    |	РегистрСведений.РазделыНоменклатурыНаСайте КАК Разделы
    |ГДЕ
    |	Разделы.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", СсылкаНаТовар);
Результат = Запрос.Выполнить().Выгрузить();

Этот код позволит вам в карточке товара вывести список всех «виртуальных» папок, в которых он состоит, что закроет вопрос визуального контроля для менеджера.

Заключение

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

  1. Если нужен быстрый результат без кода — используйте Теги или Сегменты.
  2. Если важна точная копия структуры сайта для обмена — настраивайте Модуль обмена.
  3. Если вы строите серьезную систему с кастомным интерфейсом — внедряйте Регистр Сведений через расширение.
Главное помнить: дублирование элементов номенклатуры — это путь к ошибкам в остатках и ценах. Всегда используйте один элемент Номенклатура и связывайте его с нужным количеством групп через дополнительные сущности.

← На главную