Имя: Пароль:
1C
1С v8
Не основная форма обработки и содержимое реквизитов объекта
0 LisaAlisa
 
06.05.16
12:18
Подскажите. пожалуйста, почему при обращении к процедурам и функциям объекта из модуля неосновной формы обработки не видны значения реквизитов объекта, в частности табличных частей?
"МояТабличнаяЧасть" - реквизит объекта, в отладчике Тип и значение имеет ВнешняяОбработкаТабличнаяЧасть.ВнешняяОбработка1.МояТабличнаяЧасть
1 LisaAlisa
 
06.05.16
12:23
Форма2 вызывается из основной формы Форма через ОткрытьФорму()
2 lubitelxml
 
06.05.16
12:31
я так понимаю вы про управляемые формы. В процедуре с директивой &НаКлиенте так отображается, попробуйте в процедуре с директивой &НаСервере
3 LisaAlisa
 
06.05.16
13:04
(2) Да, формы управляемые.
В форме2
&НаСервере
Процедура СоздатьНоменклатуруНаСервере()
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");    
    Номенклатура = ОбработкаОбъект.СоздатьНоменклатуру();
КонецПроцедуры

В модуле объекта в процедуре СоздатьНоменклатуру() не видно значения реквизитов объекта
4 lubitelxml
 
06.05.16
13:06
покажите весь код
5 LisaAlisa
 
06.05.16
13:08
(4) чего именно? процедур в модуле формы или модуле объекта?

может, значения реквизитов вообще не видны в экспортных процедурах? СоздатьНоменклатуру() экспортная
6 lubitelxml
 
06.05.16
13:09
СоздатьНоменклатуру() покажи. Это процедура модуля объекта или модуля менеджера?
7 LisaAlisa
 
06.05.16
13:10
Это функция в модуле объекта

Функция СоздатьНоменклатуру(Строка) Экспорт
    
    НоменклатураСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",Строка.Артикул);
    
    Если НоменклатураСсылка = Справочники.Номенклатура.ПустаяСсылка() Тогда
        
        НоменклатураНовый = Справочники.Номенклатура.СоздатьЭлемент();
        НоменклатураНовый.АлкогольнаяПродукция                        = Истина;
        НоменклатураНовый.Артикул                                        = Строка.Артикул;
        НоменклатураНовый.Наименование                                    = Строка.Наименование;
        НоменклатураНовый.НаименованиеПолное                        = Строка.ПолноеНаименование;
        НоменклатураНовый.ВидНоменклатуры                              = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар-алкоголь");
        НоменклатураНовый.ТипНоменклатуры                              = Перечисления.ТипыНоменклатуры.Товар;
        НоменклатураНовый.СтавкаНДС                                 = ПолучитьСтавкуНДС(Строка.СтавкаНДС);
        НоменклатураНовый.ЕдиницаИзмерения                             = Справочники.БазовыеЕдиницыИзмерения.НайтиПоНаименованию("шт");
        НоменклатураНовый.Родитель                                    = Справочники.Номенклатура.НайтиПоНаименованию(Строка.ВидНоменклатуры);
        Попытка
            НоменклатураНовый.Записать();
            НоменклатураСсылка = НоменклатураНовый.Ссылка;
            Сообщить("Записан артикул: " + НоменклатураНовый.Артикул + " " + НоменклатураНовый.Наименование);
            Успех = Истина;
        Исключение
            Сообщить("Артикул "+НоменклатураНовый.Артикул + ". " + ОписаниеОшибки());
            Успех = Ложь;
        КонецПопытки;
        
        Если Не Успех Тогда
            Возврат Справочники.Номенклатура.ПустаяСсылка();
        КонецЕсли;
        
    КонецЕсли;
        
    Возврат НоменклатураСсылка;

КонецФункции
8 LisaAlisa
 
06.05.16
13:11
в (3) я привела максимально упрощенный код
9 lubitelxml
 
06.05.16
13:15
Переменную с именем "Строка" переименуйте
10 lubitelxml
 
06.05.16
13:18
а вообще - код выкинуть и переписать все по нормальному. Почитайте для начала про управляемые формы
11 LisaAlisa
 
06.05.16
13:19
(9) не думаю, что дело в имени переменной, потому что в других процедурах так же недоступны значения объекта
12 rozer76
 
06.05.16
13:59
(3) в "Объект" точно тот объект экспортные функции которого которые хотите вызвать?
13 rozer76
 
06.05.16
14:02
(12) + тип посмотрите его
14 LisaAlisa
 
11.05.16
10:05
(13) объект имеет тип ДанныеФормыСтруктура,
ОбработкаОбъект - ВнешняяОбработкаОбъект.ВнешняяОбработка1
15 LisaAlisa
 
11.05.16
10:16
Вот та же проблема с еще одной формой этой обработки. Это процедуры описаны в НЕосновной форме объекта. В процедуре СоздатьКонтрагентов() я могу увидеть значения реквизитов только через ЭтаФорма.ВладелецФормы.Объект, но в СоздатьКонтрагентовНаСервере() это уже недоступно.
Там же переходя в ОбработкаОбъект.СоздатьПартнеровКонтрагентов(ТаблицаНесопоставленныхКонтрагентов); выполнение переходит в процедуру модуля объекта СоздатьПартнеровКонтрагентов(), но при этом все реквизиты объекта имеют значения неопределено

&НаСервере
Процедура СоздатьКонтрагентовНаСервере()
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ОбработкаОбъект.СоздатьПартнеровКонтрагентов(ТаблицаНесопоставленныхКонтрагентов);
    ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры

&НаКлиенте
Процедура СоздатьКонтрагентов(Команда)
    СоздатьКонтрагентовНаСервере();
    ЭтаФорма.Закрыть();
КонецПроцедуры
16 RomanYS
 
11.05.16
10:19
(7) ээээ... А где там обращение к "реквизитам объекта"?
17 LisaAlisa
 
11.05.16
10:23
(16) обращение идет в процедуре, описанной в модуле объекта.
Дело в том, что я вот здесь ОбработкаОбъект.СоздатьПартнеровКонтрагентов(ТаблицаНесопоставленныхКонтрагентов);   обращаюсь к той самой процедуре модуля объекта, и именно там нечитаемы реквизиты объекта. В этой процедуре я создаю нового контрагента и пытаюсь реквизит объекта заполнить этим новым значением, но реквизит не меняется
18 RomanYS
 
11.05.16
10:30
(17) ближе к делу. Ты приводишь куски кода, а потом говоришь что не работает где-то "там" в другом месте. Где и что у тебя не получается.
19 LisaAlisa
 
11.05.16
10:42
(18) ок.
Из формы (не основной) я обращаюсь к функции модуля объекта. Из одной формы я обращаюсь к функции создания номенклатуры, из другой - к процедуре создания контрагентов. В (7) я описала, как создаю номенклатуру, она записывается успешно. После этого я должна в "МояТабличнаяЧасть" - реквизит объекта - записать эту новую номенклатуру, а так же записать её в таблицу-реквизит формы. но "МояТабличнаяЧасть" имеет тип неопределено и в процедуре модуля объекта, и в процедуре формы. поэтому не могу это сделать. Функция СоздатьНоменклатуру() имеет Возврат НоменклатураСсылка; - но это значение не возвращается в форму, поэтому не могу заполнить и таблицу формы.
Получается, элемент создала, но не могу его записать ни в объект, ни в реквизит формы.
Форму открываю так
        ОткрытьФорму(
            ДополнительныеПараметры.ИмяФормы,
            Новый Структура("ТаблицаНесоответствий", ДополнительныеПараметры.Таблица),
            ЭтотОбъект,,,,
            Новый ОписаниеОповещения("СопоставлениеЗавершение", ЭтотОбъект, ДополнительныеПараметры));
20 LisaAlisa
 
11.05.16
10:45
(16) раньше обращение к реквизитам объекта было в функции СоздатьНоменклатуру(), но я убрала эту часть, т.к. она не работает. Заполняю реквизиты пока обходным путем. Сначала создаю номенклатуру, а потом в основной форме вызываю процедуру по заполнению реквизитов, где приходится искать новую номенклатуру
21 RomanYS
 
11.05.16
10:49
(19) МояТабличнаяЧасть - это реквизит (не табличная часть?) обработки? Какого она типа (по метаданным обработки)? Что ты в неё пытаешься засунуть(присвоить)?
22 LisaAlisa
 
11.05.16
10:53
МояТабличнаяЧасть - реквизит объекта, табличная часть. Я пытаюсь перебрать строки этой ТЧ и некоторые из них заполнить ссылкой на созданную номенклатуру. НО она недоступна,пустая в момент создания номенклатуры, хотя на самом деле строки есть
23 RomanYS
 
11.05.16
11:18
(22) "реквизит объекта, табличная часть" = ТЧ обработки?
"недоступна" это как?
"пустая" - всё таки это ТЧ, в (19) утверждалось, что неопределено.

(20) опять тоже самое, ты приводишь код, который работает. А спрашиваешь почему не работал код, который ты убрала.

Покажи ошибку и тебе (может быть) объяснят почему она возникает.
24 LisaAlisa
 
11.05.16
11:40
Функция СоздатьНоменклатуру(Строка) Экспорт
    
        НоменклатураНовый = Справочники.Номенклатура.СоздатьЭлемент();
        НоменклатураНовый.АлкогольнаяПродукция                        = Истина;
        НоменклатураНовый.Артикул                                        = Строка.Артикул;
        НоменклатураНовый.Наименование                                    = Строка.Наименование;
        НоменклатураНовый.НаименованиеПолное                        = Строка.ПолноеНаименование;
        
        Попытка
            НоменклатураНовый.Записать();
            НоменклатураСсылка = НоменклатураНовый.Ссылка;
        Исключение
            Сообщить("Артикул "+НоменклатураНовый.Артикул + ". " + ОписаниеОшибки());
        КонецПопытки;
        
        Если Не Успех Тогда
            Возврат Справочники.Номенклатура.ПустаяСсылка();
        КонецЕсли;

        Отбор = Новый Структура("Артикул",Строка.Артикул);
        МассивСтрок = МояТабличнаяЧасть.НайтиСтроки(Отбор);
        Для каждого СтрокаМассива Из МассивСтрок Цикл
            СтрокаМассива.НоменкалтураСсылка = НоменклатураСсылка;
        КонецЦикла;
            
    Возврат НоменклатураСсылка;

КонецФункции

Не записывается ничего в "МояТабличнаяЧасть", если эту функцию вызываю из неосновной формы. В этом случае МояТабличнаяЧасть имеет значение ВнешняяОбработкаТабличнаяЧасть.ВнешняяОбработка1.МояТабличнаяЧасть, тип такой же ВнешняяОбработкаТабличнаяЧасть.ВнешняяОбработка1.МояТабличнаяЧасть
25 LisaAlisa
 
11.05.16
11:52
в отладчике не видно ни колонок ТЧ, ни значений
26 RomanYS
 
11.05.16
12:17
(24) Если ТЧ пустая, то твой код её не изменит.

Покажи результат:

&НаСервере
Процедура СоздатьКонтрагентовНаСервере()
Сообщить("на форме: "+ Объект.МояТабличнаяЧасть.Количество());

    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

Сообщить("у обработки: "+ ОбработкаОбъект.МояТабличнаяЧасть.Количество());
    ОбработкаОбъект.СоздатьПартнеровКонтрагентов(ТаблицаНесопоставленныхКонтрагентов);
    ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");

КонецПроцедуры
27 LisaAlisa
 
11.05.16
12:36
результат

На форме: 0
У обработки: 0

Хотя ТЧ совершенно точно заполнена, она заполняется в основной форме, откуда и вызывается форма сопоставления контрагентов
28 BlackBytes
 
11.05.16
13:07
а где и когда заполнялась МояТабличнаяЧасть?

Отбор = Новый Структура("Артикул",Строка.Артикул);
        МассивСтрок = МояТабличнаяЧасть.НайтиСтроки(Отбор);
        Для каждого СтрокаМассива Из МассивСтрок Цикл
        СтрокаМассива.НоменкалтураСсылка = НоменклатураСсылка;
        КонецЦикла;
тут отладчиком и смотри есть или нету
29 RomanYS
 
11.05.16
13:11
(27) ну вот ты и добралась до правильного вопроса "Как в УФ передать контекст из одной формы (обработки) в другую форму (при её открытии)?"
30 LisaAlisa
 
11.05.16
13:39
(29) т.е. в дополнительные параметры надо передать объект?
31 LisaAlisa
 
12.05.16
08:39
(28) ТЧ заполнялась в основной форме обработки, из которой вызывается форма сопоставления контрагентов
32 RomanYS
 
12.05.16
09:08
+(29) общего контекста/объекта у форм нет, поэтому контекст этот надо передавать явно, например

КопироватьДанныеФормы(ЭтаФорма.ВладелецФормы.Объект, Объект);
И не забыть потом вернуть данные обратно.

Если на допформе ТЧ не отображается, то проще редактировать ТЧ основной формы:

ТЧ = ЭтаФорма.ВладелецФормы.Объект.МояТабличнаяЧасть;
МассивСтрок = ТЧ.НайтиСтроки(Отбор);
...
33 LisaAlisa
 
12.05.16
10:13
RomanYS , огромное спасибо!!! Вы мне очень помогли!!!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс