Имя: Пароль:
1C
1C 7.7
v7: Как программно открыть документ?
0 Новичёк123123
 
14.07.11
14:48
Здравствуйте) Такой вопрос: есть один документ, из него мы программно создаём новый и сохраняем его номер в реквизите первого документа.
Далее при попытке найти созданный нами документ по номеру ничего не получается( Выглядит это так:
//первый кусок
ДокСчет=СоздатьОбъект("Документ.Счет");
ДокСчет.Новый();
ДокСчет.НоваяСтрока();
ДокСчет.Товар=ТабЗначПа.ТоварАкционногоПакета;
ДокСчет.Записать();        
ОткрытьФорму (ДокСчет.ТекущийДокумент());
СсылкаНаСчет=ДокСчет.НомерДок;
//второй кусок
ДокСчетСтарый=СоздатьОбъект("Документ.Счет");
ДокСчетСтарый.НайтиПоНомеру(СсылкаНаСчет,Дата(0));
1 Guk
 
14.07.11
14:50
СсылкаНаСчет разве номер?...
2 Новичёк123123
 
14.07.11
14:52
СсылкаНаСчет -Имя реквизита с типом строка куда сохраняем номер документа
3 ДенисЧ
 
14.07.11
14:52
(1) у него да...
(0) в счетах нумерация документов с какой периодичностью идёт?
4 Guk
 
14.07.11
14:53
(2) а почему бы ссылку не сохранить? тогда и искать ничего не надо...
5 Новичёк123123
 
14.07.11
14:53
Год
6 Новичёк123123
 
14.07.11
14:54
Пробовал ссылку сохранить, не знаю как её потом открыть(
7 Guk
 
14.07.11
14:54
и зачем Дата(0)?...
8 Guk
 
14.07.11
14:55
(6) передать как параметр в метод ОткрытьФорму...
9 ДенисЧ
 
14.07.11
14:56
(5) Тогда и указывай дату из нужного года...
10 Tatitutu
 
14.07.11
14:58
ДокСчетСтарый=СоздатьОбъект("Документ.Счет");
Если ДокСчетСтарый.НайтиПоНомеру(СсылкаНаСчет)=1 Тогда
//нашли теперь откроем
  НайденныйДок=ДокСчетСтарый.ТекущийДокумент();
  ОткрытьФорму(НайденныйДок);
КонецЕсли;
11 ДенисЧ
 
14.07.11
14:59
(10) не взлетит НайтиПоНомеру...
12 andrewks
 
14.07.11
15:03
(10) НайтиДокумент()
13 Tatitutu
 
14.07.11
15:04
(11) взлетит (если автоматическая сквозная нумерация)
(12) не взлетит
14 Новичёк123123
 
14.07.11
15:06
И то и то не взлетает(
15 ДенисЧ
 
14.07.11
15:08
(13) если нумерация периодическая, то не взелит с вероятностью 99%
16 Tatitutu
 
14.07.11
15:09
(14) летает

Сообщить(СсылкаНаСчет); что пишет
в журнале есть такой документ ?
17 andrewks
 
14.07.11
15:11
(13) 2. чорт.. СсылкаНаСчет - строка. меня название реквизита смутило
18 andrewks
 
14.07.11
15:12
полностью согласен с (4)
19 Tatitutu
 
14.07.11
15:14
ДокСчет=СоздатьОбъект("Документ.Счет");
   ДокСчет.Новый();
   ДокСчет.Записать();
   СсылкаНаСчет=ДокСчет.НомерДок;
   
   Сообщить(СсылкаНаСчет);
   
   ДокСчетСтарый=СоздатьОбъект("Документ.Счет");
   
   Если ДокСчетСтарый.НайтиПоНомеру(СсылкаНаСчет,ТекущаяДата())=1 Тогда
       //нашли теперь откроем
       
       НайденныйДок=ДокСчетСтарый.ТекущийДокумент();
       ОткрытьФорму(НайденныйДок);
   Иначе
       Сообщить("Не нашла");
   КонецЕсли;
20 Tatitutu
 
14.07.11
15:17
(19) работает
но заново прочитал вопрос темы
и посмотрев код твой, понял что кто где то не то делает


Здравствуйте) Такой вопрос: есть один документ, из него мы программно создаём новый и сохраняем его номер в реквизите первого документа.

есть документ (он уже записан)
создаем новый документ - его номер (нового документа) нужно записать в старый документ , так задача стоит ?
21 andrewks
 
14.07.11
15:17
может, хватит поощрять автора в извращениях, и пора наставить его на путь истинного христианина?
22 ado
 
14.07.11
15:18
Переписать так:

//первый кусок

ДокСчет=СоздатьОбъект("Документ.Счет");
ДокСчет.Новый();
ДокСчет.НоваяСтрока();
ДокСчет.Товар=ТабЗначПа.ТоварАкционногоПакета;
ДокСчет.Записать();        
ОткрытьФорму (ДокСчет.ТекущийДокумент());
СсылкаНаСчет=ДокСчет.ТекущийДокумент();
//второй кусок

ДокСчетСтарый=СоздатьОбъект("Документ.Счет");
ДокСчетСтарый.НайтиПоДокумент(СсылкаНаСчет);

И не иппать людям мозг.
23 ado
 
14.07.11
15:19
+(22) Тип реквизита "СсылкаНаСчет" сменить на "Документ.Счет", естественно.
24 ado
 
14.07.11
15:21
+(22)

ДокСчетСтарый.НайтиПоДокумент(СсылкаНаСчет);

исправить на

ДокСчетСтарый.НайтиДокумент(СсылкаНаСчет);
25 Новичёк123123
 
14.07.11
15:23
Так уже пробовал не работает( Поэтому и решил через номер искать(
26 Tatitutu
 
14.07.11
15:23
(22) ты не поверишь ему совершенно не то нужно см. 20
27 Новичёк123123
 
14.07.11
15:24
Татитуту, там нужно хранить в первом документе номер второго, что бы потом програмно второй открыть(не открывая формы) и сравнить с другим
28 Tatitutu
 
14.07.11
15:25
(27) вот и я о том же ))))
29 ado
 
14.07.11
15:26
(26) По-моему, твой телепат перетелепачивает ;-)

(25) Как именно не работает? Что говорит?
30 andrewks
 
14.07.11
15:26
(28) хренасе, о том же...

ему ссылку надо хранить, а не номер.
31 Новичёк123123
 
14.07.11
15:27
Через ссылку потом не открывается ни как(
32 Tatitutu
 
14.07.11
15:27
тебе нужно наоборот

создать новый документ
заполнить
записать его

(дальше запомнить ссылку на него (или номер его))

и записать в реквизит текущего открытого документа
33 andrewks
 
14.07.11
15:27
(31) как открываешь?
34 Tatitutu
 
14.07.11
15:28
(31) реквизит в который ты записываешь ссылку у тебя строка
а нужно изменить тип реквизита
35 ado
 
14.07.11
15:28
(31) А ссылка у тебя точно сохранилась? Тип реквизита правильно указал?
36 Новичёк123123
 
14.07.11
15:29
Проверял, ссылка передаётся в реквизит(тип:документ.Счет), но открыть по ссылке не могу никак, открывал через НайтиДокумент
37 andrewks
 
14.07.11
15:30
(36) код давай!
38 Новичёк123123
 
14.07.11
15:31
(32) ага именно так) а потом ещё открыть его по этому номеру или ссылке)
39 Tatitutu
 
14.07.11
15:31
//*******************************************
Процедура СоздатьНовый()
   
   ДокСчет=СоздатьОбъект("Документ.Чек");
   ДокСчет.Новый();
   ДокСчет.Записать();
   СсылкаНаСчет=ДокСчет.НомерДок;  //где ссылканасчет это реквизит текущего документа
   Записать();
КонецПроцедуры

//======================================================================
Процедура ОткрытьНовый()    
   
   Если ПустаяСтрока(СсылкаНаСчет)=0 Тогда
       ДокСчетСтарый=СоздатьОбъект("Документ.Чек");    
       Если ДокСчетСтарый.НайтиПоНомеру(СсылкаНаСчет,ТекущаяДата())=1 Тогда
           //нашли теперь откроем        
           НайденныйДок=ДокСчетСтарый.ТекущийДокумент();
           ОткрытьФорму(НайденныйДок);
       Иначе
           Сообщить("Не нашла");
       КонецЕсли;
   Иначе
       Сообщить("Неуказан номер документа");
   КонецЕсли;
КонецПроцедуры // ОткрытьНовый
40 ado
 
14.07.11
15:32
(36)  Показывай код, как делал через ссылку.
41 ado
 
14.07.11
15:34
(39) Не пость сюда эту ересь с номерами, не развращай молодежь ;-)
42 Новичёк123123
 
14.07.11
15:38
СсылкаНаСчет=ДокСчет.ТекущийДокумент();    
//проверял ссылка передаётся
       
ДокСчетСтарый=СоздатьОбъект("Документ.Счет");

Терь как вызвать документ из СылкиНаСчёт не открывая формы
43 Tatitutu
 
14.07.11
15:38
(41) да ладно ! При его подходе - лучше хранить номер документа как текст, чем ссылку на документ
(он же потом документ удалить не сможет)
да и ненужна ему эта ссылка, только как коментарий


Процедура СоздатьНовый()
   
   ДокСчет=СоздатьОбъект("Документ.Чек");
   ДокСчет.Новый();
   ДокСчет.Записать();
   СсылкаНаСчет=ДокСчет.ТекущийДокумент;  //где ссылканасчет это реквизит текущего документа с вид документ.Счет

   Записать();
КонецПроцедуры

//======================================================================

Процедура ОткрытьНовый()    
   
   Если ПустоеЗначение(СсылкаНаСчет)=0 Тогда
       
           ОткрытьФорму(СсылкаНаСчет);
     
   Иначе
       Сообщить("Не указан документ");
   КонецЕсли;
КонецПроцедуры // ОткрытьНовый
44 Tatitutu
 
14.07.11
15:39
(42) вот с этого места поподробнее "Терь как вызвать документ из СылкиНаСчёт не открывая формы"
45 ado
 
14.07.11
15:39
(43) >> он же потом документ удалить не сможет

И это правильно!
46 Fram
 
14.07.11
15:41
(42) а можно по русски - что значит "вызвать" документ?
47 Tatitutu
 
14.07.11
15:41
(45) ты это у него спросил )))
Смотря какая задача стоит
(0) А что ты делаешь и хочешь получить в итоге
только не говори что - "счет разбить на несколько других счетов"
48 Tatitutu
 
14.07.11
15:42
(46) ни разу духов чтоль не вызывал ?
новый технологии голосового управления в бухгалтерии
сказывается на сленг "Я вызываю документ счет №0000000"
49 zdas
 
14.07.11
15:42
(42) для чего вызвать?
50 ado
 
14.07.11
15:43
(42) Что значит "вызвать документ"?

ДокСчетСтарый.НайтиПоДокумент(СсылкаНаСчет) спозиционирует тебя на этот документ.
Что тебе дальше с ним нужно делать?
51 Новичёк123123
 
14.07.11
15:43
Татитуту, спасибо!!!) заработало)
52 ado
 
14.07.11
15:44
+(50) Тьфу, пля.
*ДокСчетСтарый.НайтиДокумент(СсылкаНаСчет)
53 zdas
 
14.07.11
15:44
НайтиПоДокумент = НайтиДокумент :)
54 ado
 
14.07.11
15:45
(51) Что заработало то?
(47) У него бесполезно спрашивать, он, скорее всего, не знает, почему это правильно :-)
55 Fram
 
14.07.11
15:45
(48) :))))
(51) о_О
56 Новичёк123123
 
14.07.11
15:46
Татитуту, ну задача была мол из первого документа нужно считать все товары проверить на акционные, если есть то мы записываем их во второй документ, но нужно было сделать привязку что бы если вдруг  часть товара возвращают то убирать из второго документа акционные товары)
57 ado
 
14.07.11
15:46
(56) И? Что не работало то по ссылке?
58 Новичёк123123
 
14.07.11
15:49
Ну у меня руки ещё не до конца прямые поэтому наверно у меня и не работало(
59 ado
 
14.07.11
15:49
(39) Очень весело будет смотреться этот код, когда 1-го января откроют документ, созданный вчера ;-)
60 ado
 
14.07.11
15:50
(58) Код покажи полностью. Выпрямим.
61 Новичёк123123
 
14.07.11
15:52
//Кнопка Акции, проверяет все активные акции и выводит список, в котором можно выбрать интересующую нас акцию
Процедура ПроверкаНаАкции()    
   Перем НомСтроки;
   
   ТабЗнач=СоздатьОбъект("ТаблицаЗначений");
   ТабЗнач.НоваяКолонка("Наименование");
   ТабЗнач.НоваяКолонка("АкционныйТовар1");
   ТабЗнач.НоваяКолонка("КолвоТовара1");
   ТабЗнач.НоваяКолонка("ТоварАкционногоПакета");
   
   ТабЗначПа=СоздатьОбъект("ТаблицаЗначений");
   ТабЗначПа.НоваяКолонка("Наименование");
   ТабЗначПа.НоваяКолонка("ТоварАкционногоПакета");  
   
   ТабЗначСтарый=СоздатьОбъект("ТаблицаЗначений");
         
   СпрАкции=СоздатьОбъект("Справочник.Акции");
   ТекДата=ТекущаяДата();
   
//Проверяем, если в реквизите СсылкаНаСчет ничего нет, то значит Счет ещё не создавался и мы его создадим
   Если ПустоеЗначение(СсылкаНаСчет)=1 Тогда  
//Заносим в таблицу значений все акции которые действуют в данный день
       СпрАкции.ВыбратьЭлементы();
       Пока СпрАкции.ПолучитьЭлемент()=1 Цикл
           Если (СпрАкции.НачАкц<=ТекДата) и (СпрАкции.КонАкц>=ТекДата) Тогда  
               ТабЗнач.НоваяСтрока();
               ТабЗнач.Наименование=СпрАкции.Наименование;
               ТабЗнач.АкционныйТовар1=СпрАкции.АкционныйТовар1;
               ТабЗнач.КолвоТовара1=СпрАкции.КолвоТовара1;  
               ТабЗнач.ТоварАкционногоПакета=СпрАкции.ТоварАкционногоПакета;
           КонецЕсли;
       КонецЦикла;
       
//Проверяем совпадает ли товар и количество его с условиями акции и формируем новую Таблицу значений куда вносит подходящие акции
       ВыбратьСтроки();
       Пока ПолучитьСтроку()=1 Цикл
           ТабЗнач.ВыбратьСтроки();
           Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
               Если Товар=ТабЗнач.АкционныйТовар1 Тогда                
                   Если Количество=ТабЗнач.КолвоТовара1 Тогда
                       Индикатор=1;
                       ТабЗначПа.НоваяСтрока();
                       ТабЗначПа.Наименование=ТабЗнач.Наименование;
                       ТабЗначПа.ТоварАкционногоПакета=ТабЗнач.ТоварАкционногоПакета;
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;
       КонецЦикла;
       
// Выводим список всех акций и обрабатываем выбор акции
       Если Индикатор=1 Тогда
           ТабЗначПа.ВыбратьСтроку(НомСтроки,"Выберите акцию");
           ТабЗначПа.ПолучитьСтрокуПоНомеру(НомСтроки);
           Предупреждение ("Вы выбрали акцию:"+ТабЗначПа.Наименование,3);  
           ДокСчет=СоздатьОбъект("Документ.Счет");
           ДокСчет.Новый();
           ДокСчет.НоваяСтрока();
           ДокСчет.Товар=ТабЗначПа.ТоварАкционногоПакета;
           ДокСчет.Записать();        
           ОткрытьФорму (ДокСчет.ТекущийДокумент());
           СсылкаНаСчет=ДокСчет.НомерДок;            
       Иначе Предупреждение ("На данные товары акций нет")
       КонецЕсли;  
// А если что-то есть то мы проверяем совпадают ли эти документы
   Иначе    
//Выгружаем Значения из старого документа  
       ДокСчетСтарый=СоздатьОбъект("Документ.Счет");    
       Если ДокСчетСтарый.НайтиПоНомеру(СсылкаНаСчет,ТекущаяДата())=1 Тогда
           НайденныйДок=ДокСчетСтарый.ТекущийДокумент();
           НайденныйДок.Вы
           
       Иначе
           Сообщить("Не нашла");
       КонецЕсли;
62 andrewks
 
14.07.11
15:53
вот так и учат плохому
63 ado
 
14.07.11
15:55
(61) Блин, я просил код с поиском по ссылке, который у тебя не работал. И ту его часть, где происходит работа с искомым документом.

А этот код очень плох. Плох тем, что он чаще всего будет работать, но иногда не будет. И вот в эти "иногда" ты будешь бицца головой об стену, пока найдешь ошибку.
64 ado
 
14.07.11
15:58
(63) Это не говоря про контроль ссылочной целостности ...
65 Новичёк123123
 
14.07.11
16:00
Там где пробовал с ссылками работать я удалил, когда решил с номерами работать. Это мой первый проект(
66 ado
 
14.07.11
16:04
(65) Попробуй заново сделать. Еще раз говорю, с номерами работать -- плохая идея. Очень плохая.
67 ado
 
14.07.11
16:05
+(66) Сейчас заработает "на от@бись", а потом плакать будешь.
68 Новичёк123123
 
14.07.11
16:06
Так может только переделать кусок с номерами? и если ссылку сохранять как её потом открыть, выгрузить в таблицу значений табличную часть не открывая при этом форму?)
69 Tatitutu
 
14.07.11
16:06
(59) ну ты садист !!!
это кто ж создает документ 31 декабря и потом его открывает 1 января
70 Tatitutu
 
14.07.11
16:07
(68) и (0) я же в (43) код и со ссылкой написал

у него проблема ссылка не открывалась так как реквизит документа тип СТРОКА, а нужно Документ.Счет
71 ado
 
14.07.11
16:08
(68) >> если ссылку сохранять как её потом открыть, выгрузить в таблицу значений табличную часть не открывая при этом форму?

В эннадцатый раз повторяю, метод НайтиДокумент()
72 ado
 
14.07.11
16:10
(70) >> у него проблема ссылка не открывалась так как реквизит документа тип СТРОКА, а нужно Документ.Счет

Нет, смотри (36)
73 Новичёк123123
 
14.07.11
16:10
угу(
74 Новичёк123123
 
14.07.11
16:14
попробую ещё раз сделать через ссылки:
поменять реквизит на Документ.Счет
открывать через НайтиДокумент
Всё правильно?
75 ado
 
14.07.11
16:16
(74) Точно так.
76 ado
 
14.07.11
16:17
+(75) Вместо
СсылкаНаСчет=ДокСчет.НомерДок;
подставить
СсылкаНаСчет=ДокСчет.ТекущийДокумент();
77 Новичёк123123
 
14.07.11
16:17
Спасибо всем) Будем совершенствоваться)
78 Tatitutu
 
14.07.11
16:18
(75) не так, если ссылка хранится на фига ему Найтидокумент ??? для открытия

если верить тому что он пишет в (36) то (51) не могло заработать
79 Новичёк123123
 
14.07.11
16:18
так в 51 заработало с номерами)
80 Tatitutu
 
14.07.11
16:19
(76) глаза подними в (43) так и написал

или здесь посмотри

Процедура СоздатьНовый()
   
   ДокСчет=СоздатьОбъект("Документ.Чек");
   ДокСчет.Новый();
   ДокСчет.Записать();
   СсылкаНаСчет=ДокСчет.ТекущийДокумент;
//где ссылканасчет это реквизит текущего документа с вид документ.Счет
   Записать();
КонецПроцедуры

//======================================================================


Процедура ОткрытьНовый()    
   
   Если ПустоеЗначение(СсылкаНаСчет)=0 Тогда        
       ОткрытьФорму(СсылкаНаСчет);      
   Иначе
       Сообщить("Не указан документ");
   КонецЕсли;
КонецПроцедуры // ОткрытьНовый
81 Tatitutu
 
14.07.11
16:19
(79) конечно, при том что ты в (36) утверждаешь что реквизит имеет тип Документ.Счет
82 ado
 
14.07.11
16:22
(78) Ну, если ему манипуляции на изменение делать, то только через СоздатьОбъект/НайтиДокумент
83 Новичёк123123
 
14.07.11
16:22
Я запутался( ккогда пытался сделать с ссылками реквизит был точно Документ.Счет, не работало, но я попытаюсь ещё раз может чё то не учел)
84 Новичёк123123
 
15.07.11
10:10
Сделал через ссылки заработало) Скорее всего я на позиционировании лоханулся) Ещё раз всем спасибо) Обещаю руки выпрямить)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан