|   |   | 
| 
 | 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) ДокНаОплатуПоСреднему - это как раз реквизит. Был.....:)
 все переделал | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |