Имя: Пароль:
1C
1C 7.7
v7: Применение метода формы Активизировать()
0 stpd
 
12.01.12
09:10
В расходном документе клиент попросил НЕ заполнять некоторые колонки табличной части.
Суть в том, что эти поля заполняются автоматически, рассчитываются при выборе товара в зависимости от цены, наличия и прочих характеристик.
Клиент хочет для определенных видов товара указывать только конечную сумму.
Соответственно, в модуле формы этого документа я вставляю в процедуру ПриВыбореТовара() следующее условие:

   Если Найти(Товар.Наименование,"метка")=0 Тогда          
       ...
       // если не помечено - стандартное движение курсора и
       // стандартная обработка, то есть те самые расчеты
       ...
   Иначе  
       // если помечено - переходим сразу к последней колонке
       Активизировать("Итого",1);            
   КонецЕсли;                                                

и получаю в ответ:

   Активизировать("Итого",1);
   {Документ.РН.Форма.Модуль(209)}: В данной формуле не может быть вызвана эта процедура(функция)

Роюсь в ЖКК, инете - не вижу со своей стороны ошибок. А она - видит.
Рассудите, плз. :)
1 KUBIK
 
12.01.12
09:12
Форма.
2 ДенисЧ
 
12.01.12
09:12
Ищи слова "Ложное закрытие"
3 dk
 
12.01.12
09:16
может проще нащелкать галок "Пропускать при вводе" в нужных колонках?
правда это для всех, а не выборочно
4 Shaman100M
 
12.01.12
09:23
(0) клиент-то хочет, но представь себя на месте его оператора - у него отнимут возможность работать вслепую, ему придется думать и смотреть, в каком столбце  у него находится курсор в таблице - в количестве или сумме. Просто оставить как есть - для таких позиций автоматический расчет цены и количества, а потом контроль при попытке их изменить.
5 stpd
 
12.01.12
09:34
(1) Активизировать("Форма.Разница",1)
   Активизировать(Форма.Разница,1)
   и даже Активизировать(Форма.ТекущаяКолонка(),1), прошедшая в каком-то из подобных запросов в форумах -
   дают тот же самый результат: "В данной формуле не может быть вызвана..."  

(2) А подробнее можно? Ложное закрытие - чего? Искать - где?
   Интернет дает что угодно, только не 1С :)

(3) именно - не выборочно.

(4) Я вобщем-то уже сделал, что хотел - через WSH.SendKeys.
   Интерес чисто принципиальный - что за ФОРМУЛА? И почему метод формы, официально
   обязанный работать в модуле формы, тем не менее в нем не работает?
6 Ёпрст
 
12.01.12
09:41
(0)http://my1c-archive.narod.ru/knowhow/getskod.html

а сендкей - это моветон.
7 Ковычки
 
12.01.12
09:41
Форма.Закрыть
ПриЗакрытии
Активизировать
8 stpd
 
12.01.12
13:06
(6) Очередная засада :( :
  Форма.Закрыть(0) - якобы закрывающая без вопросов, тем не менее вопрос задает.
  И закрывает-таки форму, с сохранением или без.
9 stpd
 
12.01.12
13:09
Век живи -век учись...
Сколько с 1С работаю - впервые узнаю, что есть еще область действия "формула"...
10 filh
 
12.01.12
13:14
(8) покажи код где Форма.Закрыть(0); и Процедура ПриЗакрытии()
11 Ёпрст
 
12.01.12
13:22
(8) форму она не закрывает, ибо статусвозврата в 0 в ПриЗакрытии стоит, это раз, вопросов никаких не задается при этом, это два.
А что ты там пишешь - нам отсюда не видно, это три
12 stpd
 
12.01.12
13:49
По-моему точная копия того, что на что была ссылка
//******************************************************************************
Процедура ПриЗакрытии()                                
  Если МожноЗакрыть=0 тогда                      
     Активизировать("Разница",1);  
       СтатусВозврата(0);      
  КонецЕсли;              
  МожноЗакрыть=1;        
КонецПроцедуры

//*******************************************
Процедура ПриВыбореТовара();
   Если Найти(Товар.Наименование,"метка")=0 Тогда          
       ...
       // если не помечено - стандартное движение курсора и

       // стандартная обработка, то есть те самые расчеты

       ...
   Иначе  
       // если помечено - переходим сразу к последней колонке
       МожноЗакрыть = 0;
       Форма.Закрыть(0);
   КонецЕсли;  
КонецПроцедуры
13 filh
 
12.01.12
13:53
(12) Перем МожноЗакрыть; в начале модуля объявил?
14 stpd
 
12.01.12
13:59
Само собой!
15 Ёпрст
 
12.01.12
14:05
(14) врешь ведь.
16 stpd
 
12.01.12
14:11
почему?
17 stpd
 
12.01.12
14:20
Прохожу код отладчиком. Вот что имею:
- в процедуру ПриВыбореТовара() Отладчик входит дважды. Причем подряд.
- после чего, наконец, входит в ПриЗакрытии(). Нормально отрабатывает - через условие и СтатусВозврата(0).
- и после выхода из ПриЗакрытии() - передо мной запрос на сохранение. На фоне формы
  с переместившимся курсором.
18 Ёпрст
 
12.01.12
14:24
(17) ну, а теперь подумай  - 2 раза!
первый раз - нормально со статусом возврата 0, второй раз - закрывает форму.
19 stpd
 
12.01.12
14:26
Когда он инициирует второе закрытие?
При втором прохождении команды Форма.Закрыть(0)?
20 stpd
 
12.01.12
14:28
Вообще - почему 2 раза?
Первый - обработка выбора из справочника, а второй - выход из режима редактирования ячейки?
21 Ёпрст
 
12.01.12
14:36
(20) втыкай выполнятьФормулутолькоприизменении(1) - полегчает, или смотри в сторону обрботкаВыбораЗначения
22 stpd
 
12.01.12
17:28
Включил Форма.Товар.ВыполнятьФормулуТолькоПриИзменении(1).

Пошел проверять отладчиком. Эффект - тот же: при заполнении пустой ячейки, т.е. изменении, процедура ПриВыбореТовара() вызывается дважды. Плюнул, перекурил. Попробовал еще раз. Твою мать! Одно прохождение! Что я сделал?!!  
Методом научного тыка определил:
- при работе мышью (выбор товара в справочнике двойным кликом) - имеем два прохода ПриВыбореТовара() и запрос на сохранение.
- при работе клавой (стрелки и Enter) - проход один и запроса на сохранение нет.
Форма ведет себя так как я и хотел.
Всем спасибо. Тему можно считать закрытой.
23 Ёпрст
 
12.01.12
17:36
Смотри еще событие ОбработкаВыбораЗначения - оно всегда 1 раз будет.. если че.
24 stpd
 
12.01.12
18:43
(23) Именно. И ведь пользовался же раньше :) Но не знал этого нюанса...
Окончательно получилось так, что пресловутую формулу - выкинул нафиг. А код переместил в ОбработкаВыбораЗначения():

Процедура ОбработкаВыбораЗначения(ТекЗнач,ТекЭлем,Флаг)
   Если ТекЭлем = "Товар" Тогда                        
       Если Найти(ТекЗнач.Наименование,"метка")=0 Тогда
           ...
           //Всяко разно...
           
       Иначе                                                      
           Активизировать("Разница",1);                          
       КонецЕсли;                                                
   КонецЕсли;
КонецПроцедуры