• Как создать несколько назначений для разных документов во внешней обработке и назначить на эти назначения разные команды?

    @Dementor
    программист, архитектор, аналитик
    Никак. Если вы не модифицировали свою версию БСП, то в описании команд нет назначения использования. Вы просто описываете пачку команд и каждая из них должна подключится к каждому из описанных типов в массиве "Назначение". Почему появляются только в Заказе покупателя нужно смотреть в отладке. Похоже на глюк.
    Ответ написан
    2 комментария
  • Как максимально быстро добавить огромное количество записей в БД без дублей?

    Frostealth
    @Frostealth
    Backend Developer
    Как вариант: отфильтровать `$numbers` на стороне PHP и вставить пачкой.

    // избавляемся от возможных дубликатов
    $numbers = collect($numbers)->unique();
    // pluck('num') вернет нам список значений атрибута num, а не список моделей
    $existingNumbers = Model::query()->whereIn('num', $numbers->toArray())->pluck('num');
    // с помощью diff получаем элементы, которых нет в $existingNumbers
    $newNumbers = $existingNumbers->diff($numbers)->mapWithKeys(function ($value, $key) {
        // ['one', 'two'] => [['num' => 'one'], ['num' => 'two']]
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($newNumbers) {
        Model::query()->insert($newNumbers->toArray()); 
    });


    При очень больших данных в БД нужно вытаскивать из БД чанками (пачками определенного размера, например по 500 000), а не сразу все.
    // избавляемся от возможных дубликатов
    $newNumbers = collect($numbers)->unique();
    Model::query()->toBase()->whereIn('num', $numbers->toArray())
          ->chunk(500000, function ($existingNumbers) use (&$newNumbers) {
               // с помощью diff получаем элементы, которых нет в $existingNumbers
              $newNumbers = $newNumbers->diff($existingNumbers);
          });
    
    // ['one', 'two'] => [['num' => 'one'], ['num' => 'two']]
    $newNumbers = $newNumbers->mapWithKeys(function ($value, $key) {
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($newNumbers) {
        Model::query()->insert($newNumbers->toArray()); 
    });


    Также можно воспользоваться ON CONFLICT, если СУБД поддерживает подобное. Например, у SQLite - ON CONFLICT DO, у MySQL - INSERT IGNORE. Это позволит избавиться от выгрузки данных из БД, что уменьшит потребление памяти приложением и сократит количество запросов.
    Laravel имеет для этого метод Query::insertOrIgnore(), который будет глушить все ошибки от некоторых БД, но для некоторых не поддерживается. Поддерживаемые БД: MySQL, SQLite, PostreSQL.
    Необходимо, чтобы на атрибут `num` в БД стоял constraint unique, иначе БД просто вставит дубликат.
    $numbers = collect($numbers)->unique()->mapWithKeys(function ($value, $key) {
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($numbers) {
        Model::query()->insertOrIgnore($numbers->toArray());
    });


    Индексы и explain изучить не помешает. Размер чанка подобрать по возможностям железа.
    Индекс на num значительно ускорит выборку, но скорость вставки снизится.
    Так же отказ от ORM (Eloquent), объектов и использование голого SQL с PDO ускорит работу.
    На большие данные и нагрузки нужно мощное железо. Может потребоваться масштабирование и т.д.
    Ответ написан
    Комментировать
  • Как максимально быстро добавить огромное количество записей в БД без дублей?

    @mrFlyer
    Много записей это сколько? Вы просто каждый раз делаете запрос к базе для проверки. Если переложить проверку поиска дубля на пхп, то проблема решится.

    Получите все записи разом из бд, в пхп найдите несуществующие записи и через DB::insert проведите вставку.

    Что то типа такого:
    $models = Model::select("id","num")->get();
            foreach($numbers as $num){
                if (!$models->where("num",$num)->first()) {
                    \DB::table("table_name")->insert(["num"=>$num]);
                }
            }


    Ну и как вариант вытащить все записи из списка numbers и сравнить каких не хватает:

    $models = Model::select("id","num")->whereIn("num",$numbers)->get();
            foreach($numbers as $num){
                if (!$models->where("num",$num)->first()) {
                    \DB::table("table_name")->insert(["num"=>$num]);
                }
            }
    Ответ написан
    7 комментариев
  • Как в яндекс почте пересылать получаемые письма под своим аккаунтом, а не под оригинальным отправителем?

    @9999_dk
    В автоматическом режиме никак.
    Только в ручном режиме.
    Как вариант в почтовом клиенте создать правило пересылки писем вложенными.
    Ответ написан
    Комментировать
  • Какое максимальное количество очередей(queues) может переварить Laravel?

    Enokin
    @Enokin
    Full-stack разработчик
    Laravel не имеет конкретного ограничения на максимальное количество очередей, которые он может обрабатывать. Фактическое количество очередей, которые можно обработать, зависит от различных факторов, таких как спецификации железа сервера, размера очередей и мощности обработки для каждого задания в очереди.

    В целом, возможно обрабатывать тысячи очередей в Laravel, но это в конечном итоге зависит от ресурсов, доступных на сервере и нагрузки на каждое задание в очереди. Если вам нужно обрабатывать большое количество очередей, вы можете рассмотреть использование пула рабочих очередей и настройку нескольких процессов для обработки нагрузки. Это поможет распределить нагрузку
    Ответ написан
    Комментировать
  • Как можно сделать запрос и максимально быстро вывести количество записей во всех категориях на одной странице?

    Fragster
    @Fragster
    помогло? отметь решением!
    А чем не устроил withCount? Если он также тормозит, то можно провести денормализацию: добавить поле-агрегатор в таблицу категорий (или в отдельную таблицу с отношением 1 к 1) и обновлять его при добавлении/удалении подчиненной модели в обработчике события https://laravel.com/docs/8.x/eloquent#events-using... все-таки чтение этой информации будет происходить явно в десятки/сотни раз реже изменения.

    Ну и дополнительный вопрос: а есть ли индекс по category_id? А то разное бывает.
    Ответ написан
    2 комментария
  • Как обновить внешнюю обработку новой версией в 1cfresh?

    @LollyFox
    Новую версию отправляете на аудит точно также, как и в первый раз.
    После прохождения аудита новая версия будет подключена автоматически и заменит старую, никаких дополнительных действий не требуется.
    Ответ написан
    1 комментарий
  • Как сохранить настройки во внешней обработке для всех пользователей?

    Fragster
    @Fragster
    помогло? отметь решением!
    Если это фреш, значит используется скорее всего подсистема Дополнительные отчеты и обработки из БСП, там это делается так:
    https://its.1c.ru/db/bsp316doc#content:4:1:issogl3...
    Ответ написан
    1 комментарий