Имя: Пароль:
1C
1С v8
Как дозаписать реквизит документа после его проведения?
,
0 Prog111
 
20.04.16
11:57
Нужно после проведения документа реализации (после того, как сформируются его движения), на основании этих движений дозаписать один из реквизитов документа. Как методически правильно это сделать? Конфигурация УТ 10.3
1 aleks_default
 
20.04.16
11:58
ПослеЗаписи()
2 Господин ПЖ
 
20.04.16
11:58
(1) это событие есть только в форме
3 Fragster
 
гуру
20.04.16
11:59
чтобы все было правильно - надо писать в РС
4 1Сергей
 
20.04.16
12:02
методически правильно высчитать этот реквизит при формировании движений и записать его
5 Prog111
 
20.04.16
12:04
В какой момент работает подписка на событие с событием "ОбработкаПроведения"? Возможно ли использование подписки на событие для такого случая?
6 DomovoiVShoke
 
20.04.16
12:05
(0)В подписке лучше всего с учетом (3). Но еще лучше вообще никогда так не делать.
7 PR пять
 
20.04.16
12:06
(5) Будет цикл
8 Prog111
 
20.04.16
12:06
(4) Там достаточно сложный подсчёт по себестоимости, лучше считывать уже готовые результаты проведения.
9 Fragster
 
гуру
20.04.16
12:06
10 PR пять
 
20.04.16
12:06
(0) А что за задача-то?
11 Sabbath
 
20.04.16
12:07
(0) По мне так слегка странная задача. Я так понял, реквизит не типовой. Можно было сделать доп. свойство или РС, где хранить это значение, а писать туда подпиской на события
12 Prog111
 
20.04.16
12:09
(10) Сумма вознаграждения менеджера, зависящее от прибыли документа. Да, реквизит нетиповой.
13 Sabbath
 
20.04.16
12:11
(12) А зачем тебе это в документе хранить? Сумма вознаграждения, наверно, нужна в какой-то обработке или отчете раз в месяц. Считай ее там, а не в документе.
Всю задачу не знаю, но выглядит так.
14 DomovoiVShoke
 
20.04.16
12:12
(12)В подписке и в отдельный регистр записывать.
15 PR пять
 
20.04.16
12:13
(12) Пипец. Такие вещи в регистры пишутся. Накопления.
16 lxndr
 
20.04.16
12:15
(0) >> методически правильно
никак.
Сумма вознаграждения менеджера зависит от марьванны, которая вколотит документы до обеда или после обеда?
17 Prog111
 
20.04.16
12:16
(16) А какая разница - до обеда или после обеда?)
18 lxndr
 
20.04.16
12:17
(17) потому что менеджер торгует в обед
19 Prog111
 
20.04.16
12:20
Хотелось бы делать это непосредственно в документе ещё и потому, чтобы была возможность вручную менять эту сумму. То есть провели документ - сумма автоматически просчиталась и записалась в реквизит, отображаемый на форме. При необходимости руководитель менеджеров может отредактировать эту сумму и записать документ заново.
20 Prog111
 
20.04.16
12:21
(18) И? Как это повлияет на документ?
21 PR пять
 
20.04.16
12:24
(19) Ну так меняй через форму документа запись в регистре
22 PR пять
 
20.04.16
12:25
+(21) В регистре сведений, на основании чего уже делается запись в регистр накопления
23 DomovoiVShoke
 
20.04.16
12:28
(19)Привыкайте документы проводить только оперативно, соответственно изменять проведенные нельзя.

Вообще какая схема подсчета вознаграждения? Может оно должно считаться сразу при наборе ТЧ? И менять тогда в документе до проведения.
24 aleks_default
 
20.04.16
12:30
"При необходимости руководитель менеджеров может отредактировать эту сумму и записать документ заново."
потом руководитель записывает проведенный документ - движения рассчитываются заново - сумма опять становится прежней.
25 Prog111
 
20.04.16
12:30
(23) Грубо говоря, процент менеджера, умноженный на разницу между суммой продажи и себестоимостью товаров по документу.
26 AneJIbcuH
 
20.04.16
12:30
(24) Только хотел сказать :))
27 varyag
 
20.04.16
12:31
если не париться, то ОбменДанными = Истина ))) но это не правильно
28 Prog111
 
20.04.16
12:31
(24) Ну здесь уже галочка влияет на то, рассчитывать ли сумму из движений документа или брать уже вручную установленную сумму.
29 AneJIbcuH
 
20.04.16
12:31
(0) Подход крайне не верный, а почему уже всё сказали.
30 DomovoiVShoke
 
20.04.16
12:33
(25)Это стандартная схема, считается сразу до проведения документа и меняется руководителем до проведения.
31 Prog111
 
20.04.16
12:33
(22) Зачем 2 регистра использовать? По идее, если использовать внешний регистр - то достаточно будет РС или РН, чтобы записать и считыть в дальнейшем всю необходимую информацию.
32 gae
 
20.04.16
12:34
Надо сделать отдельный документ, который на основе первички и её движений соберет все за период и посчитает и запишет себе в ТЧ эти суммы, ну и если надо в регистр какой-нибудь.

В этом же документе можно и поменять результаты расчета вручную.

Если вдруг себестоимость поплывет, это же по всем документам пересчет надо будет делать, а при помощи отдельного документа - зашли в него и пресчитали-перезаполнили.

И права доступа на этот документ можно только уполномоченному дать.
33 Prog111
 
20.04.16
12:35
(30) Мне гораздо проще считать из уже готовых движений по себестоимости, чем рассчитывать, какая выйдет себестоимость ДО проведения документа.
34 Vanilla26
 
20.04.16
12:35
(33) Если без заморочек
ОбъектДокумента.Записать(РежимЗаписиДокумента.Проведение);
                        Для каждого СтрокаДвижений из ОбъектДокумента.Движения.Регистр Цикл
                            Если НЕ ЗначениеЗаполенено(ОбъектДокумента.ТвойРеквизит) Тогда
                                ОбъектДокумента.ТвойРеквизит = СтрокаДвижений.Сумма;    
                            КонецЕсли;
                        КонецЦикла;
                        ОбъектДокумента.Записать(РежимЗаписиДокумента.Запись);
35 Prog111
 
20.04.16
12:37
(32) Сейчас наоборот от этой схемы решили уйти, ибо не хотят лишних телодвижений по формированию отдельного итогового документа. К тому же, результаты по вознаграждению желают видеть актуальные, а не ждать, пока ответственное лицо просчитает промежуточные результаты в отдельном документе.
36 DomovoiVShoke
 
20.04.16
12:38
(33)Ну тебе говорят как надо, а ты уже сам себе костылей добавляй) Ты не представляешь как люди проклянают БП в которой разрабы избрали принцип как у тебя. Мало того что работать с этим очень сложно, так грейдануть документ в разы усложняется.
37 Prog111
 
20.04.16
12:39
(34) Это куда именно засунуть? В модуле документа в процедуре обработки проведения?
38 Vanilla26
 
20.04.16
12:41
(37) лучше никуда) херню я написал
39 Prog111
 
20.04.16
12:42
(38) Ну вроде выглядит симпатично)
40 Лефмихалыч
 
20.04.16
12:43
О = Ссылка.ПолучитьОбъект();
О.Реквизит = Значение;
О.ОбменДанными.Загрузка = Истина;
О.Записать();
41 aleks_default
 
20.04.16
12:43
(35) ну да ну да им проще облазить сотню документов и сложить по каждому сумму, чем получить данные отчетом по одному регистру... че за бред
42 PR пять
 
20.04.16
12:44
(31) По идее для расчета вознаграждения менеджера используется отдельный документ и никому не трахается мозг на тему своих копроидей.
43 PR пять
 
20.04.16
12:45
+(42) Ну то есть (32)
44 elCust
 
20.04.16
12:45
(0) В чем проблема, если документ сделает еще одно движение в регистр сведений.
45 PR пять
 
20.04.16
12:46
(35) Кому какое дело, куда вы там решили уйти?
Придумали какую-то хрень, сами и расхлебывайте свои геморрои.
46 PR пять
 
20.04.16
12:47
(40) И все это в обработке проведения, ага.
47 gae
 
20.04.16
12:48
(35) Цеплять к первичке кучу всякой хрени - хреново.
Конечно, если процесс требует - то можно и извратиться, только надо понимать последствия и сложности.
48 Prog111
 
20.04.16
12:54
Уговорили...) Теперь расскажите, как православно записать данные в регистр сведений? В подписке на события с событием "ОбработкаПроведения"?

Далее, если эту сумму необходимо видеть и менять в форме документа - то просто создаю поле в форме и в ней отображаю данные из РС.
49 PR пять
 
20.04.16
12:54
(47) Цеплять к первичке кучу всякой хрени — нормально.
Но только когда она нормально цепляется.
50 gae
 
20.04.16
12:55
Корректнее всего, если уж нужна типа оперативность, было бы в процедурах проведения выловить момент, когда себестоимость посчитана и лежит в переменных, и готова к записи в регистр (или может быть уже записана), и записать её ее в свой регистр "Вознаграждение".
51 Лефмихалыч
 
20.04.16
12:56
а методически правильно записывать все реквизиты до проведения
52 gae
 
20.04.16
12:56
(49) нормально цеплять нормальные вещи, а хрень цеплять хреново :) логика.
53 lxndr
 
20.04.16
12:58
(50) она может быть совсем не посчитана и не готова
54 gae
 
20.04.16
12:59
(53) Я предполагаю, то у них по среднескользящей или ФИФО считается. Если исходные остатки есть - то будет посчитана.
55 aleks_default
 
20.04.16
13:01
Делаешь регистр накопления с измерениями менеджер, документ и ресусами сумма и ручное изменение  и описываешь проведение по этому регистру своего документа
56 DomovoiVShoke
 
20.04.16
13:03
(54)В реализации есть партии, в партиях есть себестоимость. Тут даже гадать не надо как считать прибыль.
57 Prog111
 
20.04.16
13:07
(50) В документе "Реализация" в типовой процедуре ОбработкаПроведения есть такой момент, с которым не могу разобраться: в конце процедуры делается следующее:

// Движения по документу
    Если Не Отказ Тогда

        // Подготовим таблицу скидок для проведения.
        ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, ТаблицаПоУслугам, СтруктураШапкиДокумента);

        ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре,
                            ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);
    КонецЕсли;
    Сообщить(ЭтотОбъект);
КонецПроцедуры // ОбработкаПроведения()


Когда в отладчике останавливаюсь на Сообщить(ЭтотОбъект), то движения по некоторым регистрам документа уже есть (например, РН "Продажи"), а по РН "ПродажиСебестоимость" движений ещё нет. А в следующем шаге, когда вроде ничего уже и не происходит - то движения появляются.
58 gae
 
20.04.16
13:13
(57) Движения могут быть записаны где-то в общих модулях без использования ЭтотОбъект.Движения. А какие-то записываются по окончании Обработки проведения.
59 Prog111
 
20.04.16
13:28
(58) А как-то можно отловить в отладчике момент записи в регистр "ПродажиСебестоимость"? Ведь что-то же происходит в конце процедуры ОбработкаПроведения, только в отладчик не попадает...
60 DomovoiVShoke
 
20.04.16
13:59
Тогда дам последний совет: напишите документацию на такие велосипеды, а то программист, который придет после вас - проклянет.
61 zak555
 
20.04.16
14:43
Пишите в рс дополнительные свед
62 FIXXXL
 
20.04.16
15:10
(59) а чего бы регЗаданием не воспользоваться для такого расчета? пусть движения пишет в РН твой
63 Serg_1960
 
20.04.16
16:09
"Нормальные герои всегда идут в обход"(с) :( вредные советы :)

В обработчике подписки на событие "ПередЗаписьюРегистраНакопленияПродажиСебестоимости":

Процедура ПередЗаписьюРегистраНакопленияПродажиСебестоимости(Источник, Отказ, Замещение)
        
    Если Отказ ИЛИ Источник.ОбменДанными.Загрузка ИЛИ Источник.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ДокСсылка = Источник.Отбор.Регистратор.Значение;
    
    Если ТипЗнч(ДокСсылка) <> Тип("ДокументСсылка.ТипТвоегоДокумента") Тогда
        Возврат;
    КонецЕсли
    
    ТекЗначение = ТвояФункцияРасчетаЗначенияДляРеквизитаДокумента(Источник);
    
    Если ТекЗначение <> ДокСсылка.ТвойРеквизит Тогда
        ДокОбъект = ДокСсылка.ПолучитьОбъект();
        ДокОбъект.ТвойРеквизит = ТекЗначение;
        Докбъект.ОбменДанными.Загрузка = Истина;
        ДокОбъект.Записать();
        ДокОбъект = Неопределено;
    КонецЕсли;
    
    Возврат;

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