Имя: Пароль:
1C
1C 7.7
v7: Непонятка - приоткрытии внешнего отчета параметр в форме читается через раз
0 Vladal
 
21.12.11
13:19
Релиз 7.70.027.
Из одной внешней обработки вызываю вторую.

Делаю так:

в первой:
   ....
   
   Параметры.Установить("СтрокаКолонок","ТМЦ, Цена");
   ОткрытьФорму("Отчет", сп, "ОбработкаТЗ.ert");

Во второй, ОБработкаТЗ.ert которая:

Процедура ПриОткрытии()
   Сп = Форма.Параметр;
   ...

Вот тут-то Форма.Параметр и пусто. Отладчик говорит, что в первой обработке Параметры - список значений, размер списка 7 элементов, даёт его просмотреть по Параметры.ВыбратьЗначение(1)

А во второй как-то через раз - то пусто, то есть
Соответственно, если параметр пусто получается, то не работает.

Как отловить или из-за чего это может быть?
1 Vladal
 
21.12.11
13:20
упс, пропустьил строку: сп = Параметры
2 Vladal
 
21.12.11
13:27
Правильный вариант:

   Параметры.Установить("СтрокаКолонок","ТМЦ, Цена");
   сп = Параметры
   ОткрытьФорму("Отчет", сп, "ОбработкаТЗ.ert");

....
во второй обработке:

Процедура ПриОткрытии()
   Сп = Форма.Параметр;

Сообщить(Сп.размерСписка) - либо сообщает размер (7 элементов) либо ругается "Поле агрегатного объекта не обнаружено", это если параметр формы не прочитался.
3 1Сергей
 
21.12.11
13:28
(2) Сообщить(Сп.размерСписка())
4 1Сергей
 
21.12.11
13:30
и для чего такой изврат, если достаточно:
   Параметры=создатьОбъект("СписокЗначений");
   Параметры.Установить("СтрокаКолонок","ТМЦ, Цена");
   ОткрытьФорму("Отчет", Параметры, "ОбработкаТЗ.ert");
&
5 Vladal
 
21.12.11
13:41
Да то изврат еще тот. Там список дальше работает. И наверно, чтобы зафиксировать его и копируется он в Параметры
6 Vladal
 
21.12.11
13:42
Суть в том, что этот список всегда заполнен (Сообщить() сообщает его размер до вызова обработки), а в параметры он не всегда попадает - там "соощить" иногда вываливается в ошибку
7 dk
 
21.12.11
13:44
ОткрытьФормуМодально
8 NS
 
21.12.11
13:46
У тебя сп  - ссылка на Параметры.
К моменту входа в обработку время жизни "параметры" уже закончилось.
Выход - сделать "параметры" переменной модуля формы.
9 1Сергей
 
21.12.11
13:47
(6) не понял. Ты где проверяешь, в вызываемой обработке или в вызывающей?
10 NS
 
21.12.11
13:47
Либо передавать не сп, а параметры.
11 Vladal
 
21.12.11
13:52
(8) Сделано, в первой строке: Перем Сп, Параметры, Таб;
12 Vladal
 
21.12.11
13:52
(9) А обеих. Перед вызовом ОткрытьФорму и после вызова Форма.Параметр
13 1Сергей
 
21.12.11
13:56
(12) Избавься вообще от Сп.

И:

ОткрытьФорму(<?>,,)
Синтаксис:
ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>,<ИмяФайла>)
Назначение:
Открывает визуальную форму внешнего отчета.
Возвращает: 1 - если действие выполнено, 0 - иначе.
Параметры:
<ОписательОбъекта> - строковое выражение. ''Отчет'';
<КонтекстФормы> - имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр. После исполнения данного метода система вернет в данную переменную контекст открытой формы (необязателен).
<ИмяФайла> - cтроковое выражение - полное имя файла внешнего отчета.
Замечание:
Пока форма открыта, тип значения параметра <КонтекстФормы> равен 100, когда закрыта - 0.

на последнее предложение обрати внимание
14 Ёпрст
 
21.12.11
13:58
(0) где-то еще переопределяешь Параметры свои..
Или есть такой реквизит формы.
15 Vladal
 
21.12.11
14:03
Короче, почистил все "параметры", оставил только Сп.


также выпадает.
Х.з.
16 1Сергей
 
21.12.11
14:04
(15) ещё раз покажи как сделал
17 Vladal
 
21.12.11
14:10
на принимающей стороне

Процедура ПриОткрытии()
   Сп = Форма.Параметр;
   Если ПустоеЗначение(Сп) = 0  Тогда        
============================================

при вызове:

   Сп = СоздатьОбъект("СписокЗначений");
...
   Сп.Установить("СтрокаКолонок","ТМЦ, Цена");
   ОткрытьФорму("Отчет", Сп, "ОбработкаТЗ.ert");
18 Ёпрст
 
21.12.11
14:11
(17)
сообщить(Форма.Параметр.РазмерСписка());

поди всегда нормально работает, не так ли ?
:)
19 2S
 
21.12.11
14:11
ну епт, на принимающей стороне просто
Если ПустоеЗначение(Форма.Параметр) = 0  Тогда
20 NS
 
21.12.11
14:12
(11) Значит ты вызывающую форму закрываешь.
21 Vladal
 
21.12.11
14:12
Вот не всегда.
Иногда выдаёт "Поле агрегаьного объекта не обнаружено"
22 Vladal
 
21.12.11
14:13
нихрена не закрываю. Всё программно.
Простите за мой французский.
23 Vladal
 
21.12.11
14:13
(19) Да так и сделал. Но толку от этого нихт. Если отчет работал и перестал.
24 NS
 
21.12.11
14:13
(22) Ничего не понял. Программно форму что-ли не закрыть?

У тебя в момент открытия вызываемой формы вызывающая на экране?
25 Vladal
 
21.12.11
14:15
(24) Первая форма всегда открыта. Она программно вызывает служебную обработку. Та делает вычисления и по идее в список, который передаётся в неё параметром, помещает результаты работы.

Но нихт.
26 Vladal
 
21.12.11
14:15
вторая потом закрывается, первая остается открытой всегда.
27 NS
 
21.12.11
14:15
Хотя не важно. Предавай везде список по-человечески, а не через равно, и всё будет работать.
сп=создатьобъект("списокЗначений");
Параметры.выгрузить(сп);

сп=создатьобъект("списокЗначений");
Форма.Параметр.выгрузить(сп);
28 Vladal
 
21.12.11
14:16
Что заметил - если открыт отлачик  и сджелан стоп перед вызовом формы второй обработки - срабатывает.
Если стопа не было, пролетает мимо.
29 Vladal
 
21.12.11
14:16
Выгрузить... Загрузить... Хм.. ща попробую.
30 Ёпрст
 
21.12.11
14:17
Ну ёпта.. Сразу не мог об этом сказать ??
Лови в ПриПовторномОткрытии свой список.
У тебя вторая форма еще не закрыта.
31 Vladal
 
21.12.11
14:22
При повторном.. сфигли она не закрылась? ща пофиксю.
32 Vladal
 
21.12.11
14:34
там фигня такая теперь - в полученный параметр я помещаю результат - Сп.Установить("Табл", Табл);

и он не читается:

   Сп.Установить("СтрокаКолонок","ТМЦ, Цена");
   ОткрытьФорму("Отчет", Сп, "ОбработкаТЗ.ert");
   Табл = Сп.Получить("Таблица");
33 NS
 
21.12.11
14:36
ОткрытьФорму не вызывается сразу!
Сразу вызывается и ждет результата только открытьформумодально.
34 mdocs
 
21.12.11
14:36
Если форма уже открыта, то нужно юзать ПриПовторномОткрытии()
35 1Сергей
 
21.12.11
14:37
(34)* в вызывающей форме, а не вызываемой
36 mdocs
 
21.12.11
14:40
(35) Да. Если не модально, то вызывающую форму тоже "открывать" из вызываемой и передавать параметры
37 Vladal
 
21.12.11
14:43
(35) Рекурсивно?

Форма 1: Открыть Форму("Отчет, сп, "ОбработкаТЗ");

ОбработкаТЗ:
Форма.Параметр;
...
ОткрытьФорму ("отчет", СП, "ОтчетТМЦ.ert");


Так??
38 mdocs
 
21.12.11
14:46
если не ошибаюсь да, и в первой форме ловить приповторномоткрытии
39 Vladal
 
21.12.11
14:59
Восстановил из архива, что было на утро.
Работает.
НУ что за дела, блин?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн