Falcon Space. Работа с каталогом, корзиной и заказами

Речь идет о некой торговой площадке, типа MarketPlace, где продукция представлена в виде Каталога, 
есть возможность добавлять выбранный товар в Корзину и осуществлять Заказы.
Это доступно как авторизованному пользователю, так и не авторизованному.

Адрес демо https://demo.web-automation.ru/catalog

Номенклатура

Существуют два варианта работы торговой площадки:

1.Когда перечень товара фиксированный, и управляется администратором сайта.

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

Продукт

Обложка продукта

2. Без номенклатуры. У каждого поставщика уникальный товар. Тогда поставщик может сам управлять всеми характеристиками и атрибутами своей продукции.

Обложка и продукт содержат просто указание одного поставщика и цену товара.Какой из вариантов будет настроен определяется в хранимых процедурах каталога.

Выводить или скрывать цены продуктов для показа также настраивается в ХП каталога.

Схема "Связь Продуктов и Поставщиков"

Категории продуктов

Категории продуктов лежат в as_cat_categories.
Есть поле isDisabled, которым можно отключить вывод категории в каталог.
Чтобы сделать вложенные категории следует правильно расставить parentID и level.
Чтобы наполнить категории продуктами нужно прописать связь в as_cat_categoryProducts.

Атрибуты продуктов (фильтры)

Все возможные атрибуты продуктов лежат в as_cat_filters.
Атрибуты, как правило, назначаются на категории в таблице as_cat_categoryFilters, а продукты уже в свою очередь наследуют атрибуты всех родительских категорий.
Тип данных значений атрибута указывается в dataTypeID (строка, целое число, дробное число).
Заполнение атрибутов значениями для конкретного продукта идет в as_cat_productAttrs.

В этой таблице заполняется одна из трех колонок согласно установленному типу атрибута.

Значение Атрибута как выбор значения из списка (справочника)

Если на атрибуте заполнено поле sqlGetValues, значит он имеет конечное число установленных значений, и для каждого продукта будет выбор из списка одного из этих значений.
В sqlGetValues указана хранимая процедура для выбора списка значений атрибута.
Соответственно в БД необходимо создать дополнительные таблицы-справочники по таким атрибутам в виде as_cat_cust_{имяАтрибута} (id, name)
В as_cat_productAttrs тогда будет заполнена колонка intValue - ID записи из таблицу указанной в sqlGetValues.

Атрибуты как фильтры

Атрибуты продуктов должны также быть среди фильтров поиска.
Поле visibleInFilter определяет будет ли введен атрибут в перечень фильтров.

Есть три типа работы фильтра в каталоге:
  • checks выбор нескольких вариантов из списка - галочки
  • radio выбор одного варианта из списка - радио
  • range диапазон значений - ползунок
  • select список выбора с диапазоном

Поле typeID определяет тип фильтра.
Если вариант отображения - ползунок, то поле defValue необходимо обязательно заполнить по следующему шаблону - {минимум,максимум,шаг}
Для фильтра select необходимо в начале добавить элемент Не выбрано.
Чтобы назначить каждой категории свой набор фильтров, нужно прописать связи в as_cat_categoryFilters

Атрибуты отображаемые на обложке продукта

Если на атрибуте заполнен признак showForProductInList, то этот атрибут будет выводиться сразу на обложке товара в режиме отображения товаров Список

Схема "Связь Продукты - Категории - Атрибуты (фильтры)"

Добавление продуктов в корзину

При нажатии на соответствующую иконку на продукте, он попадает в корзину к пользователю, в количестве указанном в поле рядом.

Таблица корзин ord_carts. Если пользователь не авторизован, то поле username в ней будет равно null.
В таблице ord_cartItems лежат позиции, которые были добавлены в корзину.

О таблице ord_cartTypes

В ней лежит настройка того, какая корзина работает на каталоге

Оформление заказа

Нажав на кнопку Оформить заказ ниже откроется форма заказа

Форма стандартная, прописана в Falcon с кодом cartOrder, т. е. можно посмотреть её хранимки, и соответственно есть возможность её видоизменить.
В SaveItem прописано создание заказа. Все заказы хранятся в ord_orders, и через таблицу корзины выходят на позиции заказа (они же позиции корзины).

Как сделать, чтобы оформлялся единый заказ?

  • Когда оформленный заказ идёт напрямую к поставщику, то кнопка Оформить заказ будет выставлена напротив каждого производителя в Корзине. В этом случае
  • указываем ord_cartTypes.isSingleOrder = 0
  • и в cartOrder будет передаваться itemID = ’{cartGuid}_{supplierID}’
  • Чтобы сделать единую кнопку Оформить заказ в Корзине, например когда заказ должен уйти на Склад, то есть независимо от того у скольких поставщиков мы выбрали товар, то необходимо
  • указать в ord_cartTypes.isSingleOrder = 1
  • и в cartOrder будет передаваться itemID = ’{cartGuid}_0’

Добавление продуктов в Избранное

Добавить продукт в Избранное может только авторизованный пользователь, нажав на соответствующую иконку на продукте.
Физически запись об избранном продукте добавляется в ord_favorites.

Адрес Избранного https://falcon.web-automation.ru/favorites

Схема “Связь Корзина - Заказы - Избранное”

Основные Хранимые процедуры каталога

  • Получить детали для карточки товара -  cat_getItem (примеры процедуры лучше брать из demo)
CREATE PROCEDURE [dbo].[cat_getItem]
	@itemID int,
	@username nvarchar(32),
	@langID int = 0
AS
BEGIN
	select 0 OneToOneProduct, -- Признак, номенклатура одна на всех, или уникальная у каждого поставщика
		   *,				  -- Все основные свойства продукта
		   REPLACE([desc], char(10), '
')  shortDesc,  -- Значение для вставки в краткое описание
       --     'Meta Title1' MetaTitle,
       -- 'Meta Desc2' MetaDescription,
       -- 'Meta Keys3' MetaKeywords,
		   -- Минимальная цена по всем поставщикам этого продукта:
		   dbo.as_num(cast(  isnull((select min(price) from as_cat_supplierProducts where productID = as_cat_products.id), 0) as nvarchar),2) price,
		   ''

'' CustomMakeup  -- Кастомизированная верстка страницы товара. Если пустая, но выводится дефолтовая верстка страницы Товара
	  from as_cat_products where id = @itemID

	-- Определяем на каком уровне находится продукт, то есть во сколько категорий вложен
	-- (Наверное это для хлебных крошек?)

	declare @level int

	CREATE TABLE dbo.#cats (id int, code nvarchar(256), name nvarchar(256),  level int, parentID int)

	insert into #cats
	select top 1 id, code, name, [level], parentID
	  from as_cat_categories
	 where id in (select categoryID from as_cat_categoryProducts where productID = @itemID)

	select top 1 @level = level from #cats

	while (@level>0)
	begin
		insert into #cats
		select id, code, name, [level], parentID
		  from as_cat_categories
		 where id in (select parentID from #cats where level=@level)

		set @level = @level -1
	end

	select * from #cats

	-- Определяем какие фильтры назначены продукту

	select as_cat_productAttrs.productID,
		   as_cat_productAttrs.id attrID,
		   as_cat_filters.code attrCode,
		   as_cat_filters.title title,
		   (case dataTypeID when 2 then cast(intValue as nvarchar)
							when 3 then cast(decimalValue as nvarchar)
							else value end )  value,
		   (select code from as_cat_filterTypes where id = as_cat_filters.typeID) typeCode,
		   (select code from as_dataTypes where id = as_cat_filters.dataTypeID) dataType,
		   sqlGetValues,
		   cacheMinutes
	  from as_cat_productAttrs inner join as_cat_filters on as_cat_filters.id = as_cat_productAttrs.filterID
	 where productID = @itemID
	 order by as_cat_filters.ord

	-- Выводим список поставщиков предлагающих этот продукт

	select as_cat_supplierProducts.id supplierProductID,
		  dbo.as_num(cast(  price as nvarchar), 2) price,
		  isnull(as_cat_suppliers.name,code) supplierName,
				 dbo.cat_getSupplierLink(supplierID) supplierLink
	  from as_cat_supplierProducts
	 inner join as_cat_suppliers on as_cat_suppliers.id = as_cat_supplierProducts.supplierID
	 --inner join as_cat_categories on as_cat_categories.code=as_cat_suppliers.code
	 where productID = @itemID --and as_cat_categories.isDisabled='False'
	 --order by price desc

	drop table #cats
END

  • Подготовка фильтрации товаров - cat_preSearch
CREATE PROCEDURE [dbo].[cat_preSearch]
	@filters DictionaryParameter READONLY,
	@cats nvarchar(256),
	@username nvarchar(32),
	@langID int = 0
AS
BEGIN
-- процедура предвариетльной подгоовки в поиске каталога


CREATE TABLE dbo.#cats (id int, code nvarchar(256), name nvarchar(256),  level int, parentID int, icon nvarchar(32))
insert into #cats
select id, code,name, level, parentID, icon from as_cat_categories where code in (select Value from dbo.split(@cats, ',') )

declare @catCount int
select @catCount = count(*) from #cats

declare @selectedCatID int
select top 1 @selectedCatID=id from #cats order by level desc

	-- SELECT 1. return Cats (Цепочка категорий)
	select *, isnull(icon, 'fa-cube') Icon from #cats order by level

	-- SELECT 2. return Filters (данные по фильтрам - для построения фильтра слева)
   		select
		as_cat_filters.id,
		as_cat_filters.title,
		as_cat_filters.tooltip,
		as_cat_filters.Code,
		as_cat_filters.defValue,
		as_cat_filters.sqlGetValues,
		as_cat_filters.cacheMinutes,
		(select code from as_cat_filterTypes where id = as_cat_filters.typeID) typeCode,
		(select top 1 Value from @filters where [Key]=as_cat_filters.code) commaSelected
	from as_cat_filters left join as_cat_categoryFilters on as_cat_filters.id = as_cat_categoryFilters.filterID
	where
		(as_cat_categoryFilters.categoryID in (select id from #cats) or as_cat_categoryFilters.id is null)
		and visibleInFilter='1'
	order by as_cat_categoryFilters.ord

	-- SELECT 3. return InnerCats (список дочерних категорий)
	select *, isnull(icon, 'fa-cube') Icon from as_cat_categories t1 where parentID = @selectedCatID or (parentID is null and @catCount=0)

	drop table #cats
END
  • Процедура фильтрации товаров - cat_search
CREATE PROCEDURE [dbo].[cat_search]
	@filters ExtendedDictionaryParameter READONLY,
	@selectedCatID int,
	@sort nvarchar(24),
	@page int,
	@username nvarchar(32),
	@langID int = 0
AS
BEGIN
-- процедура поиска по каталогу


declare @PAGE_SIZE int = 15

declare @title nvarchar(max) = '', @bannerImage nvarchar(256), @bannerText nvarchar(max)
set @title  = isnull(	(select name from as_cat_categories where id =@selectedCatID), 'Каталог товаров')
set @bannerText  = replace( isnull(	(select [desc] from as_cat_categories where id =@selectedCatID), ''), '''', '"')
set @bannerImage = dbo.rs_resourceLink('catBanner', @selectedCatID, 0)

exec as_print @str = @bannerText
exec as_print @str = @bannerImage


declare @allCatIDs table (id int)
insert into @allCatIDs(id) values (@selectedCatID)

--insert into @allCatIDs (id) select id from as_cat_categories where parentID in (select id from @allCatIDs) and isDisabled = 'false'
--insert into @allCatIDs (id) select id from as_cat_categories where parentID in (select id from @allCatIDs) and isDisabled = 'false'
--insert into @allCatIDs (id) select id from as_cat_categories where parentID in (select id from @allCatIDs) and isDisabled = 'false'
--insert into @allCatIDs (id) select id from as_cat_categories where parentID in (select id from @allCatIDs) and isDisabled = 'false'
--insert into @allCatIDs (id) select id from as_cat_categories where parentID in (select id from @allCatIDs) and isDisabled = 'false'
declare @allCatIDsStr nvarchar(500)

-- список всех родительских категорий (для выявления общих атрибутов по которым мы должны искать)
SELECT @allCatIDsStr = STUFF((
        select ','+ cast(id as nvarchar)
        from @allCatIDs
    FOR XML PATH('')
    ),1,1,'')


DECLARE @s nvarchar(max);
DECLARE @ParmDefinition nvarchar(max);

-- SELECT 1. return Products (выдаем найденные товары)
SET @s = N'
	declare  @productIDs table (id int)

insert into @productIDs (id)
select id from as_cat_products prods '+
	 ' where  id in (select productID from  as_cat_categoryProducts where ( categoryID in ('+@allCatIDsStr+') or '+cast(isnull(@selectedCatID, 0)as nvarchar)+'=0 )
																	or ( parentID in ('+@allCatIDsStr+') or '+cast(isnull(@selectedCatID, 0)as nvarchar)+'=0 )) ';

-- собираем фильтр по атрибутам (продолжение Динамического запроса SELECT 1 по товарам)
declare @key nvarchar(256), @value nvarchar(512), @fTitle nvarchar(512), @fTypeCode nvarchar(32)
DECLARE prodCursor CURSOR FOR  SELECT [Key], Value, Title, Value2 from @filters
OPEN prodCursor
FETCH NEXT FROM prodCursor
INTO @key,@value,@fTitle, @fTypeCode
WHILE @@FETCH_STATUS = 0
BEGIN
	-- exec as_print @key
	-- exec as_print @value
    if(@fTypeCode in ('checks', 'radio', 'select', 'switch', 'range' )) begin
		set @title = @title + ' '+@fTitle
	end

	set @s = @s + ' and ( '''+@key+'''='''' or exists (
	select as_cat_productAttrs.id from as_cat_productAttrs inner join as_cat_filters on as_cat_filters.id = as_cat_productAttrs.filterID
	where productID = prods.id
		and as_cat_filters.code = '''+@key+'''
		and (
			(as_cat_filters.typeID in (3,4) and (     -- checkboxes and radio
				datatypeID =2 and exists( select value from  dbo.split('''+@value+''', '','') where value=as_cat_productAttrs.intValue) or
				datatypeID =3 and exists( select value from  dbo.split('''+@value+''', '','') where value=as_cat_productAttrs.decimalValue) or
				datatypeID =1 and exists( select value from  dbo.split('''+@value+''', '','') where value=as_cat_productAttrs.value)
			))
			or
			(as_cat_filters.typeID in (1) and (     -- range
				datatypeID =2 and
				(as_cat_productAttrs.intValue  >= (select min(try_cast(value as int)) from  dbo.split('''+@value+''', '','')) and
						(as_cat_productAttrs.intValue  <= (select max(try_cast(value as int)) from  dbo.split('''+@value+''', '','')))
				) or
				datatypeID =3 and
				(as_cat_productAttrs.decimalValue  >= (select min(try_cast(value as decimal(18,2))) from  dbo.split('''+@value+''', '','')) and
						(as_cat_productAttrs.decimalValue  <= (select max(try_cast(value as decimal(18,2))) from  dbo.split('''+@value+''', '','')))
				) or
				datatypeID =1 and
				1=1 -- не сравниваем по диапазону строковые значения
			)

			or as_cat_filters.typeID not in (3,4,1)
	    )
	)
    -- обработка глобальных параметров поле Поиск и Переключатель На складе
    or ('''+@key+'''=''textsearch'' and lower(prods.name) like ''%''+lower('''+@value+''')+''%'')
	 or ('''+@key+'''=''instock'')
	))'
   -- exec as_print @s
    FETCH NEXT FROM prodCursor
INTO @key,@value, @fTitle, @fTypeCode

END
CLOSE prodCursor;
DEALLOCATE prodCursor;

--- добавляем сортировку в Динамический запрос SELECT 1
declare @sortStatement nvarchar(512)
set @sortStatement = (case @sort
				when 'new' then ' order by name '
				when 'price' then ' order by as_cat_products.price '
				when 'discount' then ' order by id '
				else ' order by id desc '
				end	)

-- define select parameters
/*
DECLARE parametersCursor CURSOR FOR  SELECT [Key], Value from @filters
OPEN parametersCursor

FETCH NEXT FROM parametersCursor
INTO @key,@value

WHILE @@FETCH_STATUS = 0
BEGIN
	set @s = @s + ' and ( '''+@key+'''='''' or exists ('


    FETCH NEXT FROM parametersCursor
INTO @key,@value

END
CLOSE parametersCursor;
DEALLOCATE parametersCursor;
*/

-- определяем что выбираем в Динамическом запросе SELECT 1
set @s = @s +
	' select *,
		dbo.as_num(cast(  isnull((select min(price) from as_cat_supplierProducts where productID =as_cat_products.id),price)  as nvarchar), 2) price,
		(select count(price) from as_cat_supplierProducts where productID =as_cat_products.id and price>0) supplierCount,
		'''' SupplierName, -- for OneToOneProduct = 1
		'''' SupplierLink,
		0 SupplierProductID,
		[dbo].[cat_getProductImageURL](as_cat_products.id, 0) img

	from as_cat_products where id in (select id from @productIDs)
	'+@sortStatement+'
	OFFSET ((@page - 1) * @PAGE_SIZE) ROWS
	FETCH NEXT @PAGE_SIZE ROWS ONLY;


	-- SELECT 2 Catalog settings - возвращаем настройки каталога + результат операции (Result, Msg)
	select ''Не найдено'' EmptyText,
		0 OneToOneProduct,
	'''+@title+''' Title,
    	'''+isnull(@bannerImage, '')+''' BannerImage,
        '''+isnull(@bannerText, '')+''' BannerText,
		@sort Sort,
		@page [Page],
		@PAGE_SIZE PageSize,
		(select count(*) from @productIDs) Total,
		1 Result, '''' Msg   ,
    '''+@title+''' MetaTitle,
     '''+@title+''' MetaDescription,
        '''' MetaKeywords


	-- SELECT 3 Product attrs - возвращаем все атрибуты найденных товаров
	select
	as_cat_productAttrs.productID,
as_cat_productAttrs.id attrID,
as_cat_filters.code attrCode,
as_cat_filters.title title,
(case dataTypeID when 2 then cast(intValue as nvarchar)   when 3 then cast(decimalValue as nvarchar) else value end )  value,
 (select code from as_cat_filterTypes where id = as_cat_filters.typeID) typeCode,
 (select code from as_dataTypes where id = as_cat_filters.dataTypeID) dataType,
 sqlGetValues,
 cacheMinutes
 from as_cat_productAttrs inner join as_cat_filters on as_cat_filters.id = as_cat_productAttrs.filterID
where showForProductInList=1 and productID in (select id from @productIDs)
order by as_cat_productAttrs.productID, as_cat_filters.ord

	'
set @s = replace(@s, '{parameters}', '1')

-- выполняем динамический запрос SELECT 1 (Товары), SELECT 2 (Настройки каталога), SELECT 3 (Атрибуты товаров)
EXECUTE sp_executesql @s, N'@sort nvarchar(24), @selectedCatID int, @page int, @PAGE_SIZE int ', @sort = @sort, @selectedCatID = @selectedCatID, @page = @page, @PAGE_SIZE = @PAGE_SIZE;

-- SELECT 4. return Sorts Возвращаем варианты сортировки
select 'favorite' [Key], 'По популярности' Value
union
select 'new' [Key], 'По новизне' Value
union
select 'price' [Key], 'По цене' Value
--union
--select 'discount' [Key], 'По скидке' Value
select @s

END

Каждая из них сопровождается комментариями в коде.

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

Картинки к продуктам

Это те же типы ресурсов, работа которых настраивается в Компоненты / Типы ресурсов

Панели товаров

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

Сниппет:

 <div class="as-cat-panel" data-code="new" data-type="’card|slider’" data-colclass="col-12 col-sm-6 col-md-6"></div>
Указаны тип сниппета, код панели, и часть экрана для расположения.

По коду сниппета создаем соответствующую ХП для настройки отображения панели и выбора продуктов в неё:
CREATE PROCEDURE [dbo].cat_new_panel
   @langID int,
   @username nvarchar(256)
AS
BEGIN

   select 'Новые товары' Title,
          'http://ya.ru' Link,
          'Это нижний HTML под панелью' BottomHtml,
          5 CacheMinutes,
          '' ItemMakeup,
          '' Msg,
          1 Result

   select top 8 '111х' Name,
                '222х' Link,

'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNMNkquBwADcQF5wZiBLwAAAABJRU5ErkJggg==' Img,

                123 Price,
                '444х' [Desc]
   from as_cat_products

END

В ItemMakeup можно вставлять кастомизированную верстку для элемента.

Работает 2 режима - слайдер и панель товаров. Режим задается через data-type для сниппета.

How to по каталогу (catalog)

Как сделать кастомную верстку для каталога

Для этого в SELECT 2 в cat_search указываем CustomMakeup - эта разметка может принимать следующий параметры: 
  • {catalogCats} Вложенные категории
  • {catalogFilters} Колонка фильтров
  • {catalogFilterTags} Теги выбранных фильтров (с возможностью их сбросить)
  • {catalogViewButtons} Кнопки переключения вида
  • {catalogTitle} Заголовок (с выводимым кол-вом)
  • {catalogBanner} Баннер для категории (использует Search.Select2 поля BannerText и BannerImage)
  • {catalogSortPanel} Кнопки сортировки
  • {catalogItems} Элементы каталога
  • {catalogPaging} Пагинация
  • {catalogText} Текст о категории

По дефолту используется такая верстка (если она не указана в CustomMakeup):
<div class="row cat-catalogCont">
   <div class="col-12 col-sm-12 col-md-3 col-lg-2 cat-filtersBlock"> {catalogCats}
   {catalogFilters} </div>
   <div class="col-12 col-sm-12 col-md-9 col-lg-10"> {catalogViewButtons} {catalogTitle}
   {catalogSortPanel} {catalogItems} {catalogPaging} {catalogText} </div>
</div> 

Также можно указать кастомную верстку для элементов каталога  для обоих видов (плитка и панель).
Для этого указываем в SELECT 2 в cat_search параметры ListItemMakeup, PanelItemMakeup:
  • {id} - Идентификатор номенклатуры товара
  • {name} - Наименование товара
  • {url} - URL страницы товара
  • {img} - ссылка на картинку
  • {supplierName} - наименование поставщика
  • {supplierLink} - ссылка на Поставщика
  • {price} - цена товара
  • {shortDesc} - краткое описание товара
  • {supplierCount} - количество поставщиков (если Товар к поставщику не 1 к 1)
  • {supplierProductID} - если Товар и Поставщик 1 к 1, то это ID товара поставщика (для использования в корзине). 
  • {attrs} - атрибуты товара, которые помещены ForList=1



Примечание: указывается в SELECT 2 в cat_search такую разметку для CustomMakeup и других разметок, чтобы отдельно редактировать HTML блок.

dbo.as_htmlBlock(''catalogMakeup'', 0) CustomMakeup,
dbo.as_htmlBlock(''catalogListItemMakeup'', 0) ListItemMakeup,
dbo.as_htmlBlock(''catalogPanelItemMakeup'', 0) PanelItemMakeup

В GetItem:
dbo.as_htmlBlock('catalogItemMakeup', @langID) CustomMakeup

Как кастомизировать страницу товара

Используем для этого кастомизированную верстку в параметре CustomMakeup в процедуре cat_GetItem

Параметры:

  • {id} - id товара
  • {name} - наименование товара.
  • {images} - картинки (галерея с возможностью показа увеличенной картинки)
  • {price} - цена товара
  • {offers} - предложения поставщиков по данному товару с возможностью добавить в корзину.
  • {attrs} - таблица атрибутов товароа
  • {shortDesc} - краткое описание товара
  • {attr-code1} - передача дополнительных отдельных атрибутов для отдельной вставки в верстке.

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

<div class="row">
   <div class="col-12 col-md-12 col-lg-5"> {images} </div>
   <div class="col-12 col-md-12 col-lg-7"> {price} {name} {offers} {attrs}
         <div class="cat-shortDesc my-4"> {shortDesc} </div>
   </div>
</div>

Как сделать так, чтобы каталог работал по номенклатуре 1 к 1 с товаром поставщика

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

Чтобы сделать представление 1 к 1 для позиций и предложений поставщиков (т.е. каждая позиция - это 1 предложение поставщика),
необходимо прописать в Процедурах Search и GetItem параметр настройки OneToOneProduct=1

Как скрыть цены в каталоге

Для этого в запросе укажите 0 для цен.

Как установить вид, который по умолчанию открывается в каталоге

По умолчанию ставится вид Плитка.
Укажите list или panel в DefaultView в SELECT 2 (процедура cat-search)

Как управлять внешним видом и распоряжением элементов каталога

Вывод элемента атрибута вы можете настроить через SQL (т.е. что выводится).
Расположение элемента вы можете задать через стили с position:absolute относительно элемента в каталоге.

Как сделать так, чтобы фильтрация происходила сразу при изменении одиночных элементов фильтра

Для body в Getlayout необходимо добавить класс instantCatalogFilter.

Как добавить микроразметку, стили или скрипты в каталог.

Используйте параметры headSection, bodyBottomSection в SELECT 2 в cat_search и аналогичные параметры в  cat_getItem.
Вы можете туда вставлять коды OpenGraph и JSON LD описание страниц.

Как настроить кеширование в каталоге

Для этого установите в WebConfig в разделе AppSettings параметр catalogCacheMinutes. Данный параметр указывает сколько минут будет кешироваться результат выдачи в каталоге
(кешируются все запросы по каталогу).

<add key="catalogCacheMinutes" value="60"></add>