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

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В процессе эксплуатации конфигураций 1С (особенно в узлах РИБ на базе «1С:Розница» в файловом режиме) нередко возникает ситуация, когда типовой или доработанный документ — например, ЧекККМ — начинает периодически зависать при проведении. При попытке обращения к данным конкретного регистра накопления или при формировании движений система может завершать работу аварийно с сообщением «Недостаточно памяти».

Проанализируем детально причины подобного поведения платформы, рассмотрим типичные ошибки в программном коде и разберем по шагам, как локализовать и устранить проблему.

Анализ программного кода проведения и обработчиков регистра

Основным источником проблем при записи движений являются неоптимальные алгоритмы и ошибки управления транзакциями в модуле документа или модуле набора записей регистра. Разберем ключевые моменты, на которые следует обратить внимание при аудите кода:

  1. Принудительная запись набора движений вместо отложенной. Распространенной ошибкой разработчиков является вызов метода Записать() непосредственно в цикле формирования движений документа. При проведении документа платформа 1С самостоятельно оптимизирует транзакцию и записывает все наборы движений в конце процедуры. Вместо явной записи необходимо выставлять флаг активности записи:
    
    // Неправильно:
    Движения.Зарплата.Записать();
    
    // Правильно:
    Движения.Зарплата.Записывать = Истина;
    
    Явный вызов метода Записать() выполняет лишнюю блокировку таблиц, многократно перезаписывает итоги и в файловом режиме приводит к исчерпанию адресного пространства памяти.
  2. Скрытые циклы и ресурсоемкие выборки в модуле набора записей. Проверим модуль набора записей регистра накопления на наличие обработчиков ПередЗаписью и ПриЗаписи. Если внутри этих событий выполняются тяжелые запросы без отборов по регистратору или периоду, расчеты в бесконечных циклах при определенных комбинациях данных или попытки модификации других связанных регистров, это приводит к резкому скачку потребления памяти.
  3. Корректность очистки и заполнения набора. Убедимся, что перед заполнением набора записей данные очищаются корректно и в коллекцию не попадают дублирующиеся строки с одинаковыми наборами измерений, которые могут вызвать конфликт пересчета агрегатов.

Ревизия структуры регистра накопления и таблиц итогов

Архитектурные недочеты в метаданных добавленного регистра могут существенно снизить производительность кассового узла:

  1. Тип регистра накопления (Остатки или Обороты). Если регистр предназначен для учета начислений или выработки (например, фиксация продаж для расчета зарплаты), он должен иметь вид Обороты. Если ошибочно выбран вид Остатки, но списания в ноль не происходит, таблица итогов накапливает незакрытые остатки за всю историю. При проведении каждого следующего чека СУБД пытается пересчитать всю цепочку итогов вперед, что гарантированно вызывает зависание и ошибку нехватки памяти.
  2. Типы данных в измерениях. Проверим состав измерений регистра. Не допускается использование составных типов данных, строк неограниченной длины или громоздких реквизитов. В измерениях должны быть строго определенные ссылки (например, СправочникСсылка.ФизическиеЛица, СправочникСсылка.Магазины).
  3. Управление итогами. Если регистр хранит большие объемы движений, проверим актуальность границы рассчитанных итогов. Для оборотного регистра, данные которого используются только для построения периодических отчетов, можно программно отключить расчет итогов с помощью метода УстановитьИспользованиеИтогов(Ложь).

Восстановление целостности и оптимизация файловой информационной базы

Аварийные отключения питания на рабочих местах кассиров часто приводят к логическим повреждениям индексов в файле .1CD. Утилита chdbfl исправляет лишь физическую структуру таблиц, но может оставлять поврежденными внутренние деревья индексов. Выполним комплекс регламентных процедур:

  1. Тестирование и исправление (ТиИ). Запустим конфигуратор и перейдем в меню Администрирование — Тестирование и исправление.... Обязательно выберем пункты «Реиндексация таблиц информационной базы» и «Пересчет итогов». Пересчет итогов полностью пересоберет внутренние таблицы агрегатов регистра накопления.
  2. Полная пересборка базы через выгрузку в .dt. Если после ТиИ ошибки повторяются, выполним дефрагментацию и полную пересборку адресного пространства базы: выгрузим информационную базу в файл .dt, создадим новую пустую информационную базу и загрузим данные из файла обратно.
  3. Переход на 64-разрядный клиент. Использование 32-разрядного клиента 1С ограничивает выделение оперативной памяти процессу 2–3 гигабайтами. Переход на платформу x64 снимает данное ограничение, однако перед этим убедимся, что все подключенное торговое оборудование (фискальные регистраторы, сканеры, эквайринг) имеет 64-битные драйверы.
  4. Настройка дисковой подсистемы. Для предотвращения повреждения базы при внезапном обесточивании кассы отключим кэширование записей Windows для накопителя, на котором расположена база данных, а также добавим каталог базы и временные файлы в список исключений антивирусного монитора.
← На главную