Курс по Оптимизации 1С — Занятие №9

В рамках этого занятия необходимо изучить следующие материалы.

Модуль 3. Причины медленной работы

    Глава 8. Анализ причин медленной работы и оптимизация системы

    • Основные сведения о транзакциях
    • Объектные блокировки
    • Уровни изоляции и проблемы параллельной работы
    • Автоматические и управляемые блокировки
    • Особенности использования режимов блокировки

Практические задания

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (356):

  1. Евгений

    Здравствуйте.
    Столкнулся проблемой обращение к реквизиту ссылки (ссылка.код) выполняется в неявной транзакции.
    Платформа 8.2.19.130 (пробовал и на 8.3.6.2152, результат аналогичный), сервер х64, конфигурация с нуля, управляемый режим, обычное приложение, совместимостей нет.

    Создал два справочника (Справочник1, Справочник 2).
    Справочник1 оставил по умолчанию без реквизитов.
    В справочник2 добавил ТЧ с двумя примитивными реквизитами (число, строка).
    Для каждого справочника создал по одному элементу.
    Создал обработку с двумя реквизитами ссылающиеся каждый на свой справочник.

    Эксперимент 1. Выбрал спрвочник1 в элемент формы, вызвал строку кода «сообщить(Реквизит1.Код);». В профайлере все в не транзакции и все запросы с предикатом WITH(NOLOCK).
    Эксперимент 2. Выбрал спрвочник1 в элемент формы, вызвал строку кода «сообщить(Справочники.Спрвочник1.НайтиПоКоду(“000000001”).Код);». В профайлере все в не транзакции и все запросы с предикатом WITH(NOLOCK).
    Эксперимент 3!! Выбрал спрвочник2 в элемент формы, открытие формы списка справочника2 штатно (без транзакции). Вызвал строку кода «сообщить(Реквизит2.Код);».
    Получил:
    BEGIN TRANSACTION
    go
    exec sp_executesql N’SELECT
    T1._IDRRef,
    T1._Version,
    T1._Marked,
    T1._IsMetadata,
    T1._Code,
    T1._Description,
    0 AS SDBL_IDENTITY
    FROM _Reference8 T1
    WHERE T1._IDRRef = @P1′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB06BC86ED0
    go
    exec sp_executesql N’SELECT
    T2._LineNo10,
    T2._Fld11,
    T2._Fld12,
    0 AS SDBL_IDENTITY
    FROM _Reference8_VT9 T2
    INNER JOIN _Reference8 T3
    ON T3._IDRRef = T2._Reference8_IDRRef
    WHERE T3._IDRRef = @P1
    ORDER BY 4 ASC, T2._LineNo10′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB06BC86ED0
    go
    exec sp_executesql N’SELECT
    T4._Version
    FROM _Reference8 T4
    WHERE T4._IDRRef = @P1′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB06BC86ED0
    go
    COMMIT TRANSACTION
    go

    Эксперимент 4. Выбрал спрвочник2 в элемент формы, вызвал строку кода «сообщить(Справочники.Спрвочник2.НайтиПоКоду(“000000001”).Код);». В профайлере все аналогично эксперименту 2.

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

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Евгений

        Андрей, а как же эксперимент1?
        Пробовал и так «Сообщить(Реквизит1.Код);», и так «Сообщить(Реквизит1.ПолучитьОбъект().Код);».
        Результат один, транзакция не открывается.

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Евгений

            Андрей, так стандартный реквизит «Код» у справочника же есть.
            Провел дополнительный эксперимент добавил в справочник1 реквизит1(Тип Строка).
            Заполнил этот реквизит у элемента справочника.
            И выполнил код: Сообщить(Реквизит1.Реквизит1); //те аналогично коду Сообщить(Справочники.Справочник1.НайтиПоКоду(..).Реквизит1);
            Результат:
            exec sp_executesql N’SELECT
            T1._IDRRef,
            T1._Version,
            T1._Marked,
            T1._PredefinedID,
            T1._Code,
            T1._Description,
            T1._Fld24
            FROM dbo._Reference7 T1
            WHERE T1._IDRRef = @P1′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB060D43ADA
            Транзакция не открылась.

            Получается что транзакция открывается если идет обращение к реквизиту ссылки в объектной технике у которой(ссылки) есть хотя бы одна табличная часть..
            http://downloads.v8.1c.ru/content//Platform/8_3_7_1633/1cv8upd.htm#4e71dd3a-dc62-11e4-a3f7-0050569f678a

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

              • Евгений

                Андрей, не хочется вступать в полемику, но согласно ссылки и проведенных опытов, неявная транзакция открывается только в том случаи если у ссылки есть табличная часть. Это относится к платформам 8.2 и 8.3 до версии 8.3.7.1633

                Получить открытие неявной транзакции при обращении к реквизиту ссылки у которой нет табличной части — мне не удалось опытным путем.

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

              • SvetlanaV

                Андрей, поясните пожалуйста еще раз — почему код Сообщить(Реквизит1.Реквизит1) не вызвал блокировку? Разве Реквизит1.Реквизит1 это не обращение к реквизиту объекта?

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

              • Евгений

                Разумеется внимательно, и пытаюсь его осмыслить и перепроверить.
                Ввело в заблуждение «ИЛИ» (Неявная транзакция открывается в том случае, если вы обращаетесь к реквизиту объекта или получаете сам объект у которого есть табличная часть.)
                Я понял ваш ответ как либо обращение к реквизиту либо получение объекта.

                PS Разбирая практическое задание 39 и отвечая на вопрос (Что изменится, если выполнять данный код вне транзакции?) тоже важно понимать если у справочника товаров ТЧ :-)

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

  2. Gosha009

    Здравствуйте! Есть дефицит понимания о том как работает RCSi для необъектных сущностей.
    С объектами вроде бы все очевидно, есть реквизит «версия объекта». А как происходит версионирование необъектных сущностей. Каким то образом транзакция №2 знает что на данные некоторого пространства уже наложена блокировка и что из себя представляет версия в этом случае. Я так предполагаю что в tempdb в таблице блокировок добавляется запись с заблокированными данными и полем типа «Момент времени», и вторая транзакция строит свой запрос до «момента времени». Извиняюсь на некоторую сумбурность, но верно ли я рассуждаю?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  3. vanleo

    Еще вопрос, по уроку 83 «БлокироватьДляИзменения».

    Суть проблемы и ее решение в среде 1С 8.2 понятна.

    1. А воспроизводится ли взаимоблокировка в среде 1С 8.3? После записи 2мя транзакциями параллельно в таблицу итогов в режиме разделения итогов они, эти транзакции, обе могут считать остатки, так как S-блокировка не требуется. Получается, что взаимоблокировки не будет?

    2. Тогда возникает проблема грязного чтения, так как изменения в регистре не зафиксированы транзакциями, и чтение остатков после записи (до окончания транзакции) для контроля даст некорректный результат, так как не будут учтены новые записи. Правильно? Какой тогда может быть контроль остатков?

    3. Как совмещается «новая методика контроля остатков» с «1С 8.3 + упр режим блокировок»? То есть сначала записываем движения, потом читаем актуальные остатки на предмет наличия отриц остатков. Но изменения в регистре не зафиксированы транзакцией, по сути это «грязные» данные, и при чтении остатков регистра мы должны получить остатки на момент до Х-блокировки, то есть до записи.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  4. vanleo

    Здравствуйте.
    У меня небольшое непонимание различий между упр режимом 1С 8.2 и упр. режимом 1С 8.3
    Правильно ли утверждать, что:

    1. в случае упр режима 8.2 в транзакции:
    — чтение данных запросом не приводит к установке неявной упр блокировки, но приводит к установке S-блокировки СУБД на период чтения (т.к уровень изоляции для 8.2 упр режима — READ COMMITTED)
    — чтение объектных данных объектной моделью — аналогично пункту выше
    — чтение необъектных данных объектной моделью приводит к установке неявной упр блокировки до конца транзакции и установке блокировки СУБД

    2. в случае упр режима 8.3 в транзакции:
    — любое чтение данных НЕ приводит к установке неявной блокировки на уровне СУБД, так как используется уровень изоляции READ COMMITTED SNAPSHOT, то есть работает версионирование.
    — неявная упр. блокировка устанавливается только при чтении необъектных данных объектной моделью (по аналогии с 8.2)

    Почему я все это пишу. Во всех слайдах указывается, что используется уровень изоляции READ COMMITTED в упр. режиме, хотя в 8.3 используется READ COMMITTED SNAPSHOT со своими небольшими особенностями.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  5. Dmitry K

    Как узнать какая схема контроля остатков используется в типовом решении? В частности в КА1.1.61.1

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  6. allegrosoft

    Здравствуйте. В автоматическом режиме при записи не объектных сущностей открывается X блокировка, c типом изоляции Searizable (Range-x) на диапазон. В управляемом режиме используется изоляция Read Commited, не совсем понятно как отрабатывает данная изоляция с необъектными сущностями с блокировкой диапазона? Интересует только блокировка на стороне СУБД.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  7. Dmitry K

    Вопрос по слайду «Реализация блокировок в СУБД» (стр.177):
    Правильно понимаю, что если достаточно много пользователей и достаточно часто будут накладывать S блокировку на ресурс то пользователь, желающий наложить X блокировку просто не дождется?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Dmitry K

        Какие блокировки накладывает (если вообще накладывает) запрос вызываемый из формы списка (документов или справочников)? Например если он вызывается в обработчике «ПриПолученииДанных» для вывода информации в дополнительные колонки списка.

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  8. Виктор Яковлев

    Здравствуйте. Заметил противоречие в двух слайдах.
    Урок 68 — Сводная таблица режимов. Автоматическая транзакция принимает уровни изоляции только Repeatable Read и Serializable.
    Урок 63 — Режимы блокировок СУБД. Автоматическая транзакция версионника принимает уровень изоляции Read Committed.
    Где же всё-таки верная информация.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  9. pp.semin

    платформа v8.3, режим READ COMMITED SNAPSHOT (СУБД работает как версионник)
    записываем набор данных и читаем одни и те-же данные

    1. При записи набора данные возникнет управляемая блокировка исключительная
    2. При чтении управляемой блокировки не будет

    какие блокировки СУБД возникают при чтении и записи?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  10. Виктор Яковлев

    Здравствуйте.
    Непонятны некоторые моменты уровня изоляции READ COMMITTED SNAPSHOT.

    Насколько я знаю есть блокировки СУБД (S U X и прочие), которые ставит СУБД, а так же есть блокировки, которые ставит сама платформа (только S X). Правильно ли я понимаю: так как используется версионирование, то блокировки СУБД не используются, но чтобы не возникало конфликтов на запись + запись платформой будут установлены X и X блокировки, и т.к. они не совместимы, то первая транзакция будет изменять данные, а вторая ждать.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • pp.semin

        Вот как бы очень интересно соответствия блокировок СУБД и блокировок 1С (управляемый режим)

        платформа 8.3, режим READ COMMITED SNAPSHOT
        исключительная соответствует X блокировке на СУБД
        разделяемая соответствует S блокировке на СУБД

        Правильно или есть нюансы?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Виктор Яковлев

            Но ведь разделяемая управляемая блокировка снимается после чтения запроса, т.е. не до конца транзакции. Уровень изоляции read committed.

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

              • Виктор Яковлев

                В книге Настольная книга 1С:Эксперта по тех. вопросам (стр. 50) написано:
                При этом следует иметь в виду, что управляемые блокировки платформа ставит ещё и сама: разделяемые — на время выполнения чтения, когда оно выполняется в объектной технике, исключительные до конца транзакции.
                Решил проверить сам, провёл кучу экспериментов. В итоге оказывается что в официальной книге такая грубая ошибка.
                Для себя составил таблицу зависимости. Посмотрите, пожалуйста, её во вложении — правильно ли я теперь понимаю когда и как ставятся блокировки.
                Так же попутно появился большой вопрос, он так же во вложении.

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

  11. serk@rarus.ru

    Здравствуйте,

    У меня вопрос про уровень изоляции READ COMMITTED SNAPSHOT.

    На складе есть одно количество определенного товара.
    1-ая Транзакция читает остаток на складе и устанавливает Х-блокировку на изменение данных
    Затам 2-ая блокировка тоже читает остаток на складе и из-за версионности видит одно количество товара (1-ая транзакция еще не завершилась)
    После 1-ая транзакция завершилась, списав товар со склада, сняв Х-блокировку.
    Что будет со 2-ой транзакцией? отказ транзакции или списание товара в минус?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  12. Andrefan

    Добрый день.
    Андрей, есть ли у Вас информация (или мнение) насчет: почему в 1С не поддерживается уровень изоляции SNAPSHOT? Кажется, он выгодно отличается от READ COMMITTED SNAPSHOT тем, что решает проблему неповторяющегося чтения?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  13. Lima

    При разработке механизма многопоточной работы с регистром бухгалтерии наткнулись на следующую проблему:
    Очистка движений регистра бухгалтерии за определенный период происходит в несколько потоков. Документы-регистраторы произвольно делятся на группы, после чего запускается несколько фоновых заданий. Каждое фоновое задание последовательно обрабатывает свой кусок данных — создает и без чтения записывает набор записей по регистратору. При этом возникает взаимоблокировка с последующим таймаутом ожидания блокировки. Разделение итогов на регистре включено.
    Сервис deadlock показал блокировки в таблицах «ИтогиПоСчетамССубконто1» и «ИтогиПоСчетамССубконто3».
    Ситуацию удалось воспроизвести на каркасной конфигурации, установив время ожидания блокировок 2 с.

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

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  14. yamarsel

    Вопрос по отличию версионных СУБД от блокировочников.

    Насколько я понял, ключевое отличие состоит в том, что в версионных СУБД нет ожиданий на блокировках при чтении, т.к. конкурирующие транзакции не ждут, пока завершится транзакция, захватившая ресурс на изменение, а читают версию данных, которая имеется на момент начала этой транзакции, верно?

    Есть ли ещё какие-то принципиальные различия?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • yamarsel

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

        Я правильно понимаю, что главная проблема в том, что конкурирующие транзакции не смогут параллельно писать в эту же таблицу, пока не завершится первая транзакция, заблокировавшая всю таблицу целиком ради одной записи? При этом чтение в параллельных транзакциях будет проходить без ожиданий.

        И не совсем понятно, а почему в автоматическом режиме версионники блокируют всю таблицу целиком? Есть какая-то особая причина?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • yamarsel

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

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

          • yamarsel

            Андрей, тогда не понятен следующий момент: В автоматическом режиме в версионниках: 1. При чтении данных — не блокируется ничего, т.е. теоретически возможно ситуация, что мы прочитали в транзакции остатки, ничего при этом не заблокировав, а в этот момент другая транзакция быстренько заблокировала всю таблицу и списала остатки. Соответственно, наша транзакция уже будет списывать с регистра то, чего там нет. Как тут решена проблема отрицательных остатков? Источник: ©Курсы-по-1С.рф

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

              • yamarsel

                Андрей, немного запутался…
                Как сопоставить вот эти две фразы:
                1. Версионники не блокируют данные при чтении вообще, блокируют только при записи.
                2. Если же используется автоматический режим блокировок, тогда в версионниках включается уровень Serializable и он у версионников реализован так, что даже параллельное чтение будет не возможно.

                Почему невозможно параллельное чтение, раз чтение вообще не блокирует записи?

                • yamarsel

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

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

                  Как только я сказал, что в версионнике даже читать параллельно нельзя одну таблицу, то мне сразу поставили минус за этот вопрос, т.к. якобы чтение и чтение всегда совместимы. (Препод вроде был Морозов Павел)

                  Действительно ли нельзя читать одну таблицу в двух параллельных транзакциях?
                  Сейчас пойду разворачивать Postgre и экспериментировать.

                  Да, и там было два запроса к одной таблице, одна причем с опцией для изменения.
                  Завтра пойду ему доказывать если что, что я был всё-таки прав, а то из-за этого не смог третий плюс получить.

                  • Андрей Бурмистров

                    …
                    (текст комментария доступен только участникам Мастер-группы)

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

                • yamarsel

                  То есть даже если мы читаем параллельно две совершенно разные записи, в автоматическом режиме в Postgree мы не сможем этого сделать?

                  Никак не могу поставить Postgree, постоянно какие-то ошибки вылетают.

                  • Андрей Бурмистров

                    …
                    (текст комментария доступен только участникам Мастер-группы)

                • yamarsel

                  Сделал в Postgree следующий пример:

                  НачатьТранзакцию();

                  Запрос = Новый Запрос;
                  Запрос.Текст =
                  «ВЫБРАТЬ
                  | РегистрСведений1.Измерение1,
                  | РегистрСведений1.Измерение2
                  |ИЗ
                  | РегистрСведений.РегистрСведений1 КАК РегистрСведений1»;

                  РезультатЗапроса = Запрос.Выполнить();

                  ЗафиксироватьТранзакцию();

                  Режим управления блокировками — автоматический, Postgree 9.4.2, платформа 8.3.5.
                  В одной сессии — поставил точку останова перед фиксацией транзакции, в другой — выполнил тот же код.

                  Вторая сессия без проблем выполнила данный код, несмотря на блокировки первой транзакции..

                  Андрей, проверьте, пожалуйста. Может быть мне попробовать использовать другие версии, чтобы воспроизвести ожидание при чтении одной записи?

                  • Андрей Бурмистров

                    …
                    (текст комментария доступен только участникам Мастер-группы)

                • yamarsel

                  Потом напишите, пожалуйста, ваши результаты

                  • Андрей Бурмистров

                    …
                    (текст комментария доступен только участникам Мастер-группы)

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

                  %D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9.png

  15. yamarsel

    Задание 17
    «Что изменится если поставить документу режим управляемый?
    Блокировка также будет снята только после выполнения транзакции, только теперь это будет
    управляемая блокировка платформы».

    Я так понимаю, в управляемом режиме в данной ситуации при записи данных в регистр будет наложена как управляемая исключительная блокировка, так и блокировка X-типа на уровне СУБД?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  16. Вера Кокотова

    Добрый день!
    Если в транзакции очистить набор записей, содержащий 20000 записей, а затем добавлять в этот набор новые записи, возникнет ли эскалация (для 8.2)?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  17. Вячеслав

    Добрый день!
    В консоли сервера 1С у каждой базы есть раздел Блокировки. Бывают ситуации когда активных сеансов в базе нет, но в разделе Блокировки есть «зависшие» соединения, которые не позволяют обновить базу данных. Как их можно сбросить? Кроме перезапуска агента сервера 1С, другого решения не нашел.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  18. hjkl

    Добрый день.

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

    Конфигурация какая то старая версия УПП для Казахстана, мб она сделана еще до того как в платформе временные таблицы, вероятно по этой причине
    довольно много вложенных запросов.

    Контроль остатков осуществляется процедурами КонтрольОстатков(…) в модулях наборов записей регистров накопления.
    Довольно много(почти все) таких процедур, где вложенный запрос соединеняется с виртуальной таблицей остатков регистра накопления по которому производится контроль
    остатков, а также с другими виртуальными таблицами остатков регистров накопления. При в этом конструкции языка запросов «Для Изменения» указывается только одна
    таблица — регистр накопления по которому производится контроль остатков.

    Раньше(до прохождения вашего курса) я думал, что нужно наложить управляемую блокировку на ту таблицу которая указана конструкции языка запросов «Для Изменения» и
    блокировать только те данные — которые указаны в параметрах виртуальной таблицы.

    Если я правильно понял видео курса то в этом случае нужно наложить управляемые блокировки и на другие виртуальные таблицы остатков, это так?

    Прикрепил два текстовых файла — Запрос_Отдельно_.txt, и второй Запрос_В_Контексте_Процедуры_.txt, для того чтобы было наглядно видно то о чем я написал выше.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  19. lepth

    Добрый день.

    1. Можно ли сказать, что с версионными СУБД 1с работает так же как в MS SQL с уровнем изоляции read commited snapshot ?
    2. Можете уточнить в какой момент делается снимок данных при использовании read commited snapshot, перед установкой блокировки или перед началом транзакции?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  20. Дмитрий

    Добрый день.
    Вопрос по видео №59 «Внутреннее устройство управляемых блокировок».

    Почему блокировка №4 будет поглощена блокировкой №3, а блокировка №7 будет поставлена в очередь, хотя она также полностью совпадает с блокировкой №3?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  21. Константин Тулакин

    В ходе экспериментов обнаружил непонятное для себя поведение платформы. Помогите разобраться.
    Автоматический режим. Во время проведения одного документа продажи (с точкой останова после записи движений) не получается открыть соседний непроведенный документ продажи. Причем какой-то получается, а какой-то нет. Наверное это связано с тем, что во время открытия формы документа идет считывание наборов записей, но на некоторые лишние строки установлена X блокировка проводимым документом, верно?
    И вторая ситуация: документ не проводим, а перепроводим, не изменяя. Соседние документы уже открываются, но некоторые не записываются, т.е. непровденный документ не можем просто записать. Тут мне совсем не понятно, почему происходит ожидание на блокировках?

    Можете прокомментировать, какие блокировки приводят к ожиданию в том и в другом случае? В управляемом режиме такого не наблюдается.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Константин Тулакин

        Посмотрел в профайлере, какой запрос блокируется при записи непроведенного документа. Оказался такой запрос:
        exec sp_executesql N’SELECT
        CAST(COUNT(T1._RecorderTRef) AS NUMERIC(10))
        FROM dbo._AccumRg18 T1 WITH(SERIALIZABLE, UPDLOCK)
        WHERE T1._RecorderTRef = 0x0000000C AND T1._RecorderRRef = @P1′,N’@P1 varbinary(16)’,0x9228001E6711E5F811E5221F023CD1C5

        Этот запрос считает количество записей в регистре остатков. И соответственно ждет, т.к. соседний документ захватил лишние записи. Тогда возникают два вопроса:
        1. Зачем платформа генерирует такой запрос просто при записи документа?
        2. Что означает указание UPDLOCK?

        В случае ожидания при открытии формы, ожидание происходит на запросе
        exec sp_executesql N’SELECT
        T1._Period,
        T1._RecorderTRef,
        T1._RecorderRRef,
        T1._LineNo,
        T1._Active,
        T1._RecordKind,
        T1._Fld19RRef,
        T1._Fld404RRef,
        T1._Fld20RRef,
        T1._Fld21
        FROM dbo._AccumRg18 T1 WITH(SERIALIZABLE)
        WHERE T1._RecorderTRef = 0x0000000C AND T1._RecorderRRef = @P1
        ORDER BY T1._LineNo’,N’@P1 varbinary(16)’,0x9228001E6711E5F811E5221F023CD1C5

        Здесь вроде все понятно — форма считывает движения по регистру остатков.

        На всякий случай, выгрузка базы: https://yadi.sk/d/6fZ1fKxnhiEHm

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Константин Тулакин

            Спасибо. Но осталось непонятным, зачем платформа при записи непроведенного документа делает запрос к регистрам и накладывает U-блокировку? Опытным путем выяснил, что это делает форма документа, т.к. при программной записи документа такого запроса нет. Но остается вопрос, зачем это делает форма?

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

  22. Константин Тулакин

    Добрый день!
    Видео 56. На мой взгляд в нем ошибка: Вы говорите, что если в наборе записей измерение не заполнено, то блокировка установится на все значения этого измерения. Провел эксперимент на учебной конфигурации курса. Провожу док. Поступление с пустым складом и номенклатурой Стул — с точкой останова в конце обработки проведения. В другой сессии провожу реализации стула. Если склад заполнен, то блокировки не возникает, если реализация с пустого склада, то возникает блокировка. Таким образом при пустом измерении блокируется именно пустое значение этого измерения, а не все возможные значения. Версия платформы 8.3.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  23. KulakoffAlex

    Добрый день!
    Вопрос по уроку 57 установка неявных упр. блокировок.
    Пример когда проводится документ по регистру накопления.
    Блокировка устанавливается по контрагенту, хочется понять почему «Период» не влияет на блокировку, ведь документы проводятся разной датой.
    Значения «Периода» в регистре будет различным. почему в блокировке не участвует значение «Периода», хотя перед этим было показано, что значение «Периода» входят в состав кластерного индекса «Таблицы итогов».

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  24. Владимир

    Добрый день!
    Подскажите, пожалуйста, колонка Rows в плане запроса — это количество строк, обработанных сервером БД или это число строк подходящих под условие поиска?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Владимир

        Если будет Table Scan, в результате которого под условие попадет только 10 строк, то в колонке rows будет отображено 10 или столько, сколько строк просканировал сервер для нахождения этих 10?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  25. Владимир

    Добрый день. Очередная порция вопросов. Тут вопросы из разных занятий, но очень неудобно будет, если я их буду отдельно писать, поэтому пишу в одном месте:

    1. Как запустить счетчики производительности при старте системы?

    2. Если мы используем 8.3 и у нас есть несколько центральных кластеров, что указывать в «кластер серверов» при подключении информационной базы? Я, вероятно, этот момент упустил.

    3. Проясните, пожалуйста, кое какие моменты по использованию итогов в регистрах. В управлении итогами есть кнопка «Установить период итогов…» и соответствующая колонка «Период итогов». В этой колонке какое-то значение появляется по нажатию указанной кнопки. Так вот, на что влияет этот «Период итогов»? Я думал, что она показывает период, на который итоги находятся в «хорошем» состоянии. Но после того, как жму «пересчитать итоги» в этой колонке ничего не появляется, хотя я предполагал, что там при этом должна установиться актуальная дата (конец текущего или предыдущего месяца)

    4. Выполняется запрос в сеансе1 со сканированием таблицы. В этот момент сеанс2 хочет выполнить тот же запрос. Сеансу2 придется подождать, пока запрос из 1-го сеанса закончит операцию сканирования над таблицей? Это поведение зависит от того выполняется запрос в транзакции или вне транзакции?

    5. Выполняется запрос в сеансе1 с поиском по индексу по условию Товар = Стол. Если в этот момент сеанс 2 будет выполнять тот же запрос, но с условием Товар = Стул, то они смогут делать это параллельно?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Владимир

        1, 2, 3 — ясно, спасибо!

        4, 5 — а если 1 запрос со сканирование таблицы на выборку, а 2 запрос хочет в эту таблицу вставить какие-то записи, то пока 1 полностью не закончит свое выполнение, 2 будет ждать?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Владимир

            Просто в нескольких видео вы делаете акцент на том, что во время выполнения запроса (а в курсе рассматриваются запросы на выборку) блокируются все строки, которые обрабатываются запросом (а не строки, которые попадают в результат выполнения запроса) на время выполнения запроса.

            Исходя из того, что вы выше ответили, я ещё более запутался, поэтому разделю вопрос на подвопросы. Будем считать, что у нас есть запрос на выборку и он выполняется со сканированием таблицы. Под блокировкой мы понимаем, что накладывается S блокировка.

            а) Если режим изоляции Serialazible, то в результате выполнения запроса будет заблокирована вся таблица до конца транзакции?

            б) Если режим изоляции Repeatable read, то в результате выполнения запроса будет заблокирована вся таблица до конца транзакции, но с возможностью вставки в неё новых строк?

            в) Режим изоляции Read committed. Если происходит сканирование таблицы (как в данном случае), то разве возможна ситуация, что пока сканирование, условно говоря, дойдет до 100’000-й строки, то она уже может иметь другое значение (измениться другой транзакцией)? А если не блокировать всю таблицу на время выполнения запроса, то такие ситуации могут быть повсеместно.

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

              • Владимир

                > В общем-то все выше описанное только усложняет восприятие и как правило не играет большой роли при решении проблем блокировок и дедлоков

                Мне, например, было очень интересно это выяснить. Если бы не выяснил, то у меня осталось бы ложное суждение о том, что строки блокируются всегда, независимо от режима изоляции. Но теперь у меня этот вопрос определенно прояснился.

                Очередное спасибо за ответы!

                • Андрей Бурмистров

                  …
                  (текст комментария доступен только участникам Мастер-группы)

          • Константин Тулакин

            Вы пишете: «В read committed (упр. режим) если строка попадает в выборку она блокируется до конца запроса, если не попадает, то отпускается сразу после чтения, не дожидаясь окончания запроса.»

            Тогда становится непонятным пример из видео 71: Там у нас управляемый режим и неоптимальный запрос со сканированием всей таблицы. Тогда при его выполнении в read committed не будут заблокированы все записи таблицы на время выполнения запроса, а будут заблокированы только на незначительное время чтения данных из таблицы. Я верно это понимаю? И тогда пример из видео 71 становится неудачным?

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

  26. pupermario

    Перекрывает ли действие глобальных флагов трассировки действия локальных команд на уровне конкретных таблиц или действует только по умолчанию, если не указано иное, например будет ли включена возможность эскалации для таблицы TableName командой ALTER TABLE TableName SET (LOCK_ESCALATION=TABLE), если для сервера в целом эскалацию отключили соответствующим флагом трассировки?

    Кстати какой параметр необходим для включения возможности эскалации для таблицы, LOCK_ESCALATION=TABLE или LOCK_ESCALATION=AUTO ? В чем разница?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  27. Дмитрий Абраменко

    А еще раз хотелось бы уточнить по Автоматическому режиму, Serializable и Range-блокировке. Фактически используются те же типы блокировок S,U,X, отличие только в количестве блокируемых строк. т.е. если у нас автоматический режим (с чем я имею дело на рабочем месте) и два документа будут проводится одновременно по регистру с одинаковыми данными, то в случае чтения в транзакции данных регистра, до конца транзакции будет наложена блокировка Range-S, такую же блокировку установит и второй документ, т.к. S-блокировки разделяемые, и вот если далее и тому и тому документу нужно будет изменить данные в регистре, то ни одна из двух транзакций не сможет установить Range-x и мы получим deadlock, так?
    И даже если в одной из транзакций в запросе мы укажем «ДЛЯ ИЗМЕНЕНИЯ», т.е. будет наложена Range-U, это ведь все равно не оградит нас от чтения второй транзакцией и в итоге все равно дедлок?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  28. Дмитрий Абраменко

    Добрый вечер Андрей,
    1)есть вопрос по видео 32-33 о Repeatable Read, там говорится, что блокировка S накладывается до конца транзакции, что в принципе понятно, но не совсем понятен пример, скажем с проведением документа, если два документа проводятся одновременно с одной и той же номенклатурой, в обработке проведения обоих читается остаток, соответственно накладывается две S-блокировки, т.к. S-блокировка совместима с другой S-блокировкой, они обе прочтут один и тот же остаток, но потом, когда будет выполнена попытка записи движений, то X-блокировку не сможет установить ни одна из транзакций и получится фактически deadlock, т.к. они обе будут ждать друг друга, правильно? т.е. проведение двух одинаковых документов в этом случае всегда взаимоблокировка?
    2)у вас в одном из видеоуроков показана таблица блокировок, как она схематично выглядит, меня интересует ее работа в плане очереди, если скажем какая-то транзакция установил S-блокировку, а за ней в очередь встала Х-блокировка (она ждет), пока еще не кончилась первая S-транзакция в очередь попадает вторая S-блокировка, она может выполняться вместе с первой и начинает выполняться, первая кончается, но 2ая S-блокировка продолжается, соответсвенно X-блокировка ждет уже завершение 2ой S-блокировки и так может продолжаться бесконечно, пока не отвалится по таймауту. Я это к чему, СУБД никак не «останавливает» S-блокировки (которые пришли позже X-блокировки), если видит, что X-блокировка долго висит?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Дмитрий Абраменко

        да, сейчас как раз дошел до 36 видео, где вы и указываете, что для регистров применяется другой уровень. Побежал впереди паровоза.
        Кстати говоря, спасибо за рекомендацию по литературе. Начал читать SQL Server Execution Plans, хорошо организованная книга.

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  29. AlexanderKulikov

    Проявилась интересная особенность блокировок. Точнее платформы.
    Исходные данные: Конфигурация учебная (из данного курса). Тестирую в 8.3.5.1517. Режим блокировок управляемый. Разделение итогов включено (впрочем с выключенным разделением происходит тоже самое).
    При проведении документа Продажа флаг БлокироватьДляИзменения = Истина.
    Что происходит: Запускаю первую сессию и останавливаю проведение на последнем операторе процедуры. Во второй сессии проведение аналогичного по составу (склад и товар) к моему изумлению таймаута не вызывает и документ спокойненько проводится.

    После нескольких проверок и экспериментов обнаруживаю: Таймаут для второй сессии возникает только в случае если, например, в первой сессии изменить количество в документе. То есть получается несмотря на то что движения очищаются и перезаполняются (пусть теми же данными) — при записи X блокировка на таблицу остатков в таких случаях не накладывается. Я что то неверно понял или неверно сделал? (Ведь если это так — то в таких случаях отпадает смысл анализировать остатки после записи потому что они могут измениться прямо в процессе проведения)

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • AlexanderKulikov

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

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • AlexanderKulikov

            Да, если речь идет о проверке оперативных остатков — то отрицательных остатков не будет.
            А вот если мы проверяем на Момент времени документа, то возникают варианты. Правда, просто блокировки тоже не спасают. Большое спасибо за разъяснение.

  30. magrib

    Еще вопрос по видео 32 — «Неповторяемое чтение.решение»
    Допустим такая ситуация:
    Чтобы избежать проблемы неповторяемого чтения, обе транзакции накладывают s- блокировку до конца транзакций, далее читают остатки из регистра и обе пытаются наложить х- блокировки, чтобы списать товар. Не может ли получиться такого, что s -блокировка 1 транзакции не даст установиться х- блокировке 2й транзакции, а s-блокировка 2й транзакции — не даст установиться х-блокировке 1й, т.е крест-накрест?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  31. magrib

    Добрый день! Начал изучать видеоматериалы по транзакциям и возникло несколько вопросов.
    1) Не очень понял, как реализован уровень изоляции Read Comitted Snapshot.
    В видеоуроке №28 приведена схема решения проблемы грязного чтения(нарисовал по памяти как вы рекомендовали):
    Тр.1 Тр.2
    1) Прочитать остаток(ост=1)
    2) Установить х-блок
    3) Списать 1шт.
    4) Х блок до конца транзакции Прочитать ост. на момент до блок(ост = 1)
    5) Отмена транзакции Установить х-блок
    6) Списать 1шт
    7) Фикс.транзакцию

    У меня вопрос по строке 5. Если первая транзакция будет не отменена, а зафиксирована, то получается, что остаток, что был прочитан во 2й транзакции станет устарелым(неверным) и мы уйдем в минус. Ведь транзакция не может знать, что соседняя транзакция будет отменена. Как решается эта проблема? Не нужно ли 2 транзакции еще раз прочитать остатки после установки х-блокировки? Но тогда будет тоже самое, как и read comitted… В общем запутался…

    2) Уровень Read Comitted Snapshot функционирует на основе версий. Вы сказали, что версии хранятся в таблице TempDB. Также у всех документов и справочников есть служебный реквизит «Версия данных», который меняется при изменении объекта. Есть ли корреляция между информацией в этом реквизите и информацией о версии в TempDB? И если да — зачем хранить информацию в 2-х местах?
    Спасибо.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  32. bot12345

    Работает ли менеджер управляемых блокировок в файловой базе? Если работает, то снимается ли S блокировка после выполнения запроса?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  33. bot12345

    В видео в примере автоматических блокировок при проведении документов по разным складам и товарам и непустой таблице регистра почему второй документ не провелся? Показывался пример range блокировки, которая блокирует граничные записи. Т.е. если бы было больше складов и товаров, то документ бы провелся?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  34. bot12345

    Какие блокировки накладываются при Движения.Очистить а затем Движения.Записать?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • bot12345

        Спасибо, это понятно. А на какие записи будет наложена блокировка в том регистре, по которому мы очищаем движения?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  35. bot12345

    Какой уровень изоляции транзакций будет использован при блокировке записей табличной части документа — repeatable или serializable в случае автоматического режима? Табличная часть относится к объектной сущности или к необъектной с данной точки зрения?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  36. bot12345

    Блокировка.Заблокировать — надо ли в попытке?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  37. Gostmair

    В Автоматическом режиме блокировок, если при проведении документа посмотреть текст запроса в SQL Profiler то там видно, что рядом с таблицей пишется уровень изоляции (Repeatable read, Serializable). А вот если сделать то же самое в управляемом режиме блокировок, то там не указано никакого уровня изоляции. Хотя, казалось бы, должно быть read commited или read commited snapshot. Почему?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Gostmair

        А что происходит в том случае когда чтение обычным запросом в 8.2 (Автоматический режим), должен быть уровень изоляции Read uncommited? Но его тоже не видно.

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  38. Виталий

    Вопрос по практике 20:
    Почему даже если склад один в документе, то его лучше в шапку? В типовых конфах встречается по разному. Какие могут быть проблемы с складом в ТЧ?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Виталий

        В данном случае лишнее дублирование информации как то может повлиять на производительность? Возможны излишние блокировки или что то подобное?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  39. Виталий

    Вопрос по практике 20:
    Почему такая структура не будет оптимальной, если бы она была возможна?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  40. Kamas

    Для ЭлементБлокировкиДанных метода УстановитьЗначение в справке есть такое примечание.
    Примечание:
    Следует иметь в виду, что одну и ту же запись регистра можно заблокировать дважды, первый раз блокируя саму запись, а второй раз блокируя набор, в который эта запись входит.
    Можно разъяснить что к чему?? И такая возможность не противоречит самой сути блокировок??

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Kamas

        То есть я правильно понимаю есть возможность установить блокировку на запись считать данные, быть уверенным что все эти данные не кто не поменяет, но кто то другой заблокировал набор записей, и злостно изменил их хотя блокировка на запись не снималась и в результате у меня не верные данные?? Либо возможность установить Блокировку на запись и на набор возможна только в одной транзакции??

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Kamas

            Еще вопрос стоит ли пользоваться отложенным проведением? Есть ли это в курсах (Честно не нашел пока)? Какие подводные камни мы можем поиметь с этого?

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

    • Виталий

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

  41. poloskovi

    Правильно ли я понимаю, что в управляемой блокировке невозможно поставить блокировку по диапазону значений (цены от 200 до 300 рублей)? И от чтения фантомов в управляемом режиме защиты нет?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  42. wonrims

    Не могу понять, как работает уровень изоляции serialazible.

    В уроке 8.34 выбираются все товары с ценой от 200 до 300, если по полю цена не установлен индекс, то в плане запросов будет clustered index scan, будут выбраны все записи таблицы => все записи будут заблокированы и все значения кластерного индекса. Верно ли это?
    Если по полю цена установлен индекс, то будет index seek, будут заблокированы все записи в диапазоне цен от 200 до 300, а так же заблокированы значения индекса или будут заблокированы только значения индекса, а сами записи нет смысла блокировать?
    Имеет ли при этом значение кластерный индекс или нет?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • wonrims

        Спасибо! Теперь в теории стало понятнее, но действительно, лучше все попробовать проверить.

  43. Иван Татарников

    Корректно ли использовать конструкцию Попытка … Исключение … КонецПопытки в транзакции?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  44. Сержантов Владимир Викторович

    Добрый вечер! Вопрос к практическому заданию №16

    В ответе к данному заданию есть фраза:
    «иначе
    возможна
    ошибка с сообщением, что данные уже устарели (были изменены или удалены)»

    Эта оптимистическая объектная блокировка?

    Сообщение при пессимистической для другого пользователя будет:
    «Объект уже заблокирован»?

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

    %D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0%2016.png

  45. Сержантов Владимир Викторович

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

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  46. Сержантов Владимир Викторович

    Подскажите, в расписании со 02.03 по 09.03 — финал, а как он будет проходить? Будел ли финальное задание?

    • Татьяна Гужавина

      Здравствуйте, Владимир!
      Финал второго потока состоится с 02.03 по 09.03. В рамках финала будет опубликовано финальное задание.
      При выполнении всех обязательных заданий и финального предусмотрена выдача сертификата об успешном окончании тренинга.

  47. Сержантов Владимир Викторович

    Андрей, здравствуйте!
    Подскажите:
    в модуле 3, урок 51 «Блокировка 2-х товаров» можно или нельзя было использовать такую конструкцию:

    ЭлментБлокировки.ИсточникДанных = ДокументОбъект.ТабЧасть;
    ЭлементБлокировки.ИспользоватьИзИсточника(«Товар», «Товар»);
    ЭлементБлокировки.УстановитьЗначение(«Склад», СкладОсновнойСсылка);
    ЭлементБлокировки.УстановитьЗначение(«Склад», СкладРозницаСсылка);

    Т.е. без определения ЭлементБлокировки2, сразу указать 2 склада

    или скажем определить список значений складов и указать его как ИсточникДанных для ЭлементБлокировки.

    И вообще, ЭлементБлокировки2 — это новая строка в таблице блокировок?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  48. Сержантов Владимир Викторович

    Добрый день!
    В модуле 3. урок «Грязное чтение. Решение». На слайде, где изображена таблица с S блокировкой, в действиях второго пользователя указана S блокировка. Далее следует списание 1 шт и фиксация транзакции. А разве здесь не должна быть еще и Х блокировка, перед изменениями данных втроым пользователем.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  49. dbarkov

    Добрый день, Андрей.
    Хочу уточнить информацию из видео 56 («Установка неявных управляемых блокировок»). При рассмотрении блокировок по РН ОстаткиТоваров вы говорите: «… блокировка будет наложена на пересечение «Основной склад», «Стул» и, т.к. характеристика здесь пустая, …, будет наложена блокировка на все характеристики…».
    Но, судя по видео, значение у характеристики — пустая ссылка на соответствующий справочник. Разве не должна в этом случае блокировка накладываться на склад+стол+»пустая ссылка характеристики»?
    Опыты, вроде, говорят о том же.
    И в развитие темы: если измерение будет составным типом и оно не будет указано (совсем, т.е. Неопределено), то тогда блокировка пойдет на все характеристики?
    Ну и немного по другой теме. Провожу документ, по точке останова останавливаю его проведение до завершения транзакции. В другой сессии пытаюсь прочесть данные этого документа (именно документа). Вылетает сообщение об ошибки превышения периода ожидания запроса на блокировку (ожидаемо) от SQL сервера (а вот это удивило). Разве при проведении (режим — управляемый, сам документ не менялся, просто перепроводится) на документ не вешается объектная блокировка на сервере 1С?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  50. Дмитрий

    Здравствуйте.
    Хотелось бы уточнить вопрос, в видео «Режимы блокировки и СУБД» вы говорите что в версионных СУБД, в автоматическом режиме, уровень изоляции транзакции Read Committed, в книге «Настольная книга 1С:Эксперта» в этом случае указана Serializable. Где все же правда? Ведь в если накладывается Read Committed, то она накладывается на время запроса, она не защищает от неповторяемого чтения, может все же в видео ошибка?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты