Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Запуск внешних обработок после закрытия формы документа. (число прочтений - 5732 )
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Запуск внешних обработок после закрытия формы документа.
10. Октября 2011 :: 00:25
Печать  
Всем доброго времени суток!

Столкнулся с проблемой при вызове обработки после закрытия формы документа.
Суть в следующем: есть документ и есть внешняя обработка. При проведении документа, форма закрывается и запускается обработка. В обработке проводятся некоторые расчеты и в итоге должна перезаписать этот документ (т.к. вносит некоторые изменения в ТЧ).
И тут вылазит одна пренеприятная проблема. Если закрывать форму документа стандартным способом, то при попытки перезаписать документа обработкой, естественно система говорит, что документ заблокирован. Пробывал убирать блокировку через Док. Блокировка(0). Не помогает. 
Решил обойти это средствами 1С++/FormEx закрывая форму из обработки. Все отлично проводится. Но вылазит другая проблема. При завершении работы обработки 1С падает. Судя по всему это както связано с тем, что обработка была вызвана уже из несуществующей формы.
Как я только не пытался обойти это. Никак. Даже использовал глобальную предопределенную процедуру FormEx "После закрытия". Все равно падает.
Так вот вопрос - как нибудь можно это обойти это? И желательно не перенося логику обработки в глобальный модуль ?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #1 - 10. Октября 2011 :: 01:19
Печать  
Сначала про варианты обходов:
Вариант 1:
При закрытии вызываешь невидимую форму с ожиданием на 1 сек, которая выполняет или вызывает выполнитель необходимых действий. Пояснять?
У меня так удаляются ненужные документы, которым для нормального заполнения необходимо сначала записаться.
Вариант 2:
На кнопки "Провести" и "ОК" Ставишь не стандартные команды с решетками, а вызов спец.функции (у меня она называется НаПроведение), которая сперва выполняет "операции до проведения", потом вызывает само проведение, а потом выполняет "операции после проведения".
Методика по началу кажется достаточно сложной и требует также переписания функции ПриЗаписи, но в дальнейшем работает как часы (вплоть до конфликта с транзакцией).
Суть идеи и заключалась в том, что перед проведением иногда требовалось выполнить некоторые пересчеты ТЧ, а после надо было автоматически создать или перепровести подчиненные документы, полностью зависящие от содержимого данного документа и не редактируемые пользователями.

А теперь про косяки:ziflex писал(а) 10. Октября 2011 :: 00:25:
В обработке проводятся некоторые расчеты и в итоге должна перезаписать этот документ
Это в корне неверный подход! Если необходимо изменять документ, то это надо делать либо при проведении либо непосредственно перед этим, но ни никак не после!!!

ziflex писал(а) 10. Октября 2011 :: 00:25:
Решил обойти это средствами 1С++/FormEx закрывая форму из обработки. Все отлично проводится. Но вылазит другая проблема. При завершении работы обработки 1С падает.
Это, скорее всего, проблема циклических ссылок и способа вызова. Проверяй, чтобы после открытия формы немодально сразу очищались все ссылки на нее в форме документа, а также, чтобы в открытой форме не было ссылки на его контекст.
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #2 - 10. Октября 2011 :: 01:32
Печать  
Спасибо за ответ.
У нас есть своя процедура проведения из которой уже вызывается предопределенная. Но этот подход подразумевает перенос логики из обработки в форму документа. Чего крайне не хотелось бы.

А вот первый вариант не совсем понял. Невидимую форму документа?


Dmitry The Wing писал(а) 10. Октября 2011 :: 01:19:
А теперь про косяки:ziflex писал(а) 10. Октября 2011 :: 00:25:
В обработке проводятся некоторые расчеты и в итоге должна перезаписать этот документ
Это в корне неверный подход! Если необходимо изменять документ, то это надо делать либо при проведении либо непосредственно перед этим, но ни никак не после!!!


Рекомендуете все таки перенести в форму документа? Не хотел переносить в модуль формы т.к. эта же логика запускается когда мне необходимо создать подчиненный документ определенного вида.

Dmitry The Wing писал(а) 10. Октября 2011 :: 01:19:
ziflex писал(а) 10. Октября 2011 :: 00:25:
Решил обойти это средствами 1С++/FormEx закрывая форму из обработки. Все отлично проводится. Но вылазит другая проблема. При завершении работы обработки 1С падает.
Это, скорее всего, проблема циклических ссылок и способа вызова. Проверяй, чтобы после открытия формы немодально сразу очищались все ссылки на нее в форме документа, а также, чтобы в открытой форме не было ссылки на его контекст.


Каким образом очищать ссылки ?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #3 - 10. Октября 2011 :: 03:39
Печать  
ziflex писал(а) 10. Октября 2011 :: 01:32:
Но этот подход подразумевает перенос логики из обработки в форму документа.
У меня все намного проще: ВСЯ логика документа вынесена в класс, как форма - так и модуль проведения ... в форме только перенаправление вызовов в класс... Это позволяет менять логику документа "на лету" без изгнания персонала из 1С...

ziflex писал(а) 10. Октября 2011 :: 01:32:
А вот первый вариант не совсем понял. Невидимую форму документа?
Некорректно выразился. Форма видимая, но только при загрузке сервера. При закрытии вызывается открытие обработки (у меня внешняя, но это не обязательно).
А в обработке
Код
Выбрать все
Процедура ПриОткрытии()
	Если ПустоеЗначение(Форма.Параметр) = 1 Тогда
		Отладка("Пустой параметр");
		СтатусВозврата(0);
		Форма.Закрыть();
	ИначеЕсли ТипЗначенияСтр(Форма.Параметр) <> "Документ" Тогда
		Отладка("Не документ");
		СтатусВозврата(0);
		Форма.Закрыть();
	Иначе
		Док = Форма.Параметр;
		Форма.ОбработкаОжидания("Ожидание", 1);
	КонецЕсли;
КонецПроцедуры // ПриОткрытии
Процедура Ожидание()
	Доки = СоздатьОбъект("Документ");
	Если Доки.НайтиДокумент(Док) = 1 Тогда
		Если Доки.Блокировка() = 1 Тогда
			Отладка("Ожидание разблокировки " + Доки.ТекущийДокумент());
			Возврат;
		КонецЕсли;
//Здесь выполняется необходимая логика
		Форма.Закрыть();
	Иначе
		Форма.Закрыть();
	КонецЕсли;
КонецПроцедуры // Ожидание 



ziflex писал(а) 10. Октября 2011 :: 01:32:
Рекомендуете все таки перенести в форму документа?
Как уже написал выше - логика не в документе, а в классе, но вызывается из формы и модуля документа. А в этом случае ее можно вызывать откуда угодно.

ziflex писал(а) 10. Октября 2011 :: 01:32:
Каким образом очищать ссылки ?
Это же элементарно, Ватсон Подмигивание
Откуда может быть ссылка на контекст формы документа в обработке? - например, если при открытии передается контекст формы ... это в корне неверно - надо передавать ТекущийДокумент() - тогда передастся ссылка на документ в журнале, а не на контекст формы. Еще вариант сохранения ссылки на контекст обработки в контексте документа - глобальная переменная при открытии обработки во втором параметре. Т.е. после открытия обработки и передачи в нее необходимых параметров, ссылку надо просто обнулить, т.е. присвоить в нее пустое значение
Код
Выбрать все
КФ....// Заполнение параметров открытия
ОткрытьФорму("Отчет", КФ, ПутьОбработки); //или ОткрытьФорму("Отчет.Имя", КФ);
КФ..... //Передача параметров
КФ = ""; 



Если нужны подробности о функционале "НаПроведение" - спрашивай.
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #4 - 10. Октября 2011 :: 03:52
Печать  
Dmitry The Wing писал(а) 10. Октября 2011 :: 03:39:
ziflex писал(а) 10. Октября 2011 :: 01:32:
Каким образом очищать ссылки ?
Это же элементарно, Ватсон Подмигивание
Откуда может быть ссылка на контекст формы документа в обработке? - например, если при открытии передается контекст формы ... это в корне неверно - надо передавать ТекущийДокумент() - тогда передастся ссылка на документ в журнале, а не на контекст формы. Еще вариант сохранения ссылки на контекст обработки в контексте документа - глобальная переменная при открытии обработки во втором параметре. Т.е. после открытия обработки и передачи в нее необходимых параметров, ссылку надо просто обнулить, т.е. присвоить в нее пустое значение
Код
Выбрать все
КФ....// Заполнение параметров открытия
ОткрытьФорму("Отчет", КФ, ПутьОбработки); //или ОткрытьФорму("Отчет.Имя", КФ);
КФ..... //Передача параметров
КФ = ""; 



Если нужны подробности о функционале "НаПроведение" - спрашивай.


Это в том случае, если форму закрывать после выполнения обработки? В моем случае я хочу, чтоб после закрытия формы документа выполнялась эта обработка. И могла манипулировать этим документом.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #5 - 10. Октября 2011 :: 03:55
Печать  
ziflex писал(а) 10. Октября 2011 :: 03:52:
Dmitry The Wing писал(а) 10. Октября 2011 :: 03:39:
Если нужны подробности о функционале "НаПроведение" - спрашивай.


Это в том случае, если форму закрывать после выполнения обработки? В моем случае я хочу, чтоб после закрытия формы документа выполнялась эта обработка. И могла манипулировать этим документом.
В твоем случае больше подходит именно ПаПроведение, т.к. тогда можно не мешая логике 1С, добавить и свою.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #6 - 10. Октября 2011 :: 05:27
Печать  
на вот, ознакомься с баяном:
http://hare.ru/old-hareru/tm/tm_64.html
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #7 - 10. Октября 2011 :: 06:03
Печать  
Eprst писал(а) 10. Октября 2011 :: 05:27:
на вот, ознакомься с баяном:
http://hare.ru/old-hareru/tm/tm_64.html
Интересная статейка, однако тот подход, о котором говорю я, не требует разблокировки документа документа.
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #8 - 11. Октября 2011 :: 01:10
Печать  
Спасибо всем за ответы!
Eprst, это действительно то, что я искал!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Запуск внешних обработок после закрытия формы документа.
Ответ #9 - 11. Октября 2011 :: 04:14
Печать  
Если делать штатно и без мелькания формы, то самый красивый способ - это способ с синьёры с копированием всех атрибутов.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать