Имя: Пароль:
1C
1C 7.7
v7: Создание документа
0 Slypower
 
07.09.15
13:47
Добрый день. Помогите разобраться с дилеммой.
Создается документ. При создании автоматически создается 2-й. Вот код:
    
Док.Новый();
Док.НомерДок=НомерДок;
Док.ДатаДок=ДатаДок;
Док.Сумма=Сумма;  
Док.Контрагент=Клиент;
Док.Договор=Клиент.ОсновнойДоговор;
Док.Валюта=Валюта;
Док.Фирма=Фирма;  
Док.Автор=Автор;
Док.Комментарий=Комментарий;
Док.Курс=Курс;
Док.АвтоВремяКонецДня();
Док.Записать();
Док.Провести();

При создании 2го дока, он имеет время создания ранее чем первый, но это не критично.
Вопрос в том, что в журнале документов 2й документ виден без контрагента и при восстановлении последовательности выскакивает ошибка: Не найден контрагент.
Если вручную открыть 2-1 док, то контрагент виден, при сохрании, он появляется. При перепроведении 1-го документа, во 2-м тоже появляется контрагент.
Почему тогда при начальном создании его нет?
1 Масянька
 
07.09.15
13:49
(0) Что значит "При создании автоматически создается 2-й"?
2 Slypower
 
07.09.15
13:53
(1) При создании 1-го документа, по нажатию кнопки ОК или Провести, создается 2-й документ
3 ДенисЧ
 
07.09.15
13:55
(2) расстрелять
4 1Сергей
 
07.09.15
13:55
(2) ещё и проводится?
5 Масянька
 
07.09.15
13:58
(2) Ищи, где косяк (не путать с табаком).
6 Slypower
 
07.09.15
14:00
(4) а почему бы и нет?
7 Slypower
 
07.09.15
14:01
Начало пропущено:
Док=СоздатьОбъект("Документ.Документ");
Док.ВыбратьДокументы();
8 Масянька
 
07.09.15
14:02
(7) Давай уж весь папирус...
9 aka AMIGO
 
07.09.15
14:05
"Документ.Документ" - интересная конструкция :)
10 Slypower
 
07.09.15
14:51
(9) Хорошо, Документ.НазваниеДокумента.
Как называется документ - это уже каждому свое, и это строчка никак не влияет на мою проблему
11 Масянька
 
07.09.15
14:59
(10) Показывай весь папирус (код).
12 HawkEye
 
07.09.15
15:11
(7) ужас какой и выбрать и Новый в одном месте, в чем сакральный смысл сего опуса?

и собс-но... вопрос в чем? "При создании 1-го документа, по нажатию кнопки ОК или Провести, создается 2-й документ" - в этом? при чем тут тогда код из (0) ?
13 HawkEye
 
07.09.15
15:13
(0) "Почему тогда при начальном создании его нет?" - потому что он (контрагент) проставляется при интерактивном проведении документа.
14 Slypower
 
07.09.15
15:16
(12) Это так нужно, это проверки:

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

(13) Интересно то, что если не вносить сумму в документ вообще, то контрагент появляется без проблем. Значит не только при интерактивном проведении
15 palpetrovich
 
07.09.15
15:22
(7) зря уточнил :)
Док.ВыбратьДокументы();
Если Док.НайтиПоНомеру(НомерДок,ДатаДок)<>1 Тогда
16 palpetrovich
 
07.09.15
15:26
+(15) ну и в ветке Иначе так вернее будет:
Если Док.ВыбратьПоНомеру(НомерДок,ДатаДок)=1 Тогда
...
17 Масянька
 
07.09.15
15:27
(14) А в чём состоит задача?
18 HawkEye
 
07.09.15
15:40
(14) еще веселее...
ВыбратьДокументы() - зачем это?

зачем после НайтиПоНомеру, делать еще и выбратьПОНомеру?

какой смысл гадать когда появляется контрагент - если можно открыть код и посмотреть?

ты кем работаешь?
19 Масянька
 
07.09.15
15:47
(18) Лучше перебдеть, чем не добдеть (С) :)))
20 HawkEye
 
07.09.15
15:51
+18, судя по совпадению реквизитов и наличию НомерДок и ДатаДок, ты это все из самого документа делаешь?
21 Slypower
 
07.09.15
15:55
(18)Гадать не нужно, и что не так в коде может быть, что не видно контрагента? Неужели все реквизиты нормально заполняются при таком коде, а вот контрагент очень особенный?
(17) Во 2-й Документ, который автоматически создается, никто не лазит и не изменяет вообще, все делается через первый. 2-й даже в журнале по покупателям не показывается, поэтому и идет такой перебор. Это 2 документа должны быть одинаковыми, только модули документов отличается.
22 Slypower
 
07.09.15
15:57
(17) Задача в том,  решить проблему: не восстанавливается последовательность, т.к. не видит контрагент документа №2
23 Масянька
 
07.09.15
15:58
(22) Абсолютно ничего не поняла...
24 HawkEye
 
07.09.15
15:59
(21) еще раз, для тех кто в танке, ты не тот кусок кода смотришь...

(22) зачем контрагентУ видеть документ №2? ))
25 Slypower
 
07.09.15
16:05
(24) Почему при 2-х одинаковых документах (одинаковые модули формы)возникла данная проблема?
Почему один при восстановлении последовательности проводится, а второй нет, т.к. пишет: "не заполнен контрагент"?
Абсолютно одинаковые, только смысл работы: один увеличивает долг, второй уменьшает. И это прописано в модуле документа.
Второй раз напишу: при повторном проведении документа 1, во 2м документе контрагент уже заполняется. Что ему мешаем при первом заполниться?
26 HawkEye
 
07.09.15
16:11
(24)
1. если один увеличивает, а другой уменьшает - это не одинаковые документы
2. потому что, в одном контрагент заполнен, а во втором нет, это же логично, разве нет?
3. стопитедесятый раз повторю... кривые руки писателя кода мешают...
27 kobzon2
 
07.09.15
16:11
Док.Контрагент=Клиент;
Клиент это что? Откуда берется?
28 Масянька
 
07.09.15
16:19
(26) Ты смысл понял? Объясни, пожалуйста.
29 Slypower
 
07.09.15
16:23
(27) в документе 1 задаются: контрагент, клиент. Вот клиент  это контрагент для документа 2
30 HawkEye
 
07.09.15
16:27
(28) еще не до конца..

юноша, создает интерактивно док1, при записи\проведении этого док1, видимо программно создается и проводится док2, у которого все реквизиты совпадают с док1, даже номер и дата (видимо юноша не в курсе про подчиненные документы, что судя по коду из (14) неудивительно).. и видимо при первом проведении док1 в док2 не попадает контрагент, а при втором попадает, вот юноша и вопрошает "а почему собственно?"... ))

мне кажется так )
31 Масянька
 
07.09.15
16:30
(30) П-п-переведи (С)  :))))))
Юноша не колется - зачем это всё? Описал бы задачу, знающие люди предложили бы массу нормальных вариантов...
32 Slypower
 
07.09.15
16:30
(30) все так, а что в коде (14) не так? Если в нем загвоздка, так пальцем покажите. Дополнение в том, что документе 1 2 реквизита: контрагент и клиент.
33 kobzon2
 
07.09.15
16:31
Я блин вапще не понимаю как так вапще создается Док.НомерДок=НомерДок; О_о
Номер же не уникальный получается.
34 Slypower
 
07.09.15
16:31
Если я правильно понимаю, Док.ВыбратьДокументы(); мешает, т.к. при первом создании еще нет данного документа?
35 Масянька
 
07.09.15
16:32
(33)
Но всё-таки знай -
Ты не один. (C)
36 oslokot
 
07.09.15
16:32
Даже мне стало интересно)
(32) а где в коде (14) реквизит "клиент" и какого он типа?
37 Slypower
 
07.09.15
16:33
(34) нет, все таки не мешает. И почему если не задавать сумму в документе, то даже при первом проведении и создании все отображается хорошо.
38 Масянька
 
07.09.15
16:34
(36) Мне интересно - почему бы не использовать НаОсновании()?
39 oslokot
 
07.09.15
16:35
Люблю темы про клюшки
40 Slypower
 
07.09.15
16:35
(36)  Клиент-справочник.Контрагенты.
из (14) Док.Контрагент=Клиент;. Вот для чего нужен этот реквизит
41 Масянька
 
07.09.15
16:36
(39) Это кто там кодит (С) (пардон, вырвалось) :)))))
42 kobzon2
 
07.09.15
16:37
Давай так! Документ уже есть.
Начинает проводиться первый. Там: Док=СоздатьОбъект("Документ.НазваниеДокумента");
Услови6 Если Док.НайтиПоНомеру(НомерДок,ДатаДок)<>1 Тогда - выполняется.
И:
Док.Контрагент=Клиент;

Там окошечко в котором написано клиент?)) Или что это за зверь?)
43 oslokot
 
07.09.15
16:37
(41) откуда выражение?)
44 aka AMIGO
 
07.09.15
16:38
В цикле выбора документов создается еще один, точно такой-же документ..

И тут-же выбирается следующий документ!..

Напрашивается вопрос - а что будет с циклом?

Почему-то ТС не приводит весь код обработки?
Заставлять додумывать за него, не объяснив цель - это неуважение..
45 Масянька
 
07.09.15
16:38
(43) Анекдот (с бородой), в котором действующие лица вместо "х" говорили "к" (проблемы с дикцией).
46 palpetrovich
 
07.09.15
16:41
(39) это не "тема про клюшки", это совсем доугая тема ;)
47 aka AMIGO
 
07.09.15
16:42
(46) ты прав, клюшки тут по-боку..
48 kobzon2
 
07.09.15
16:43
(40) На строчке какой-нить: Док.СделатьНеПроведенным(); Если в отладчике посмотреть Док. Что тама??
49 kobzon2
 
07.09.15
16:46
+ (48) Я просто к тому что Док.ВыбратьПоНомеру(НомерДок,ДатаДок); Этого достаточно чтобы очутиться в найденном документе? Или мы все еще будем тут: Док.Новый();
50 Slypower
 
07.09.15
16:48
(49) почему там? Там же:
Если Док.НайтиПоНомеру(НомерДок,ДатаДок)<>1 Тогда
    Док.Новый();
Иначе
    Док.ВыбратьПоНомеру(НомерДок,ДатаДок);
    Если Док.ПометкаУдаления()=1 Тогда
        Док.СнятьПометкуУдаления();  
    КонецЕсли;
    Док.СделатьНеПроведенным();
КонецЕсли;
51 aka AMIGO
 
07.09.15
16:49
блин.. там и цикла нет.. Просто  зачем-то "Выбрать документы(...) и тут-же - найти по номеру..
52 Масянька
 
07.09.15
16:49
(50) Ну, будь ты человеком - объясни смысл белиберды...
53 kobzon2
 
07.09.15
16:49
(50) А ну да не в Док.Новый();
54 Slypower
 
07.09.15
16:54
(52) в (28) все объяснено же.
Попробую по другому. Есть контора, на нее создали карточку контрагента. У нее есть 2 магазина и более со своими директорами. Контора заплатила сумму какую-то за проданный товар. Так вот, сумму, что мы получили от нее вешаем на "Клиент" (про него и пишется все тут), и такую же сумму мы вешаем на один из магазинов "Контрагент". Мы создаем один документ, чтобы 2 не создавать в ручную, а программа уже сама создает 2-й документ. В день таких документов №1 может быть от 100, и представьте как это сокращает работу
55 Масянька
 
07.09.15
16:56
(54) Ну, наконец-таки...
То есть - нужно ... А чего нужно-то?
Один клиент платит за другого и что нужно в результате?
Я ничего не понимаю...
56 Slypower
 
07.09.15
16:59
(55) Это папка,  у него 2 детей. Каждые из них работают отдельно, и заказы отдельно, и продажи отдельно, но папка платит за них. Так вот чтобы контролировать долги сыновей, мы разбрасываем папкины деньги этими доками, ведь и продажи у них разные идут.
Если так не понятно, то можно и про царей и их шнырей писать
57 Масянька
 
07.09.15
17:04
(56) Плательщик/грузополучатель.
58 Slypower
 
07.09.15
17:15
(57) ааааа, ну тогда все ясно, проблема решена)))
59 Масянька
 
07.09.15
17:18
(58) И вот - кто ты после этого? Сказал бы после (17) - давно бы уже деньги в кармане лежали :(
60 Slypower
 
07.09.15
17:20
(59) а проблема в другом, что кому какие деньги - это не проблема, никто не откажется)))
Вопрос в коде, и мне так не понятно, что сделано не так и где ошибка
61 Масянька
 
07.09.15
17:25
(60) Вопрос не в коде...
Вопрос в понимании поставленной задачи и не знании мат. части и типовых механизмов.
Век живи - век учись (С)
И не надо про продолжение поговорки. Оба варианта - самостоятельны.
62 HawkEye
 
07.09.15
18:41
(33) это разные документы )) ну и так-то номер может быть не уникальным ))

(34) ничего он не мешает, он просто нафиг не нужен... вообще
63 HawkEye
 
07.09.15
18:42
(44) где ты там цикл увидел? ))
64 HawkEye
 
07.09.15
18:45
(60) для начала, покажи весь код из ПриЗаписи() первого документа.
65 alexandr1
 
07.09.15
19:16
А что при проведении находится в клиент, или оно само заполняется если пустое?
66 alexandr1
 
07.09.15
19:30
В каком месте код?
67 HawkEye
 
07.09.15
19:39
(66) ну в ОбработкеПроведения() он точно не может быть )))
68 alexandr1
 
07.09.15
20:19
(67) Почему нет, может и там. А может у него на кнопку что ни будь еще повешено.
69 HawkEye
 
07.09.15
20:21
(68) вот ТАМ как раз не может,
а на кнопку что угодно может быть повешено )
70 alexandr1
 
07.09.15
20:48
(69) Не вижу никаких проблем.
71 alexandr1
 
07.09.15
20:59
(69) ПРОВОДИТЬ НЕЛЬЗЯ,СОЗДАВАТЬ МОЖНО
72 HawkEye
 
07.09.15
20:59
(70) жаль
73 HawkEye
 
07.09.15
21:00
(71) я в курсе, или это ты себе кричишь? ))
74 aka AMIGO
 
07.09.15
21:01
(63) у меня уже до автоматизма дошло сочетание ВыбратьДоки() и цикл по выборке.. Тем более, что опенконф делает это автоматически. Я потом поправился, см. (51).
Был неправ, извините :)

ЗЫ. и всё равно, пост с кодом такой покоцаный, что разобраться мне лично так и не удалось.. мозги уже не те стали :)

ЗЗЫ. а Масянька - молодец :)
75 alexandr1
 
07.09.15
21:01
(73) Отвечаю, вдруг не видно )
76 alexandr1
 
07.09.15
21:02
(73) С учетом кода, я не удивлюсь что и туда запихнут.
77 HawkEye
 
07.09.15
21:03
(76) там ругаться будет при проведении, а раз не ругается, значит не там...
78 alexandr1
 
07.09.15
21:05
(77) согласен
79 Slypower
 
08.09.15
09:42
(64)

Процедура ПриЗаписи() //Предопределенная процедура
    Перем ОписаниеОш;

    Если глМожноЗаписатьДокумент(Контекст)=0 Тогда
        СтатусВозврата(0);                        
    ИначеЕсли глКонтрольДатыДокумента(Контекст, НачальнаяДатаДокумента)=1 Тогда
        СтатусВозврата(0);  
    Иначе
        Если глПриЗаписиДокОснСФКонтр(Контекст, ВидСчетаФактуры, "ЗаписьКнигиПродаж", НачКонтрагент, НачДоговор, НачФирма, ОписаниеОш) = 0  Тогда
            СтатусВозврата(0);
            Предупреждение(ОписаниеОш, 60);
        Иначе
            НачКонтрагент    = Контрагент;
            НачФирма        = Фирма;  
            НачВалюта        = Валюта;
            НачДоговор        = Договор;
        КонецЕсли;
    КонецЕсли;

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


Это код в документе №1.
(65) Клиента выбираем мы сами, ничего пустое не остается.
http://pixs.ru/showimage/1sJPG_1555156_18717710.jpg вот пример работы
80 HawkEye
 
08.09.15
12:10
(79) оставив в стороне возможность того, что док1 можно просто записать, при этом док2 - проведется...

а чего у тебя в Док1 контрагент и клиент местами поменяны на форме, это то-же какой то особый смысл имеет?
81 Slypower
 
08.09.15
12:13
(80) да, имеет смысл, просто так бы не делал
82 HawkEye
 
08.09.15
13:07
(81) ну кто тебя знает... Найти и Выбрать - же используешь...

покажи модуль проведения документа2
83 Slypower
 
08.09.15
13:24
(82)
Процедура ПриЗаписи() //Предопределенная процедура
    Перем ОписаниеОш;

    Если глМожноЗаписатьДокумент(Контекст)=0 Тогда
        СтатусВозврата(0);                        
    ИначеЕсли глКонтрольДатыДокумента(Контекст, НачальнаяДатаДокумента)=1 Тогда
        СтатусВозврата(0);  
    Иначе
        Если (глПриЗаписиДокОснСФКонтр(Контекст, ВидСчетаФактуры, "ЗаписьКнигиПродаж", НачКонтрагент, НачДоговор, НачФирма, ОписаниеОш) = 0) Тогда
            СтатусВозврата(0);
            Предупреждение(ОписаниеОш, 60);
        Иначе
            НачКонтрагент    = Контрагент;
            НачФирма        = Фирма;  
            НачВалюта        = Валюта;
            НачДоговор        = Договор;
            НачСумма        = Сумма;
        КонецЕсли;
    КонецЕсли;
                  
КонецПроцедуры
84 HawkEye
 
08.09.15
13:26
(83) это у тебя в модуле документа ? ))
надо все что находится в модуле документа
85 Slypower
 
08.09.15
13:27
(84) нет, модуль формы
86 Slypower
 
08.09.15
13:29
(85) нет, конечно, не все. А разве имеет смысл писать Процедуру ПриОткрытии()?
87 HawkEye
 
08.09.15
13:29
(85) а нужен модуль документа, т.е. то, что выполняется при проведении и отмене проведения
88 HawkEye
 
08.09.15
13:30
(86) пока нет, я просил модуль документа
89 Slypower
 
08.09.15
13:32
(87) Все что написано в модуле документа - это код из документа "Корректировка долга", который идет из ТиС. Чтобы документ понимал, какой контрагент: добавлено:
    Док=СоздатьОбъект("Документ.Документ1");
    Док.ВыбратьПоНомеру(НомерДок,ДатаДок);
    Контрагент=Док.Клиент;
90 HawkEye
 
08.09.15
13:36
(89) это в ОбработкаПроведения() такое написано?
91 Slypower
 
08.09.15
13:37
(90) Процедура ОбработкаПроведенияПоВзаиморасчетам()
92 Slypower
 
08.09.15
13:40
Все остальное - точно так как в Корректировке долга
93 HawkEye
 
08.09.15
13:44
(91) с другой стороны, зачем мне из тебя вытягивать код по строчкам....

совет: либо пригласи специалиста, чтобы сделали на месте, либо пригласи того, кто будет отвечать на те вопросы которые ему задают, не пропуская их через твой интерпретатор...
94 HawkEye
 
08.09.15
13:45
+93 ну и почитай в конце концов описание метода ВыбратьПоНомеру
95 alexandr1
 
08.09.15
13:50
Лезь в отладчик и смотри что у тебя клиент когда кнопку жмешь.
Или через контекст или текущийДокумент пробуй
96 Slypower
 
08.09.15
14:09
(94) (95) спасибо, этого как раз мне не хватало. Вы правы
97 Slypower
 
08.09.15
15:04
Вс оказалось проще простого. Все что в (14) работает верно. Вот что в (89) нафик не нужно. В  модуле документ поиск по контрагенту вообще не нужно. Удалил - все работает как доктор прописал.
98 alexandr1
 
08.09.15
19:15
Гениально
2 + 2 = 3.9999999999999999999999999999999...