ДЛЯ ИЗМЕНЕНИЯ в запросах 1С 8
Я думаю, каждый из нас встречался с этой конструкцией «ДЛЯ ИЗМЕНЕНИЯ» в запросах 1С 8.3, но многие часто не понимают суть использования данной конструкции. Рассмотрим, зачем нужна и когда используется данная конструкция в тесте запроса.
Содержание
Зачем «ДЛЯ ИЗМЕНЕНИЯ» в запросах 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. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Владимир:
Здравствуйте.
А как же быть с тем, что по сути эти две транзакции должны будут взаимозаблокироваться? Ведь и первая транзакция наложит разделяемую блокировку, при чтении, по одним измерениям, и вторая транзакция наложит разделяемую блокировку на те же измерения при чтении — в результате, когда первая транзакция попытается записать данные возникнет конфликт и монопольную блокировку, которая ей позволит записать данные первая транзакция не получит. Или я чего-то не так понимаю?
С уважением, Владимир.
Программист 1С:
Добрый день!
Т.е вы имеете ввиду если два запроса «параллельно» выполняются с конструкцией «для изменения»?
Если я вас правильно понял, то система в данном случае не даст наложить вторую U блокировку.
Посмотрите таблицу совместимости блокировок тут — https://programmist1s.ru/1s-ekspert-blokirovki-v-1s-i-subd/
Ирек:
Добрый день!
Он немного другое имел ввиду: чтение данных по измерениям с дальнейшей записью набора с отбором по этим же измерениям. Да, действительно по истечению времени возникнет конфликт, но это немного не то, что описано в статье:)
Псевдодент:
Будет наложена исключительная блокировка. Вторая транзакция не сможет прочитать эти данные.
Александр:
Добрый день.
Немного не понятен следующий момент, на сайте http://its.1c.ru/db/metod8dev/content/2651/hdoc есть еще такое примечение:
-Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения ДЛЯ ИЗМЕНЕНИЯ. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята.
Тогда, с учетом примечания (Данная конструкция игнорируется вне транзакции) получается что вне транзакции это неактуально, а в транзакции в любом случае данные блокируются, независимо от использования ДЛЯ ИЗМЕНЕНИЯ, т.е. эта конструкция нам ничего не дает.
Тогда вообще зачем эта конструкция ?
Аноним:
1С книжку читаю по Документообороту. В первом предложение одно утверждение и главное прям в СЛЕДУЮЩЕМ предложении ровно наоборот! Для 1С походу это норма. Что касается примечания и конструкции ДЛЯ ИЗМЕНЕНИЯ — если мы это указали в запросе. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть СЧИТАНЫ и изменены до тех пор, пока блокировка не будет снята. Я думаю сюда надо вставить слово СЧИТАНЫ, потому как ДЛЯ ИЗМЕНЕНИЯ это самая сильная блокировка данных считается.
Аноним:
В продолжении предыдущего сообщения. Если я списываю остатки мне не подойдет блокировка записи. Если я списываю остатки, то я не дам никому ни читать, ни писать, пока сам не разберусь с остатками, все с ними не сделаю, не запишу на хард и транзакцию не зафиксирую. А то так я прочитал остатки 10 шт и пока вожусь с тем что мне записать, а в это время другая сука взяла и тоже считала такие же данные как у меня 10 шт и мы параллейно начинаем работать. А я хочу чтобы пока я вожусь со своими 10-ю штуками, никто не мог считать их! Вот я считал 10 штук, повозился и записал в регистр что сейчас 9 штук стало и теперь хочу чтобы та сука считала 9 штук, а не 10 штук как в начале!