Имя: Пароль:
1C
1С v8
Запрос остатков при проведении документа с учетом новых движений
0 Slon747
 
09.01.20
10:51
При проведении документа проверяю задолженность с учетом движений, созданных этим же документом.
Т.к. проверка происходит после записи движений (в конце процедуры ОбработкаПроведения), то вроде как эти движения уже должны учитываться.
Но почему эти движения не учитываются в текущем документе?

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК Сумма
               |ИЗ
               |    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&МоментВремени, Контрагент = &Контрагент) КАК ВзаиморасчетыСКонтрагентамиОстатки";

Запрос.УстановитьПараметр("Контрагент",        Контрагент);
Запрос.УстановитьПараметр("МоментВремени",    Новый Граница(МоментВремени(), ВидГраницы.Включая));
Выборка = Запрос.Выполнить().Выбрать();
1 Джинн
 
09.01.20
11:08
Пока транзакция не завершена, в базе нет записей. Да и сама идея проверки бестолковая по сути.
2 Ns33
 
09.01.20
11:12
Если ты сам их записал в ОбработкаПроведения "Движения.ВзаиморасчетыСКонтрагентами.Записать()"
, но перед запросом, то  будут.

А еще можно сделать так:
Движение = Движения.ВзаиморасчетыСКонтрагентами.Добавить();
Движение.Период = Дата + 1;

То тогда не попадет.
3 Slon747
 
09.01.20
11:14
Не из-за того-ли, что в свойствах документа выставлено: "Запись движений: Записывать модифицированные"?
4 Cyberhawk
 
09.01.20
11:18
Чтобы внутри транзакции проведения движения в запроса учитывались, их нужно записать в явном виде
5 pechkin
 
09.01.20
11:19
(1) для текущей записи - это не влияет
6 Cyberhawk
 
09.01.20
11:19
(1) "сама идея проверки бестолковая по сути" // Во всех современных типовых контроль отрицательных остатков там, где для этого не требуется что-то читать из контролируемого регистра, сделан именно так - записали движения, сделали запрос - а не минус ли стал? - если стал то откат транзакции, иначе коммит
7 Slon747
 
09.01.20
11:22
(4) В явном виде это как раз то, что в свойствах документа "Записывать выбранные"?
8 Cyberhawk
 
09.01.20
11:26
(7) Нет конечно. Явно - это вызов метода Записать() у "зависимого" набора (который в коллекции движений документа) или у независимого набора
9 Slon747
 
09.01.20
11:34
Всем спасибо!
10 Джинн
 
09.01.20
12:07
(6) Из-за лени разработчиков. Кошернее заранее проверить.
11 Cyberhawk
 
09.01.20
12:08
(10) Чем кошернее?
12 Джинн
 
09.01.20
12:12
(11) Для примера проверить нужно выход за условия взаиморасчетов, а процедура формирует записи по чемодану регистров с сопутствующими расчетами, а потом добросовестно отправляет все это в корзину за ненадобностью.
13 Cyberhawk
 
09.01.20
12:13
(12) Ты просто описал как это происходит, но не ответил на вопрос
14 pechkin
 
09.01.20
12:14
(12) зависит от того насколько часто получаем отказ.
если очень часто то лучше в начале. если нет то в конце
15 pechkin
 
09.01.20
12:15
(13) поэтому и лучше, то не нужно делать лишние движения и отказываться от них. все таки ресурсы не безграничны
16 Джинн
 
09.01.20
12:15
(13) Из описания не следует, что кошернее выполнить проверку перед формированием этого чемодана движений, чтобы понять, что он на фиг не нужен будет?
17 Cyberhawk
 
09.01.20
12:16
(16) Нет конечно
18 hhhh
 
09.01.20
12:23
(16) там по теории вероятностей сделано. По теории вероятностей 99% всё нормально будет, а 1% отказ. Поэтому если сразу записать, то в 99% случаев в 2 раза выигрыш в скорости.
19 elCust
 
09.01.20
12:26
(8) Молодец!
20 Джинн
 
09.01.20
12:34
(18) Возможно. С этой точки зрения я не рассматривал вопрос :(
21 Eiffil123
 
09.01.20
14:27
вот кратко расписано преимущество "новой" методики проведения перед "старой":
https://курсы-по-1с.рф/articles/2017-02-12-two-methods-for-inventory-check/

да и вообще это сейчас стандарт - использовать новую там, где это возможно (если например не требуется расчет суммовых показателей, а все необходимые данные для проведения лежат в документе).
22 Джинн
 
09.01.20
14:42
(21) Мутно написано. Явно не очевидны некие "преимущества". Два раза перечитал специально. Что есть "все необходимые данные для проведения лежат в документе"? Сальдо взаиморасчетов "в самом документе"? Или данные о просроченных долгах? А свободные остатки "в самом документе", или "требуется расчет"?
23 Cyberhawk
 
09.01.20
17:12
(22) Простой пример - списание по партиям или распределение взаиморачетов по документам: этих данных в документе нет, распределение происходит динамически во время проведения и поэтому требует блокирования регистр, откуда достаются эти данные, до конца транзакции (надеюсь не надо объяснять зачем). Тогда тут подойдет старая методика контроля - раз регистр уже и так заблокирован до конца транзакции, то чтение из него надежное и поэтому проконтролировать тоже можно сразу заранее.
Другое дело, когда просто пишешь в регистр без необходимости надежного чтения из него - в этом случае регистр блокируется только ближе к концу транзакции, когда в него идет запись и последующий контроль отрицалова.
24 Cyberhawk
 
09.01.20
17:14
Преимущество - повышение параллельности работы из-за отсутствия преждевременного блокирования регистра в транзакции проведения: этот момент смещается ближе к ее концу (к моменту начина от Движения.Записать() и до ее конца)
25 Джинн
 
09.01.20
17:32
(23) Т.е.применительно к реальным учетным системам практически всегда "старая схема" предпочтительнее? За исключение документов, проводимых "как есть"?

Или это задел под "отложенное проведение", когда всяческие распределения где-то в фоне втихаря выполняются? Тогда есть некая логика.
26 Skylark
 
09.01.20
17:53
(25) Ты как вчера родился прям. Да это та же история как с планами счетов в бухгалтерии - общий план счетов БУ и НУ это круто! - раздельные планы счетов для БУ и НУ это потрясающее ноу-хау! - общий план счетов БУ и НУ это круто! - ...
27 Cyberhawk
 
10.01.20
07:41
(25) Не только за исключением "простых" документов, но и в типовых нынче документы пишут в регистры только количество (без расчета суммы выбытия по какой-нибудь там скользящей) по новой схеме, а потом уже отложенно дозаполняются суммы при закрытии месяца
28 Rovan
 
гуру
10.01.20
09:09
(22) как я помню - преимущество в том, что старым способом надо "исхитрится" заблокировать регистр по нужным изменениям,
затем сделать проверку остатков, затем уже запись движений,
(получается что алгоритм регистры блокирует в раза - для проверки и для записи)
а в новом идет запись и сразу блокировка, а затем уже проверка
(т.е. одна блокировка)
29 Смотрящий
 
10.01.20
09:23
(28) Баальшие сомнения в целесообразности таких вывертов.
Если остатков хватает, то и первый вариант - чтение/запись и второй - запись/чтение отработают всегда
А вот если их не хватает, то первый вариант только считает данные но не запишет их, а второй запишет/считает

Маркетологи и ленивые прогеры 1С  (((
30 Cyberhawk
 
10.01.20
10:21
(29) Новая схема - она не про то, что там работает или не работает и даже не про то, что в случае нехватки будет "холостая" запись. Она про сокращение длительности блокировки путем сдвиг момента блокировки ближе к концу транзакции.
31 hhhh
 
10.01.20
10:32
(29) там фишка в том, что первый сначала очищает регистр, потом проверка, а потом пишет. Поэтому запись 2 раза и 2 блокировки.
32 pechkin
 
10.01.20
10:35
(25) без отложенного проведения 1с ка умирает почти сразу
33 Rovan
 
гуру
10.01.20
11:21
(+28) кто сдавал или готовится к сдаче по 1С Специалист по платформе, то это обязательное требование
и задача такая точно будет
34 Смотрящий
 
10.01.20
13:06
(30, 31) Тогда уж проще вынести момент расчета до попадания в ОбработкаПроведения, а в ней только писать данные. Ну или не писать ;)
35 RomanYS
 
10.01.20
13:10
(34) тогда на момент ОбработкаПроведения данные уже протухнут при параллельной работе
36 Cyberhawk
 
10.01.20
13:35
(34) "до попадания в ОбработкаПроведения" // Расчитать что-то можно только в единой транзакции с записью туда и с блокированием используемых при расчете данных регистра (недопущения добавления в используемое пространство новых данных), иначе такой расчет коту под хвост. Самое позднее, когда это можно сделать в транзакции проведения - это конец обработки проведения.