Имя: Пароль:
1C
1С v8
Реквизит формы ссылочного типа
,
0 Denis Nsk
 
14.05.15
10:55
Привет Всем!

Конфа БП 3.0
Внешняя обработка для заполнения ТЧ документа.
Есть Реквизит1 обработки тип ДокументСсылка, Реквизит2 формы тип ДокументСсылка, Реквизит3 формы тип Строка.

В модуле формы в Процедуре1 контекст НаКлиенте присваиваются значения реквизитам (Реквизит1 и Реквизит2 ссылка на документ, для которого выполняется заполнение ТЧ, Реквизит3 строковое значение). Проверяю реквизиты все 3-и заполнены.

Затем. Форма не закрывается. В том же модуле формы в Процедуре2 (НаКлиенте) Реквизит1 и Реквизит2 значения не заполнены, Реквизит3 (строковый) содержит нужное значение.

Подскажите, пожалуйста, что проверить? Почему значения в Реквизитах 1 и 2 теряются?
1 asady
 
14.05.15
11:00
Затем это когда?
подробнее пожалуйста
2 Denis Nsk
 
14.05.15
11:25
(1) Заполняются при открытии формы.
"Затем" после того как выбрали файл из которого загружаем данные, нажимаем кнопку и выполняется команда (Процедура2). И вот в этот момент реквизиты 1 и 2 почему-то пустые. Может есть особеннсоти с ссылочными типами реквизитов? Потому что строковый не теряется.
3 asady
 
14.05.15
11:28
(2) как вариант может быть ты ещё где-то устанавливаешь реквизиты 1 и 2 (типа забыл что так называются реквизиты формы)
4 hhhh
 
14.05.15
11:28
барабашка завелся. Как вариант.
5 Denis Nsk
 
14.05.15
11:35
(2) проверю с пристрастием. но на вскидку не перезаписываю.
я в УФ плаваю ... поэтому предположил что есть особенности

(3) ))

щас база не под рукой. проверю позже.

варианты принимаются..
6 Torquader
 
14.05.15
13:16
Значения реквизитов присваиваются на сервере или на клиенте ?
Ещё очень полезно бывает ОбновитьОтображение (или как оно там называется).
7 Denis Nsk
 
14.05.15
22:49
(3) проверил больше ни где не устанавливаю эти реквизиты

(6) На клиенте
8 Denis Nsk
 
17.05.15
14:50
(3) Что-то ни как не получается.
Создал новые реквизиты, параллельно использую переменные (контекст НаКлиенте). В процедуре при открытии формы после заполнения реквизитов (переменных) проверяю значения есть.
Сделал отдельную команду (кнопку) и сразу после открытия проверяю реквизиты (переменные). Все пусто. Что проверить?
9 Rie
 
17.05.15
15:24
(6) Точно на клиенте? Внешняя обработка для заполнения табличной части?
10 Denis Nsk
 
17.05.15
16:18
Сохраняю НаСервере, первый раз проверяю НаКлиенте все Ок, Второй раз проверяю НаКлиенте не Ок.

Внешняя обработка заполнения ТЧ. Вызывается из формы документа. Может как-то по другому ее регистрировать/вызывать нужно?

Сейчас постараюсь собрать код и выложить.
11 Denis Nsk
 
17.05.15
16:27
&НаКлиенте
Перем мДатаДокумента, мНомерДокумента;

&НаКлиенте
Процедура ПокажемФормуВыбораФайлаПользователю(ТекущийДокумент)
    
        ФормаВыбора = ПолучитьФорму("ВнешняяОбработка.ПоступленияТиУЗаполнитьТЧТовары.Форма.Форма");
        
        ФормаВыбора.ОбъектИсточника = ТекущийДокумент;
        
        Объект.ДокументИсточника = ТекущийДокумент;
        
        ФормаВыбора.Открыть();
        
    //Для отладки начало
    СохранитьНомерДатуСсылкуДокументаВРеквизитахНаСервере(ТекущийДокумент);
    мДатаДокумента = ДатаДокумента_РеквизитФормы;
    мНомерДокумента = НомерДокумента_РеквизитФормы;

        //отладочные сообщения. Здесь значения есть.
    Сообщить("ДатаДокумента_РеквизитФормы = " + ДатаДокумента_РеквизитФормы);
    Сообщить("НомерДокумента_РеквизитФормы = " + НомерДокумента_РеквизитФормы);
    Сообщить("СсылкаНаДокумент_РеквизитФормы = " + СсылкаНаДокумент_РеквизитФормы);
    Сообщить("мДатаДокумента = " + мДатаДокумента);
    Сообщить("мНомерДокумента = " + мНомерДокумента);
        //Для отладки окончание

КонецПроцедуры

&НаСервере
Процедура СохранитьНомерДатуСсылкуДокументаВРеквизитахНаСервере(ТекДокументСсылка);
    ДатаДокумента_РеквизитФормы = ТекДокументСсылка.Дата;
    НомерДокумента_РеквизитФормы = ТекДокументСсылка.Номер;
    СсылкаНаДокумент_РеквизитФормы = ТекДокументСсылка.Ссылка;
КонецПроцедуры

//Далее Процедура (команда) для проверки Реквизитов и переменных
//Вызываю ее сразу после открытия формы
//Здесь значения Реквизитов и Переменных пустые
&НаКлиенте
Процедура ПроверитьРеквизитыПеременные(Команда) //отладка
    Сообщить(" =  =  =  =  =  =  =  =  =  =  =  = ");
    Сообщить("мДатаДокумента = " + мДатаДокумента);
    Сообщить("мНомерДокумента = " + мНомерДокумента);
    Сообщить(" =  =  =  =  =  =  =  =  =  =  =  = ");
    Сообщить("ДатаДокумента_РеквизитФормы = " + ЭтаФорма.ДатаДокумента_РеквизитФормы);
    Сообщить("НомерДокумента_РеквизитФормы = " + ЭтаФорма.НомерДокумента_РеквизитФормы);
    Сообщить("СсылкаНаДокумент_РеквизитФормы = " + ЭтаФорма.СсылкаНаДокумент_РеквизитФормы);
КонецПроцедуры
12 Denis Nsk
 
18.05.15
07:03
Ап
13 asady
 
18.05.15
08:04
(12) проверь ключ уникальности формы
&НаКлиенте
Процедура ПроверитьРеквизитыПеременные(Команда)//отладка

    Сообщить(" =  =  =  =  =  =  =  =  =  =  =  = ");
    Сообщить("мДатаДокумента = " + мДатаДокумента+" КЛЮЧ = "+ЭтаФорма.КлючУникальности);
    Сообщить("мНомерДокумента = " + мНомерДокумента);
    Сообщить(" =  =  =  =  =  =  =  =  =  =  =  = ");
    Сообщить("ДатаДокумента_РеквизитФормы = " + ЭтаФорма.ДатаДокумента_РеквизитФормы);
    Сообщить("НомерДокумента_РеквизитФормы = " + ЭтаФорма.НомерДокумента_РеквизитФормы);
    Сообщить("СсылкаНаДокумент_РеквизитФормы = " + ЭтаФорма.СсылкаНаДокумент_РеквизитФормы);
КонецПроцедуры
14 Denis Nsk
 
18.05.15
10:22
(13)
=  =  =  =  =  =  =  =  =  =  =  =
КЛЮЧ =
мДатаДокумента =
мНомерДокумента =
=  =  =  =  =  =  =  =  =  =  =  =

Все пусто.
15 Denis Nsk
 
18.05.15
10:44
В процедуре ПокажемФормуВыбораФайлаПользователю добавил присваивание ключа. В этой же процедуре позже его не видно. Но в процедуре ПроверитьРеквизитыПеременные виден правильный ключ.
Т.е. форма не меняется программно (интерактивно я ее не закрываю).

Но почему в первой процедуре ПокажемФормуВыбораФайлаПользователю сразу после назначения ключа его не видно?
16 asady
 
18.05.15
10:46
(15) как ключ уникальности устанавливаешь?
17 Denis Nsk
 
18.05.15
10:47
ФормаВыбора = ПолучитьФорму("ВнешняяОбработка.ПоступленияТиУЗаполнитьТЧТовары.Форма.Форма",,,"123");
18 asady
 
18.05.15
10:49
(17) ну правильно ключ назначил -

теперь где ты его не видишь?
19 asady
 
18.05.15
10:51
(17) а у основной формы ключ уникальности устанавливаешь?
20 Denis Nsk
 
18.05.15
10:56
(18) не вижу в конце процедуры ("ПокажемФормуВыбораФайлаПользователю") где его назначил
21 Denis Nsk
 
18.05.15
10:58
(19) основная это форма документа, из которого вызываем обработку или форма обработки?

документ типовой (конфа БП 3.0)

В обработке не устанавливаю
22 Denis Nsk
 
18.05.15
11:01
но про ключ уникальности это не основной вопрос...
мне главное реквизиты или переменные увидеть...
23 asady
 
18.05.15
11:06
(22) ключ уникальности нужен чтобы убедиться что ты имеешь дело с одной и той же формой.

(20)  то есть ты там пишешь:
Сообщить("Ключ уникальности формы выбора = "+ФормаВыбора.КлючУникальноси);
и не видишь ключа?

(21) нужно посмотреть ключ уникальности формы у которой ты завел реквизиты для сохранения - скорее всего это форма обработки.
24 Denis Nsk
 
18.05.15
11:17
(23) для чего ищем ключ уникальности я понял

сейчас скопирую код.
25 Denis Nsk
 
18.05.15
11:28
&НаКлиенте
Процедура ПокажемФормуВыбораФайлаПользователю(ТекущийДокумент)

//здесь ключа не видно (значит ранее не устанавливали)
Сообщить("КЛЮЧ = "+ЭтаФорма.КлючУникальности);//отладка
ФормаВыбора = ПолучитьФорму("ВнешняяОбработка.ПоступленияТиУЗаполнитьТЧТовары.Форма.Форма",,,"123");
ФормаВыбора.ОбъектИсточника = ТекущийДокумент;
Объект.ДокументИсточника = ТекущийДокумент;
ФормаВыбора.Открыть();
СохранитьНомерДатуСсылкуДокументаВРеквизитахНаСервере(ТекущийДокумент);
мДатаДокумента = ДатаДокумента_РеквизитФормы;
мНомерДокумента = НомерДокумента_РеквизитФормы;

Сообщить("ДатаДокумента_РеквизитФормы = " + ДатаДокумента_РеквизитФормы);
Сообщить("НомерДокумента_РеквизитФормы = " + НомерДокумента_РеквизитФормы);
Сообщить("СсылкаНаДокумент_РеквизитФормы = " + СсылкаНаДокумент_РеквизитФормы);
Сообщить("мДатаДокумента = " + мДатаДокумента);
Сообщить("мНомерДокумента = " + мНомерДокумента);

//здесь ключа не видно
Сообщить("КЛЮЧ = "+ЭтаФорма.КлючУникальности);//отладка
КонецПроцедуры


&НаКлиенте
Процедура ПроверитьРеквизитыПеременные(Команда) //процедура для проверки
    
Сообщить(" =  =  =  =  =  =  =  =  =  =  =  = ");

//здесь колюч видно = "123"
Сообщить("КЛЮЧ = "+ЭтаФорма.КлючУникальности);//отладка
Сообщить("мДатаДокумента = " + мДатаДокумента);//отладка
Сообщить("мНомерДокумента = " + мНомерДокумента);//отладка
Сообщить(" =  =  =  =  =  =  =  =  =  =  =  = ");//отладка
Сообщить("ДатаДокумента_РеквизитФормы = " + ЭтаФорма.ДатаДокумента_РеквизитФормы);
Сообщить("НомерДокумента_РеквизитФормы = " + ЭтаФорма.НомерДокумента_РеквизитФормы);    
Сообщить("СсылкаНаДокумент_РеквизитФормы = " + ЭтаФорма.СсылкаНаДокумент_РеквизитФормы);

КонецПроцедуры
26 asady
 
18.05.15
11:32
(25) Где находится Процедура ПроверитьРеквизитыПеременные? в каком модуле формы? у обработки, или у формы выбора или где?
27 Denis Nsk
 
18.05.15
11:39
(26) это все в модуле формы обработки
28 Denis Nsk
 
18.05.15
11:42
может проще обработку выложить?
пальцем ткнете где ошибка
29 asady
 
18.05.15
11:53
(28) конечно лучше.

странно следующее:
вначале ключ формы обработки пустой
но потом он вдруг у тебя становится равным 123
то есть равным ключу другой формы - формы выбора - то есть две формы имеют один ключ уникальности - и всё работает?
что-то здесь не так.
30 Denis Nsk
 
18.05.15
11:55
ФормаВыбора это и д.б. форма обработки. Выбор файла осуществляется в диалоге через ДиалогВыбораФайла

Сечас описание накидаю и выложу обработку
31 Denis Nsk
 
18.05.15
12:05
Выложил
https://yadi.sk/d/7i5XD2ihghVLq

там описание, обработка и файл импорта
32 asady
 
18.05.15
12:42
(0) получается что ты запускаешь две копии одной обработки - поэтому у тебя два ключа уникальности - реквизиты устанавливаешь у одной формы (которая 123) а ищещь у первой (ключ уникальности пустой)

так что твоя обработка работает правильно :)
33 Denis Nsk
 
18.05.15
12:53
интересно...

но на экране только одно окно...

А где она запускается первый раз, где второй?

Второй, похоже, строка №31 в модуле формы
ФормаВыбора.Открыть();
34 Denis Nsk
 
18.05.15
12:55
"обработка работает правильно :)"

я догадывался, что она работает, правильно. Что написали то и делает))
Это я что-то не допонимаю..))
35 asady
 
18.05.15
12:57
(31)

(32)+только вот не совсем догнал зачем вот это понадобилось
нужно было загрузить накладную из файла

проще было передать ссылку на документ во вторую форму параметром:
        ПараметрыФормы = Новый Структура;
        ПараметрыФормы.Вставить("СсылкаНаДокумент", ТекущийДокумент);
        ФормаВыбора = ПолучитьФорму("ВнешняяОбработка.ПоступленияТиУЗаполнитьТЧТовары.Форма.Форма",ПараметрыФормы,ЭтаФорма,"123"); //вот  здесь вызывается форма во второй раз - ну и пусть и так будет работать

//это лишнее
//ФормаВыбора.ОбъектИсточника = ТекущийДокумент;
// Объект.ДокументИсточника = ТекущийДокумент;

Надо добавить
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("СсылкаНаДокумент") Тогда
        СсылкаНаДокумент_РеквизитФормы = Параметры.СсылкаНаДокумент;
    КонецЕсли;    
КонецПроцедуры
36 Denis Nsk
 
18.05.15
13:15
(35) и определять нужное окно документа по ссылке, да?

я так и хотел. Но, похоже, из-за второго открытия формы, я не получал ссылки в реквизите формы.
37 Denis Nsk
 
18.05.15
13:16
Не подскажите, как правильно, определить нужное окно? Где у окна хранится ссылка на владельца (т.е. на документ)?

Наверно через
Окно.Содержимое

а дальше как?
38 asady
 
18.05.15
13:17
(36) у тебя есть только одно окно формы обработки - и это вторая копия формы обработки

первая копия формы не открыта - из неё вызвана команда экспортная.

то что я предложил достаточно - должно работать и так - пробуй
39 Denis Nsk
 
18.05.15
13:31
ОГРОМНОЕ СПАСИБО!
Заработало!

Не до конца понял как. Сейчас буду сидеть по шагам как с букварем разбираться ))

Я ожидал, что еще условие нужно переделать.

Если будут вопросы, спрошу в этой ветке. Если ответите буду очень благодарен!

Еще раз СПАСИБО!