Подобная задача возникала у многих клиентов - при выгрузке из 1С удалить или деактивировать товары, если они без цены.[spoiler] Подобная возможность есть в функционале импорта товаров из xml-файла стандарта CommerceML 1.0, но при обмене с 1с 8.1 напрямую деактивации товаров без цен не происходит. Многим постоянно приходится "извращаться всячески", чтобы решить эту задачу, т.к. существующие события модуля каталога и инфоблоков не совсем подходят.
Собственно, выход можно найти в кастомизации компонента выгрузки из 1С - bitrix:catalog.import.1c. Я решил эту задачу добавлением дополнительного шага в компонент "Деактивация товаров без цен".
Деактивация выполняется в конце импорта данных из файла предложений. В компонент добавил параметр "Деактивировать товары без цен":
При выгрузке из 1С будет выполняться шаг деактивации, покажу на скришоте скрипта импорта (в 1с будет аналогично):
Деактивация заключается в переборе активных элементов инфоблока, поиск цен для этих элементов и их деактивация при отсутствии цен. Есть пошаговость(особо не тестировал).
При больших объёмах каталога работоспособность не проверял - может оказаться ресурсоёмким делом оказаться. Надеюсь пошаговость спасёт
Особенности работы: 1. Деактивация работает как при полной выгрузке так и при выгрузке изменений 2. Деактивация элементов без цен происходит только в процессе импорта предложений(файл offers.xml), при импорте каталога (файл import.xml) деактивация производится не будет. 3. Деактивация будет производится только если неактивна опция "Выгружать предложения (характеристики) в отдельный инфоблок".
Можно кастомизировать компонент импорта из 1С, чтобы он не грузил напрямую в таблицу b_catalog_products и b_catalog_price, а делал update собственной промежуточной таблицы ID->Price
И скриптом по крону активировать/деактивировать товары в зависимости от цены
Дмитрий, все это вариации и костыли на тему "Как сделать автоматическое управления товарными предложениями на сайте идеальным".
Гораздо проще в 1С ввести свойство "не показывать" и выгружать его на сайт (его можно вормировать и динамически). Тогда вообще никаких обработок не нужно, достаточно лишь правильно настроить фильтры.
кому то нравится крон, кому то реалтайм, кому то ручное управление.
К сожалению, пока еще не видел автоматического универсального идеального решения, которое работало бы без полной выгрузки. Большинство решений основаны на общих приемах либо заточены под конкретные задачи.
Вот именно. Как сказано в слогане битрикса "Битрикс обеспечивает потребности 90% сайтов". Мы видимо попали в оставшиеся 10%. Я например вообще ушел от выгрузки товаров из 1С с помощью xml-файлов. Описания и свойства вообще держу в отдельной базе, в эту же базу выгружаю из 1С цены и наличие на складе. Потом скрипты по крону обновляют битрикс в соответствии с этой базой. Производительность возрастает в разы.
Что побудило к этому? Большой ассортимент номенклатуры. Обновление с полной выгрузкой через xml занимает 4 часа. Как оказалось выгрузка import.xml прибивает все цены в каталоге, т.о. следом надо обязательно выгружать offers.xml Т.е. ни о какой оперативности речи не идет.
В варианте с промежуточной базой у меня получается: 1 раз в день выгружать полный каталог с описаниями - 40 мин каждые 30 мин обновлять цены и наличие
Собственная обработка промежуточной базы дает еще следующие преимущества. Каждая категория товаров грузится в отдельный инфоблок, что позволяет создать для каждой категории собственный набор свойств и фильтров.
Может кому будет интересно, когда встала задача - выгрузка двух инфоблоков из 1с с деактивацией товаров без цены, ну и еще по некоторым параметрам по окончании выгрузки. Сделал следующее: 1. Был написан скрипт для деактивации элементов, фильтрация была по active=Y && catalog_price_#id# = false (sync_run.php) 2. Сделан скрипт (sync.php), который - при инклуде в битриксе (проверка переменной $_SESSION или $_SERVER) - создавал/обновлял файл-флаг сигнализирующий о том что происходит синхроназация - при вызове из крона проверяется наличие файла-флага, если он есть и старше 4 минут - запускает sync_run.php, после чего удаляет файл-флаг 3. В файле где установлена компонента, до непосредственно ее вызова происходит инклуд файла sync.php 4. В крон на каждые 2 минуты ставим вызов sync.php В итоге получаем - без модификации компоненты и допиливания 1с - получаем нужный функционал, только обновление происходит в данном случае не сразу же, а через 4-6 минут после окончания экспорта из 1с
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».