Опрос
Опрос закрыт Тема Опроса: Вызов методов группового контекста
bars   pie
*** Этот Опрос был завершен ***


Вариант 1    
  10 (66.7%)
Вариант 2    
  2 (13.3%)
Вариант 3    
  2 (13.3%)
Вариант 4    
  0 (0.0%)
Ваш вариант    
  1 (6.7%)




Всего голосов: 15
« Последняя модификация: sedmin : 04. Декабря 2006 :: 15:02 »
Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Вызов методов группового контекста (число прочтений - 10553 )
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Вызов методов группового контекста
03. Декабря 2006 :: 20:37
Печать  
Хотелось бы услышать мнения уважаемого сообщества по следующему вопросу.

Цитата:
Процедура модуля может выполняться в разных режимах: в режиме обычной процедуры, либо в режиме события, предопределенного, либо вызываемого из формул элементов. Вот пример:
Код
Выбрать все
Процедур СостояниеТЗНаФорме()
    Сообщить("Номер строки="+тзНаФорме.НомерСтроки);
    Сообщить("Текущая строка="+тзНаФорме.ТекущаяСтрока());
КонецПроцедуры 


Такая процедура может выдать разные варианты в зависимости от того, вызвана она из другой процедуры, либо вызвана, например, по щелчку на таблице значений.

То же самое и для этой процедуры, вызываемой извне через КонтекстФормы.СостояниеТЗНаФорме(). Мы можем захотеть ее вызвать как метод объекта, тогда НомерСтроки не должен портиться. Либо мы вызываем ее как процедуру контекста извне.

Но в 1С++ начиная с версии 2.0.3.1 такая запись приведет к тому, что процедура будет выполнена как будто извне, то есть с переустановкой НомераСтроки.

Для разделения таких вариантов можно реализовать разные способы вызова процедур/функций. Думаю, что вызов через точку должен работать просто как вызов метода объекта, без дополнителбных действий.
Код
Выбрать все
КонтекстФормы.СостояниеТЗНаФорме();  


Для вызова процедуры, как события контекста можно сделать разные варианты:

1. Самый простой.
Код
Выбрать все
Система.StartBatch(КонтекстФормы);
КонтекстФормы.СостояниеТЗНаФорме();
Система.EndBatch(КонтекстФормы); 


2. Вызвать как событие.
Код
Выбрать все
КонтекстФормы.__ВызватьСобытие("СостояниеТЗНаФорме"); 


либо
Код
Выбрать все
КонтекстФормы.__ВыполнитьПроцедуруФункцию("СостояниеТЗНаФорме"); 


3. Через вспомогательный флаг.
Код
Выбрать все
КонтекстФормы.__ИсполнятьПроцедурыВБатче(1);
КонтекстФормы.СостояниеТЗНаФорме(); 


4. Еще один вариант.
Код
Выбрать все
КонтекстФормы.__ВыполнитьСледующуюПроцедуруВБатче(1);
КонтекстФормы.СостояниеТЗНаФорме(); 



Можно, конечно, реализовать и все четыре варианта.


Поясню, что Система::StartBatch() и Система::EndBatch() - уже реализованы и, по сути - это системные методы 1С. Сейчас для пользовательских методов конткста они вызываются автоматически. Для встроенных методов контекстов (например, НоваяСтрока()) они могут вызываться вручную.

Я же предлагаю никогда не вызывать их автоматически, а реализовать один или несколько удобных механизмов их вызова.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #1 - 04. Декабря 2006 :: 08:13
Печать  
Вариант 1.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #2 - 04. Декабря 2006 :: 09:51
Печать  
Вариант 1.

Потому что при таком раскладе не нужно никаких искусственных примочек типа КонтекстФормы.__ВыполнитьПроцедуруФункцию("СостояниеТЗНаФорме");.  Просто пишем нормальный код на 1С. И к тому же можно выполнить несколько методов в одном батче.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #3 - 04. Декабря 2006 :: 13:55
Печать  
Если присмотреться, то Вариант 1 равнозначен Варианту 3
Система.StartBatch(КонтекстФормы) = КонтекстФормы.__ИсполнятьПроцедурыВБатче(1))
Система.EndBatch(КонтекстФормы) = КонтекстФормы.__ИсполнятьПроцедурыВБатче(0))

Мне больше нравится вариант 3.
Но для бОльшей гибкости лучше наверное реализовать оба способа. Только в таком случае методы должны называться одинаково, кмк.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #4 - 04. Декабря 2006 :: 13:57
Печать  
И вместо непонятных батчей метод предлагаю так и назвать:
КонтекстФормы.__ВыполнятьПроцедурыКакСобытия(1)
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Вызов методов группового контекста
Ответ #5 - 04. Декабря 2006 :: 15:01
Печать  
fez писал(а) 04. Декабря 2006 :: 13:55:
Если присмотреться, то Вариант 1 равнозначен Варианту 3
Система.StartBatch(КонтекстФормы) = КонтекстФормы.__ВыполнятьПроцедурыКакСобытия(1))
Система.EndBatch(КонтекстФормы) = КонтекстФормы.__ВыполнятьПроцедурыКакСобытия(0))


Нет, не так. По крайней мере я не так планировал. Я думал сделать так:

После КонтекстФормы.__ВыполнятьПроцедурыКакСобытия(1) - вызов методов будет выполняться также как сейчас, с новым TurboBL. То есть каждый вызов будет выполняться как событие.

После КонтекстФормы.__ВыполнятьПроцедурыКакСобытия(0) - вызов будет выполняться как в старом TurboBL, как в 2.0.3.0 и ранее.

Собственно, здесь два вопроса: второй вынесен на голосование, а первый следует из второго: придется изменить умалчиваемый способ вызова метода.

Я вижу, что особого интереса к этой теме нет, есть только у разработчиков. Поэтому в дополнение к имеющемуся первому варианту думаю реализовать второй и третий вариант.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вызов методов группового контекста
Ответ #6 - 04. Декабря 2006 :: 15:48
Печать  
Забыл еще идею о пользовательском (в 1С) аналоге BatchGuard.

Код
Выбрать все
БГ = СоздатьОбъект("BatchGuard");
БГ.ОкучиватьКонтекст(КонтекстФормы);

// ну или конструктор с параметрами, типа
// БГ = глФабрика.BatchGuard(КонтекстФормы);

КонтекстФормы.СостояниеТЗНаФорме1();
КонтекстФормы.СостояниеТЗНаФорме2();
КонтекстФормы.СостояниеТЗНаФорме3();
КонтекстФормы.СостояниеТЗНаФорме4();

БГ = 0;
 



Любителей БГ прошу не обижаться Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Вызов методов группового контекста
Ответ #7 - 04. Декабря 2006 :: 22:04
Печать  
kms писал(а) 04. Декабря 2006 :: 15:48:
Забыл еще идею о пользовательском (в 1С) аналоге BatchGuard.

Вот вам BatchGuard, прошу любить и жаловать  Очень довольный

Код
Выбрать все
Класс BatchGuard=BatchGuard.txt

Перем ОкучиваемыйКонтекст;

Процедура ОкучиватьКонтекст(Конт)
    ОкучиваемыйКонтекст=Конт;
    Система=СоздатьОбъект(Система);
    Система.StartBatch(ОкучиваемыйКонтекст);
КонецПроцедуры

Процедура Деструктор()
    Система=СоздатьОбъект(Система);
    Система.EndBatch(ОкучиваемыйКонтекст);
КонецПроцедуры 



Объект глСистема добавить по вкусу.

Или так не честно?  Подмигивание
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вызов методов группового контекста
Ответ #8 - 04. Декабря 2006 :: 22:16
Печать  
А при обнулении переменной объекта, он разрушается сразу?
Если да, тогда сойдет Подмигивание


sedmin писал(а) 04. Декабря 2006 :: 22:04:
Или так не честно?  Подмигивание

Не честно, что ты опрос создал, в котором могут голосовать гости.
Один уже точно проголосовал  Смех
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Вызов методов группового контекста
Ответ #9 - 04. Декабря 2006 :: 23:17
Печать  
kms писал(а) 04. Декабря 2006 :: 22:16:
А при обнулении переменной объекта, он разрушается сразу?
Если да, тогда сойдет Подмигивание

Сразу разрушается. И даже тесты такие у нас есть.  Улыбка

Только сейчас толку от его использования мало - только для родных методов. Такой у нас ТурбоБЛ.  Улыбка

Цитата:
sedmin писал(а) 04. Декабря 2006 :: 22:04:
Или так не честно?  Подмигивание

Не честно, что ты опрос создал, в котором могут голосовать гости.
Один уже точно проголосовал  Смех
А мне не жалко, пусть голосуют.

Но, блин! Почему все чего-то видят, а я не вижу, кто в моем опросе голосует! Что за неравноправие?

  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #10 - 05. Декабря 2006 :: 06:11
Печать  
sedmin писал(а) 04. Декабря 2006 :: 23:17:
Но, блин! Почему все чего-то видят, а я не вижу, кто в моем опросе голосует! Что за неравноправие?

Кнопку "Проголосовавшие" рядом с графиком видишь? Жми, не укусит.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Вызов методов группового контекста
Ответ #11 - 05. Декабря 2006 :: 06:29
Печать  
Где?!! Где эта потайная кнопка?!!
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #12 - 05. Декабря 2006 :: 07:05
Печать  
А ты сам, надеюсь, голосовал?
ИМХО без этого не увидишь, наверняка ты такое условие поставил Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #13 - 05. Декабря 2006 :: 07:36
Печать  
fez писал(а) 05. Декабря 2006 :: 06:11:
sedmin писал(а) 04. Декабря 2006 :: 23:17:
Но, блин! Почему все чего-то видят, а я не вижу, кто в моем опросе голосует! Что за неравноправие?

Кнопку "Проголосовавшие" рядом с графиком видишь? Жми, не укусит.

имхо это привилегия модераторов
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вызов методов группового контекста
Ответ #14 - 05. Декабря 2006 :: 07:38
Печать  
+ и еще нет возможности посмотреть результат голосования не проголосовав самому.
мне вот пришлось выбрать последний вариант дабы сильно не влиять на статистику
простите за офф
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать