При работе с интернет-магазином часто возникает задача выводить товары на сайте в определенном порядке: сначала акционные, затем новинки или самые популярные. Стандартный обмен между 1С: Управление торговлей 11 и сайтом выгружает товары, как правило, в алфавитном порядке или по внутреннему идентификатору. Попытка задать сортировку через настройки узла обмена с сайтом не всегда приводит к желаемому результату. Рассмотрим, как гарантированно управлять порядком выгрузки товаров.
Проанализируем ситуацию. В настройках узла обмена с сайтом (раздел Администрирование – Синхронизация данных – Узлы обмена с сайтами) действительно есть возможность указать поле для сортировки. Однако эта настройка влияет только на первоначальную выборку данных, которые попадут в выгрузку. Сам же процесс формирования XML-файла для сайта управляется программным кодом, в котором может быть жестко задан свой порядок сортировки, игнорирующий пользовательские настройки.
Корнем проблемы является запрос внутри общего модуля ОбменССайтомСервер, а именно в процедуре ВыгрузитьТовары. Именно там "зашита" сортировка, которая имеет приоритет. Чтобы изменить логику, нам потребуется вмешаться в этот код.
Прежде чем менять код, нам нужно поле, по которому система будет сортировать товары. Для этого создадим дополнительный реквизит для номенклатуры.
ПорядокНаСайте и выберем тип данных Число. Этот реквизит будет хранить порядковый номер для каждого товара.Внимание! Этот способ предполагает редактирование основной конфигурации. Это может привести к сложностям при последующих обновлениях. Используйте его только в крайнем случае и обязательно сделайте резервную копию базы данных перед началом работ.
Разберем по шагам, как внести изменения напрямую:
ОбменССайтомСервер и откройте его.ВыгрузитьТовары.ВЫБРАТЬ.УПОРЯДОЧИТЬ ПО. В стандартной конфигурации она, скорее всего, будет выглядеть так:
...
УПОРЯДОЧИТЬ ПО
Номенклатура.Наименование
ПорядокНаСайте. Изменим код так, чтобы наш реквизит стал основным полем для сортировки, а сортировка по наименованию — дополнительной (на случай, если у нескольких товаров одинаковый индекс сортировки).
...
УПОРЯДОЧИТЬ ПО
Номенклатура.ПорядокНаСайте,
Номенклатура.Наименование
ПорядокНаСайте.Чтобы не снимать конфигурацию с поддержки и избежать проблем с обновлениями, все доработки следует вносить через механизм расширений. Это современный и правильный подход.
Рассмотрим, как реализовать нашу задачу с помощью расширения.
СортировкаПриОбменеССайтом, и снимите галочку Безопасный режим.ОбменССайтомСервер, кликните по нему правой кнопкой мыши и выберите Добавить в расширение.&Вместо. Скопируйте целиком текст процедуры ВыгрузитьТовары из основной конфигурации и вставьте его в модуль расширения.&Вместо("ВыгрузитьТовары"). Также принято добавлять префикс к имени самой процедуры в расширении, чтобы избежать конфликтов имен.Пример итогового кода в модуле расширения будет выглядеть так:
&Вместо("ВыгрузитьТовары")
Процедура Расш1_ВыгрузитьТовары(КомпонентаОбмена, УзелОбмена, ТаблицаТоваров, ТолькоИзменения)
// Здесь находится полный код оригинальной процедуры ВыгрузитьТовары,
// скопированный из основной конфигурации.
// ... [начало кода процедуры] ...
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| // ... [другие поля запроса] ...
| Номенклатура.ПорядокНаСайте КАК ПорядокНаСайте
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| // ... [условия запроса] ...
|
|УПОРЯДОЧИТЬ ПО
| ПорядокНаСайте,
| Наименование";
// ... [остальной код процедуры] ...
КонецПроцедуры
После сохранения расширения и обновления конфигурации базы данных система будет использовать вашу версию процедуры ВыгрузитьТовары вместо стандартной. Этот метод позволяет сохранить конфигурацию на поддержке и легко управлять доработками.