|   |   | 
| 
 | Запрос остатков при проведении документа с учетом новых движений | ☑ | ||
|---|---|---|---|---|
| 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) "до попадания в ОбработкаПроведения" // Расчитать что-то можно только в единой транзакции с записью туда и с блокированием используемых при расчете данных регистра (недопущения добавления в используемое пространство новых данных), иначе такой расчет коту под хвост. Самое позднее, когда это можно сделать в транзакции проведения - это конец обработки проведения.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |