Имя: Пароль:
1C
1C 7.7
v7: Активный элемент формы (продолжение)
0 Downkey
 
14.08.11
12:58
Начало: на форме имеется поле ввода, которое открывает справочник номенклатуры дял подбора, текстовое поле для ввода серийника и табличная часть справочника. После выбора номенклатуры вводятся серийники.
По совету мудрых товарищей, я справился с пробемой принудительной активации поля для ввода серийника, ну, чтоб после ввода, курсор не перескакивал в табличную часть, а возвращался в поле серийника.
Но тут возникла следующая проблема - при изменении номенклатуры, после ввода серийника, вываливается ошибка:

Активизировать("Серийник");
{Справочник.Серийники.ФормаСписка.СерийникиВвод.Модуль(113)}: В данной формуле не может быть вызвана эта процедура(функция)

Почеу не может быть вызвана? Ведь если номенклатура не изменяется - все вызывается корректно!
1 Rie
 
14.08.11
13:02
(0) Используй фиктивное закрытие.

Активизировать - оно плохо себя ведёт в формулах полей ввода.
2 Downkey
 
14.08.11
13:03
Я как раз через фиктивное закрытие и делаю:

Процедура ПриЗакрытии()
    Если МожноЗакрыть=0 тогда
       Активизировать("Серийник");
       СтатусВозврата(0);
    КонецЕсли;            
    МожноЗакрыть=1;
КонецПроцедуры // ПриЗакрытии
3 Downkey
 
14.08.11
13:05
(1) Rie, ты участвовал тогда в моей теме.. Активный элемнет формы
4 Rie
 
14.08.11
13:06
(2) Вероятно, где-то ещё делаешь. Поскольку "В данной _формуле_".
5 Rie
 
14.08.11
13:07
(3) Виноват. Больше не повторится :-)
6 Downkey
 
14.08.11
13:10
(5) не-не-не... повторяйся!!  
делаю ТОЛЬКО в одном месте.
Если номенклатура не изменяется , т.е. если серийники вводятся для одной позиции - все ОК.
А если позицию изменить - ошибка!, и в табличной части вываливается список серийников (подчиненного справочника) для исходной позиции, а не для измененной! вот я чего еще не пойму.
7 Rie
 
14.08.11
13:18
(6) А как ты меняешь _позицию_-номенклатуру? Что в этом случае срабатывает?
И где стоит Форма.Закрыть()?
8 Downkey
 
14.08.11
13:23
Форма.Закрыть() стоит в двух местах - в формуле поля выбора номенклатуры и в формуле обработки текстового поля серийника.

//* формула поля выбора номенклатуры
Процедура Всерийник()
   ИспользоватьВладельца(ВыбНоменклатура);    
   ИерархическийСписок(1,0);
   Серийник=""; // очищаем поле
   МожноЗакрыть=0;
   Форма.Закрыть(0);
КонецПроцедуры


//** формула обработки ввода серийника
Процедура Всправочник()      
   Если ПустоеЗначение(ВыбНоменклатура)=0 тогда
       спрСер.Новый();
       спрСер.Номенклатура=ВыбНоменклатура;  
       спрСер.Наименование=Серийник;
       спрСер.ДатаПост=ДатаПост1;
       спрСер.Владелец=ВыбНоменклатура;
       Форма.Обновить();
       Серийник="";
       МожноЗакрыть=0;
       Форма.Закрыть(0);
   Иначе
       Предупреждение("Не выбрана номенклатура.");
       Возврат;
   КонецЕсли;    
КонецПроцедуры
9 Rie
 
14.08.11
13:45
(8) Не совсем понял. Эта форма - форма чего? Почему нет спрСер.Записать()?
10 Downkey
 
14.08.11
13:51
(9) На само деле есть, эт я коммент удалил вместе с спрСер.Записать() когда в форум вставлял.
Форма - форма справочника серийных номеров.
11 Rie
 
14.08.11
14:12
(10) Тупой вопрос - а что говорит по этому поводу товарищ Отладчик? Каким путём добираемся до строки 113?
12 Downkey
 
14.08.11
15:55
Все строки процедуры ПриЗакрытии() проходит без претензий, а после того как выходит из процедуры - вываливает ошибку.

Ну да ладно. Я это дело вкорне обошел - изменил немного логику ввода серийников. Но все равно не понятно, почему ругается только при смене номенклатуры и почему после ругательств сбрасывает справочник серийников на первоначального владельца.
13 Torquader
 
14.08.11
20:53
Есть мнение, что Форма.Обновить и потом Форма.Закрыть - не очень хорошо.
Также интересно, что происходит при обновлении формы (какие формулы вызываются).
P.S. перенеси Обновить в ПриЗакрытии, чтобы всё было корректно (то есть сначала активизировали Элемент, а потом уже обновляли).
14 Злопчинский
 
15.08.11
01:08
".. а возвращался в поле серийника."
в обработке ввода серийника - открываешь МОДАЛЬНО внешнюю обработку. При открытии обработки - СтатусВозврат(0); и возврат - курсор остается в поле ввода.
15 Downkey
 
15.08.11
12:10
(13) пробовал и без Форма.Обновить - результата тот же.
(14) Обработка ввода серийника это не внешняя обработка, это процедурка в модуле основной формы. Или я чегото недопонимаю.
16 Злопчинский
 
15.08.11
17:45
(15) включи мозг и прочитай сабж 14 внимательно.
.
в обработке ввода серийника - открываешь МОДАЛЬНО внешнюю обработку.
.
"обработке ввода серийника" - можнозаменить так: ПроцедураПриВводеСерийникаВполеВвода()