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