|
Не основная форма обработки и содержимое реквизитов объекта | ☑ | ||
---|---|---|---|---|
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 , огромное спасибо!!! Вы мне очень помогли!!!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |