Кто-то уже реализовывал деактивацию при отсутствии данных в выгрузочном файле при интеграции с 1С в файле init.php?

Здравствуйте! <br/> У кого-нибудь есть опыт деактивации товара или элемента при интеграции с 1С, если соответствующий товар или элемент отсутствует в файле? <br/> Стандартные методы не дают результатов.
  • 10 сентября 2024 г. 9:03
Ответы на вопрос 2
Здравствуйте!

Да, многие разработчики сталкиваются с задачей деактивации товаров или элементов при интеграции с 1С, если они отсутствуют в выгрузочном файле. Обычно это делается в файле `init.php` или в других скриптах, отвечающих за обработку данных из 1С. 

Вот общий алгоритм, который может помочь:

1. **Получение списка всех товаров**: Сначала нужно получить все товары из вашей базы данных, чтобы знать, какие товары существуют.

2. **Парсинг файла выгрузки**: Мы читаем выгружаемый файл из 1С и создаем массив активных товаров, которые есть в этом файле.

3. **Сравнение списков**: Сравниваем список активных товаров из вашей базы данных и список товаров из файла выгрузки. 

4. **Деактивация**: Если товар присутствует в базе данных, но отсутствует в выгрузке, меняем его статус на "неактивный".

Вот пример кода, который может помочь вам реализовать данный процесс:

```php
<?php
// Предположим, что у вас есть функция для получения всех товаров
$allProducts = getAllProducts(); // Получаем массив всех товаров из БД
$activeProducts = []; // Массив для хранения активных товаров из файла

// Предположим, что вы уже прочитали файл и распарсили его в массив
$importedProducts = parseImportFile('path_to_file'); // Функция для парсинга файла 1С

// Заполняем массив активных продуктов
foreach ($importedProducts as $product) {
    $activeProducts[] = $product['id']; // Предположим, что у каждого товара есть уникальный ID
}

// Деактивируем товары, которые не присутствуют в выгрузке
foreach ($allProducts as $product) {
    if (!in_array($product['id'], $activeProducts)) {
        deactivateProduct($product['id']); // Функция для деактивации товара в БД
    }
}
?>
```

Убедитесь, что у вас есть необходимые проверки и обработка ошибок, а также что вы создаёте резервные копии данных перед выполнением подобных операций. 

Если стандартные методы не работают, возможно, стоит проверить настройки интеграции с 1С или уточнить, как именно ваш код взаимодействует с API 1С.

Если вам нужна более конкретная помощь, пожалуйста, предоставьте больше информации о ваших текущих настройках или о проблемах, с которыми вы сталкиваетесь.
mills какая у вас конфигурация 1С и модуль обмена? 
в новых версиях обмена которые на расширении этот параметр настраивается из 1С

если сильно нужно из init.php
нужно сначала передать в глобальную переменную время начала обмена $startTime = $_GET["timestamp"];

$rsImportedIBlocks = \Bitrix\IBlock\IblockFieldTable::getList(array(
            "select" => array("IBLOCK_ID", "DEFAULT_VALUE"),
            "filter" => array(
                "=FIELD_ID" => "XML_IMPORT_START_TIME",
                ">=DEFAULT_VALUE" => date("Y-m-d H:i:s", $startTime),
            ),
        ));
        $timeStamp = ConvertTimeStamp($startTime"FULL");

        while ($arField = $rsImportedIBlocks->fetch())
        {
            $element = new CIBlockElement;
            $rsElements = CIBlockElement::GetList(array(), array(
                "IBLOCK_ID" => $arField["IBLOCK_ID"],
                "ACTIVE" => "Y",
                "<TIMESTAMP_X" =>  $timeStamp,
            ), false, false, array("ID"));
            while ($arElement = $rsElements->Fetch())
            {
                $element->Update($arElement["ID"], array("ACTIVE" => "N"));
            }

            $section = new CIBlockSection();
            $rsSections = CIBlockSection::GetList(array(), array(
                "IBLOCK_ID" => $arField["IBLOCK_ID"],
                "ACTIVE" => "Y",
                "<TIMESTAMP_X" =>  $timeStamp,
            ), false, array("ID"));
            while ($arSection = $rsSections->Fetch())
            {
                $section->Update($arSection["ID"], array("ACTIVE" => "N"));
            }
        }
Похожие вопросы