Имя: Пароль:
1C
1С v8
Документ рождает документы. Вопрос по учебной задаче.
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
Понял.Спасибо за участие и ответы.