Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Удаление строк открытого документа через контекст (число прочтений - 18319 )
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #15 - 23. Июня 2006 :: 13:51
Печать  
который не работал
  
Наверх
www  
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #16 - 23. Июня 2006 :: 14:41
Печать  
Неработающий код уже не сохранился. Напишу его аналогичный по смыслу прототип:
В модуле формы документа:
[code]
СП=СоздатьОбъект("СписокЗначений");
СП.ДобавитьЗначение(Контекст, "КонтекстДокумента");
ОткрытьФорму("Обработка.РаботаСШтрихкодами", СП);
[/code]

В модуле формы обработки:
[code]
Перем КонтекстДокумента;

Процедура ПриОткрытии()
    КонтекстДокумента=Форма.Параметр.Получить("КонтекстДокумента");
КонецПроцедуры

Процедура ОбновитьДокумент()
    КонтекстДокумента.УдалитьСтроки();
КонецПроцедуры
[/code]
Это самый простой из приходящих в голову неработающих вариантов. Он заканчивается сообщением "Нет возможности удалить строку".

Второй вариант был такой:
В модуле формы документа:
[code]
СП=СоздатьОбъект("СписокЗначений");
СП.ДобавитьЗначение(Контекст, "КонтекстДокумента");
ОткрытьФорму("Обработка.РаботаСШтрихкодами", СП);
...
Процедура ОбновитьТЧ()
    УдалитьСтроки();
КонецПроцедуры
[/code]
В модуле формы обработки:
[code]
Перем КонтекстДокумента;

Процедура ПриОткрытии()
    КонтекстДокумента=Форма.Параметр.Получить("КонтекстДокумента");
КонецПроцедуры

Процедура ОбновитьДокумент()
    глСервисРасшФормы.ВыполнитьПроцедуру(КонтекстДокумента, "ОбновитьТЧ");
КонецПроцедуры
[/code]
Этот способ работал, но нестабильно (см. выше подробности).
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #17 - 23. Июня 2006 :: 15:36
Печать  
Вот это:
Код
Выбрать все
СП=СоздатьОбъект("СписокЗначений");
СП.ДобавитьЗначение(Контекст, "КонтекстДокумента");
ОткрытьФорму("Обработка.РаботаСШтрихкодами", СП); 


каким образом вызывается?
Если способом, отличным от нажатия кнопки - то ничего удивительного.
  
Наверх
www  
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #18 - 23. Июня 2006 :: 15:43
Печать  
В оригинале, в форме документа из метода, вызываемого при нажатии кнопки создавался объект класса, в который передавался контекст документа.  Далее вызывался метод объекта класса, который открывал форму обработки и передавал ей контекст документа.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #19 - 23. Июня 2006 :: 17:07
Печать  
kbakaras писал(а) 23. Июня 2006 :: 15:43:
Далее вызывался метод объекта класса, который открывал форму обработки и передавал ей контекст документа.

Вот это происходило кнопкой или как-то еще?
  
Наверх
www  
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #20 - 23. Июня 2006 :: 17:15
Печать  
И создание объекта класса и вызов его метода для отображения обработки производились в одном методе документа последовательно. Этот метод вызывался при нажатии кнопки в документе.
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #21 - 23. Июня 2006 :: 17:44
Печать  
вот это:[quote author=kbakaras link=1151013085/0#16 date=1151073697][code]Процедура ОбновитьДокумент()
   глСервисРасшФормы.ВыполнитьПроцедуру(КонтекстДокумента, "ОбновитьТЧ");
КонецПроцедуры[/code][/quote] по моему излишество.
Вызов методов через контекст должен работать и так по причине наличия TurboBL в составе 1С++.
Заинтересовался, сейчас даже попробую.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #22 - 23. Июня 2006 :: 18:31
Печать  
[quote author=steban link=1151013085/20#21 date=1151084659]вот это:[quote author=kbakaras link=1151013085/0#16 date=1151073697][code]Процедура ОбновитьДокумент()
    глСервисРасшФормы.ВыполнитьПроцедуру(КонтекстДокумента, "ОбновитьТЧ");
КонецПроцедуры[/code][/quote] по моему излишество.
Вызов методов через контекст должен работать и так по причине наличия TurboBL в составе 1С++.
Заинтересовался, сейчас даже попробую.
[/quote]


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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Удаление строк открытого документа через конте
Ответ #23 - 23. Июня 2006 :: 19:15
Печать  
steban писал(а) 23. Июня 2006 :: 13:07:
Пару лет назад поднимался уже подобный вопрос.
Насколько я помню, для добавления/удаления строк ТЧ через контекст достаточно было просто загрузить 1C++.
Нашел вот это: http://itland.ru/forum//lofiversion/index.php/t1120.html
Может покажешь свой код полностью?

На техническом форуме в ветке "предложения по FormEx" я в принципе раскрыл тему, почему возможность добавления строк и стабильность результата через контекст документа зависит от релиза и версии FormEx.
Посты 45, 46, 47.
Суть сводится к вызову EnableNewLine для соответстующего CDocContext.

Собственно, меня интересует стабильность. Я так думаю. Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Удаление строк открытого документа через контекст
Ответ #24 - 23. Июня 2006 :: 19:26
Печать  
Да, собственно, могу и сюда забросить:

Начальное описание проблемы: http://itland.ru/forum/index.php?act=ST&f=8&t=15702&st=0#entry83241

Разбор полетов:
Цитата:
По нарушению контекста.

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

В нормальных условиях при запуске обработки из документа по кнопке или из меню СЗ процедуры отрабатывают в следующем порядке:
Цитата:
ПриНажатииЛевойКнопки - форма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), все будет работать стабильно.


Возможное решение мной уже приведено в начальных постах.
  

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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #25 - 24. Июня 2006 :: 14:12
Печать  
[quote author=steban link=1151013085/20#21 date=1151084659]вот это:[quote author=kbakaras link=1151013085/0#16 date=1151073697][code]Процедура ОбновитьДокумент()
    глСервисРасшФормы.ВыполнитьПроцедуру(КонтекстДокумента, "ОбновитьТЧ");
КонецПроцедуры[/code][/quote] по моему излишество.
Вызов методов через контекст должен работать и так по причине наличия TurboBL в составе 1С++.
Заинтересовался, сейчас даже попробую.
[/quote]

Хмм.. И у меня сегодня возникла необходимость воспользоваться этим методом, но...

Суть в следующем. В абстрактном классе создается Тулбар::Активикс.
При смене закладки мне надо передать этому классу список кнопок, причем для каждой копки надо:
1. Иконку
2. Тултип
3. Строкой имя процедуры класса (где был создан активикс) для выполнения.

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

Или у меня руки не тем концом?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #26 - 24. Июня 2006 :: 14:56
Печать  
Решил с помощью Делегата  Улыбка
  
Наверх
 
IP записан
 
kbakaras
Junior Member
**
Отсутствует


Ребята, давайте жить дружно!

Сообщений: 20
Зарегистрирован: 22. Июня 2006
Пол: Мужской
Re: Удаление строк открытого документа через конте
Ответ #27 - 26. Июня 2006 :: 13:06
Печать  
В документации к 1с++ мне не попадалось о том, что можно вызывать методы контекста прям через точку. Поэтому и городил огород. Спасибо. Я переделал на прям через точку. Код выглядит лучше и не надо списки значений создавать.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Удаление строк открытого документа через контекст
Ответ #28 - 16. Марта 2012 :: 14:28
Печать  
Решился как-то вопрос с удалением строк через контекст? Или другим каким-то методом? Так, чтобы не менять модуль документа. Хотел по комбинации клавиш удалять строки из табличной части документа. А тут оказался облом с контекстом... Т.е. типа нажал Ctrl+Del в документе, перехватил нажатие, контекст получил.... и облом....
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Удаление строк открытого документа через контекст
Ответ #29 - 17. Марта 2012 :: 14:36
Печать  
alyuev писал(а) 16. Марта 2012 :: 14:28:
Решился как-то вопрос с удалением строк через контекст? Или другим каким-то методом? Так, чтобы не менять модуль документа.
....

Поищи по форуму описание использования недокументырованых методов "StartBatch" и "EndBatch" объекта "Система" (последний раз о них писал kms и конфигурацию с примером выкладывал). Помоему это то, что тебе нужно.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать