Рубрики

Запись в регистры 1С больших наборов записей

В любой реально работающей базе 1С может возникнуть ситуация, когда документ при проведении делает большое количество движений – несколько тысяч или даже несколько десятков тысяч. Данная статья посвящена особенностям записи таких больших наборов записей в базу.

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

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

code-1

Небольшое исследование, проведенное на эту тему, показало, что при использовании текущего (на момент написания статьи) релиза платформы 1С:Предприятия 8.1.15.41 время записи наборов линейно зависит от количества записей в наборе, то есть время записи 6 порций по 3 000 проводок и одной в 18 000 проводок одинаково. Однако также мы имели сведения, что запись несколькими порциями в ряде случаев может быть эффективнее, и в ходе работ, описанных в данной статье ниже, получили теоретическое объяснение – почему так может быть.

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

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

Мы инициировали обсуждение данной проблемы в партнерской конференции 1С http://partners.v8.1c.ru/forum/thread.jsp?id=856332 (требует регистрации).

Коллеги успокоили, подтвердив, что принципиальных ограничений в данном случае нет, и проблема должна иметь решение. В качестве примера приводились данные о реальных документах, делающих по 250 000 проводок.

Одной из интересных идей (Доронин Сергей, ВДГБ-Софт, Йошкар-Ола http://www.vdgb-soft.ru/) было отменять проведение документа вне транзакции:

code-2

Данный способ можно рекомендовать в проблемных случаях, но нам он не помог.

Решение было найдено специалистом фирмы-заказчика, который отменил проведение проблемного документа, переведя базу в монопольный режим (фрагмент кода из Синтакс-помощника):

code-3

По данному факту мы получили разъяснения из 1С (там же в конференции):

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

Полученный ответ позволил не только обосновать экспериментально найденный способ решения проблемы, но прояснил и еще два момента:

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

Уже после того, как проблема была решена, были получены сведения об альтернативном способе решения проблемы (Пиголкин Станислав, Акселот, Москва http://www.axelot.ru/ ). Для этой цели рекомендовано отключать использование итогов:

code-4

Про метод УстановитьИспользованиеИтогов(<Признак>) в Синтакс-помощнике сказано:

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

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

  • запись несколькими порциями;
  • запись вне транзакции;
  • перевод базы в монопольный режим;
  • установка управляемой исключительной блокировки на весь регистр;
  • отключение использования итогов

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

 
ГК Трейд Софт, Москва
Автор: Филиппов Е.В.
Дата публикации: 05.12.2010 г.