Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

В режиме «Конфигуратор». Блокировка данных, которые читаются и изменяются при проведении




В режиме «Конфигуратор»

Сделаем заготовку. После цикла обхода результата запроса и перед концом процедуры напишем следующие строки (листинг 14. 35).

листинг 14. 35. Фрагмент процедуры «ОбработкаПроведения()»

 

Сначала мы записываем движения в регистры.

Затем определяем режим проведения документа. При выполнении процедуры ОбработкаПроведения() вторым параметром (Режим) в нее передается режим проведения документа, и значение этой переменной сравнивается со значением системного перечисления РежимПроведенияДокумента. В случае оперативного проведения мы будем выполнять контроль остатков.


Теперь сделаем заготовку запроса для проверки отрицательных остатков.

Так как нам придется снова получать остатки только для той номенклатуры, которая в документе, укажем, что этот запрос будет использовать тот же самый менеджер временных таблиц МенеджерВТ (листинг 14. 36).

листинг 14. 36. Фрагмент процедуры «ОбработкаПроведения()»

 

Установим курсор внутрь кавычек и вызовем конструктор запроса. Подтвердим создание нового запроса.

Выберем таблицу ОстаткиМатериалов. Остатки и из нее два поля:

Материал и КоличествоОстаток.

Зададим параметры этой таблицы. В параметре Условие напишем:

листинг 14. 37. Условие виртуальной таблицы

 

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

Затем на закладке Условия перенесем в список условий поле Коли- чествоОстаток, установим флажок Произвольное и укажем, что нас интересуют только отрицательные остатки (листинг 14. 38).

листинг 14. 38. Условие запроса

ОстаткиМатериаловОстатки. КоличествоОстаток < 0                                                                 

Нажмем ОК. Текст запроса будет выглядеть следующим образом (листинг 14. 39).


листинг 14. 39. Текст запроса

 

Теперь осталось только установить параметр запроса, обойти результат запроса и вывести сообщения об отрицательных остатках (листинг 14. 40).

листинг 14. 40. Фрагмент процедуры «ОбработкаПроведения()»

 

Кратко поясним добавленный текст.

При выполнении проверки в запрос в параметре Склад передается склад, указанный в документе.


Затем выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице и на складе, указанном в параметре Склад.

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

При этом параметру Отказ процедуры проведения документа присва- ивается значение Истина, то есть документ не проводится, начатая транзакция отменяется, и состояние данных, измененных в процессе проведения, возвращается в исходное, до начала проведения документа.

 

Блокировка данных, которые читаются и изменяются при проведении

Казалось бы, это все? Но нет, есть очень важный момент, о котором мы не позаботились.

Сейчас схема нашей процедуры такова:

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

2. Выполняем второй запрос с именем Запрос2. В результате мы читаем стоимость и остатки для номенклатуры, содержащейся в табличной части документа.

3. Записываем движения регистров (Движения. Записать()).

4. Выполняем третий запрос с именем Запрос3. Тем самым мы

проверяем наличие отрицательных остатков.

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

Однако может возникнуть следующая ситуация. Выполняя второй запрос, мы прочитали, что есть 2 шт. некоторого материала. И другая транзакция (другой пользователь), которая собирается списывать материалы, тоже прочитала, что есть 2 шт. этого материала. После этого мы записали движения, и система заблокировала эти данные.


Другая транзакция ждет, когда мы освободим данные. Мы провели документ, списали 2 шт. материала и освободили данные. Другая транзакция пытается тоже списать 2 шт. материала, но его уже нет!

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

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...