Имя: Пароль:
1C
1C 7.7
v7: Переход в форму списка справочника из элемента справочника.
,
0 1C_noob_1C
 
08.04.13
14:57
Добрейшего дня.

Платформа: 7.70.025
ТиС: 7.70.941

Пытаюсь реализовать переход в ФормуСписка справочника из формы элемента справочника, по аналогии "Перейти в журнал".

Сама задача состоит в следующем:
Справочник Номенклатура. При создании новой Номенклатуры, если номенклатура с таким артикулом есть, то при закрытии активизировать в ФормеСписка существующую Номенклатуру.

Алгоритм моих действий таков:
При вводе артикула, если такой существует, то сообщать пользователю... и при закрытии формы выполняется глобальная процедура, которая открывает ФормуСписка справочника и передает ей как параметр Номенклатуру, которую надо активизировать.



// В самом элементе справочника

Перем НужноПерейтиВФормуСписка, СтАртикул;

Процедура ПроверкаАртикула()
Тов=СоздатьОбъект("Справочник.Номенклатура");
Если Тов.НайтиПоРеквизиту("Артикул",Артикул,1)=1 Тогда
       Предупреждение("Товар с введенным артикулом уже существует!");  
       СтАртикул = Артикул;
       НужноПерейтиВФормуСписка = 1;
       Артикул="";
КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()

Если (СтАртикул <> "") И (НужноПерейтиВФормуСписка = 1) Тогда
       глОткрытьНоменклатуруВФормеСписка(СтАртикул);
КонецЕсли;

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

// Глобальный модуль

Процедура глОткрытьНоменклатуруВФормеСписка(Артикул, СписокДействий) Экспорт

СпрНом = СоздатьОбъект("Справочник.Номенклатура");    
СпрНом.НайтиПоРеквизиту("Артикул", Артикул, 1);
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", СпрНом.ТекущийЭлемент());

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

// В ФормеСписка справочника

Процедура ПриОткрытии()

Если Форма.Параметр <> "" Тогда
       АктивизироватьОбъект(Форма.Параметр);
КонецЕсли;

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


В итоге открывается вторая форма списка Номенклатуры, в которой активизируется нужная номенклатура.

Что я делаю не так или мне чего-то не хватает?

З.Ы. Набрел на ПриПовторномОткрытии(), но пока не пробовал.
1 Rie
 
08.04.13
14:59
(0) Ты внимательно посмотрел, какие параметры у ОткрытьФорму?
А то у тебя в (0) нечто странное написано...
2 1C_noob_1C
 
08.04.13
15:03
(1) Да.
Открыть форму списка справочника.
ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>)

<ОписательОбъекта> - строковое выражение. ''Справочник.ХХХХХ.YYYYY''

<КонтекстФормы> - имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр.

Единственно в коде "глОткрытьНоменклатуруВФормеСписка" без параметра "СписокДействий" (не все копировал).
3 Rie
 
08.04.13
15:03
Если уж тебе именно так хочется - в форме списка справочника в ПриОткрытии получи передаваемый элемент. И АктивизироватьОбъект.
4 Rie
 
08.04.13
15:04
(2) Ты передал значение в форму. И что дальше?
5 1C_noob_1C
 
08.04.13
15:06
(3) Это я и делаю.
Но открывается еще одна ФормаСписка. Не получается сделать, чтоб Номенклатура активизировалась в уже открытом

(4) последняя процедура ПриОткрытии()
6 Ёпрст
 
08.04.13
15:07
(0)
Комменти всё, оставь только ЭТО
Процедура ПроверкаАртикула()
    Тов=СоздатьОбъект("Справочник.Номенклатура");
    Если Тов.НайтиПоРеквизиту("Артикул",Артикул,1)=1 Тогда
       Предупреждение("Товар с введенным артикулом уже существует!");  
       Конт="";
       ОткрытьФорму("Справочник.Номенклатура",Конт);
       Конт.АктивизироватьОбъект(Тов.ТекущийЭлемент());
  КонецЕсли;
КонецПроцедуры
7 1C_noob_1C
 
08.04.13
15:13
(6) ПроверкаАртикула() выполняется в модуле формы самого справочника, при изменении реквизита "Артикул" на форме.

ОткрытьФорму("Справочник.Номенклатура",Конт);
{Справочник.Номенклатура.Форма.Модуль(16)}: Открытие окна в данном режиме недоступно!
Конт.АктивизироватьОбъект(Тов.ТекущийЭлемент());
{Справочник.Номенклатура.Форма.Модуль(17)}: Значение не представляет агрегатный объект (АктивизироватьОбъект)
8 Rie
 
08.04.13
15:14
(7) Используй "фиктивное закрытие".
9 Rie
 
08.04.13
15:17
10 1C_noob_1C
 
08.04.13
15:27
(7)(8) Как я понимаю это слегка не то, что мне надо. Этот метод активизирует элементы внутри одной формы. Или я что-то не понял...
11 Rie
 
08.04.13
15:29
(10) "Фиктивное закрытие" позволит обойти запрет, о котором ты говоришь в (7).
12 1C_noob_1C
 
08.04.13
15:30
(11) Понял.
13 Ёпрст
 
08.04.13
15:31
(10)
Перем Вася;
Процедура ПроверкаАртикула()
    Тов=СоздатьОбъект("Справочник.Номенклатура");
    Если Тов.НайтиПоРеквизиту("Артикул",Артикул,1)=1 Тогда
       Предупреждение("Товар с введенным артикулом уже с уществует!");  
       Вася = Тов.ТекущийЭлемент();
       Форма.Закрыть(0);
  КонецЕсли;
КонецПроцедуры
Процедура ПриЗакрытии()
 Если ПустоеЗначение(Вася)=0 Тогда
       Конт="";
       ОткрытьФорму("Справочник.Номенклатура",Конт);
       Конт.АктивизироватьОбъект(Вася);
       СтатусВозврата(0);
       Вася="";
 КонецЕсли;
КонецПроцедуры
14 1C_noob_1C
 
08.04.13
15:46
(7) (8) (13)

Спасибо, работает. Оказалось все проще...
15 1C_noob_1C
 
08.04.13
15:46
+(14) чем я думал)
16 1C_noob_1C
 
08.04.13
15:49
Разрешите еще попутный вопрос.

Возможно ли сделать данный метод универсальным для всех форм списков: ДляВыбора, ДляПодбора, ФормаСписка?
17 1C_noob_1C
 
08.04.13
15:53
+(16) или ограничить только для ФормыСписка
18 1C_noob_1C
 
08.04.13
16:03
Извиняюсь за второй вопрос в одной теме (наглость).
Спасибо большое за помощь.
19 Ёпрст
 
08.04.13
16:07
Можно.. даже штатно.
Но проще - через Класс.Перехватчик - хоть во всех формах сразу и что угодно
20 1C_noob_1C
 
08.04.13
16:10
(19) Понял. Буду копать дальше.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан