|
Документ рождает документы. Вопрос по учебной задаче. | ☑ | ||
---|---|---|---|---|
0
SAVINOV
06.04.18
✎
17:45
|
Добрый день.
Поясните, пожалуйста, логику поведения системы. Есть Отделы закупок и Точки продаж. Между ними товар перекидывается документом Перемещение(и программно и интерактивно). Вся соль в Расходной Накладной: 1) В процедуре ОбработкаПроведения читаю необходимые данные запросом. 2) Вижу, что остатков не хватает. 3) Инициирую программное создание и проведение документов Перемещение. 4) Снова читаю регистр(Себестоимости товаров в точках продаж поменялись) 5) Делаю движения НО пункт 3 выполняется только после отработки процедуры ОбработкаПроведения, соответственно, в п.4 Запрос получает некорректные остатки. Последовательность можно проследить в движениях регистра. Намекните, в чем тут дело: создаваемые документы Перемещение ждут разблокировки регистра (но режимы везде Управляемые и в модуле блокировка еще не описана), или так вообще нельзя сделать - пока проводишь один документ, нашлёпать и провести из него еще несколько программно, да так чтобы их движения были ДО движений документа - инициатора ??? Приложения: Задача - учебная, по оперативному учёту с курсов П.С. Белоусова. Картинка движений регистра: https://yadi.sk/i/G1Y67kmQ3UAVNW Выгрузка базы: https://yadi.sk/d/__x7WA8k3UAeyf Условие задачи: https://yadi.sk/i/qbYLzR7p3UAf4o P.S. Понимаю, что все можно было устроить и по-другому и обойти эту сложность, но интересует именно эта проблема: почему движения "ПОСЛЕ",а не "ДО" ??. |
|||
1
SAVINOV
06.04.18
✎
17:47
|
(8.3.9.2170)
Каркасная конфигурация для сдачи экзамена "1С:Специалист" по платформе "1С:Предприятие 8" (1.0.0.2) |
|||
2
Russiagreat
06.04.18
✎
17:56
|
(1) При записи()
|
|||
3
ks_83
06.04.18
✎
17:56
|
Пункт 3 выполняется внутри проведения, а не после.
|
|||
4
RomanYS
06.04.18
✎
18:06
|
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);
Оперативный - будет текущее и оно больше времени продажи! Принудительно ставь время перемещения меньше и не проводи его оперативно. |
|||
5
Остап Сулейманович
06.04.18
✎
18:08
|
(0) Не нужно при проведении "рождать" документы. При перепроведении возможно возникновение таких коллизий, что всем колхозом не разгребешь.
В форме перед проведением проверить остатки. Составить список необходимых перемещений. Спросить пользователя за их оформление и проведение. И только если получен положительный ответ начинать "рожать" документы. После проводить Расходную. |
|||
6
Остап Сулейманович
06.04.18
✎
18:09
|
+ (5) "рожание" накладных перемещения и расходной желательно выполнять в транзакции. С откатом всего, если что-то пошло косяком.
|
|||
7
youalex
06.04.18
✎
18:13
|
(6) дык рождение перемещения из записи/проведения и так в транзакции, по определению
|
|||
8
RomanYS
06.04.18
✎
18:14
|
(5) это учебная задача с заданным условием
|
|||
9
ks_83
06.04.18
✎
18:25
|
На месте автора, я бы задал вопрос непосредственно Белоусову. Иначе, прислушиваясь к местным советам, экзамен он не сдаст 100%.
|
|||
10
youalex
06.04.18
✎
18:28
|
Лень разбирать код, я вижу два варианта. Первый - это типа по старой методике- в начале проведения лочишь оба регистра по всем возможным измерениям, которые будут трогаться (возможно, ПередЗаписью и ДополнительныеСвойства придется использовать). Дальше получаешь остатки, и играешься с ними как хочешь. Тем более, что цена единицы не меняется.
Второй - это типа по новой методике. Пишешь движения по РН без проверок (Движения.Записать()) (не забыв отключить разделение итогов через .БлокироватьДляИзменения) И дальше, по отрицательным остаткам - создаешь перемещения. Могу наврать) |
|||
11
SAVINOV
07.04.18
✎
08:18
|
Большое спасибо за ответы. Буду ломать голову.
|
|||
12
SAVINOV
09.04.18
✎
12:08
|
(9) Нашел блок - схему для данного модуля в учебных материалах. Регистры там сделаны по-другому: оба моих сведены в один и еще регистр для себестоимости, но сути это не меняет. Решение больше похоже на(10) : сначала проведение по новой методике, если не хватает, то формируем перемещения, если и для перемещений не хватает, то откат.
Но таким способом в регистре точно будут сначала движения в расход, а только потом - в плюс перемещения. У меня ещё Ошибка была в п4 - регистр надо читать с учётом сделанных перемещений, а не на такой же "МоментВремени()", как при первом запросе. p.s. У П.Белоусова спросить уже не могу т.к. вебинары заканчиваются быстрее, чем начинаешь вкуривать материал )). |
|||
13
RomanYS
09.04.18
✎
12:44
|
(12) ты (4) осознал? Все твои беды со временем движений от оперативного проведения перемещений.
А один регистр при таких условиях - явная ошибка. |
|||
14
SAVINOV
09.04.18
✎
13:58
|
(13) Сделал следующий опыт.
Все находится в ОбработкеПроведения. Сначала подготавливается регистр необходимыми документами проведения, потом делаются движения. Инициированные документы проводил оперативно и неоперативно(в разных опытах), также для документа инициатора перед движениями получал или не получал оперативную отметку времени (Дата = ПолучитьОперативнуюОтметкуВремени();) . Получилось 4 результата, картинки прилагаю. ----- Неоперативно С Отметкой https://yadi.sk/i/pIl5-DOT3UEeD8 Неоперативно БЕЗ Отметки https://yadi.sk/i/E8ag40ym3UEcSr ----- Оперативно С Отметкой https://yadi.sk/i/awjCPvKc3UEeHB Оперативно БЕЗ Отметки https://yadi.sk/i/rLI9BG4p3UEePc ----- На картинках Расходная - это инициатор, Перемещение - инициируемые подготовительные документы. Хорошо виден порядок, номера и время. Выходит, что режим проведения либо раскидывает документы через секунду, либо проводит их внутри одной секунды. А вот положение движений в регистре определяется Отметкой времени - либо при записи документа и тогда его движения на списание будут раньше перемещений, либо, если после перемещений принудительно получить оперативную отметку, то запись движений происходит логично: сначала приход перемещениями, потом-расход накладной. Выгрузка: https://yadi.sk/d/vCkYVyLn3UEg9e (без блокировок) ----- (2) По поводу ПриЗаписи() - так тоже попробовал, но в данном случае это не дает разницы с размещением всего только в обработке проведения. Ещё пробовал ПередЗаписью(), в надежде, что пока там еще нет ссылки на документ, сделать перемещения, а в следующих обработчиках документ впишется куда надо. Но не тут то было: без ссылки не сделать запросы к табличной части, да и при отмене проведения проблемы. ---- (9)Если интересно, картинка схемы как надо делать от Павла Станиславовича https://yadi.sk/i/LQJ8ZGX83UBZTB Мне кажется, что тут изначально приход после расхода (особенно, если делать в разных регистрах) |
|||
15
SAVINOV
09.04.18
✎
14:06
|
(14) Тень сомнения: на картинке Оперативно БЕЗ Отметки Расходная имеет время раньше Перемешений, однако находится где надо - после...
|
|||
16
SAVINOV
09.04.18
✎
14:10
|
перепутал...хотел сказать, на картинке "Оперативно С Отметкой"...
|
|||
17
SAVINOV
09.04.18
✎
14:21
|
(15) (16) - Если так сделать и посмотреть в консоли запросов на момент времени, то все нормально.
картинка: https://yadi.sk/i/yRSDPLoQ3UEkrE |
|||
18
RomanYS
09.04.18
✎
14:27
|
(17) У тебя дата движений не совпадает с датой документа, из-за этого такая картина
|
|||
19
SAVINOV
09.04.18
✎
14:33
|
...Но ведь решающее значение имеет дата движений, та, что первая в моменте времени ?...
|
|||
20
RomanYS
09.04.18
✎
14:40
|
(19) иногда действительно нужно делать движения документа датой отличной от даты документа. В твоей задаче так делать явно не стоит.
Просто делай перемещения на секунду раньше даты расхода. Неоперативно. |
|||
21
SAVINOV
09.04.18
✎
14:54
|
Понял.Спасибо за участие и ответы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |