Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Возможность вызова Шаблон в КОП для контекста форм (число прочтений - 12197 )
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 записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #15 - 03. Июня 2008 :: 15:51
Печать  
Проблема метода ПолучитьКонтекстОкружения() в том, что класс получает контекст формы, что-то с ним делает, а форма об этом ни сном, ни духом. Причем ситуация усугубляется тем, что ПолучитьКонтекстОкружения() можно вызвать в каком-нибудь из базовых классов. Или в классе может быть вызван метод другого класса, который и вызывает ПолучитьКонтекстОкружения(). Эту цепочку можно удлиннять и комбинировать.

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #16 - 03. Июня 2008 :: 15:56
Печать  
Вот еще ДмитрО в свое время зажог: http://itland.ru/forum//index.php?showtopic=12465
  
Наверх
www  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #17 - 03. Июня 2008 :: 16:19
Печать  
Спасибо, fez, в голове начало что-то проявляться...
... возможные проблемы, которые я списывал на всё что угодно, вплоть до перезагрузки.
Или это от пива выпитого...  Улыбка

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

Попробую изменить подход при использовании 1С++, возможно потом вам спасибо скажу  Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #18 - 04. Июня 2008 :: 04:38
Печать  
fez писал(а) 03. Июня 2008 :: 15:51:
Проблема метода ПолучитьКонтекстОкружения() в том, что класс получает контекст формы, что-то с ним делает, а форма об этом ни сном, ни духом. Причем ситуация усугубляется тем, что ПолучитьКонтекстОкружения() можно вызвать в каком-нибудь из базовых классов. Или в классе может быть вызван метод другого класса, который и вызывает ПолучитьКонтекстОкружения(). Эту цепочку можно удлиннять и комбинировать.

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

Вставил цитату в официальную доку (2.5 и 3.0) для ПолучитьКонтекстОкружения + ссылка на пост с итланда.
  

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: Возможность вызова Шаблон в КОП для контекста
Ответ #19 - 07. Июня 2008 :: 05:31
Печать  
Федор, просьба - пожалуйста, перенеси ветку в раздел "Репозитарий".
  

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: Возможность вызова Шаблон в КОП для контекста
Ответ #20 - 09. Июня 2008 :: 04:46
Печать  
Спасибо, Федор.
  

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #21 - 29. Июля 2008 :: 09:57
Печать  
Вчера налетел на глюк функции "Шаблон" в классе...
3 часа потратил, пока вылечил...
Заменил на использование выполняемого модуля, вроде взлетело.
Самое смешное, что работы с какими либо контекстами не происходит, вот текст модуля
Код
Выбрать все
Функция ОстатокТовара(_Товар,_Накл = "",_Поставщик = "",_Договор = "") Экспорт
   Если _Товар.Выбран() = 0 Тогда Возврат 0; КонецЕсли;

  _Формула = "[Регистр.ОстаткиТовара.СводныйОстаток(";
  _Формула = _Формула + ?(_Договор = "",",","_Договор,");
  _Формула = _Формула + ?(_Поставщик = "",",","_Поставщик.ТекущийЭлемент(),");
  _Формула = _Формула + "_Товар.ТекущийЭлемент(),";
  _Формула = _Формула + ?(_Накл = "",",","_Накл.ТекущийДокумент(),");
  _Формула = _Формула + """Кол"")]";

  Возврат Число(Шаблон(_Формула));
КонецФункции 


Пришел домой, думаю, ща быстренько тест нарисую, как Артур любит Улыбка
Хренов-дров, воспроизвести по быстрому не получилось Печаль
Похоже, что проблема возникает в результате комплекса факторов, что бы выловить, надо день потратить...
Единственное, что смог уловить - проблема снимается, если класс, в котором этот метод, создавать непосредственно в месте использования метода, в то время как в боевой конфе он создается как глобальный объект в процедуре "ПриНачалеРаботыСистемы".
Пока отложил, как будет время, попробую тест нарисовать.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #22 - 29. Июля 2008 :: 10:08
Печать  
CaBaT писал(а) 29. Июля 2008 :: 09:57:
Пришел домой, думаю, ща быстренько тест нарисую, как Артур любит Улыбка
Хренов-дров, воспроизвести по быстрому не получилось Печаль
Похоже, что проблема возникает в результате комплекса факторов, что бы выловить, надо день потратить...
Единственное, что смог уловить - проблема снимается, если класс, в котором этот метод, создавать непосредственно в месте использования метода, в то время как в боевой конфе он создается как глобальный объект в процедуре "ПриНачалеРаботыСистемы".
Пока отложил, как будет время, попробую тест нарисовать.

Вот поэтому я и люблю тесты, что при их создании многое становится ясным.
И очень часто выявляется собственная ошибка, а не ошибка АПИ Улыбка

А у тебя вполне может быть сочетание/пересечение различных переменных в различных модулях - модуль формы, модуль класса, модуль ГМ. Т.е. возможно, где-то в них есть одинаковые переменные Печаль
Т.е. неоднозначность использования Печаль
Изучай свой код, попробуй его изолировать от других модулей.
  

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #23 - 29. Июля 2008 :: 10:14
Печать  
что меня удивляет, так это то, что простая замена на такой код решила проблему
Код
Выбрать все
Функция ОстатокТовара(_Товар,_Накл = "",_Поставщик = "",_Договор = "") Экспорт
 _ВМОстатокТовара = СоздатьОбъект("ВыполняемыйМодуль");
 _Текст = "
 |Функция Остаток(_Товар,_Накл = """",_Поставщик = """",_Договор = """")
 | _Формула = ""[Регистр.ОстаткиТовара.СводныйОстаток("";
 | _Формула = _Формула + ?(_Договор = """","","",""_Договор,"");
 | _Формула = _Формула + ?(_Поставщик = """","","",""_Поставщик.ТекущийЭлемент(),"");
 | _Формула = _Формула + ""_Товар.ТекущийЭлемент(),"";
 | _Формула = _Формула + ?(_Накл = """","","",""_Накл.ТекущийДокумент(),"");
 | _Формула = _Формула + """"""Кол"""")]"";
 | Возврат Число(Шаблон(_Формула));
 |КонецФункции";
 _ВМОстатокТовара.УстановитьМодуль(_Текст);
 _ВМОстатокТовара.КомпилироватьМодуль();
 _ВМОстатокТовара.ВыполнитьМодуль();
 Возврат _ВМОстатокТовара.Остаток(_Товар,_Накл,_Поставщик,_Договор);
КонецФункции
 


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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #24 - 29. Июля 2008 :: 10:21
Печать  
Нет, не только, были еще какие-то баги при использовании Шаблон внутри класса Улыбка
Поэтому и пришлось родить подобную функцию
  

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #25 - 29. Июля 2008 :: 10:23
Печать  
ясно, короче для себя я записал, что шаблон нежелательно использовать в классах до выяснения... Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Возможность вызова Шаблон в КОП для контекста
Ответ #26 - 29. Июля 2008 :: 10:29
Печать  
Давно известно, что Шаблон это функция, имеющая неявное поведение, чем и опасна Печаль
Плюс изнутри Шаблон не работают исключения, сообщения и т.п.
Я лично выложил свой код как пример для быстрого перехода на классы некоторых специализированных участков.
  

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: Возможность вызова Шаблон в КОП для контекста
Ответ #27 - 29. Июля 2008 :: 10:33
Печать  
А вообще тест было бы интересно посмотреть.
Его сделать просто - все переменные в своей функции обзываешь уникально, с каким-нибудь префиксом/постфиксом, типа _Товар_5976, этим ты достигаешь отсутствия влияние внешних модулей. Соответственно меняешь код функции и проверяешь выполнение Шаблон изнутри класса.
Очень может быть, что Шаблон сработает неверно Улыбка
  

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: Возможность вызова Шаблон в КОП для контекста
Ответ #28 - 29. Июля 2008 :: 10:34
Печать  
И кстати, я лично Шаблон практически не юзаю Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать