Как настроить свой порядок сортировки товаров при выгрузке из 1С: Управление торговлей 11 на сайт?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с интернет-магазином часто возникает задача выводить товары на сайте в определенном порядке: сначала акционные, затем новинки или самые популярные. Стандартный обмен между 1С: Управление торговлей 11 и сайтом выгружает товары, как правило, в алфавитном порядке или по внутреннему идентификатору. Попытка задать сортировку через настройки узла обмена с сайтом не всегда приводит к желаемому результату. Рассмотрим, как гарантированно управлять порядком выгрузки товаров.

Почему стандартная настройка сортировки не работает?

Проанализируем ситуацию. В настройках узла обмена с сайтом (раздел Администрирование – Синхронизация данных – Узлы обмена с сайтами) действительно есть возможность указать поле для сортировки. Однако эта настройка влияет только на первоначальную выборку данных, которые попадут в выгрузку. Сам же процесс формирования XML-файла для сайта управляется программным кодом, в котором может быть жестко задан свой порядок сортировки, игнорирующий пользовательские настройки.

Корнем проблемы является запрос внутри общего модуля ОбменССайтомСервер, а именно в процедуре ВыгрузитьТовары. Именно там "зашита" сортировка, которая имеет приоритет. Чтобы изменить логику, нам потребуется вмешаться в этот код.

Подготовительный этап: создаем реквизит для сортировки

Прежде чем менять код, нам нужно поле, по которому система будет сортировать товары. Для этого создадим дополнительный реквизит для номенклатуры.

  1. Перейдем в раздел НСИ и администрирование – Администрирование – Общие настройки.
  2. Убедимся, что включена галочка Дополнительные реквизиты и сведения.
  3. Откроем справочник Номенклатура (раздел НСИ и администрирование – НСИ).
  4. В меню Еще выберем пункт Изменить состав дополнительных реквизитов.
  5. Создадим новый реквизит. Назовем его, например, ПорядокНаСайте и выберем тип данных Число. Этот реквизит будет хранить порядковый номер для каждого товара.
  6. Сохраним настройки. Теперь в карточке каждого товара появилось новое поле. Заполним его нужными значениями: чем меньше число, тем выше товар будет в списке на сайте. Например, товару, который должен быть первым, присвоим значение 1, второму — 2 и так далее.

Способ 1: Прямое изменение кода конфигурации (не рекомендуется)

Внимание! Этот способ предполагает редактирование основной конфигурации. Это может привести к сложностям при последующих обновлениях. Используйте его только в крайнем случае и обязательно сделайте резервную копию базы данных перед началом работ.

Разберем по шагам, как внести изменения напрямую:

  1. Откройте конфигуратор вашей базы 1С.
  2. Найдите в дереве конфигурации общий модуль ОбменССайтомСервер и откройте его.
  3. С помощью поиска (Ctrl + F) найдите процедуру ВыгрузитьТовары.
  4. Внутри этой процедуры найдите большой многострочный текст запроса к базе данных. Он начинается со слова ВЫБРАТЬ.
  5. Пролистайте текст запроса до самого конца, до секции УПОРЯДОЧИТЬ ПО. В стандартной конфигурации она, скорее всего, будет выглядеть так:
    
    ...
    УПОРЯДОЧИТЬ ПО
        Номенклатура.Наименование
    
  6. Наша задача — добавить в эту секцию сортировку по нашему новому реквизиту ПорядокНаСайте. Изменим код так, чтобы наш реквизит стал основным полем для сортировки, а сортировка по наименованию — дополнительной (на случай, если у нескольких товаров одинаковый индекс сортировки).
    
    ...
    УПОРЯДОЧИТЬ ПО
        Номенклатура.ПорядокНаСайте,
        Номенклатура.Наименование
    
  7. После внесения изменений сохраните конфигурацию и обновите базу данных (F7). Теперь при следующей выгрузке на сайт товары будут отсортированы согласно значениям в поле ПорядокНаСайте.

Способ 2: Безопасное изменение через расширение (рекомендуется)

Чтобы не снимать конфигурацию с поддержки и избежать проблем с обновлениями, все доработки следует вносить через механизм расширений. Это современный и правильный подход.

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

  1. В конфигураторе откройте меню Конфигурация – Расширения конфигурации.
  2. Добавьте новое расширение. Задайте ему понятное имя, например, СортировкаПриОбменеССайтом, и снимите галочку Безопасный режим.
  3. Найдите в основном дереве конфигурации общий модуль ОбменССайтомСервер, кликните по нему правой кнопкой мыши и выберите Добавить в расширение.
  4. В окне расширения появится наш модуль. Откройте его.
  5. Нам нужно "перехватить" выполнение стандартной процедуры и заменить ее своей версией. Для этого воспользуемся аннотацией &Вместо. Скопируйте целиком текст процедуры ВыгрузитьТовары из основной конфигурации и вставьте его в модуль расширения.
  6. Над скопированной процедурой добавьте аннотацию, указав имя заменяемой процедуры: &Вместо("ВыгрузитьТовары"). Также принято добавлять префикс к имени самой процедуры в расширении, чтобы избежать конфликтов имен.
  7. Теперь в тексте скопированной процедуры внесите те же изменения в запрос, что и в первом способе.

Пример итогового кода в модуле расширения будет выглядеть так:


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

После сохранения расширения и обновления конфигурации базы данных система будет использовать вашу версию процедуры ВыгрузитьТовары вместо стандартной. Этот метод позволяет сохранить конфигурацию на поддержке и легко управлять доработками.

← На главную