Ночной регламент 1С: шаг на 4 минуты каждую ночь оказался четырьмя секундами работы

15.08.26

Интеграция - Нейросети

Ночные регламенты не оптимизируют по простой причине: они идут ночью и никому не мешают. Пока однажды не мешают. У одного шага здесь набежало почти сутки чистого времени в год. И он же оказался четырьмя секундами работы, если делать то же самое иначе. Разница не в железе и не в версии платформы: после правок результат совпадает с прежним до строки, это проверено сверкой. Разобраны пять причин, каждая с доказательством и замером до и после, плюс шестая правка, которую протестировали и отклонили. Отдельно - как убедиться, что расчёт не поехал, и короткий способ найти такое же у себя. Диагноз ставили четыре модели с доступом только на чтение, и главные виновники у них разошлись.

Ночной регламент переоценки товаров без движения работал от 55 до 100 минут, и самый тяжёлый его шаг - запись в регистр истории - стабильно занимал по 3,9-4,2 минуты каждую ночь. После пяти точечных правок этот шаг на первом же боевом ночном прогоне отработал за 4 секунды. Холодный кэш, ноль ошибок.

Это продолжение нашего бенчмарка ИИ-агентов. Ту же самую обработку мы давали четырём моделям (Fable 5, Opus 5 и двум сборкам Codex) прямо в продуктиве, с доступом только на чтение: каждая сама искала, где тормозит, и главные виновники у них разошлись; кто из четырёх попал точнее - разбор здесь. Сегодня другая часть истории: собранный диагноз выложили в прод и проверили реальным ночным прогоном. Цифры сравнения моделей оставляю в той статье, тут только боевые прогоны после выкладки.

Сразу про формат работы, чтобы не было вопросов по ходу. Диагностику и черновики правок гнали тем же способом, что в бенчмарке: read-only агент по базе, только на чтение (здесь это Claude Code, то есть прогоны Fable 5 и Opus 5). Каждую правку инженер сверял числом «было / стало», проверял на эквивалентность результата и выкладывал в прод сам. Агент - инструмент вроде профайлера, решения и ответственность на человеке. Ниже видно, где это дало результат, а где предложенную правку пришлось выбросить.

Обработку не переписывали с нуля. В ней около 9 400 строк рабочей логики, переписывание - это гарантированная регрессия и недели проверок. А время утекало в пяти конкретных местах, каждое чинится точечно.

 

Что за регламент

Внешняя обработка автоматической переоценки товаров без движения 180+ дней. Каждую ночь в 01:00 пересчитывает скидки, формирует документы установки цен, генерирует купоны и раскладывает их по складам (их больше 160). Система - сеть розничных магазинов на ERP-платформе 1С:Предприятие 8.3. Модуль объекта около 9 400 строк BSL, десятки процедур.

Формально регламент укладывался в норматив (10 800 секунд), и по нему одному его никто бы не трогал. Но по журналу за две недели прогон плавно рос (55-100 минут, в среднем около 73), а один шаг каждую ночь жёг по несколько минут на пустых накладных расходах. Большая часть времени уходила в инфраструктуру - срез по лишним данным, построчная запись, обращения к базе в циклах. Сама переоценка была ни при чём.

 

Пять причин, у каждой доказательство

 

Причина 1: срез цен строился по всей номенклатуре

Один из шагов читал историю расчёта и подтягивал к ней текущие цены через СрезПоследних(). В параметрах среза стоял отбор только по типу цен, без ограничения по номенклатуре. Платформа честно строила срез по всем товарам этого типа цен, а лишнее отбрасывала уже при соединении.

Цена вопроса - в счётчиках плана запроса за один прогон:

 

Счётчик До После
Строки, добранные через key lookup 549 383 0
Итого логических чтений страниц 585 739 9 090

 

Это именно логические чтения (буферный пул), а не диск. На прогретом кэше физического ввода-вывода тут почти нет. Но регистр цен - свыше 107 миллионов строк, около 93 ГБ индексов, и на холодном кэше заметная часть этих чтений превращается в физические. Поэтому число важно само по себе: полмиллиона обращений к структуре, чтобы вернуть 300 строк (на входе 9 295 строк истории, на выходе 300).

Правка: нужные номенклатуры материализуются во временную таблицу с индексом, и оба среза цен ограничиваются ею прямо в параметрах виртуальной таблицы: Номенклатура В (ВЫБРАТЬ … ИЗ ВТ_ИсторияСрез). Результат совпал посимвольно - отпечаток выборки в 50 685 символов на 300 строк знак в знак. По логическим чтениям 64,4x, по времени на холодном кэше 3,24x.

Всё дело в том, куда попадает отбор. Когда он в параметрах виртуальной таблицы, платформа строит срез сразу узким - по тремстам нужным номенклатурам. Когда отбор вынесен в условие соединения после среза, платформа сначала строит срез по всем товарам типа цен, а для этого перелопачивает историю регистра - те самые сто с лишним миллионов строк, - и только потом отбрасывает лишнее. Внешне запрос почти одинаковый, разница только в месте отбора, а в счётчике чтений это 585 739 против 9 090.

 

Причина 2: запись в регистр по одной строке

Для Каждого Строка Из ТЗРасчёта Цикл
    МЗ = РегистрыСведений.ИсторияРасчёта.СоздатьМенеджерЗаписи();
    …
    МЗ.Записать();   // отдельная операция записи на КАЖДУЮ строку
КонецЦикла;

На 8 406 строках это 103 629 мс. Заменили на чтение набора записей за период, точечную замену строк по ключу в памяти и одну операцию записи всем набором: 5 265 мс, ускорение 19,68x. Состав и контрольная сумма регистра до и после совпали побитово. Одна запись набором - это одна транзакция и один коммит вместо восьми с лишним тысяч мелких, каждый со своим сбросом лога на диск; отсюда и разница на порядок.

Набор = РегистрыСведений.ИсторияРасчёта.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Период);
Набор.Прочитать();
ЗаменитьСтрокиПоКлючу(Набор, ТЗРасчёта);   // точечно, по нормализованному ключу
Набор.Записать();   // одна операция вместо 8 406

Здесь есть о чём спросить, и правильно. Набор.Записать() с отбором по периоду перезаписывает весь период - это осознанный размен: одна большая запись вместо тысяч мелких. Безопасно это потому, что регламент - единственный писатель в этот регистр, работает ночью в эксклюзивное окно, между Прочитать() и Записать() данные периода менять некому. Плюс подстраховка: Записать() набором атомарна, при сбое транзакция откатывается целиком, регистр не остаётся в полузаписанном виде, и тогда срабатывает резервный построчный путь. Так что надёжность не пострадала, а способ проверки остался прежним - сверка состава и контрольной суммы.

Тонкость, без которой правка была бы неверной: одно измерение регистра хранится в базе усечённым (обрезанное имя вместо полного), и сопоставление ключей «что перезаписываем» пришлось делать по нормализованному значению. Иначе вместо перезаписи в регистре появлялись бы дубли. Пакетную запись вообще нельзя ставить вслепую: без сверки такой дубль легко проехать.

 

Причины 3-5: обращения к базе в циклах

  • Реквизит справочника «через точку» внутри цикла. На каждую новую ссылку платформа читает весь объект целиком в кэш объектов. Пока номенклатура повторяется - дёшево, но когда в цикле тысячи разных ссылок, это тысячи чтений объектов вместо одного запроса до цикла. Заменили на предварительную выборку. Замеряли время участка цикла до и после на тех же данных: 212-265x в трёх разных местах.
  • Массив.Найти() при накоплении уникальных значений - линейный поиск на каждой вставке. Рядом с массивом завели Соответствие (хеш-таблицу) для проверки наличия. Около 7x.
  • Чтение настроек из базы на каждой строке детальной таблицы - закэшировали в переменной модуля. Было 3,05 мс на вызов, стало почти 0.

 

Как мерили и как убедились, что ничего не сломали

Время брали из журнала регламентного задания по шагам за 14 дней подряд: нужна была разбивка, где именно утекают минуты. Общая цифра прогона этого не покажет. Логические чтения считали через план запроса и статистику ввода-вывода на одном и том же входе: сколько чтений страниц сделал шаг, чтобы вернуть свои строки.

Эквивалентность проверяли для каждой из пяти правок: фиксировали результат до, применяли правку, сверяли после - контрольной суммой набора записей или посимвольным отпечатком выборки. Отпечаток - это конкатенация полей результата в фиксированном порядке в одну строку, которую потом сравнивали посимвольно: так видно любое расхождение, вплоть до одного изменившегося символа. У среза цен отпечаток совпал знак в знак, у регистра истории совпали состав и контрольная сумма. Без такой сверки я бы эти правки в прод не повёз.

Мерили на двух кэшах. Днём буферный пул прогрет, ночью данные регламента вытесняются из него дневной OLTP-нагрузкой, и шаг стартует на холодных страницах. Часть правок (та, что экономит чтения) выигрывает именно на холодном кэше, а на прогретом почти незаметна. Холодный кэш в лаборатории получали на копии базы; сбрасывать буферы на боевом сервере нельзя.

 

Что не стали трогать

Отдельно замерили гипотезу об индексации временных таблиц в главном тяжёлом запросе. На холодном кэше правка не сокращала чтений, а на прогретом оказалась медленнее исходного варианта. Правку отклонили, в релиз она не пошла.

Это и есть лучшее доказательство, что работой управлял инженер, а не «агент что-то сделал в базе»: идея звучала правильно, замер её не подтвердил, и её выбросили, а не оставили «раз уж всё остальное переписали». В отчётах об оптимизации такой пункт обычно не показывают.

 

Прод: два прогона на живых данных

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

Прогон 1 - ручной, в день выкладки, тёплый дневной кэш. Запись регистра истории 0,4 мин вместо обычных 3,9-4,2 (10x), ошибок нет. Но кэш тёплый, это ещё не целевой сценарий.

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

 

Шаг Обычно (14 дней) Ручной (тёплый кэш) Ночной (холодный кэш)
Запись регистра истории 3,9-4,2 мин 0,4 мин (10x) 4 с (около 60x)
Расчёт автоцен 5,1-11,7 мин 2,7 мин 1,0 мин
Полный прогон 55-100 мин (сред. ~73) 35,8 мин 46,7 мин

 

Полный ночной прогон (46,7 мин) длиннее ручного (35,8): холодный кэш и другой объём данных за сутки. Отдельные шаги при этом ускорились; смотреть надо по шагам, а не по общему времени.

Оба прогона: 0 ошибок, 0 откатов на резервный путь. Регистр истории за ночь: 8 422 записи, 8 251 номенклатура, дублей ключей 0. На холодном кэше эффект по записи регистра оказался даже сильнее лабораторного прогноза (19,68x): лаборатория считала на отдельной копии, а прод-сервер мощнее и ночью почти без конкурентной нагрузки.

Что это дало по сути: ночное окно разгрузилось, и риск не уложиться в него и получить утром сломанные цены ушёл. Подтверждение - журнал реального ночного прогона, где тяжёлый шаг занял 4 секунды.

 

Как найти то же самое у себя

Если есть ночной регламент, который «пока укладывается», проверьте его по четырём шагам:

  1. Читайте журнал регламента по шагам. Общее время прячет, где именно потери. Нужна разбивка: какой шаг сколько занимает. Часто основное время висит на одном месте, о котором никто не думал.
  2. Смотрите логические чтения тяжёлых шагов (план запроса, статистика ввода-вывода, технологический журнал). «На выходе триста строк, а чтений полмиллиона» - верный признак виртуальной таблицы без отбора по нужному измерению.
  3. Грепните модуль по антипаттернам: .Записать() внутри цикла, реквизиты «через точку» в циклах, Массив.Найти( при накоплении уникальных, чтение настроек внутри цикла по строкам.
  4. Любую правку меряйте числом «было / стало» и сверяйте результат контрольной суммой или отпечатком. Без этого «оптимизация» ничем не отличается от угадывания.

Чаще всего большую часть окна съедает один шаг, и обычно это либо срез виртуальной таблицы без нужного отбора, либо запись в цикле. С них и стоит начинать: здесь эти два места дали основной выигрыш, остальные три правки добрали по мелочи, хотя по кратности выглядят эффектно.

Антипаттерны тут универсальные, цифры у вас будут свои. Если у вас похожий регламент - интересно, где утекает время у вас.

 

Другие наши инструменты диагностики 1С:

Наши инструменты для работы 1С с нейросетями:

Вступайте в нашу телеграмм-группу Инфостарт

оптимизация 1С производительность 1С регламентное задание ERP УПП СрезПоследних виртуальные таблицы временные таблицы логические чтения набор записей пакетная запись регистр сведений антипаттерны 1С план запроса statistics io highload ночной регламент оптимизация запросов буферный кэш

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    67918    137    38    

144

SALE! %

Банковские операции Обмен с интернет-банком Мастера заполнения Нейросети Программист Бухгалтер Пользователь 1С:Предприятие 8 1C:ERP 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:ERP. Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Корректируйте банковские документы быстро и легко! Создайте правило обработки — и оно автоматически применится при загрузке выписки (отбор по любому реквизиту или регулярному выражению). Решение заполняет расшифровку платежа, комиссию эквайринга, подбирает ведомости на выплату зарплаты, помечает дубли из банка на удаление и многое другое. Доплачивать за алгоритмы не нужно — они включены в решение. Обработка работает при загрузке из файлов клиент-банка и через DirectBank. Новое — искусственный интеллект: модель приводит нестандартные назначения платежа к виду, понятному алгоритмам, а ИИ-ассистент прямо в 1С консультирует по решению и разбирает код правил и алгоритмов. Поддерживаются локальные и облачные OpenAI-совместимые модели — данные могут не покидать ваш контур.

15250 руб.

20.12.2024    18241    91    29    

80

SALE! %

Нейросети Системный администратор Программист Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта 1С 8.3 1С:Документооборот 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Россия Платные (руб)

Задавайте вопросы базе 1С обычными словами: получайте данные, находите ошибки и связанные документы, проверяйте права, работайте с вложениями и контролируемо вносите изменения. Всё это работает в самой программе, а Codex и Claude подключаются по желанию.

15989 9891 руб.

30.07.2026    6744    17    4    

15

Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

Новый UI-контур CodexTestBridge запускает штатные TestClient/TestManager и даёт ИИ-агенту семантические действия вместо координат. Результаты возвращаются по шагам, долгие операции сопровождаются heartbeat. На реальной БП 3.0 открываем и заполняем приходную накладную без записи.

26.08.2026    1334    Aleksandr    1    

8

Нейросети Программист Бесплатно (free)

Практический эксперимент по использованию ИИ при обновлении расширений 1С. Сравниваются GigaChat-2-Pro и локальный Qwen3-Coder 30B на реальных конфликтах BSL-кода. Показано, как модели анализируют изменения типовой конфигурации, где могут ошибаться даже с высокой уверенностью и почему рекомендации AI необходимо дополнительно проверять алгоритмически и в тестовой базе 1С.

24.08.2026    1090    aldar    12    

8

Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье расскажу, как реализовал с помощью LLM полноценную генерацию кода для 1С (BSL) в популярном Open Source API-клиенте Bruno.

21.08.2026    1150    malikov_pro    9    

10

Нейросети Программист 1С 8.3 Бесплатно (free)

Один проход модели по вопросу из 28 знаков стоит 631 296 умножений и 4,8 секунды. Столько берёт языковая модель на 21 920 параметров, посчитанная прямо в 1С средствами самой платформы. На ней разбираю по шагам, что стоит за каждым словом из модного словаря: токен, словарь, вектор символа, вес, слой, голова внимания, контекст, softmax, температура, KV-кэш. Отдельно про температуру - она вообще не про креативность и управляет выбором буквы уже после того, как модель закончила работу. Отдельно про галлюцинацию - показываю в цикле генерации место, куда физически невозможно вставить "не знаю". Плюс расчёт потолка для встроенного языка, замер цены размера модели и история про метод платформы, которого не существует.

20.08.2026    5086    nedomolkov.ivan    15    

21

Нейросети Программист Бесплатно (free)

Код от агента выглядит хорошо, но между «агент выдал код» и «код работает в боевой базе» лежит дистанция, которую никто не проходит за вас. Как я обвесил её конвейером из семи ролей на боевой 1С:БП КОРП с БИТ.ФИНАНС: устройство конвейера, почему «критично» у агента не значит «дефект», шесть промахов, прошедших конвейер насквозь, один дефект, доехавший до боевой базы, и честный список того, чего я не измерял.

19.08.2026    2143    VlaMax    36    

13
Для отправки сообщения требуется регистрация/авторизация