Обратил внимание в SQL Profiler, что если записывать данные менеджером, после чтения, то происходит дублированное выполнение нескольких одних и тех же запросов, тем самым увеличивая время записи.
Например, если будет такая конструкция:
В этом случае в момент выполнения метода Записать SQL Profiler покажет следующее:
1. Прочитает данные
2. Удалить данные
3. Прочитает опять эти же самые данные
4. Удалить эти же самые данные
5. Запишет считанные ранее данные (см. скрин)
1. Почему действия 1-4 повторяются?
2. Почему сначала идет SELECT, а потом DELETE, почему недостаточно только DELETE(операция DELETEпо условию также читает искомые данные прежде, чем удалить)?
(3) в приведенной цитате все это подробно расписано.
"Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи)." Менеджер записи позволяет изменять запись и по ключевым полям. Вот его основное предназначение.
Он не отслеживает, что запись не изменилась. У него общий алгоритм:
Т.е. один набор считывает и удаляет существующую запись.
Второй набор считывает и записывает новые данные.
То, что вызывает недоумение, это просто из-за того, что смотрите действие на не измененной записи по ключевым полям.
Попробуйте изменить ключевые поля в записи и все сразу станет наглядно.
Для регистра сведений не подчиненного регистратору кроме набора записей существует так же тип РегистрСведенийМенеджерЗаписи. Этот тип предназначен для чтения и записи одной записи регистра. Прежде всего, он используется для организации редактирования одной записи в форме. Он позволяет прочитать запись с определенными значениями ключевых полей, изменить поля, в том числе и ключевые, и записать.
Этот тип является вспомогательным. Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи). Соответственно реализация обработчиков в модуле набора записей позволят полностью контролировать изменения данных регистра, в том числе и тогда, когда они выполняются с помощью менеджера записи.
Для регистра сведений не подчиненного регистратору кроме набора записей существует так же тип РегистрСведенийМенеджерЗаписи. Этот тип предназначен для чтения и записи одной записи регистра. Прежде всего, он используется для организации редактирования одной записи в форме. Он позволяет прочитать запись с определенными значениями ключевых полей, изменить поля, в том числе и ключевые, и записать.
Этот тип является вспомогательным. Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи). Соответственно реализация обработчиков в модуле набора записей позволят полностью контролировать изменения данных регистра, в том числе и тогда, когда они выполняются с помощью менеджера записи
Спасибо за ответ, но я так и не увидел, чтобы мои вопросы были раскрыты в нем.
Вопрос заключался в том, чтобы понять, почему при выполнении метода записать у менеджера записи происходит выполнение одних и тех же действий (описанны в пунктах 1- 4) несколько раз?
(3) в приведенной цитате все это подробно расписано.
"Для работы с регистром он использует два набора записей (с отборами соответствующими соответственно ключевым полям считанной и записываемой записи)." Менеджер записи позволяет изменять запись и по ключевым полям. Вот его основное предназначение.
Он не отслеживает, что запись не изменилась. У него общий алгоритм:
Т.е. один набор считывает и удаляет существующую запись.
Второй набор считывает и записывает новые данные.
То, что вызывает недоумение, это просто из-за того, что смотрите действие на не измененной записи по ключевым полям.
Попробуйте изменить ключевые поля в записи и все сразу станет наглядно.
(4)Спасибо, разобрался с этой частью вопроса.
Интересно, а почему используется такая последовательность действий: SELECT, затем DELETE?
Почему нельзя использовать только DELETE, ведь эта инструкция также удаляет только те данные, которые есть в базе, а следовательно прежде их читает.
(5) Чтобы удалить что-то из регистра необходимо записать пустой набор. Если не делать предварительное чтение набора по отбору, то все записи в регистре удалятся.
(7) еще раз. DELETE не доступна из 1С напрямую. Чтобы удалить записи в регистре применяется набор записей. Он работает по отбору. В том числе и удаляет. Для удаления применяется запись пустого набора. Если не делать чтение по отбору, то произойдет удаление ВСЕХ записей регистра. Если сделать предварительно чтение набора по отбору, то запись пустого набора удалит только прочитанные записи.
(8)Я в своем вопросу говорю уже про уровень SQL, почему там в момент записи делается сначала SELECT, а затем DELETE?
Инструкция DELETE на SQL удалит, предварительно считанные данные, то есть она сама читает и удаляет то, что нашла.
(8)Все, кажется разобрался. Это универсальная инструкция для записи после чтения и без чтения.
1. После чтения. Набор предварительно считывает данные из базы, удаляет их и записывает ранее считанные + измененные.
2. Без чтения. Набор считывает данные, удаляет их, записывает новые.
Спасибо за разъяснения. SELECT на уровне SQL остается в обоих случаях, так как система не анализирует в каком случае было предварительное чтение, а в каком случае не было. Так бы, наверное, можно было в случае без чтения не использовать SELECT, а использовать delete сразу.
(7) ну и попробуйте найти Отбор у менеджера записи.
Чтобы изменить запись с его помощью нужно эту запись прочитать.
Вот в этот момент отбор первого набора заполняется прочитанной записью, а отбор второго набора становится записываемой новой записью.