@TheDrumkilla

Как запретить изменение типа свойства при выгрузке из 1С?

Приветствую. У товаров на сайте есть множество свойств, некоторые из них нужно выводить в умном фильтре в качестве ползунка с диапазоном "от" и "до" Как известно по умолчанию в битриксе так выводятся только свойства с типом "число". Из 1с же как правило свойства выгружаются типом "список" что по понятным причинам мне не подходит. При помощи 1с-программиста удалось заставить 1с передавать некоторые свойства типом "строка", ну по крайней мере на сайт они приходят в таком виде. Если сменить тип свойства на число, то получаем желаемый функционал в виде пресловутых ползунков.

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

Вопрос: Возможно ли "заблокировать" тип для определенных свойств? Какие события для этого можно использовать? Или может есть возможность заставить 1С отдавать свойства с уже нужным типом?

Буду благодарен за помощь.
  • Вопрос задан
  • 1760 просмотров
Решения вопроса 1
@anton99zel Куратор тега 1С-Битрикс
29а класс средней школы №7
1С отдает xml файл, где всё строки (нет чисел)
У свойства бывают следующие возможные значения: S - строка, N - число, F - файл, L - список, E - привязка к элементам, G - привязка к группам.
--
Этот API-код меняет тип Строка на Число:
<?
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");

$arFields = Array(
  "PROPERTY_TYPE" => "N", //ставим N если нужно число
  "IBLOCK_ID" => 2 //номер инфоблока
  );

$ibp = new CIBlockProperty;
if(!$ibp->Update(7, $arFields)) // где 7 это номер свойства (ID) в инфоблоке
    echo $ibp->LAST_ERROR; //выведем ошибку если ничего не получилось
?>


По сути, после выгрузки вы можете запустить этот код и нужное свойство поменяет тип.
spoiler
PS: Хотя, почему меняется тип свойства - не понятно. Не должно быть так.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
askunash
@askunash
Тренер Битрикс
Если вас не устраивает импорт из 1С есть 3 варианта (по возрастанию сложности):
1. Привести в соответствие данные в 1С.
2. Привязаться к событию OnBeforeCatalogImport1C и переопределить/перезаписать данные.
3. Кастомить компоненты обмена - есть стандартный скрипт обмена, его адрес в настройках магазина в админке, проследите пару шагов подключаемых файлов - там все компоненты подключаемые.
Всё.
Ответ написан
Shuriban
@Shuriban
Ваш персональный сайт web-разработчика
решение для автоматической установки нужных типов свойств.
В файле local/php_interface/init.php ну или в таком же в папке битрикс.
Навешиваемся на событие перед обновлением свойств.
AddEventHandler("iblock", "OnBeforeIBlockPropertyUpdate", "OnBeforeIBlockPropertyUpdateHandler");

function OnBeforeIBlockPropertyUpdateHandler(&$arFields){
//Проверяем, что идет обмен с 1С
    if (!empty($_GET['mode']) && $_GET['mode'] == 'import') {
        //сохраняем необходимые типы свойств инфоблока
        if ($arFields['NAME'] == 'Бренд' && $arFields['PROPERTY_TYPE'] !== 'E') {
            $arFields['PROPERTY_TYPE'] = 'E';
        }
        //для всех числовых свойств N

        $arPropertiesInt = [
            'Максимальная цена',
            'Объем камеры (л)',
            'Мощность охлаждения, Вт',
            'Потребл. мощность (Вт)',
            'Номин. мощность (Вт)',
            'Пиковая мощность (Вт)',
            'Расход топлива',
            'Мощность обогрева макс. (Вт)',
            'Расход газа (г/ч)',
            'Минимальная цена',
        ];
        if (in_array($arFields['NAME'], $arPropertiesInt) && $arFields['PROPERTY_TYPE'] !== 'N') {
            $arFields['PROPERTY_TYPE'] = 'N';
        }
    }
}


В примере использутея название свойства. Можно использовать его ID, но не CODE.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы