Как в базе 1С на 4,2 ТБ нашлось 3,85 ТБ мёртвого кэша: расследование и диагностика

01.09.26

База данных - HighLoad оптимизация

База 1С розничной сети выросла до 4,2 ТБ: бэкап — два часа, кассиры ждут список чеков по 25 секунд, диски кончаются. Прежде чем что-то чинить, мы две недели строили карту «что сколько занимает» — платформенными средствами, через ПолучитьСтруктуруХраненияБазыДанных(). Диагноз удивил всех: 3,85 ТБ — мёртвый кэш механизма разграничения доступа БСП, копившийся с 2020 года. Разбираем: как ставится такой диагноз, три красивые гипотезы, которые не подтвердились, почему кэш нельзя просто удалить (208 живых ролей), матрица эквивалентности прав на 329 проверок и почему вечерние «блокировки» оказались параллелизмом. Очистка — только штатными средствами; главный герой статьи — диагностика.

База 1С весом 4,2 терабайта. Ночной бэкап — два часа и 556 ГБ. Места на дисках почти нет, кассиры ждут список чеков по 25 секунд, а вечером, в час закрытия смен, всё «залипает». Знакомая картина? Нам предстояло с ней разобраться — и первое, что мы сделали, это не стали ничего чинить. Две недели ушло на диагноз. Он того стоил: выяснилось, что больше 90 % базы — вообще не данные бизнеса.

Это история-расследование о диагностике: с картой объёмов, тремя красивыми гипотезами, которые не подтвердились, и неожиданным виновником, который съел 3,85 из 4,2 терабайт. Спойлер: это была не история продаж и не версии документов.

 

Завязка: пациент и симптомы

Вводные. Розничная сеть fashion-сегмента: три страны, около 200 касс, 11 боевых баз 1С (Розница + ERP). Главная база — 4,2 ТБ — росла быстрее, чем бизнес, который она обслуживает. Симптомы на момент обращения:

  • Диски. Файл данных — 4 197 ГБ, свободного места на сервере почти не осталось. Дальше — только закупка СХД.
  • Бэкапы. Полный ночной бэкап — около 2 часов и 556 ГБ в сжатом виде. Восстановление тестового контура — событие, которое планируют заранее.
  • Кассы. Список чеков под кассиром открывался ~25 секунд. В вечерний пик закрытие смен подвисало.
  • Соседи. SQL-сервер общий: на одном инстансе живут десятки баз и делят диск, память, tempdb и процессорные ядра.

Всё это — боевой контур работающей розницы: останавливать торговлю нельзя, терять данные нельзя, ошибаться в правах доступа — тем более нельзя.

 

Метод: карта «что сколько занимает» — прежде любых действий

По опыту, в задачах вида «база слишком большая и всё тормозит» самое дорогое — это не решение, а правильный диагноз. Инструмент диагностики штатный и доступен каждому: метод глобального контекста ПолучитьСтруктуруХраненияБазыДанных() возвращает соответствие объектов метаданных таблицам хранения. Дальше остаётся сопоставить этому списку размеры таблиц из административных отчётов СУБД (стандартные отчёты о занимаемом месте, доступные администратору сервера) — и отсортировать.

В нашем случае карта связала 3 585 таблиц с метаданными. Ожидания у всех участников были стандартные: «наверное, документы за десять лет», «наверное, версии объектов», «наверное, логи». Реальность оказалась интереснее:

 

Что Объём
История версий шаблонов ограничения доступа 3,34 ТБ
Очередь «пересчитать ключи доступа пользователей» (1,18 млрд строк) 287 ГБ
Очередь «пересчитать ключи доступа к данным» (1,19 млрд строк) 221 ГБ
Итого: служебный кэш механизма разграничения доступа ≈ 3,85 ТБ из 4,2 ТБ

 

Прочитайте таблицу ещё раз. Больше 90 % четырёхтерабайтной базы — не данные бизнеса. Это служебный кэш универсального механизма ограничения доступа на уровне записей (RLS в терминологии БСП), который годами рос и никогда не использовался по назначению: регламентные задания пересчёта ключей доступа были выключены ещё в 2020 году. Механизм исправно складывал в очереди задания «пересчитать», которые никто никогда не забирал, и версии шаблонов ограничений, которые никто никогда не читал.

То есть база не «разжирела от документов». Она годами копила ТОДО-лист, который никто не собирался выполнять. 2,37 миллиарда строк ТОДО-листа.

Откуда вообще берётся такой кэш

В типовых конфигурациях на «Библиотеке стандартных подсистем» есть два способа ограничивать доступ на уровне записей. Классический — условие подставляется прямо в текст запроса каждого списка: дёшево в хранении, но каждое чтение платит за вычисление условия. И универсальный — система заранее рассчитывает «ключи доступа»: материализует для каждого пользователя и каждого объекта ответ на вопрос «видит / не видит», чтобы в момент чтения оставалось только соединиться с готовой таблицей ключей.

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

 

Глава, которую мы любим больше всего: отброшенные гипотезы

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

Гипотеза 1. «RLS отключён — значит, всё это мусор, сносим целиком»

Раз регламентные задания пересчёта выключены с 2020 года, соблазнительно решить, что механизм мёртв целиком: очистить кэш, отключить ограничения, разойтись. Проверка ролей показала обратное: 208 ролей реально используют ограничения доступа по условию. Механизм жив, им пользуются каждый день, просто его кэширующая часть превратилась в свалку. Снести «всё целиком» означало бы открыть кассирам чужие магазины.

Гипотеза 2. «Мусор накопили уволенные сотрудники — почистим по ним»

Красивая версия: справочник пользователей разросся до 5 600 карточек, из которых активны ~150. Логично предположить, что ключи доступа уволенных и составляют массу кэша. Посчитали: живых ключей доступа — 660 строк. Из миллиардов. Эффект от чистки «по уволенным» — десятки килобайт. Не гигабайт. Килобайт.

Гипотеза 3. «Виноват вот этот конкретный медленный регистр»

В метриках сервера СУБД стабильно светился один регистр с чудовищными чтениями — идеальный подозреваемый. При внимательном разборе выяснилось, что регистр… из соседней базы на том же инстансе. Урок бесплатный, но выстраданный: на общем сервере любую метрику сначала фильтруйте по конкретной базе. Иначе будете неделю оптимизировать чужую систему.

 

Почему «просто удалить кэш» нельзя — и что делать сначала

Ключевая развилка проекта: пока динамические списки работают через универсальный механизм, его кэш нельзя трогать — без кэша универсальный RLS начнёт вычислять права «на лету», и кассы лягут окончательно. Значит, сначала база переводится с универсального механизма разграничения доступа на классический — отбор по магазину прямо в запросах динамических списков. Это полностью прикладная доработка: отбор внедрён в 23 документах средствами конфигурации. После этого кэш становится по-настоящему мёртвым, а списки начинают работать быстро, потому что перестают тащить за собой каскад служебных соединений.

Замер эффекта на списке чеков (с учётом RLS): 162 млн логических чтений → 94. Плюс отдельно — добавление недостающих индексов под кассовые операции: список чеков открылся мгновенно вместо 25 секунд, 505 410 логических чтений → 4. Такой порядок улучшения — почти всегда признак того, что раньше запрос просматривал таблицу целиком; никакой магии, просто индекс, которого не хватало годами.

 

Права — только через матрицу эквивалентности

Смена механизма доступа — точка максимального риска всего проекта: права — единственная область, где «почти как раньше» равно «авария». Кассир, увидевший чужой магазин, — инцидент безопасности; менеджер, потерявший свой, — остановка работы. Поэтому перед переключением прогонялась матрица эквивалентности прав: 329 проверок «кто что видит до и после» по комбинациям ролей и сценариев, с фиксацией результата по каждой строке. Расхождений — 0. Это самая скучная таблица проекта, и мы ни разу не пожалели о часах, потраченных на её заполнение: скучная таблица сильно приятнее интересного инцидента.

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

 

Вечерний пик: все думали на блокировки — виноват был параллелизм

Второй сюжетный поворот расследования. Все были уверены, что вечерние залипания касс — это блокировки. Аудит показал: блокировок в пик — ноль. Душил кассы агрессивный параллелизм: заводские настройки сервера СУБД (cost threshold for parallelism = 5, MAXDOP = 0) на 48-ядерном сервере отправляли даже лёгкие запросы разбегаться по всем ядрам, и две трети запросов в пик просто стояли в очереди за потоками. Лечение — административная настройка сервера: cost threshold 5 → 50, MAXDOP 0 → 8, динамически, с заранее подготовленным откатом. Это стандартные серверные параметры, рекомендации по которым есть в любой методике обслуживания нагруженных СУБД.

 

Что было дальше — и что осталось за рамками статьи

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

  • объектное удаление средствами платформы — порциями, в фоновых заданиях, с контролем ссылочной целостности;
  • штатные регламентные процедуры БСП — у механизмов версий и очередей есть собственные средства очистки, которые нужно включить и настроить;
  • «Тестирование и исправление» с опцией сжатия таблиц — освобождает место после массовых удалений;
  • выгрузка/загрузка через DT — полностью перестраивает базу и убирает фрагментацию: эффективный способ «сбросить вес» после очистки;
  • регламентное обслуживание СУБД без изменения данных — обновление статистики, дефрагментация индексов, настройки производительности сервера: это административные операции, не затрагивающие данные.

Процедурная дисциплина при любой очистке одна и та же: полные репетиции на копии, контрольные сверки остатков «до/после», точки отката, приёмка на стороне заказчика. Детали исполнения сознательно вынесены за рамки этой статьи: здесь нам важно было показать, как ставится диагноз и как доказывается, что данные действительно мёртвые — потому что именно на этом этапе рождаются и катастрофы, и успехи.

Результат для понимания масштаба: база — 105 ГБ вместо 4 197, полный бэкап — 18,3 ГБ вместо 556 и минуты вместо двух часов, кассы открывают список чеков мгновенно. Приёмку проводили не мы: представители заказчика под ограниченными правами прошли по чекам, отчётам, остаткам и разграничению доступа. Замечаний не было. Мы вообще считаем, что приёмка глазами исполнителя — это оксюморон: исполнитель смотрит туда, где ожидает увидеть успех.

 

Чек-лист диагностики для тех, у кого база «весит как чугунный мост»

Если у вас конфигурация на БСП с универсальным ограничением доступа и база подозрительно велика:

  1. Постройте карту объёмов. ПолучитьСтруктуруХраненияБазыДанных() + административные отчёты о размерах таблиц, отсортировать по убыванию. Диагноз — до любых действий. Наши 3,85 ТБ кэша нашлись именно так.
  2. Проверьте таблицы механизма доступа БСП: версии шаблонов ограничений, очереди обновления ключей доступа. Если регламентные задания пересчёта выключены, а таблицы растут — вы, вероятно, нашли своего пожирателя дисков.
  3. Не удаляйте кэш, пока не разобрались, кто им пользуется. «Задания выключены» ≠ «механизм мёртв». Посчитайте роли с ограничениями по условию.
  4. На общем инстансе фильтруйте метрики по своей базе. Иначе рискуете оптимизировать соседей.
  5. Проверьте параллелизм до охоты на блокировки. Заводские cost threshold for parallelism и MAXDOP на многоядерном сервере — мина, которая маскируется под «блокировки в пик».
  6. Любое изменение механизма прав — только через матрицу эквивалентности «роль × сценарий × видимость» до и после. У нас в ней было 329 строк, и жалеть не пришлось ни разу.
  7. Отчёты сверяйте контрольной суммой по нормализованной выгрузке, а не глазами.

 

Вместо эпилога

Самое поучительное в этой истории, на наш взгляд, не цифры. А то, что четыре терабайта проблем не были следствием чьей-то ошибки в моменте. Каждый участник в своё время действовал разумно: механизм доступа включили, потому что он был нужен; задания пересчёта выключили, потому что они грузили сервер; на растущую базу махнули рукой, потому что «диски пока есть». Система деградировала маленькими рациональными шагами — и «внезапно» оказалось, что бэкап идёт два часа, а бизнес живёт на 2,5 % своей базы, нося на спине остальные 97,5.

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

Если у вас база тоже «весит как чугунный мост» — начните с карты объёмов из чек-листа. А вопросы и свои грабли несите в комментарии: самое интересное в таких историях обычно всплывает именно там.

 

И про сам список таблиц. Мёртвый кэш здесь нашёлся по факту из СУБД, а не по оценке объёма. Разница между этими двумя способами оказалась крупнее, чем я думал: на базе 3,4 ТБ оценка по метаданным недооценила регистр бухгалтерии в 14,6 раза и не увидела больше терабайта служебных таблиц - Обработка сказала 244 ГБ, на диске 19.

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

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

диагностика RLS БСП большие базы производительность администрирование MAXDOP ограничение доступа

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

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

См. также

HighLoad оптимизация Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    15052    ivanov660    48    

57

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

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

18.02.2025    15900    ivanov660    39    

62

HighLoad оптимизация Программист Россия Бесплатно (free)

А вы знали, что сервер 1С при соединении с базой на сервере PostgreSQL самостоятельно устанавливает некоторые параметры? Это важно знать при настройке сервера и отладке долгих запросов. Предлагаю разобраться.

27.08.2024    9792    soulner    10    

41

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    18494    ivanov660    13    

64

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

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    24419    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    14151    spyke    29    

54
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. lada2011 28.07.26 08:37 Сейчас в теме
Страх парализует систему. Каким образом кассир, видя на экране монитора экранную клавиатуру, держа в руке сканер штрихкода и еле успевая обслуживать покупателей , увидит чужой магазин?
Andreeei; +1 Ответить
5. nedomolkov.ivan 235 28.07.26 13:43 Сейчас в теме
Кассир в потоке — согласен, ему некогда 🙂 Но RLS защищает не от любопытства кассира, а от доступности данных: под теми же ролями работают менеджеры, ревизоры, бэк-офис — со списками, отборами, отчётами и поиском. «Увидеть чужой магазин» — это не «взглянул на экран», а «данные другого юрлица доступны тому, кому не положено»: обороты, остатки, цены закупки. Для сети из трёх стран это уже не UX-вопрос, а аудит и коммерческая тайна. Матрица нужна не из страха, а из асимметрии цены: проверка стоит часы, инцидент — сильно дороже.
AntonErmolaev; SP2000; +2 Ответить
2. muskul 28.07.26 09:49 Сейчас в теме
ну не увидеть что каким то мусором база засралась это прям постараться нужно. непонятно чем там вообшще люди занимались пока 200 точек строили.
Что за матрица эквивалентности?
6. nedomolkov.ivan 235 28.07.26 13:44 Сейчас в теме
(2)
По первой части — отчасти соглашусь: изнутри такое действительно не видят, потому что деградация идёт маленькими шагами, а рост базы легко списывается на рост бизнеса. Мониторинга объёмов в разрезе таблиц не было — потому первым шагом мы (внешняя команда, пришли по симптомам) и строили карту «что сколько занимает».

Матрица эквивалентности — это таблица «роль × сценарий × ожидаемая видимость». До изменений снимаем эталон: пользователь с ролью X в сценарии Y видит ровно набор Z (списки, отчёты, остатки). После перевода на классический RLS прогоняем те же 329 строк и сверяем. Совпало всё — переключаемся; любое расхождение — разбор до причины. Скучно, зато права меняются без инцидентов.
AntonErmolaev; +1 Ответить
12. muskul 29.07.26 03:03 Сейчас в теме
(6)
это таблица «роль × сценарий × ожидаемая видимость»

а как вы и чем вы проверяли доступна видимость и все работает как нужно или нет?
20. nedomolkov.ivan 235 03.08.26 08:34 Сейчас в теме
(12)
Тремя слоями, от дешёвого к дорогому.
1. Программный прогон. Обработка под каждым эталонным пользователем выполняла фиксированный набор запросов (списки документов, остатки, взаиморасчёты) в обычном режиме, без привилегированного, и складывала в таблицу «роль × сценарий × число строк + хеш выборки». 329 комбинаций — около 40 минут машинного времени. Снимок до переключения = эталон, после = факт, сверка автоматическая, глазами никто ничего не сравнивал.
2. Сверка отчётов. Десяток типовых отчётов (остатки, продажи, взаиморасчёты) выгружался в mxl под теми же эталонными пользователями до и после, сравнение — по SHA-256 файла выгрузки. Любое расхождение в байтах уходило в разбор: так ловятся случаи, когда состав строк тот же, а суммы поехали.
3. Живая приёмка. Две недели параллельной работы пилотной группы (бэк-офис и ревизор) с явной просьбой жаловаться, если из списка что-то пропало. Это единственный слой, который ловит «видно не то, что нужно для работы», — автотест такое не отличит от корректного ограничения.
Расхождения были, и ровно там, где универсальный RLS раздавал права широко «на всякий случай». Это как раз те строки, ради которых всё и затевалось.
3. SerVer1C 1143 28.07.26 10:21 Сейчас в теме
Самый главный вопрос: почему эта проблема не смутила вас гораздо раньше, например, когда база перевалила за терабайт ???
RustIG; ASKER_DS; +2 Ответить
7. nedomolkov.ivan 235 28.07.26 13:45 Сейчас в теме
(3)
Справедливый вопрос, и ответ простой: нас тогда ещё не было 🙂 Мы — приглашённая команда: позвали, когда бэкап перестал влезать в ночь, а диски — в бюджет. До этого система жила «изнутри», где рост базы выглядел нормой растущего бизнеса — тем более что рос он равномерно, без резких скачков, которые заставляют насторожиться.

Но с посылом согласен полностью: смутиться стоило на первом терабайте. Поэтому главный вывод статьи — скучное «измеряйте»: карта объёмов стоит часы и отвечает на вопрос «что из этого вообще ваши данные» до того, как их станет четыре терабайта.
AntonErmolaev; +1 Ответить
4. Tahallus 441 28.07.26 13:31 Сейчас в теме
Вроде решили похвастаться, а получается как-то наоборот.
Вместо того чтобы еще в самом начале разбираться почему база разрастается, вы просили еще дисков, 6 лет.
"И так сойдет".
8. nedomolkov.ivan 235 28.07.26 13:45 Сейчас в теме
(4) Небольшое уточнение ролей: «мы» в статье — внешняя команда. Шесть лет диски просили не мы — мы пришли, когда диски закончились вместе с терпением, и первым делом построили карту объёмов.

А в остальном вы пересказали эпилог статьи 🙂 Она ровно об этом и написана — не «как мы красиво удалили», а «как система деградирует маленькими рациональными шагами и как это поймать диагностикой». Если после прочтения кто-то проверит свои таблицы механизма доступа на втором сотне гигабайт, а не на четвёртом терабайте, — статья свою задачу выполнила.
AntonErmolaev; +1 Ответить
11. Tahallus 441 28.07.26 18:56 Сейчас в теме
(8) лучше добавил это уточнение что вы внешняя команда которая была привлечена для устранения проблемы
G.Shatrov; +1 Ответить
21. nedomolkov.ivan 235 03.08.26 08:36 Сейчас в теме
(11)
Справедливо, и претензия по адресу: роль команды должна была стоять в преамбуле, а не всплывать в комментариях. Читатель заходит с картинки «4,2 ТБ» и по умолчанию считает, что это довели те же, кто чинит. В следующих текстах ставим это первой строкой.
9. SerVer1C 1143 28.07.26 14:13 Сейчас в теме
Ещё для размышления:
Это часть статьи, которую не разрешили публиковать на ИС, ибо опасно трогать скуль голыми руками.
Прикрепленные файлы:
10. nedomolkov.ivan 235 28.07.26 14:45 Сейчас в теме
(9)
Ещё для размышления:
Это часть статьи, которую не разрешили публиковать на ИС, ибо опасно трогать скуль голыми руками.


Знакомая история 🙂 У нас ровно так же: первую версию статьи про обрезку 4,2 ТБ модерация отклонила именно за операции уровня СУБД. Спорить не стали — переписали в чисто диагностическом ключе: платформенная карта объёмов, гипотезы, матрица прав, настройки параллелизма. В таком виде прошла, и, честно говоря, статья стала полезнее: способ удалить у каждого свой, а вот найти проблему нужно всем одинаково.

По _SystemSettings подтверждаю из практики: в базах, где никто не следит за служебными таблицами, она стабильно оказывается в топе. У нас на 4,2 ТБ первое место держал кэш механизма разграничения доступа — 3,34 ТБ истории версий шаблонов плюс 2,37 млрд строк в очередях пересчёта, при выключенных с 2020 года регламентных заданиях. То есть больше 90 % базы были не данными бизнеса.

Ирония в том, что самое ценное в таких историях — не способ удаления, а первый шаг: посмотреть, что вообще лежит в базе, включая таблицы, за которыми не стоит ни один объект метаданных. Их в конфигураторе не видно, а весят они больше всего.
AntonErmolaev; +1 Ответить
13. karpik666 4361 30.07.26 13:42 Сейчас в теме
Почему не разделили базу по магазинам, то есть есть основная база консолидирцющая информацию, и тут бы лучше erp или ут, и переферийные, где и происходит продажа, зачем эта заморочка с rls, рисками его пересчёта?
RustIG; stclean; +2 Ответить
15. nedomolkov.ivan 235 30.07.26 18:10 Сейчас в теме
(14)
(13)
Почему не разделили базу по магазинам, то есть есть основная база консолидирцющая информацию, и тут бы лучше erp или ут, и переферийные, где и происходит продажа, зачем эта заморочка с rls, рисками его пересчёта?
Архитектуру — единая база vs распределёнка — выбирал заказчик задолго до нас: мы заходили как внешняя команда на диагностику и лечение уже работающей системы, смена ландшафта в объём работ не входила.

По существу выбора: сети были важны онлайн-остатки всех магазинов (перемещения, резервы, интернет-заказы) и централизованные доработки — единая база даёт это из коробки. РИБ на ~200 узлов — свой класс проблем: регламенты обмена, очереди, конфликты, лаг консолидации, обновление двухсот периферий. RLS здесь — не замена распределёнке, а разграничение доступа внутри единой базы.

Риски пересчёта, о которых вы пишете, реальны — статья ровно о том, что бывает, когда за этим кэшем шесть лет никто не смотрит. Вывод у нас не «RLS нельзя», а «у механизма есть эксплуатационная цена, и её надо мониторить».
14. stclean 30.07.26 16:21 Сейчас в теме
Может быть я не прав, но мне кажется, что распределенная база по точкам куда больше получила бы выгоды, чем единая база для всех точек, плюс регламент обмена.
Но в любом решении есть свои плюсы и минусы.
16. nedomolkov.ivan 235 30.07.26 18:11 Сейчас в теме
(14) С последней фразой согласны полностью — серебряной пули нет. РИБ снимает конкуренцию в одной базе, но приносит регламент обмена, лаг консолидации и сопровождение N узлов. Единая база даёт онлайн-остатки и одну точку доработок, но требует дисциплины по производительности и доступам. На ~200 точках обе архитектуры живут на пределе, и выбор в итоге определяется тем, какую команду сопровождения заказчик готов содержать. Здесь единую базу выбрали до нас — наша работа была сделать её здоровой.
17. Andrekaa 31.07.26 08:12 Сейчас в теме
(14) но 200 обменов еще тот квест
18. nedomolkov.ivan 235 31.07.26 10:01 Сейчас в теме
(17)

Именно. РИБ на 200 узлов — это отдельная профессия: регламенты обмена, очереди, конфликты, периферии, догоняющие центр после каждого обновления конфигурации. «Распределёнка снимает проблемы конкуренции» — снимает, но выдаёт взамен 200 маленьких баз со своим характером каждая. На этом масштабе единая база с дисциплиной по производительности оказалась дешевле в сопровождении — правда, дисциплина, как видно из статьи, тоже не бесплатная.
19. Andrekaa 31.07.26 12:21 Сейчас в теме
(18)
дисциплина, как видно из статьи, тоже не бесплатная.

думаю это дешевле чем обмен с 200 базами
22. KOLIZEIII 04.08.26 11:42 Сейчас в теме
Интересное обсуждение
23. RustIG 1980 06.08.26 15:48 Сейчас в теме
Спасибо за статью. Слишком круто написана - круто для человека, который ни разу не писал статьи. Чую, что писали с помощью ИИ. В данном случае, содержание интереснее формы, поэтому за ИИ не критикую, только поддерживаю.


Что было дальше:
1. объектное удаление средствами платформы — порциями, в фоновых заданиях, с контролем ссылочной целостности;
2.штатные регламентные процедуры БСП — у механизмов версий и очередей есть собственные средства очистки, которые нужно включить и настроить;
3. «Тестирование и исправление» с опцией сжатия таблиц — освобождает место после массовых удалений;
4. выгрузка/загрузка через DT — полностью перестраивает базу и убирает фрагментацию: эффективный способ «сбросить вес» после очистки;
5. регламентное обслуживание СУБД без изменения данных — обновление статистики, дефрагментация индексов, настройки производительности сервера: это административные операции, не затрагивающие данные.

1. что за объекты пришлось удалять? если речь шла об очередях и истории версий - это, наверное, все регистры сведений - зачем ссылки проверять, и что за объекты?
2. штатные регл проц. БСП для очистки, наверное, не предназначены для удаления порциями и такого объема старых сведений? может они неоптимально работают?
3. тестирование и исправление - для 1-4 Тб , наверное долго делается, и ночи не хватит... Неужели это использовали?
4. Выгрузка и загрузка - тоже непонятно - для такого объема данных , что и куда грузили и зачем? каждый раз после очистки очередной порции?

Что после всего - база весит 1Тб - наверное, ее и дальше можно чистить - сворачивать?
11 боевых баз 1С (Розница + ERP). Главная база — 4,2 ТБ
Какая здесь главная база - ЕРП или какая-то одна Розница?
24. nedomolkov.ivan 235 06.08.26 16:17 Сейчас в теме
(23) Спасибо. Про ИИ отвечу сразу, чтобы не висело: черновики готовлю с ним, скрывать смысла нет. Цифры, замеры и разбор мои, база живая. Теперь по вопросам.

1. Основная масса это не объекты, а регистры сведений: история версий шаблонов ограничения доступа и две очереди пересчёта ключей доступа. Там наборы записей, ссылочную целостность проверять не надо, удаление идёт отбором по измерениям и периоду. Список из пяти пунктов в статье это общий инструментарий администратора, а не "мы прогнали все пять подряд". Объектное удаление с контролем ссылок относится к прикладной части, а не к этим 3,85 ТБ. Из текста это читается хуже, чем хотелось, тут согласен.

2. Штатные регламенты БСП рассчитаны держать равновесие, а не разгребать завал за шесть лет. Порция у них небольшая и в фоне, на 1,19 млрд строк она будет доедать очередь очень долго. Основной объём разбирали наборами записей, порциями, с оглядкой на журнал транзакций: на удалении он растёт быстрее самих удаляемых данных, и на полной модели восстановления это отдельная засада. Но включать штатные регламенты надо обязательно, только уже после разбора завала, иначе через пару лет всё то же самое.

3. Нет, на 4,2 ТБ ТиИ никто не запускал, тут вы правы, ночи не хватит. Порядок обратный: сначала удаление. После него база логически пустая, а файл всё те же 4 ТБ, свободное место просто лежит внутри файла. Сжатие делали уже в этом состоянии, когда живых данных осталось около сотни гигабайт, вот тогда это часы.

4. Тоже один раз в конце, а не после каждой порции. DT после массового удаления снимает фрагментацию и даёт чистый файл, но на исходных 4,2 ТБ он бы не собрался за разумное время. Весь смысл в том, что к моменту выгрузки данных уже мало.

5. Тут цифра другая: не 1 ТБ, а 105 ГБ против 4 197. Дальше чистить нечего, это и есть бизнес-данные за все годы. Свёртка здесь не нужна: она лечит большую историю движений, а история занимала копейки, весь вес держал служебный кэш.

6. Розница. Кассы, чеки, разграничение по магазинам всё оттуда. ERP в контуре есть, но по объёму она заметно скромнее.
25. RustIG 1980 06.08.26 17:54 Сейчас в теме
26. Ninel_S 28 21.08.26 12:45 Сейчас в теме
Коллеги, предлагаю "Алгоритм расследования"

Снять дамп памяти.

Определить типы объектов с максимальным количеством ссылок.

Определить модули, которые создают эти объекты.

Определить сеансы, которые держат ссылки.

Проверить фоновые задания.

Проверить расширения.

Проверить временные хранилища.

Проверить формы, которые не освобождают данные.

Построить граф ссылок.

Найти циклы удержания.
27. nedomolkov.ivan 235 21.08.26 12:55 Сейчас в теме
(26) Алгоритм рабочий, но он про другую болезнь. Дамп памяти, сеансы, временные хранилища, циклы удержания - это расследование утечки в rphost, когда процесс пухнет и его перезапускают по расписанию. У нас рос файл базы на диске: 3,34 ТБ истории версий шаблонов ограничения доступа плюс полтерабайта в двух очередях пересчёта ключей. Всё это спокойно пережило бы любой перезапуск кластера, память тут ни при чём.

И по шагам: снять дамп и построить граф ссылок в 1С нечем. WinDbg по rphost покажет внутренности платформы, прикладных объектов там не видно. По памяти реально работает другое - замер по сеансам в консоли кластера и техжурнал, дальше руками смотреть код, который держит состояние.

Для роста базы алгоритм короче: топ таблиц по размеру, отделить служебные от прикладных (за первыми не стоит ни один объект метаданных, в конфигураторе их не видно), проверить, включены ли регламентные задания, которые их чистят, и глянуть динамику за пару месяцев. Первый же шаг тогда и закрыл вопрос: 90% базы оказались не данными бизнеса.
28. Ninel_S 28 22.08.26 19:39 Сейчас в теме
(27)
Алгоритм рабочий, но он про другую болезнь. Дамп памяти, сеансы, временные хранилища, циклы удержания - это расследование утечки в rphost, когда процесс пухнет и его перезапускают по расписанию. У нас рос файл базы на диске: 3,34 ТБ истории версий шаблонов ограничения доступа плюс полтерабайта в двух очередях пересчёта ключей. Всё это спокойно пережило бы любой перезапуск кластера, память тут ни при чём.

И по шагам: снять дамп и построить граф ссылок в 1С нечем. WinDbg по rphost покажет внутренности платформы, прикладных объектов там не видно. По памяти реально работает другое - замер по сеансам в консоли кластера и техжурнал, дальше руками смотреть код, который держит состояние.

Для роста базы алгоритм короче: топ таблиц по размеру, отделить служебные от прикладных (за первыми не стоит ни один объект метаданных, в конфигураторе их не видно), проверить, включены ли регламентные задания, которые их чистят, и глянуть динамику за пару месяцев. Первый же шаг тогда и закрыл вопрос: 90% базы оказались не данными бизнеса.


Коллега, Ваш 4-х шаговый алгоритм для поиска причин раздувания физической базы (особенно актуальный для терабайтных монстров с богатой историей RLS в БСП) — это чистый концентрат практики:

- Вывести топ таблиц по размеру в СУБД.

- Отделить служебный мусор от прикладных данных.

- Проверить регламенты очистки.

- Оценить динамику за пару месяцев.

С Вашего разрешения, положу в копилку, признав свое неуместное "алгоритмизирование". Спасибо за отличное и очень полезное "заземление".
29. Cyberhawk 135 08.09.26 19:08 Сейчас в теме
проверялись доработанные отчёты: результат «до» и «после» сравнивается не «на глаз», а контрольной суммой по нормализованной выгрузке
А есть какой-нибудь пример кода или более детальное объяснение процедуры сравнения?
30. nedomolkov.ivan 235 08.09.26 20:15 Сейчас в теме
( 29 ) Кода дать не могу, он из клиентского проекта. Процедура короткая. Отчёт выгружается в таблицу, по строкам считается отпечаток из трёх чисел: количество строк, сумма числовых колонок и SHA-256 по отсортированным склеенным строкам. Недетерминированные колонки из хеша исключаются явно, иначе поймаете ложное расхождение. Не сошлось - сумма по каждой колонке отдельно, и видно, какая уехала. У нас так нашёлся своп двух колонок.
31. RustIG 1980 08.09.26 20:56 Сейчас в теме
(30) а если в отчете нет числовых значений? - просто некие сведения из периодических регистров сведений...
32. nedomolkov.ivan 235 09.09.26 04:34 Сейчас в теме
( 31 ) Хеш по строкам чисел не требует, он и есть основная проверка. Сумма только ускоряет поиск места, где разошлось. Нет чисел - считайте хеш по каждой колонке отдельно, роль та же. По периодическим регистрам два подвоха. Фиксируйте параметры обоих прогонов, включая момент среза. И помните про колонки с представлениями: переименовали элемент, данные те же, а хеш разъехался.

Набросал пример, гонял на 8.3.27:

Функция ОтпечатокТаблицы(ТЗ)
Имена = Новый Массив;
Для Каждого К Из ТЗ.Колонки Цикл
Имена.Добавить(К.Имя);
КонецЦикла;
ТЗ.Сортировать(СтрСоединить(Имена, ","));

Строки = Новый Массив;
Для Каждого ТекСтрока Из ТЗ Цикл
Поля = Новый Массив;
Для Каждого Имя Из Имена Цикл
Поля.Добавить(XMLСтрока(ТекСтрока[Имя]));
КонецЦикла;
Строки.Добавить(СтрСоединить(Поля, Символы.Таб));
КонецЦикла;

Хеш = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеш.Добавить(СтрСоединить(Строки, Символы.ПС));
Возврат ПолучитьHexСтрокуИзДвоичныхДанных(Хеш.ХешСумма);
КонецФункции

XMLСтрока тут не для красоты. Дате она даёт ISO, числу точку вместо запятой, а ссылке GUID вместо наименования - как раз мимо переименований. Сортировка перед хешем делает отпечаток независимым от порядка строк. Гонял на пятистах строках номенклатуры, колонки ссылка, наименование, артикул - ни одной числовой, два разных порядка дали один хеш. Он же сходится с обычным sha256sum снаружи 1С: Добавить со строкой берёт UTF-8 без BOM. И осторожнее с Символы.ВТаб - это код 11, а нужен Символы.Таб.
33. RustIG 1980 09.09.26 09:01 Сейчас в теме
(32) подобные хеш-преобразования используются в алгоритмах версионирования - для сравнения изменений в реквизитах документов и справочников. Использовать подобный механизм для сравнения результатов выходных отчетов - интересная идея, но как будто узкоспециализированная.
В некоторых отчетах по 10 тыс строк, в реквизитах документов и справочников априори такого кол-ва полей не бывает, поэтому универсально для отчетов подобный механизм версионирования (сравнения версий) не используется.
Повторюсь, идея интересная.
Реализация не может быть универсальной, для каждой задачи нужно будет оптимизировать решение.
И еще надо понимать и различать, что мы сравниваем : измененные данные (для одного запроса) после свертки например или все-таки измененный запрос после доработки при неизменяемых данных - когда результат должен сохраниться...
34. Ninel_S 28 09.09.26 11:17 Сейчас в теме
(33) Чрезвычайно полезное замечание.
Для отправки сообщения требуется регистрация/авторизация