Запись одной записи менеджером после чтения работает медленнее, чем запись одной записи набором, предварительно прочитав набор. Почему так происходит?

1. fggf 25.01.23 18:11 Сейчас в теме
Обратил внимание в SQL Profiler, что если записывать данные менеджером, после чтения, то происходит дублированное выполнение нескольких одних и тех же запросов, тем самым увеличивая время записи.
Например, если будет такая конструкция:

МенеджерЗаписи.Прочитать();

МенеджерЗаписи.Записать().


В этом случае в момент выполнения метода Записать SQL Profiler покажет следующее:
1. Прочитает данные
2. Удалить данные
3. Прочитает опять эти же самые данные
4. Удалить эти же самые данные
5. Запишет считанные ранее данные (см. скрин)

1. Почему действия 1-4 повторяются?
2. Почему сначала идет SELECT, а потом DELETE, почему недостаточно только DELETE(операция DELETEпо условию также читает искомые данные прежде, чем удалить)?

Буду признателен за разъяснения.
Прикрепленные файлы:
Найденные решения
4. spacecraft 26.01.23 06:55 Сейчас в теме
(3) в приведенной цитате все это подробно расписано.
"Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи)."
Менеджер записи позволяет изменять запись и по ключевым полям. Вот его основное предназначение.
Он не отслеживает, что запись не изменилась. У него общий алгоритм:
Т.е. один набор считывает и удаляет существующую запись.
Второй набор считывает и записывает новые данные.

То, что вызывает недоумение, это просто из-за того, что смотрите действие на не измененной записи по ключевым полям.
Попробуйте изменить ключевые поля в записи и все сразу станет наглядно.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 25.01.23 18:26 Сейчас в теме
(1) МенеджерЗаписи это вспомогательный тип. Под капотом используются наборы записей.
https://its.1c.ru/db/metod8dev/content/2701/hdoc
Для регистра сведений не подчиненного регистратору кроме набора записей существует так же тип РегистрСведенийМенеджерЗаписи. Этот тип предназначен для чтения и записи одной записи регистра. Прежде всего, он используется для организации редактирования одной записи в форме. Он позволяет прочитать запись с определенными значениями ключевых полей, изменить поля, в том числе и ключевые, и записать.

Этот тип является вспомогательным. Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи). Соответственно реализация обработчиков в модуле набора записей позволят полностью контролировать изменения данных регистра, в том числе и тогда, когда они выполняются с помощью менеджера записи.
3. fggf 26.01.23 06:02 Сейчас в теме
(2)
Для регистра сведений не подчиненного регистратору кроме набора записей существует так же тип РегистрСведенийМенеджерЗаписи. Этот тип предназначен для чтения и записи одной записи регистра. Прежде всего, он используется для организации редактирования одной записи в форме. Он позволяет прочитать запись с определенными значениями ключевых полей, изменить поля, в том числе и ключевые, и записать.

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


Спасибо за ответ, но я так и не увидел, чтобы мои вопросы были раскрыты в нем.
Вопрос заключался в том, чтобы понять, почему при выполнении метода записать у менеджера записи происходит выполнение одних и тех же действий (описанны в пунктах 1- 4) несколько раз?
4. spacecraft 26.01.23 06:55 Сейчас в теме
(3) в приведенной цитате все это подробно расписано.
"Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи)."
Менеджер записи позволяет изменять запись и по ключевым полям. Вот его основное предназначение.
Он не отслеживает, что запись не изменилась. У него общий алгоритм:
Т.е. один набор считывает и удаляет существующую запись.
Второй набор считывает и записывает новые данные.

То, что вызывает недоумение, это просто из-за того, что смотрите действие на не измененной записи по ключевым полям.
Попробуйте изменить ключевые поля в записи и все сразу станет наглядно.
5. fggf 26.01.23 08:18 Сейчас в теме
(4)Спасибо, разобрался с этой частью вопроса.
Интересно, а почему используется такая последовательность действий: SELECT, затем DELETE?
Почему нельзя использовать только DELETE, ведь эта инструкция также удаляет только те данные, которые есть в базе, а следовательно прежде их читает.
6. spacecraft 26.01.23 08:41 Сейчас в теме
(5) Чтобы удалить что-то из регистра необходимо записать пустой набор. Если не делать предварительное чтение набора по отбору, то все записи в регистре удалятся.
7. fggf 26.01.23 08:45 Сейчас в теме
(6)Инструкция DELETE удаляет по отбору, т.е. если запись не найдена, значит не будет удалена. Зачем предварительно делать SELECT?
8. spacecraft 26.01.23 08:53 Сейчас в теме
(7) еще раз. DELETE не доступна из 1С напрямую. Чтобы удалить записи в регистре применяется набор записей. Он работает по отбору. В том числе и удаляет. Для удаления применяется запись пустого набора. Если не делать чтение по отбору, то произойдет удаление ВСЕХ записей регистра. Если сделать предварительно чтение набора по отбору, то запись пустого набора удалит только прочитанные записи.
10. fggf 26.01.23 09:16 Сейчас в теме
(8)Я в своем вопросу говорю уже про уровень SQL, почему там в момент записи делается сначала SELECT, а затем DELETE?
Инструкция DELETE на SQL удалит, предварительно считанные данные, то есть она сама читает и удаляет то, что нашла.
11. fggf 26.01.23 09:28 Сейчас в теме
(8)Все, кажется разобрался. Это универсальная инструкция для записи после чтения и без чтения.
1. После чтения. Набор предварительно считывает данные из базы, удаляет их и записывает ранее считанные + измененные.
2. Без чтения. Набор считывает данные, удаляет их, записывает новые.

Спасибо за разъяснения. SELECT на уровне SQL остается в обоих случаях, так как система не анализирует в каком случае было предварительное чтение, а в каком случае не было. Так бы, наверное, можно было в случае без чтения не использовать SELECT, а использовать delete сразу.
9. spacecraft 26.01.23 09:07 Сейчас в теме
(7) ну и попробуйте найти Отбор у менеджера записи.
Чтобы изменить запись с его помощью нужно эту запись прочитать.
Вот в этот момент отбор первого набора заполняется прочитанной записью, а отбор второго набора становится записываемой новой записью.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот