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

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

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

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

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

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

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

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

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

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

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

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

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

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

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

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

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

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

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

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

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

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

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

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

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

    Ответить

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

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

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

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

      Ответить

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

        Ответить

    • Будет наложена исключительная блокировка. Вторая транзакция не сможет прочитать эти данные.

      Ответить

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

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

    Ответить

    • 1С книжку читаю по Документообороту. В первом предложение одно утверждение и главное прям в СЛЕДУЮЩЕМ предложении ровно наоборот! Для 1С походу это норма. Что касается примечания и конструкции ДЛЯ ИЗМЕНЕНИЯ — если мы это указали в запросе. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть СЧИТАНЫ и изменены до тех пор, пока блокировка не будет снята. Я думаю сюда надо вставить слово СЧИТАНЫ, потому как ДЛЯ ИЗМЕНЕНИЯ это самая сильная блокировка данных считается.

      Ответить

  3. В продолжении предыдущего сообщения. Если я списываю остатки мне не подойдет блокировка записи. Если я списываю остатки, то я не дам никому ни читать, ни писать, пока сам не разберусь с остатками, все с ними не сделаю, не запишу на хард и транзакцию не зафиксирую. А то так я прочитал остатки 10 шт и пока вожусь с тем что мне записать, а в это время другая сука взяла и тоже считала такие же данные как у меня 10 шт и мы параллейно начинаем работать. А я хочу чтобы пока я вожусь со своими 10-ю штуками, никто не мог считать их! Вот я считал 10 штук, повозился и записал в регистр что сейчас 9 штук стало и теперь хочу чтобы та сука считала 9 штук, а не 10 штук как в начале!

    Ответить

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

Ваш адрес email не будет опубликован.