Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Проблемы с контекстом в режиме подбора (число прочтений - 6726 )
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Проблемы с контекстом в режиме подбора
10. Августа 2006 :: 10:10
Печать  
честно говоря не знаю - в тот ли раздел я сунулся, но очень похоже, что это FormEx

Итак, исходные данные:
1) 1С++ v2.0.2.2(v2.0.3.0 любая сборка), 1С R25. На разделенном варианте я не пробовал, если честно - может кто попробует - буду признателен!  Круглые глаза
2) Имеется некий документ с табличной частью, в нем кнопка с кодом для открытия подбора номенклатуры
3) Подбор организован в обработке, у которой есть Таблица значений на форме

Проблема:
Куролесие какое-то с Добавлением новой строки в документ, через контекст документа, а равно и через ОбработкуПодбора() в модуле документа.

Проявляется это так: то добавляется новая строка в документ, то НЕ добавляется  Со сжатыми губами

лучше всего покажет это тестовая конфа внизу.
1) НЕ разворачиваем окошки внутри 1С на полный экран - это ВАЖНО
2) Открываем журнал документов, заходим в документ, давим "Подобор" - все ОК

3) Закрываем все окна

4) Открываем журнал документов, разворачиваем его внутри 1С на полный экран - это ВАЖНО

5) Открываем любой документ, или создаем новый, давим кнопку "Подбор" - НЕ добавляется новая строка в документ, причем если поменять фокус на документ, а потом вернуть его на форму для подбора - строки в док начинают добавляться - все ОК  Озадачен

Похоже, что если открывать документ при развернутых на весь экран окнах, то ошибка будет железно, если в момент открытия Дока окошки внутри 1С НЕ развернуты на весь экран, то ошибки НЕ будет

ну я не знаю...  Нерешительный

PS буду очень признателен, если кто-нибудь подтвердит, или опровергнет мою ошибку
  

Test_Conf.zip ( 39 KB | Загрузки )
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Проблемы с контекстом в режиме подбора
Ответ #1 - 10. Августа 2006 :: 15:28
Печать  
неужели никто не может подтвердить, или опровергнуть выявленную мной ошибку?  Нерешительный

или всем кажется, что эта "проблема" - надуманная, не стоит ковыряния, тогда кто-нибудь может предложить иной алгоритм обработки подбора из формы с таблицей значений в документ?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблемы с контекстом в режиме подбора
Ответ #2 - 10. Августа 2006 :: 15:39
Печать  
Вроде тема обсуждалась... kms сделал System:EnableNewLinе

не пробовал, но вроде должно работать Улыбка
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Проблемы с контекстом в режиме подбора
Ответ #3 - 10. Августа 2006 :: 15:44
Печать  
Arta писал(а) 10. Августа 2006 :: 15:39:
Вроде тема обсуждалась... kms сделал System:EnableNewLinе

не пробовал, но вроде должно работать Улыбка


где и когда обсуждалось? на какой версии и с каким кодом должно работать?

ЗЫ Arta, спасибо за внимание, а то смотрю - народ читает, но как-то "прохладно"  Улыбка
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблемы с контекстом в режиме подбора
Ответ #4 - 10. Августа 2006 :: 15:50
Печать  
Точно помню обсуждение, но найти не смог...

По рус:  Система::РазрешитьДобавлениеСтрок
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблемы с контекстом в режиме подбора
Ответ #5 - 10. Августа 2006 :: 19:12
Печать  
DrACe
Была такая тема.

Краткое содержание предыдущих серий (из предложений по формексу):

= 1 =
Цитата:
По нарушению контекста.

Проблема, как всегда, оказалась рядом.
Текущая схема такая:

В нормальных условиях при запуске обработки из документа по кнопке или из меню СЗ процедуры отрабатывают в следующем порядке:
Цитата:
ПриНажатииЛевойКнопки - форма1
ПриОтжатииЛевойКнопки - форма1
ПриИзмененииРазмераОкна - форма2
ПослеСозданияФормы -форма2
ПослеОткрытия - форма2
ПриДвиженииМыши - форма1
ПриДвиженииМыши - форма1


При запуске же через Сервис::ВыбратьЗначение() паразитные хуки ПриДвиженииМыши в форме1 не отрабатываются.
В итоге, callback не может удалять строки.

То же самое происходит, если закомментировать хук "ПриДвиженииМыши" - все варианты вызова обработчика будут обламываться с удалением строк.
До тех пор, пока не будет вызвана любая функция в _CallModuleProc() в контексте форма1 (например. по щелчку мыши или по движению, если хук не закомментарен).
Тогда начинают работать все методы вызова, в том числе и из меню.

То же самое, когда мы раскомментариваем вызовы "ПослеОбновленияФормы".

В итоге, думаю, вся причина вот в этом полезном коде в _CallModuleProc():
Цитата:
for(int i = 0; i<pCont->GetSize(); i++)
{
     pCont0 = pCont->GetContext(i);
     if(!strcmp(pCont0->GetRuntimeClass()->m_lpszClassName,"CDocContext"))
           ((CDocContext*)pCont0)->SetEnableNewLine(1);
}


alf, придумай, плз, как грамотно его вызвать в контексте вызывающей формы после запуска вызываемой формы.

P.S. С этим, видимо, связана и нестабильность появления проблемы:
при разном положении форм, иногда у меня отрабатывались хуки на "ПриДвиженииМыши" в вызывающей форме, а иногда нет.
Если привильно сделать принудительный SetEnableNewLine(1), все будет работать стабильно.


= 2 =
Цитата:
alf
В общем, перед вызовом контекста документа нужно разрешать добавление строк.

Если ничего лучше не придумается, предлагаю сделать новую процедуру, которую нужно будет вызывать в обработчике перед вызовом callback методов контекста документа.

Подумай, плз, найдется ли ей место в FormEx? Если нет, добавлю в CSystem, хотя это не в тему будет.

Код
Выбрать все
BOOL CSystem::procEnableNewLine(CValue& RetVal, CValue **params)
{
	CGroupContext *pGroupCont = (CGroupContext *)params[0]->GetContext();
	if(pGroupCont)
	{
		CBLContext *pCont;
		for(int i = 0; i < pGroupCont->GetSize(); ++i)
		{
			pCont = pGroupCont->GetContext(i);

			LPCSTR pName = pCont->GetRuntimeClass()->m_lpszClassName;
			if(!strcmp(pName, "CDocContext"))
				((CDocContext*)pCont)->SetEnableNewLine(1);
		}
	}
	return TRUE;
 



Использование:
Код
Выбрать все
Процедура Выполнить(__число)
	Если ТипЗначения(_конт) =100 Тогда
		_система =СоздатьОбъект("Система");
		_система.EnableNewLine(_конт);
		_конт.Обработчик(__число);
	КонецЕсли;
КонецПроцедуры
 




А так все начиналось:
http://itland.ru/forum/index.php?act=ST&f=8&t=15702&st=0#entry83241
Проблема возникла после того, как Альф убрал тормозную отработку ПослеОбновленияФормы().

В качестве временного решения сделана затычка Система::EnableNewLine().
Поскольу я уже в сотне мест прописал этот код, менять что-то уже не собираюсь - поздняк метацца Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблемы с контекстом в режиме подбора
Ответ #6 - 10. Августа 2006 :: 19:31
Печать  
DrACe
Посмотрел пример - стопроцентно та же тема. Arta правильный диагноз поставил.

Код
Выбрать все
	КолСтр = КонтекстФормыДокумента.КоличествоСтрок();
//+
	_система =СоздатьОбъект("Система");
	_система.EnableNewLine(КонтекстФормыДокумента);
//-
	КонтекстФормыДокумента.НоваяСтрока();
 


Вот так должно работать. Можно просто сделать один глобальный объект "система" для этой цели.
Или, еще лучше, разрешение добавления строк вынести в какую-нибудь глобальную процедуру.
Ну, как то так, в общем.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблемы с контекстом в режиме подбора
Ответ #7 - 10. Августа 2006 :: 19:40
Печать  
Цитата:
спасибо за внимание, а то смотрю - народ читает, но как-то "прохладно"  Улыбка

Даа. Солнце к закату - дело к осени Улыбка

DrACe писал(а) 10. Августа 2006 :: 15:44:
на какой версии и с каким кодом должно работать?

Не помню точно, но судя по датам, EnableNewLine() должно работать где-то после 18.05.2006.

Просто так тоже может работать (как ты уже убедился), но это скорее глюки. Очень довольный
  

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


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Проблемы с контекстом в режиме подбора
Ответ #8 - 11. Августа 2006 :: 02:47
Печать  
kms и Arta, СПАСИБО ВАМ ОГРОМНОЕ!!! Все получилось!

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

а "затычек" у меня в программе уже порядком, так что одной больше, одной меньше - уже не так важно  Улыбка

теперь самое интересное - тему на itlandу я помню, но связать Сервис::ВыбратьЗначение() с любым другим изменением множественной части не смог, да и давно это было, но вот эти ссылки не открываются
Цитата:
По нарушению контекста.
...
, пишет такое: Цитата:
104 Произошла Ошибка!: Невозможно открыть 1142367676.txt
- это все же где обсуждалось? не помню  Озадачен

PS нашел  Улыбка http://www.1cpp.ru/forum/YaBB.pl?num=1151013085/24#24 - как я это мимо пропустил... а цитировал kms видимо "технический форум" - вот где счастье познания скрыто, я так думаю  Подмигивание
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать