Книга: Настольная книга 1С:Эксперта по технологическим вопросам
Назад: Сканирующие операторы
Дальше: 3.16.Работа с SQL Server. Где хранятся временные таблицы. Где хранятся снимки Snapshot для уровня изоляции Read Committed Snapshot

3.15.Особенности чтения в объектной модели

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

У чтения в объектной модели есть три особенности.

  1. Иногда ставятся управляемые блокировки.
  2. Иногда чтение происходит в неявной транзакции.
  3. Считываются все данные.

Разберем их по очереди.

1. Иногда ставятся управляемые блокировки.

Как указано в разделе 3.8 «Сведения о блокировках «1С», платформой устанавливаются управляемые разделяемые блокировки при чтении в объектной технике следующих видов объектов:

2. Иногда чтение происходит в неявной транзакции.

Как указано в разделе. 3.6, чтение в объектной технике объектов, имеющих табличные части, будет выполняться в неявной транзакции. Например, запрос ДокументПроведен = ДокументСсылка.Проведен; выполнится в транзакции, если для документа данного типа в конфигураторе определена табличная часть, но этот же запрос будет выполняться вне транзакции, если табличных частей у документа нет.

3. Считываются все данные.

Если посмотреть с помощью замера на отладчике, как выполняется следующий код, то можно увидеть, что основное время всегда тратится на выполнение первой строки:

ДокументПроведен = ДокументСсылка.Проведен;

ДокументДата = ДокументСсылка.Дата;

ДокументНомер = ДокументСсылка.Номер;

Если пройти код пошагово отладчиком и при этом посмотреть трассировку в профайлере SQL Server, можно увидеть, что запрос (если есть еще и табличная часть, то несколько запросов в транзакции) выполняется только на первой строке, при этом тексты запросов содержат имена всех реквизитов и все табличные части. На второй и на третьей строке запросы к базе уже не выполняются. На практике это приводит к следующему:

По совокупности особенностей можно дать как минимум следующие рекомендации:

  1. Не делать у объектов реквизитов с типом ХранилищеЗначения, особенно не допускать этого в табличных частях. Следует использовать отдельные справочники для установки соответствия ссылки и хранилища, а в реквизитах объектов хранить ссылки.
  2. Если не получается отказаться от использования запросов к базе из обработчиков событий ПриВыводеСтроки и ПриПолученииДанных, то по крайней мере следует получать эти данные запросом на языке запросов, а не через объектную модель. Код увеличится в объеме, но выиграет в скорости и перестанет генерировать транзакции.
Назад: Сканирующие операторы
Дальше: 3.16.Работа с SQL Server. Где хранятся временные таблицы. Где хранятся снимки Snapshot для уровня изоляции Read Committed Snapshot