Здравствуйте, уважаемые читатели!
Хочу поделиться своей реализацией множественного выбора дополнительного реквизита в Управлении торговлей 11 (проверено на 11.4.1.261) для последующей выгрузки его в интернет-магазин под управлением 1С битрикс. Для чего это потребовалось? В определенный момент менеджер интернет-магазина мне сказал: хочу увидеть весь ассортимент выбранного товара (условно назовем его Товар№1) красного, синего и зеленого цветов, как?. Сразу оговорюсь, что по ряду внутренних причин характеристики мы не используем, возможно, с ними будет совсем другая история, но поскольку данный вопрос возникает периодически, я решил написать эту статью. Так вот, в УТ цвет это у нас дополнительный реквизит и соответственно он может принимать только одно значение. На сайте это выглядит как выбор из списка, а требуется чтобы можно было отмечать галочкой несколько значений.
з.ы. это моя первая публикация (не только на ИС, но и вообще), не судите строго 🙂
Итак, начнем. Весь процесс доработки можно разделить на 3 этапа:
- Доработка механизма создания и вывода на форму дополнительных реквизитов.
- Доработка xsd схемы.
- Доработка выгрузки на сайт.
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, без них у меня бы ничего не получилось.
По мне «ЗначениеСвойства» в XSD задан «не красиво». Можно было всё в одном месте указать:
Так же можно было доработать доп. реквизит так, что бы он просто принимал «СписокЗначений», а не делать копирование. По моему мнению это получилось «элегантнее».
(1) В начале я так и пытался сделать, но для этого потребовалось дорабатывать поддержку списков значений доп реквизитами, а это, на мой взгляд, гораздо сложнее данной реализации
Спасибо, очень познавательно про множественные доп. реквизиты.
Отличная статья!
(4) Спасибо!
(3) Спасибо, я старался)
Коллеги, подскажите пожалуйста! как быть если множественных реквизитов несколько? Я в плане видов характеристик создал реквизит МножественныйРеквизит и с помощью него получаю все множественные доп свойства. Перед выгрузкой свойств формирую запрос результатом, которого является список всех множественных свойств и дальше делаю такие же проверки как в этой статье. Прикрепляю файл с кодом. Заработает ли такой код?
(7)вопрос решен.
(5) не понимаю как сделать кнопку удалить. Не подскажете?
Возможно ли вынести функции в расширение и воспользоваться &Вместо(«ЗаполнитьДополнительныеРеквизитыВФорме») такой конструкцией, что бы не менять конфигурацию, будет работать?
УИД — это в XML файле экспорта поле <Ид>?
(10) Вынести в расширение можно, работать будет, но при обновлениях конфигурации надо будет следить за изменениями в этой функции. Про УИД сейчас не вспомню, можно посмотреть отладчиком или выгрузить в файл там уже глянуть
(12) Спасибо! Ну я решал свою задачу, по этому об универсальности не думал, но вы развернулись на широкую ногу! Хоть в типовую переноси 🙂 Отличное дополнение
с кнопками не разобрался, если не сложно поясните подробнее
(14)разобрался
(12) Прекрасное решение, спасибо! Но обнаружил проблему: если было выбрано несколько значений, а потом меньшее количество — предыдущий выбор сохраняется. Наверное, надо каким-то образом очищать реквизиты во время загрузки, может быть проблема только у меня…
bad_wag, просьба-вопрос к вам. Можете ли вы сделать настройку данной доработки в нашей базе? Сделали всё по инструкции, в УТ множественный реквизит появился, но в файл обмена с Битриксом этот реквизит не попадает.. УТ (11.4.6.174), Битрикс 7.0.1.21
Сколько это будет стоить?