Рассмотрим частую и очень болезненную ситуацию, с которой сталкиваются компании, занимающиеся оптовой или розничной продажей маркированных товаров (особенно сигарет и обуви). При попытке выполнить стандартную процедуру «Тестирование и исправление» (ТИИ) в конфигурации 1С:Управление торговлей 11 процесс может затянуться на 6 и более дней. Проанализируем причину этой проблемы, выясним, почему мощное оборудование (SSD, RAM-диски) не спасает ситуацию, и разберем по шагам, как правильно обслуживать такие базы.
Проблема кроется не в СУБД PostgreSQL или слабости компьютера, а в архитектуре самой платформы 1С:Предприятие и специфике учета маркированных товаров. Если мы посмотрим на структуру данных торговой базы, работающей с табачной продукцией (Честный ЗНАК), то обнаружим, что самый тяжелый объект — это Справочник.ШтрихкодыУпаковокТоваров.
В этот справочник записывается каждая проданная пачка, блок и коробка. В оптовой торговле сигаретами объем записей растет лавинообразно. В рассматриваемом примере таблица хранения этого справочника (например, Reference23920) разрослась до более чем 3,5 миллионов записей. Проанализируем, что происходит при запуске ТИИ:
Даже если мы перенесем базу на сверхбыстрый RAM-диск или разгоним процессор до 5.1 ГГц, алгоритм платформы всё равно будет выполнять перебор огромного массива данных. Значит, проблему нужно решать на уровне оптимизации объема данных и методологии обслуживания.
Разберем по шагам практические подходы, которые помогут избежать недельных простоев из-за ТИИ.
Главный метод решения проблемы — радикальное уменьшение объема самого справочника ШтрихкодыУпаковокТоваров. Хранить миллионы кодов маркировки уже реализованных товаров бессмысленно, так как они больше никогда не вернутся в оборот.
Рекомендуем настроить процесс очистки:
Важно: Никогда не удаляйте записи напрямую через SQL-запросы в PostgreSQL (например, через команду DELETE FROM). Это неизбежно нарушит логическую структуру базы и приведет к появлению тех самых «битых ссылок», которые потом "повесят" базу при ТИИ.
Для объемных баз с маркировкой от регулярного полного ТИИ со всеми галочками стоит отказаться. Рассмотрим альтернативный сценарий обслуживания:
Хотя тюнинг СУБД не ускорит саму алгоритмическую проверку ссылок 1С в 10 раз, правильная настройка PostgreSQL критически важна для баз с постоянной текучкой данных (когда мы регулярно записываем и удаляем штрихкоды).
Посмотрим на рекомендуемые настройки для файла конфигурации postgresql.conf:
jit = off. Компиляция «на лету» (JIT) часто негативно сказывается на специфических запросах 1С.autovacuum.VACUUM FULL (полную очистку таблиц от мертвых строк), REINDEX и ANALYZE (обновление статистики) средствами самой СУБД в нерабочее время. Это освободит физическое место на диске после массового удаления штрихкодов из базы.При анализе таблиц (например, когда вы хотите узнать, сколько именно штрихкодов сейчас в справочнике) разработчики часто пишут тестовые запросы. Проанализируем важный нюанс языка запросов 1С, который всплыл при поиске количества записей.
При вычислении количества записей на языке запросов 1С следует всегда использовать агрегатную функцию КОЛИЧЕСТВО, а не СУММА(1). При количестве записей 10 миллионов и более использование суммы единиц приведет к переполнению, так как платформа по умолчанию использует для этого числа длину 7 разрядов.
Неправильно:
ВЫБРАТЬ
СУММА(1) КАК КоличествоЗаписей
ИЗ
Справочник.ШтрихкодыУпаковокТоваров
Правильно:
ВЫБРАТЬ
КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
Справочник.ШтрихкодыУпаковокТоваров
Долгое тестирование и исправление базы 1С с маркированным товаром — это нормальное поведение платформы при объеме справочника штрихкодов в миллионы строк. Чтобы база "дышала" свободно, регулярно очищайте справочник от отгруженных марок средствами 1С, настройте правильное регламентное обслуживание PostgreSQL и откажитесь от тотальной проверки ссылочной целостности без острой необходимости.