Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Возможность вызова Шаблон в КОП для контекста форм (число прочтений - 11555 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Возможность вызова Шаблон в КОП для контекста форм
29. Мая 2008 :: 13:30
Печать  
Народ, не так давно ко мне обратились с проблемой разрулить баг неработоспособности классов 1С++ с использованием вызова функции Шаблон внутри класса для возможности получения данных из контекста формы.

В результате у меня родился вот такой код, впоследствии хорошо проверенный и оттестированный:

Код
Выбрать все
Процедура ВызватьШаблонВнутриКласса(КонтекстФормы, СтрокаПередаваемаяВШаблон) Экспорт
	ВМ = СоздатьОбъект("ВыполняемыйМодуль"); // создание лучше оптимизировать для большей производительности !!

	//ТекстМодуля = "Процедура ВызватьФункцию(СтрФормула) Шаблон(СтрФормула); КонецПроцедуры";
	ТекстМодуля = "Шаблон("""+СтрокаПередаваемаяВШаблон+""");";
	ВМ.УстановитьМодуль(ТекстМодуля);
	ВМ.НазначитьКонтекст(КонтекстФормы); // обязательно до компиляции
	ВМ.КомпилироватьМодуль();

	ВМ.ВыполнитьМодуль(); // вот и все :)

	//ВМ.ВызватьФункцию(СтрокаПередаваемаяВШаблон);
    // вариант с ВызватьФункцию ИМХО можно больше оптимизировать :)
    // т.к. установку текста модуля и компиляцию можно сделать всего один раз !!
КонецПроцедуры
 



Цитата:
Пример вызова в классе
Вместо вызова
Код
Выбрать все
Шаблон("["+атрФормы.Формула+"]"); 


внутри класса нужно написать
Код
Выбрать все
ВызватьШаблонВнутриКласса(Конт, "["+атрФормы.Формула+"]"); 


где Конт - контекст активной формы


А вообще можно добавить в 1С++ предопределенный метод КОП - полную копию
данного метода, только с большей оптимизацией. Это пригодится для упрощения/стандартизации перехода от использования обычных модулей к использованию классов 1С++.

Что скажете?

ЗЫ я сам не люблю юзать Шаблон, но многие активно его юзают Улыбка
Думаю, что спец.метод поможет перейти к классам.
« Последняя редакция: 07. Июня 2008 :: 05:30 - artbear »  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #1 - 02. Июня 2008 :: 12:08
Печать  
Народ, ну что скажете?
Нужно ли вставлять в 1С++ или поместить в репозитарий просто ?
ЗЫ Доктор, почему меня все игнорируют? Улыбка
  

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #2 - 02. Июня 2008 :: 12:42
Печать  
artbear писал(а) 29. Мая 2008 :: 13:30:
для возможности получения данных из контекста формы.

Из контекста какой именно формы? Улыбка
Очередная инкарнация ПолучитьКонтекстОкружения()? Улыбка

Хотя не исключаю, что http://www.1cpp.ru/forum/YaBB.pl?num=1198851876 можно будет разрулить именно таким образом.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #3 - 02. Июня 2008 :: 13:02
Печать  
Федор, я же юзаю явную передачу контекста формы, так что с точки зрения неявного поведения здесь придраться не к  чему Улыбка
  

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



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #4 - 02. Июня 2008 :: 14:04
Печать  
Я не пользуюсь, но возможно пригодится Подмигивание
Если никому это не помешает, то я за расширение возможностей в 1С++  Улыбка
  
Наверх
 
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #5 - 03. Июня 2008 :: 09:35
Печать  
artbear писал(а) 29. Мая 2008 :: 13:30:
Код
Выбрать все
Процедура ВызватьШаблонВнутриКласса(КонтекстФормы, СтрокаПередаваемаяВШаблон) Экспорт
	ВМ = СоздатьОбъект("ВыполняемыйМодуль"); // создание лучше оптимизировать для большей производительности !!

	//ТекстМодуля = "Процедура ВызватьФункцию(СтрФормула) Шаблон(СтрФормула); КонецПроцедуры";
	ТекстМодуля = "Шаблон("""+СтрокаПередаваемаяВШаблон+""");";
	ВМ.УстановитьМодуль(ТекстМодуля);
	ВМ.КомпилироватьМодуль();

	ВМ.НазначитьКонтекст(КонтекстФормы);
	ВМ.ВыполнитьМодуль(); // вот и все :)

	//ВМ.ВызватьФункцию(СтрокаПередаваемаяВШаблон);
    // вариант с ВызватьФункцию ИМХО можно больше оптимизировать :)
    // т.к. установку текста модуля и компиляцию можно сделать всего один раз !!
КонецПроцедуры
 



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

  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #6 - 03. Июня 2008 :: 09:44
Печать  
fez писал(а) 02. Июня 2008 :: 12:42:
artbear писал(а) 29. Мая 2008 :: 13:30:
для возможности получения данных из контекста формы.

Из контекста какой именно формы? Улыбка

Формы, вызывающей данный класс.
В продолжение темы о Перехватчике, я перехватываю установленные реквизиты формы и после быстрого поиска по объекту, установленному в Типе реквизита, устанавливаю найденное значение в реквизит и при этом необходимо выполнить формулу, прописанную в реквизите... (много слов реквизит)
Так что для этих целей Артур показал хороший пример Улыбка
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #7 - 03. Июня 2008 :: 09:52
Печать  
fez писал(а) 02. Июня 2008 :: 12:42:
Очередная инкарнация ПолучитьКонтекстОкружения()? Улыбка

Господа, а вы можете конкретно сказать: будет ли дальше жить метод ПолучитьКонтекстОкружения()?
В багзилле читал, что Артур признал метод устаревшим
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #8 - 03. Июня 2008 :: 10:16
Печать  
artbear писал(а) 02. Июня 2008 :: 12:08:
Народ, ну что скажете?
Нужно ли вставлять в 1С++ или поместить в репозитарий просто ?
ЗЫ Доктор, почему меня все игнорируют? Улыбка


А исключения уже работают ?
Чтобы у пользователя появлялась ошибка, а не вылет в космос.
В варианте с исключениями это уже другой функционал.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #9 - 03. Июня 2008 :: 10:26
Печать  
kiruha писал(а) 03. Июня 2008 :: 10:16:
artbear писал(а) 02. Июня 2008 :: 12:08:
Народ, ну что скажете?
Нужно ли вставлять в 1С++ или поместить в репозитарий просто ?
ЗЫ Доктор, почему меня все игнорируют? Улыбка


А исключения уже работают ?
Чтобы у пользователя появлялась ошибка, а не вылет в космос.
В варианте с исключениями это уже другой функционал.

1. Исключения уже работают в 3.0

2. ПолучитьКонтекстОкружения() признан устаревшим не мной одним, а сообществом.
Метод устарел, но из-за совместимости, скорее всего,никогда не будет удален.
Этим методом не рекомендуется пользоваться, т.к. он вносит элементы неявного поведения в классы, намного лучше явная передача используемого контекста, как в моем примере.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #10 - 03. Июня 2008 :: 10:28
Печать  
AndreyM писал(а) 03. Июня 2008 :: 09:35:
artbear писал(а) 29. Мая 2008 :: 13:30:
Код
Выбрать все
Процедура ВызватьШаблонВнутриКласса(КонтекстФормы, СтрокаПередаваемаяВШаблон) Экспорт
	ВМ = СоздатьОбъект("ВыполняемыйМодуль"); // создание лучше оптимизировать для большей производительности !!

	//ТекстМодуля = "Процедура ВызватьФункцию(СтрФормула) Шаблон(СтрФормула); КонецПроцедуры";
	ТекстМодуля = "Шаблон("""+СтрокаПередаваемаяВШаблон+""");";
	ВМ.УстановитьМодуль(ТекстМодуля);
	ВМ.КомпилироватьМодуль();

	ВМ.НазначитьКонтекст(КонтекстФормы);
	ВМ.ВыполнитьМодуль(); // вот и все :)

	//ВМ.ВызватьФункцию(СтрокаПередаваемаяВШаблон);
    // вариант с ВызватьФункцию ИМХО можно больше оптимизировать :)
    // т.к. установку текста модуля и компиляцию можно сделать всего один раз !!
КонецПроцедуры
 



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


Да, по идее так нужно Улыбка
т.к. назначенный контекст используется при компиляции.
Почему мой код работал у меня, теперь уже не понимаю Улыбка
Проверял именно на внутренних переменных модуля Улыбка
  

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #11 - 03. Июня 2008 :: 10:56
Печать  
artbear писал(а) 03. Июня 2008 :: 10:26:
1. Исключения уже работают в 3.0

2. ПолучитьКонтекстОкружения() признан устаревшим не мной одним, а сообществом.
Метод устарел, но из-за совместимости, скорее всего,никогда не будет удален.
Этим методом не рекомендуется пользоваться, т.к. он вносит элементы неявного поведения в классы, намного лучше явная передача используемого контекста, как в моем примере.

1. Где можно скачать 3.0 (если можно)? На странице 1cpp.ru не нашел. И на сколько она готова к использованию или еще в стадии глобального тестирования?

2. По-моему, не указывая контекст, класс получается намного "юзабилити": не нужно делать того, что является внутренним механизмом самого класса. Согласись, что код (примерно как я делаю сейчас)
Код
Выбрать все
Класс = СоздатьОбъект("КлассОбработкиРеквизитаФормы");
Класс.ОбрабатываемыйРеквизит = "НомерДок"; 


Намного читабельнее и понятней, чем
Код
Выбрать все
Класс = СоздатьОбъект("КлассОбработкиРеквизитаФормы");
Класс.УстановитьКонтекст(Контекст);
Класс.ОбрабатываемыйРеквизит = "НомерДок";
Класс.Лево=300; Класс.Верх=30; Класс.Ширина=100; Класс.Высота=22;
Класс.Формула="ИзмНомерДок()";
Класс.Цвет=0;
и т.д. и т.п. 


Почему делается упор, что Контекст нужно передавать, а указывать различные параметры для работы класса - нет?
И что значит: "вносит элементы неявного поведения в классы" Это связано с реализацией самой компоненты 1CPP?

Ведь во всех языках программирования можно получить указатель на вызывающий объект. Чем компонента 1С++ не язык программирования в среде1С?

ЗЫ: Извините господа разработчики, может сильно грубо и напористо сказал, но на форум выйти меня заставила именно эта фраза в багзилле: "ПолучитьКонтекстОкружения() признан сообществом, как устаревший" Нерешительный
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #12 - 03. Июня 2008 :: 11:21
Печать  
AndreyM писал(а) 03. Июня 2008 :: 10:56:
1. Где можно скачать 3.0 (если можно)? На странице 1cpp.ru не нашел. И на сколько она готова к использованию или еще в стадии глобального тестирования?

Вот линк на страницу http://www.1cpp.ru/index.php/Image:Icpp-latest.rar
Это не прямой линк на скачку, а именно страница !!
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #13 - 03. Июня 2008 :: 11:30
Печать  
AndreyM писал(а) 03. Июня 2008 :: 10:56:
2. По-моему, не указывая контекст, класс получается намного "юзабилити": не нужно делать того, что является внутренним механизмом самого класса. Согласись, что код (примерно как я делаю сейчас)
Код
Выбрать все
Класс = СоздатьОбъект("КлассОбработкиРеквизитаФормы");
Класс.ОбрабатываемыйРеквизит = "НомерДок"; 


Намного читабельнее и понятней, чем
Код
Выбрать все
Класс = СоздатьОбъект("КлассОбработкиРеквизитаФормы");
Класс.УстановитьКонтекст(Контекст);
Класс.ОбрабатываемыйРеквизит = "НомерДок";
Класс.Лево=300; Класс.Верх=30; Класс.Ширина=100; Класс.Высота=22;
Класс.Формула="ИзмНомерДок()";
Класс.Цвет=0;
и т.д. и т.п. 


Почему делается упор, что Контекст нужно передавать, а указывать различные параметры для работы класса - нет?
И что значит: "вносит элементы неявного поведения в классы" Это связано с реализацией самой компоненты 1CPP?

Ведь во всех языках программирования можно получить указатель на вызывающий объект. Чем компонента 1С++ не язык программирования в среде1С?

1. Приведи пример подобного языка, который позволяет получить подобный указатель без явного указания? Вот я лично не припомню подобного.
С++, Паскаль, Ада, Модула - точно нет.

2. Лучше писать так
Класс = СоздатьОбъект("КлассОбработкиРеквизитаФормы");
Класс.УстановитьКонтекст(КонтекстНужнойФормы, ДругиеПараметры);
а уж внутри этого метода пиши, что и как хочешь.

Почему неявное поведение?
Объясню вкратце, более подробно иди в поиск по форуму.
Представь, тебе нужно объект класса использовать в другом контексте, например, форма другого документа. Ты, как обычно, тупо копируешь код создания объекта, не меняя класса, а в итоге класс может начать работать неверно, потому что он не знает, что его окружение изменилось.
Далее - этот метод в 1С++ возвращает контекст только того объекта, в котором объект создан, а не того, в котором выполняется его очередной метод.

Вообще это вопрос религии и идеалогии разработки.
Мы эту тему обсуждали не один раз, и в итоге пришли к подобному мнению.
Опытные разработчики, не раз сломавшие копья на подобных неявных методах, отказались от его использования. Я сам также перестал его юзать, и другим категорически не советую.
  

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #14 - 03. Июня 2008 :: 14:29
Печать  
artbear писал(а) 03. Июня 2008 :: 11:30:
1. Приведи пример подобного языка, который позволяет получить подобный указатель без явного указания? Вот я лично не припомню подобного.
С++, Паскаль, Ада, Модула - точно нет.

Извини, неправильно выразился  Смущённый, виноват, признаю, каюсь... Круглые глаза

Наверное переработался в визуальных разработчиках (там Owner и Parent), но я имел ввиду не сами языки программирования на низком уровне, а классы (обёртки), которые используются в этих языках. Фактически, 1СРР - это и есть обёртка, набор классов, используемых в 1С.
Например, получив реквизит, экземпляр класса через него может получить контекст формы, и уже тогда творить всё что нужно с этой формой. В 1СРР и FormEx я не нашел другого метода получить контекст, поэтому и использую ПолучитьКонтекстОкружения().
Я сейчас делаю интерфейсные вещи, и эти классы используются, в основном, в модулях документов, справочников и т.п., а если нужно привязать данный класс к некоему другому контексту, то для этого есть метод Класс.ОбрабатываемыйРеквизит(Контекст,"НомерДок"), как ты описал выше.
Но использую эти вещи не только я, поэтому, (повторюсь) в качестве "юзабилити" очень полезная штука ПолучитьКонтекстОкружения().
Я не такой программер, как вы: честь вам и хвала за данную компоненту (абсолютно без сарказма), но если считаете, что использовать ПолучитьКонтекстОкружения() нежелательно, только из-за того, что "тупо копируешь код создания объекта...", то я с вами не согласен.
Спасибо, Артур, за быстрые и правильные ответы.
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать