Создание множественного дополнительного реквизита. Управление торговлей 11

Программирование - Практика программирования

Создание механизма множественного дополнительного реквизита для выгрузки в битрикс.

Здравствуйте, уважаемые читатели! 

Хочу поделиться своей реализацией множественного выбора дополнительного реквизита в Управлении торговлей 11 (проверено на 11.4.1.261) для последующей выгрузки его в интернет-магазин под управлением 1С битрикс. Для чего это потребовалось? В определенный момент менеджер интернет-магазина мне сказал: хочу увидеть весь ассортимент выбранного товара (условно назовем его Товар№1) красного, синего и зеленого цветов, как?. Сразу оговорюсь, что по ряду внутренних причин характеристики мы не используем, возможно, с ними будет совсем другая история, но поскольку данный вопрос возникает периодически, я решил написать эту статью. Так вот, в УТ цвет это у нас дополнительный реквизит и соответственно он может принимать только одно значение. На сайте это выглядит как выбор из списка, а требуется чтобы можно было отмечать галочкой несколько значений.

з.ы. это моя первая публикация (не только на ИС, но и вообще), не судите строго :)

Итак, начнем. Весь процесс доработки можно разделить на 3 этапа:

  1. Доработка механизма создания и вывода на форму дополнительных реквизитов.
  2. Доработка xsd схемы.
  3. Доработка выгрузки на сайт.

1. Доработка механизма создания и вывода на форму дополнительных реквизитов.

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

Чтобы получать ссылку на нужный элемент ПВХ, я добавил функцию в модуль УправлениеСвойствамиСлужебный

Функция ПолучитьУИДМножественногоСвойства() Экспорт
    Возврат "859484ef-7e0a-11e7-8111-3863bb43122b";
КонецФункции

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

Перед ним добавим следующий код:

лУИД = Новый УникальныйИдентификатор(ПолучитьУИДМножественногоСвойства());
МножественноеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(лУИД);
ЭтоПервый = Истина;

А в теле цикла будем отлавливать наше свойство следующим образом:

Если Строка.Свойство = МножественноеСвойство Тогда
    Если ЭтоПервый Тогда
        ЭтоПервый = Ложь;
    Иначе 
        фКэшОписания = ОписаниеСвойства;
        ОписаниеСвойства = ОписаниеСвойств.Добавить();
        ЗаполнитьЗначенияСвойств(ОписаниеСвойства, фКэшОписания);
    КонецЕсли;
КонецЕсли;

В итоге должна получится следующая картина:

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

Находим в ней строку

Для каждого ОписаниеСвойства Из ОписаниеСвойств Цикл

Перед началом этого цикла вставим счетчик, например:

СчСвойств = 1;

А в теле цикла, после строки

ОписаниеСвойства.ИмяУникальнаяЧасть = ...

добавим наш код:

Если СтрНайти(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор()), УправлениеСвойствамиСлужебный.ПолучитьУИДМножественногоСвойства()) > 0 Тогда             
    ОписаниеСвойства.ИмяУникальнаяЧасть = ОписаниеСвойства.ИмяУникальнаяЧасть    +"_"+ Строка(СчСвойств);            
    СчСвойств = СчСвойств + 1;                                                  
КонецЕсли;

Получается такая картина:

Дальше, чтобы не заморачиваться с формой при обновлении, добавляем ее в расширение. Добавляем событие ПриСозданииНаСервере с типом вызова "После", в нем создаем кнопку для копирования и заполним технические реквизиты. На форму потребуется добавить 2 реквизита:

1. МножВыборИмя - тип строка, хранит имя дополнительного реквизита без индекса

2. СчСвойств - тип число, хранит текущий индекс дополнительного реквизита.

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

После этих действий у вас должно получиться что-то подобное:

Если нужно добавить кнопку удаления реквизитов, то, думаю, у вас не возникнет с этим больших проблем :)

2. Доработка xsd схемы.

Если вы не знакомы с этой темой, то в интернете полно информации с подробным описанием, расписывать детально тут не буду. Схема находится в плане обмена Б_ОбменССайтом в макете СхемаXSDОбмена. Сохраняем в файл, открываем и находим там строку

<xs:complexType name="ЗначенияСвойства">

после элемента "Значение" добавляем следующий код

<xs:element name="ЗначениеСвойства" minOccurs="0" maxOccurs="unbounded" >
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Значение" type="tns:ЗначениеТип" maxOccurs="1" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

В итоге должно получится следующее: 

Далее обновляем макет в плане обмена и сохраняем конфигурацию. Все, xsd схема готова.

3. Доработка выгрузки на сайт.

Итак, мы на финишной прямой. Еще чуточку усилий и все будет готово!

Открываем общий модуль Б_ОбменССайтомСерверВыгрузкаДанных, находим в нем процедуру ВыгрузитьСвойстваXDTO,

в ней ищем строку:

XDTOСвойство.Наименование	= Лев(ТекСвойство.Наименование, 250);

это в цикле по коллекции тзнСвойств. После нее добавляем проверку. Если это наше свойство, то делаем его множественным.

Если СтрНайти(XDTOСвойство.Ид, УправлениеСвойствамиСлужебный.ПолучитьУИДМножественногоСвойства()) Тогда
	XDTOСвойство.Множественное = Истина;
КонецЕсли;

Далее нам нужно подкорректировать процедуру ВыгрузитьСвойстваНоменклатурыXDTO. Она не очень большая, поэтому приведу ее листинг с доработками. 

 
 Процедура ВыгрузитьСвойстваНоменклатурыXDTO

 

Вот и все, после этих манипуляций, xml код файла для битрикса должен выглядеть примерно так:

Битрикс такую структуру понимает и никаких действий со стороны сайта делать не требуется. Если вы все сделали правильно, то все должно работать.

p.s. 

Хочу поблагодарить Сергея Главатских за его идею копирования дополнительных реквизитов, а так же парней из ветки https://dev.1c-bitrix.ru, без них у меня бы ничего не получилось.

См. также

Комментарии
1. Сергей Вн (EmpireSer) 21.03.18 00:47 Сейчас в теме
По мне "ЗначениеСвойства" в XSD задан "не красиво". Можно было всё в одном месте указать:
<xs:element name="ЗначениеСвойства" type="tns:ЗначениеТип" minOccurs="0" maxOccurs="unbounded" />

Так же можно было доработать доп. реквизит так, что бы он просто принимал "СписокЗначений", а не делать копирование. По моему мнению это получилось "элегантнее".
shurik_shurik; +1 Ответить
2. Егор В. (bad_wag) 16 21.03.18 11:06 Сейчас в теме
(1) В начале я так и пытался сделать, но для этого потребовалось дорабатывать поддержку списков значений доп реквизитами, а это, на мой взгляд, гораздо сложнее данной реализации
3. v i (vis_tmp) 28 11.05.18 18:15 Сейчас в теме
Спасибо, очень познавательно про множественные доп. реквизиты.
Оставьте свое сообщение