Имя: Пароль:
1C
1С v8
Внести изменение в документ при обработке проведения
0 salvator
 
10.10.22
19:00
Здравствуйте.
Есть задача: при проведении документа пересчитывать определенные проводки и полученные данные (сумму проводки) изменять в табличной части документа.
Вопрос именно по второй части: чтобы изменения сохранились, необходимо записать документ. А это, по сути, уже будет вторая запись.
Есть ли другие способы, чтобы два раза не записывать?
1 Dmitry1c
 
10.10.22
19:03
Стоматология через задний проход, спешите видеть
2 PR
 
10.10.22
19:04
(0) Есть
Не хранить в документе
3 Фрэнки
 
10.10.22
19:23
Т.е. я так могу попробовать дозаписать ваши действия:
1) Открыта интерактивная форма документа и в ней заполняются строки исходных данных.
2) идет Запись с выставлением параметра РежимЗаписиДокумента Проведение

Так вот уже после того, как документ Записан, происходит запись движений в виде наборов записей регистров.

Соответственно, нужно дожидаться закрытия Транзакции, т.е. обработка должна быть в фоновом задании, которое запускается обработчиком события После записи объекта.
Но нужно и форму объекта закрывать, чтоб она не пыталась закрываться с перепроведением еще раз.

После всего этого можно выполнить расчеты и произвести запись в поля Объекта и записать его с режимом записи документа Запись (не проведение, а только запись)

Но если это у вас такая прикольная самописка... Не храните дополнительные сведения внутри ДокументОбъект. Храните их в дополнительных сведениях. А на форме пользователю и в обработках везде вам все равно придется прописывать заново, что данные сведения должны или читаться и выводится в отчетах или отображаться в формах.
4 salvator
 
10.10.22
20:25
(3) В дополнительных сведениях хранить можно, конечно. Но хотелось бы, чтобы данные были именно в табличной части.
5 Фрэнки
 
10.10.22
20:28
Можно где угодно хранить. РежимЗаписиДокумента.Запись и храни. Но так хотеть не нужно. Больше минусов, чем плюсов от такого хранения.
6 salvator
 
10.10.22
21:07
(5) Я согласен с тем, что так не комильфо. Буду искать пути альтернативного решения. Можете вкратце описать минусы, ну, кроме того, что увеличивается время проведения документа?
7 Фрэнки
 
10.10.22
21:28
А вермя проведения документа не увеличивается. Но изменение данных в табличной части объекта перезаписывает весь объект. Не перепроводит, а перезаписывает.
Например, сегодня я возился с документами реализации, в которых были тысячи строк. Для них перезапись объекта не очень приятная процедура.
Ну и перепроведение тоже.

Т.е. ты пишешь выше - будет дважды перезаписываться документ. Зачем? Перепроводится он будет один раз, если с режимом записи документа не промахнешься.
Кроме собственно времени перезаписи, при этом же выполняются разные действия над полями в ТЧ документов. Если документы почти не насыщены разными подробностями, то и не страшно.
Но мы же говорим о неких типовых конфигурациях?

Когда говоришь о самописной, то ситуация может сильно отличаться.
У меня был опыт умышленного отказа от хранения подробных данных результатов расчетов в ТЧ документов. В самописной конфе. И там все данные действительно были записаны в движениях по регистрам. А движения формировались по данным из объекта и по табчастям объекта. Есть смысл модифицировать данные объекта после проведения по регистрам? Нет. Рисковано, что на огромных количествах строк в оперативных таблицах могут появляться расхождения, если при этом в оперативном контуре будут работать множество пользователей.
8 salvator
 
10.10.22
22:17
(7) "Т.е. ты пишешь выше - будет дважды перезаписываться документ. Зачем? Перепроводится он будет один раз, если с режимом записи документа не промахнешься."

Ну так перед проведением документа выполняется запись, затем еще после изменения реквизита я добавлю метод "Записать" с режимим "Запись".
9 RomanYS
 
10.10.22
22:39
(8) можно посчитать всё перед записью, тогда запись после проведения не понадобится.
Раскрыл бы прикладную задачу, может твой велосипед уже давно обкатан
10 rudnitskij
 
10.10.22
23:27
(0) Если нужно иметь доступ к этой цифре только в открытой форме - сделайте на форме реквизит и получайте значение из регистра при открытии формы
Если нужно иметь возможность к этой цифре запросом - она и так лежит в регистре, зачем ее еще куда-то писать?
11 roman52
 
10.10.22
23:29
если хотите гланды потрогать, то хотя бы гуманно:
1. взводить доп.свойство-флаг при проведении
2. регл.заданием сбрасывать флаг и при необходимости записывать данные в таб.часть (с ОбменДанными.Загрузка = Истина)
выигрыш = транзакцию проведения не будет растягивать повторной записью всего объекта

в общем случае достаточно варианта (10)
12 ДедМорроз
 
11.10.22
00:54
Тут все просто.
Если результат,который будет записываться,зависит только от данных документа,то его хранят в документе и рассчитывают до его записи.
Если результат зависит от документа и от данных регистров,то хранить такой результат нужно в регистре,так как он может измениться,и его можно будет обновить без перезаписи документа.

Отход от этого правила приводит к куче проблем.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший