Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут!

ДЛЯ ИЗМЕНЕНИЯ в запросах 1С 8

Я думаю, каждый из нас встречался  с этой конструкцией «ДЛЯ ИЗМЕНЕНИЯ» в запросах 1С 8.2 и 8.3, но многие часто не понимаю суть использования данной конструкции. Рассмотрим зачем нужна и когда используется данная конструкция в тесте запроса.

для изменения в запросе 1с

Зачем «ДЛЯ ИЗМЕНЕНИЯ» в запросах 1С

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

Рассмотрим пример возможной ошибки списания в минус:

Получите 267 видеоуроков по 1С бесплатно:

Схема работы конструкции для изменения

Рассмотрим хронологическую последовательность:

  • На складе 10 карандашей
  • Пользователь №1 начинает проводить документ и спрашивает у системы — есть ли в наличии 8 карандашей? Система отвечает — да.
  • Пользователь №2 начинает проводить документ и спрашивает у системы  — есть ли в наличии 7 единиц товара? Система отвечает — да.
  • Так как для пользователя №1 получил одобрение от системы, документ списывает со склада 8 карандашей. На складе остаётся 2 штуки.
  • Пользователя №2 тоже получил одобрение от системы и документ ничего не подозревая списывает со склада еще 7 единиц.
  • На складе становится отрицательный остаток — минус 5.

ДЛЯ ИЗМЕНЕНИЯ — предотвращает отрицательные остатки.

Конструкция «ДЛЯ ИЗМЕНЕНИЯ» в тексте запроса 1С устанавливает блокировку на читаемые данные до конца транзакции (например, обработку проведения). И в вышепоказанном примере пользователь №2 встанет в очередь, пока пользователь №1 не закончит операцию с ресурсом.

Когда нужно использовать ДЛЯ ИЗМЕНЕНИЯ в 1С 8

Если вы используете её, платформа устанавливает блокировку U-типа (блокировка для изменения) до конца транзакции и не позволяет изменять данных другим пользователям.

Конструкцию ДЛЯ ИЗМЕНЕНИЯ необходимо использовать для данных, которые планируется изменять в рамках текущей транзакции.

Пример в запросе:

ВЫБРАТЬ ТоварыНаСкладах .Номенклатура, ТоварыНаСкладах.Количество
ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ДЛЯ ИЗМЕНЕНИЯ

Тем самым, если запрос выполняется в транзакции, полученные данные будут захвачены до её конца.

Важные примечания

  • Данная конструкция  игнорируется вне транзакции
  • ДЛЯ ИЗМЕНЕНИЯ актуально ТОЛЬКО для автоматического режима управления блокировок (в режиме управляемых блокировок следует использовать объект БлокировкаДанных)

P.S. Наша компания предоставляет услуги по настройке, доработке и комплексному внедрению 1С. Закажите бесплатный расчет стоимости вашей задачи на странице Услуги 1С или по телефону +7 (499) 350 29 00.

Остались вопросы?

СПРОСИТЕ в комментариях!

Комментариев: 4 на “ДЛЯ ИЗМЕНЕНИЯ в запросах 1С 8
  1. Здравствуйте.
    А как же быть с тем, что по сути эти две транзакции должны будут взаимозаблокироваться? Ведь и первая транзакция наложит разделяемую блокировку, при чтении, по одним измерениям, и вторая транзакция наложит разделяемую блокировку на те же измерения при чтении — в результате, когда первая транзакция попытается записать данные возникнет конфликт и монопольную блокировку, которая ей позволит записать данные первая транзакция не получит. Или я чего-то не так понимаю?
    С уважением, Владимир.

    Ответить

    • Добрый день!

      Т.е вы имеете ввиду если два запроса «параллельно» выполняются с конструкцией «для изменения»?

      Если я вас правильно понял, то система в данном случае не даст наложить вторую U блокировку.

      Посмотрите таблицу совместимости блокировок тут — http://programmist1s.ru/1s-ekspert-blokirovki-v-1s-i-subd/

      Ответить

      • Добрый день!
        Он немного другое имел ввиду: чтение данных по измерениям с дальнейшей записью набора с отбором по этим же измерениям. Да, действительно по истечению времени возникнет конфликт, но это немного не то, что описано в статье:)

        Ответить

  2. Добрый день.
    Немного не понятен следующий момент, на сайте http://its.1c.ru/db/metod8dev/content/2651/hdoc есть еще такое примечение:
    -Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения ДЛЯ ИЗМЕНЕНИЯ. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята.

    Тогда, с учетом примечания (Данная конструкция игнорируется вне транзакции) получается что вне транзакции это неактуально, а в транзакции в любом случае данные блокируются, независимо от использования ДЛЯ ИЗМЕНЕНИЯ, т.е. эта конструкция нам ничего не дает.
    Тогда вообще зачем эта конструкция ?

    Ответить

Добавить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*