1С выбрать для изменения

1С выбрать для изменения

Она нужна, если в модуле проведения документа, например, сначала рассчитываются (получаются) остатки, на основе которых делаются расчеты и движения, влияющие на те же регистры (остатки).

Рассмотрим многопользовательский режим работы:

Процесс А: Начинает транзакцию. Считывает остатки (допустим получилось 10)
Процесс Б: Начинает транзакцию. Считывает остатки (получилось 10)
Процесс А: Контролирует остатки, выполняет расчеты (допустим, нужно списать 8),
Процесс А: Выполняет запись новых данных (10-8 = 2). Завершает транзакцию.
Процесс Б: Контролирует остатки (10 > 7), думает, что все ок. Выполняет расчеты (допустим, нужно списать 7)
Процесс Б: ОШИБКА: Он не может списать 7, поскольку в регистре уже не хватает остатка (там уже 2) после записи движений процессом А или после записи движений на складе образуется минус.

Чтобы процесс Б не ошибался в САМОМ КОНЦЕ своей работы, он должен подождать завершения работы процесса А и даже не считывать эти данные. Поэтому добавляем туда ДЛЯ ИЗМЕНЕНИЯ. Теперь картина выглядит так:

Процесс А: Начинает транзакцию. Считывает остатки (допустим получилось 10) с ключевым словом ДЛЯ ИЗМЕНЕНИЯ
Процесс Б: Начинает транзакцию. Пытается считать те же данные (получилось 10) ДЛЯ ИЗМЕНЕНИЯ, но вынужден подождать.
Процесс А: Контролирует остатки, выполняет расчеты (допустим, нужно списать 8)
Процесс А: Выполняет запись новых данных (10-8 = 2). Завершает транзакцию.
Процесс Б: Получает свежие данные из регистра (2)
Процесс Б: Контролирует остатки и сразу определяет нехватку (расчеты не выполняются). Отменяет транзакцию.

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

ВАЖНО:

    Если активна транзакция, то таблицы блокируются не только на время выполнения запроса, а полностью до конца транзакции. Заметьте, что запись объекта — тоже транзакция, поэтому если в ПередЗаписью или в ПриЗаписи вызвать такой запрос, то до конца записи таблица будет заблокирована!
    Так написано в ЖКК и проверено на практике.
    В транзакции таблица, заблокированная через "ДЛЯ ИЗМЕНЕНИЯ" блокируется на запись другими транзакциями и на чтение запросами, содержащими "ДЛЯ ИЗМЕНЕНИЯ". Простые запросы, не содержащие "ДЛЯ ИЗМЕНЕНИЯ", могут читать данные из заблокированным таким образом таблиц.
Читайте также:  Activator windows 10 1803

    На практике проверено, что "ДЛЯ ИЗМЕНЕНИЯ" работает не только с регистрами, но и со справочниками, скорее всего работает и с другими таблицами (документы, возможно даже константы)
    "ДЛЯ ИЗМЕНЕНИЯ" — гибкий способ блокировки объектов, срок жизни которой совпадает со сроком жизни транзакции, более мягкий, чем Заблокировать()

    В файловой версии блокируется вся таблица целиком, в SQL-версии — только записи, участвующие в запросе.Если используется запрос максимального или среднего значения по таблице, блокируется вся таблица (удобно для получения уникального кода при альтернативной сквозной нумерации).

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

"ВЫБРАТЬ
| *,
|ИЗ
| Справочник.Номенклатура
|ДЛЯ ИЗМЕНЕНИЯ";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать некоторые данные (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. ДЛЯ ИЗМЕНЕНИЯ дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять. В этом случае другое соединение будет ожидать освобождения этих данных уже в момент считывания внутри транзакции, т.е. не сможет прочесть заблокированные данные до тех пор, пока не будет завершена транзакция, наложившая блокировку. Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения ДЛЯ ИЗМЕНЕНИЯ. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята. Если запрос выполняется вне транзакции, то в нем могут быть считаны и заблокированные данные.

Читайте также:  164 Memory size error при загрузке

Блокировки устанавливаются в момент выполнения запроса, сбрасываются же при окончании транзакции. В случае если запрос выполняется вне транзакции предложение ДЛЯ ИЗМЕНЕНИЯ игнорируется.

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

Пример использования предложения ДЛЯ ИЗМЕНЕНИЯ можно посмотреть в типовой конфигурации "Управление торговлей" в модуле документа РеализацияТоваров, в функции СформироватьЗапросПоШапке(Режим), которая вызывается из обработчика проведения документа. В этой функции, в случае оперативного проведения выполняется запрос, в котором накладывается блокировка на регистр остатков:
Код 1C v 8.х

Похожие FAQ

Еще в этой же категории

Ключевые слова и Изображения

Слова упорядочены по частоте использования в тексте

Изображения

E_Migachev
08.11.2010 14:38

Комментарий: 3

IKSparrow, Блокировки устанавливаются в момент выполнения запроса, сбрасываются же при окончании транзакции. В случае если запрос выполняется вне транзакции предложение ДЛЯ ИЗМЕНЕНИЯ игнорируется. т.е. ЭТО используется только при Транзакциях

Прямого аналога SQL UPDATE нет, в 1С при помощи запросов данные только считываются, записываются документами, справочниками, регистрами.

IKSparrow
08.11.2010 14:02

Комментарий: 2
IKSparrow
08.11.2010 13:58

Комментарий: 1

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

И как именно отменить блокировку выбранных данных?

Ссылка на основную публикацию
Adblock detector