⟵ сюдатуда ⟶
  • Мастерклассы
  • Внешние подключения
  • Tableau и PowerBI
  • amoCRM
  • Битрикс 24
  • База знаний
  • Обращение к данным временной таблицы
  • Потеря связи с БД при большом трафике данных
  • Сохранить файл в поле по внешней ссылке url
  • Формирование списка из отмеченных галочками строк и вывод на печать
  • Добавление цикла в таблицу циклов кнопкой из временной таблицы
  • Функция TryCatch и передача данных после отката
  • Ошибка доступа при переходе в цикл если первая таблица недоступна для пользователя
  • Архитектура системы рассчитывающей остатки по кассе или складу
  • Сортировка при выборке по отображению поля Селект, а не по его основанию
  • Блокировка введения дублированного значения
  • Табличное отображение в контекстной панели
  • Сортировка строк в таблице с помощью кнопки
  • Как получить значение по условию из списка вложенных массивов?
  • Сбросить счётчик id в таблице
  • Скрытие поля в таблице по условию
  • Подтверждение действия при нажатии на кнопку в контекстном окне
  • Пересчет большой таблицы
  • Как суммировать значения в rowList по одному из ключей (по одной из колонок)
  • Наборы полей по условию при открытии через linkToTable
  • Как отложить выполнение действия и выполнить его в фоне
  • Создание и удаление строк при выборе значений в Селект или Селект-дерево
  • selectRowListForSelect с условием при котором текущее значение получается зачеркнутым
  • Не все внешние запросы на Remotes выполняются и ломается счетчик id
  • Сортировка Расчётных таблиц в Цикле
  • Как передать данные в виде чисел при обращении POST к API стороннего сервиса (must be a "integer")
  • Как сделать график если есть несколько параметров
  • Сохранение изначальных значений в поле в случае, когда поле рассчитывается кодом
  • Пересчет большой таблицы

    Оригинал на GitHub

    Ссылка на GitHub ⟹

    Вопрос

    Есть простая таблица. В ней номенклатура. Уже около 18 000 строк (так много, чтобы стандартные позиции пользователи не искали и не заносили сразу), то есть, многие просто с кол-вом 0 на складе. Много вычисляемых полей. Не могу пересчитать больше 500 строк, упираюсь в ограничение памяти. Как можно выйти из ситуации?

    Ответ

    Можно пересчитать вручную, по 500 строк, но это сложновато (а иногда бывают таблицы по 100 млн строк и их уж точно руками не пересчитаешь).

    Для таких задач делается разовый Cron.

    Нам потребуется поле, в которое мы будем записывать максимальный id, до которого пересчитали. Я сделаю его прям в таблице Кронов — h_store_num (вы можете поставить его в любое другое место)

    В таблице crons создаем задание крона:

    a1=: reCalculate(table: 'your_table'; where: 'id' = $list)
    
        ~list: selectList(table: 'your_table'; field: 'id'; where: 'id' > #h_store_num; limit: 100; order: 'id' asc)
    
    a2=: set(table: $#ntn; field: 'h_store_num' = $last_num)
    
        last_num: $cut[0]
            cut: listCut(list: $list; cut: "first"; num: -1)
    
    a3=: if(condition: $list = $#lc; then: $set_off)
    
        set_off: set(table: $#ntn; field: 'status' = false; where: 'id' = #id)
    

    Из важного:

    • Сколько строк пересчитывать задается в limit функции selectList

    • selectList обязательно должен иметь order

    • Строка с selectList обязательно должна быть зафиксирована ~

    • Поставьте интервал Крона так, чтобы они точно не пересекались с предыдущим (минимальный интервал у крона 1 минута, но может вам стоит сделать 5) или поставить галочку Контроль наложения.

    • В a3=: прописано отключение крона, когда он дошел до конца таблицы