![]() |
![]() |
![]() |
|
Профессиональная разработка в 1С 8.2 и новая методика контроля остатков | ☑ | ||
---|---|---|---|---|
0
liurn
14.05.13
✎
13:25
|
Здравствуйте, готовлюсь к сдаче специалиста, при чтении книги "Профессиональная разработка в системе 1С: Предприятие" обнаружил пример, который поламал мое представление о новой методике контроля остатков. Вот часть листинга документа Заказ покупателя (в книге страница 609):
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // Укажем, по каким регистрам нужно записывать движения. Движения.РезервыНоменклатуры.Записывать = Истина; // Создать менеджер временных таблиц. МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; // Укажем, какой менеджер временных таблиц использует этот запрос. Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = "ВЫБРАТЬ | ЗаказПокупателяСостав.Номенклатура, | СУММА(ЗаказПокупателяСостав.Количество) КАК КоличествоВДокументе |ПОМЕСТИТЬ НоменклатураДокумента |ИЗ | Документ.ЗаказПокупателя.Состав КАК ЗаказПокупателяСостав |ГДЕ | ЗаказПокупателяСостав.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ЗаказПокупателяСостав.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Запрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ; Запрос2.Текст = "ВЫБРАТЬ | НоменклатураДокумента.Номенклатура, | НоменклатураДокумента.КоличествоВДокументе |ИЗ | НоменклатураДокумента КАК НоменклатураДокумента"; // Установим необходимость блокировки данных в регистре РезервыНоменклатуры. Движения.РезервыНоменклатуры.БлокироватьДляИзменения = Истина; // Запишем пустые наборы записей, чтобы читать резервы без учета данных в документе. Движения.РезервыНоменклатуры.Записать(); Результат = Запрос2.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Сформировать движения по регистру РезервыНоменклатуры. Движение = Движения.РезервыНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Количество =ВыборкаДетальныеЗаписи.КоличествоВДокументе; КонецЦикла; // Запишем движения. Движения.Записать(); // Контроль остатков. Запрос3 = Новый Запрос; ..... Далее идет контроль остатков Так вот, не понятно, для чего автор листинга выполняет запись пустого набора: // Запишем пустые наборы записей, чтобы читать резервы без учета данных в документе. Движения.РезервыНоменклатуры.Записать(); и мотивирует это тем, что нужно читать резервы без учета данных в документе. Но ведь далее по тексту до очередного вызова Движения.Записать() нигде не происходит этого самого чтения резервов. Кроме того, записью этого пустого набора новая методика контроля отрицательных остатков после записи движений сводится на нет практически, ведь здесь происходит блокировка пустого набора записей и такой же документ Заказ покупателя не проведется в другой сессии, будет ждать завершения текущей транзакции даже если в нем совсем другой перечень номенклатуры указан. Может кто задавался аналогичным вопросом и нашел на него ответ? Это ошибка автора или в этом скрыт какой то смысл, которого я не понимаю. |
|||
1
Maxus43
14.05.13
✎
13:31
|
>>такой же документ Заказ покупателя не проведется в другой сессии, будет ждать завершения текущей транзакции даже если в нем совсем другой перечень номенклатуры указан.
с чего вдруг? набор записей данного регистратора блокируется, а не весь регистр |
|||
2
shuhard_серый
14.05.13
✎
13:38
|
(0)[в этом скрыт какой то смысл, которого я не понимаю]
100500 |
|||
3
Fragster
гуру
14.05.13
✎
13:39
|
можно наложить управляемые блокировки руками, но так проще
|
|||
4
Fragster
гуру
14.05.13
✎
13:39
|
(3)+ таким образом меньше время блокировок
|
|||
5
Fragster
гуру
14.05.13
✎
13:42
|
(4)+ всегда одинаковый порядок наложения этих самых блокировок
|
|||
6
liurn
14.05.13
✎
14:29
|
(1) выполнение Движения.РезервыНоменклатуры.Записать(); для пустого набора записей блокирует пустой набор записей. В результате в другой сессии выполнение этого же метода вызовет конфликт блокировок. Т.е. любая попытка записать пустой набор записей этого же регистра будет заблокирована до завершения данной транзакции. Проверено на опыте, хотя явно в документации не встречал такого утверждения.
|
|||
7
liurn
14.05.13
✎
14:31
|
(3) Я понимаю сам метод, понимаю для чего он был разработан. Мне не понятно для чего происходит запись пустого набора записей. На мой взгляд это безсмысленно.
|
|||
8
liurn
14.05.13
✎
14:32
|
(2) Какой же смысл в этом скрыт? Может вы разъясните?
|
|||
9
EasyRider
14.05.13
✎
14:38
|
смысл в том чтобы не учитывать движения этого регистратора.А вот насчет блокировок,так если во время проведения можно кому-то еще писать,то получится грязное чтение и остатки уплывут в минус.
|
|||
10
Fragster
гуру
14.05.13
✎
14:39
|
кстати, отдельно записывать пустой набор там не нужно
|
|||
11
liurn
14.05.13
✎
14:40
|
(9) Где не учитывать? Ведь движения нигде не читаются.
|
|||
12
Fragster
гуру
14.05.13
✎
14:40
|
кстати, вообще какой-то косячный пример - после Движения.РезервыНоменклатуры.Записать(); сбросится признак Записывать и Движения.Записать() не вызовет запись набора в случаеЮ, если стоит "записывать выбранные"
|
|||
13
liurn
14.05.13
✎
14:41
|
(12) Т.е. ваше мнение, что это ошибка автора?
|
|||
14
Fragster
гуру
14.05.13
✎
14:42
|
(13) типа того
|
|||
15
EasyRider
14.05.13
✎
14:42
|
(11)не учитывать в контроле остатков "..... Далее идет контроль остатков "
|
|||
16
liurn
14.05.13
✎
14:45
|
(15) Да, но перед этим контролем выполняется метод Движения.Записать() который в любом случае перезапишет старые движения новыми.
|
|||
17
Maxus43
14.05.13
✎
14:47
|
(6) да почему набор пустой? у данного набора отбор по регистратору, пусть не заполнен, но ограничен регистратором.
Сама метода вызывает споры конечно, но что блокируется пустой набор - не согласен, он не пустой |
|||
18
EasyRider
14.05.13
✎
14:49
|
(16)ну.Запишет старые движения новыми пустыми.
|
|||
19
liurn
14.05.13
✎
14:54
|
(17) Попробуйте выполнить простейший тест и убедитесь в этом, я спорить не стану. Да и вопрос мой не в том. Я хочу понять для чего в принципе нужен здесь этот вызов. На мой взгляд это лишнее как минимум.
|
|||
20
liurn
14.05.13
✎
14:57
|
(17) Да и причем тут отбор вообще? Каким образом отбор в наборе записей влияет на блокировки? Я знаю из СП что на блокировки влияют комбинации измерений записываемого набора записей. А регистратор - это не измерение вроде как.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |