Имя: Пароль:
1C
1C 7.7
v7: Как программно ПЕРЕзаписать документ?
,
0 e-9
 
11.08.14
16:33
Есть документ (КадровоеПеремещение). Нужно, чтобы при его проведении, программно создавался и сохранялся документ ПриказНаОплатуПоСреднему (значения реквизитов которого берутся из реквизитов кадрового перемещения).
Если же РЕДАКТИРУЕМ уже ранее проведенное кадровое перемещение, то, при перепроведении, должен поменяться и зависимый ПриказНаОплатуПоСреднему.
Сделал так: в документе КадровоеПеремещение завел реквизит ДокНаОплатуПоСреднему - в него записываю ссылку на ПриказНаОплатуПоСреднему. Соответственно, если этот реквизит пуст - создаем новый документ; если не пуст - редактируем имеющийся.
Так вот, при первом проведении, все ок - документ создается, ссылка сохраняется. А во втором случае, на строке "Док.Записать();" получаю ошибку "Не выбран документ!". Вот сам код:
    //*******
    Док = СоздатьОбъект("Документ.ПриказНаОплатуПоСреднему");
    Если ДокНаОплатуПоСреднему = ПолучитьПустоеЗначение("Документ.ПриказНаОплатуПоСреднему") Тогда
        Док.Новый();
    Иначе
        Док = ДокНаОплатуПоСреднему;
    КонецЕсли;
    Док.Сотрудник = Сотрудник;
    Док.Начало = Начало;
//...и другие реквизиты
    Док.Записать(); //ВОТ ТУТ ПОЛУЧАЮ ОШИБКУ!!!
    ДокНаОплатуПоСреднему = Док.ТекущийДокумент();

...Убился уже - почему "не выбран"??!!!
1 Voronve
 
11.08.14
16:35
Если ДокНаОплатуПоСреднему = ПолучитьПустоеЗначение("Документ.ПриказНаОплатуПоСреднему") Тогда
        Док.Новый();
    Иначе
        Док.НайтиДокумент(ДокНаОплатуПоСреднему);
    КонецЕсли;
2 Voronve
 
11.08.14
16:36
Если ДокНаОплатуПоСреднему = ПолучитьПустоеЗначение("Документ.ПриказНаОплатуПоСреднему") Тогда
Замени на
Если ПустоеЗначение(ДокНаОплатуПоСреднему) = 1 Тогда
3 e-9
 
11.08.14
16:40
(1) Я пробовал этот вариант - "Объект не может быть перепозиционирован!", на строке
Док.НайтиДокумент(ДокНаОплатуПоСреднему);
(2) к гадалкам я вроде не обращался - в чем рациональное зерно такой замены???
4 e-9
 
11.08.14
16:44
в отладчике вижу, что Док, в случае перепроведения, получает нужное значение - т.е. ссылку на тот документ, который был создан при первом проведении.
Тем более непонятно - почему "не выбран"!
5 Ёпрст
 
11.08.14
16:45
(3)В том, что всегда в ветку иначе летит, где НайтиДокумент(пусто, ибо в реквизите нихрена нет) приводит к ошибке ""Объект не может быть перепозиционирован!", н"
6 Ёпрст
 
11.08.14
16:46
(4) Записать() есть только у объектов созданные через СоздатьОбъект().
7 Ёпрст
 
11.08.14
16:46
записывать ссылку - нельзя
8 e-9
 
11.08.14
16:56
ой-ёй....(1) прав Voronve - а я слепошарый, вместо
Док.НайтиДокумент(ДокНаОплатуПоСреднему);
написал
Док = НайтиДокумент(ДокНаОплатуПоСреднему);
Заменил, как надо - и все супер! и даже с
Если ДокНаОплатуПоСреднему = ПолучитьПустоеЗначение("Документ.ПриказНаОплатуПоСреднему") Тогда
:)))
Так что, Ёпрст, со всем уважением - в (2) особого смысла нет. Ниче в ветку Иначе не летит, когда не надо, и летит, когда надо:)
9 e-9
 
11.08.14
16:57
ну и, (7,8) - в точку, значит, вместе с (1)...
10 e-9
 
11.08.14
16:57
(тьфу, не 7,8 а 6,7)
11 Voronve
 
11.08.14
17:12
Смысл в 2 в том что у тебя второй объект не создается. Обходимся методами платформы. А вообще:

Если Док.НайтиДокумент(ДокНаОплатуПоСреднему) = 0 Тогда
    Док.Новый();
КонецЕсли;

Так и элегантнее и методами объекта обходимся.
12 e-9
 
11.08.14
17:35
(11) хм...попробовал - теперь при первом проведении, когда документ на оплату по среднему должен первый раз создаться, выдает "Недопустимая операция", на строке
Если Док.НайтиДокумент(ДокНаОплатуПоСреднему) = 0 Тогда
13 e-9
 
11.08.14
17:35
а уже ранее созданные - перепроводит без проблем
14 e-9
 
11.08.14
17:48
не, не идет (11), как ни крути - видимо, НайтиДокумент должен обязательно получить непустую ссылку...
остальные варианты (через ПустоеЗначение и ПолучитьПустоеЗначение) работают норм.

Спасибо за помощь! Это я с самого начала накосячил с Док = НайтиДокумент...;
15 e-9
 
12.08.14
11:54
...да, кстати....А я случайно не костыль мастерю?:)
По требованиям, документ ПриказНаОплатуПоСреднему МОЖЕТ создаваться (необязательно!) при проведении документа КадровоеПеремещение; либо, может создаваться и независимо от кадрового перемещения.
Может, тут нужно было использовать механизм "Ввод на основании", или подчиненных документов?
16 e-9
 
12.08.14
12:10
(хотя, механизм подчиненных я уже и так реализовал - только в другую сторону:D)
17 User_Agronom
 
12.08.14
12:17
Поправь на
Док = ДокНаОплатуПоСреднему.ПолучитьОбъект();
18 e-9
 
12.08.14
12:29
(17) это вместо "Док.НайтиДокумент(ДокНаОплатуПоСреднему)"?
Будет быстрее, дальше, выше?..
19 User_Agronom
 
12.08.14
12:30
(18)
Если ДокНаОплатуПоСреднему = ПолучитьПустоеЗначение("Документ.ПриказНаОплатуПоСреднему") Тогда
        Док.Новый();
    Иначе
        Док = ДокНаОплатуПоСреднему.ПолучитьОбъект();
    КонецЕсли;
20 e-9
 
12.08.14
12:38
(19) так я в (17) про то же
так в чем смысл замены? работает и "Док.НайтиДокумент(ДокНаОплатуПоСреднему)"
21 Duke1C
 
12.08.14
13:01
(15) ИМХО "правильнее" будет заюзать Ввод на основании, но если "тупой" юзер забывает при изменении основания, изменить подчиненный документ, то делай как делаешь.
(20) Не слушай (19), он от 8-ки не отошел
22 e-9
 
12.08.14
13:03
(21) так и думал - но всегда легче, когда получаешь подтверждение от "старших":)
23 User_Agronom
 
12.08.14
13:07
(21) Это 7-ка? Ну тогда пардон, я ХЗ как там.
24 drunkovsky
 
14.08.14
16:30
// я не понимаю цели этого условия :
    // Если ДокНаОплатуПоСреднему = ПолучитьПустоеЗначение("Документ.ПриказНаОплатуПоСреднему") Тогда
    // из того, что я понял - вот вариант, если ДокНаОплатуПоСреднему - это ен реквизит, а переменная
    //
    
    Если ПустоеЗначение(ДокНаОплатуПоСреднему)=1 Тогда
        ДокНаОплатуПоСреднему=СоздатьОбъект("Документ.ПриказНаОплатуПоСреднему");
        ДокНаОплатуПоСреднему.Новый();
    КонецЕсли;
    ДокНаОплатуПоСреднему.Сотрудник = Сотрудник;
    ДокНаОплатуПоСреднему.Начало = Начало;
    ДокНаОплатуПоСреднему.Записать();
25 e-9
 
15.08.14
16:51
(24) ДокНаОплатуПоСреднему - это как раз реквизит. Был.....:)
все переделал