Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Конфликт программного ввода на основании и запроса (число прочтений - 2015 )
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Конфликт программного ввода на основании и запроса
22. Ноября 2010 :: 07:41
Печать  
Немного истории:
В моей конфигурации для ускорения разработки и избавления юзеров от необходимости частого изгнания из 1С активно изменяемые объекты (справочники, документы и печатные формы) вынесены из конфигурации наружу. Справочники и документы реализованы классами, т.е. в модуле формы и проведения наличествует лишь перенаправление вызовов в класс, например:
Код
Выбрать все
//В модуле формы
Перем клДвижение;
***
Процедура ПриИзмененииМПЗ()
	клДвижение.ПриИзмененииМПЗ();
КонецПроцедуры // ПриИзмененииМПЗ()
***
клДвижение = СоздатьОбъект("Вязание.Документ.ДвижениеМПЗ"); клДвижение.УстановитьКонтекст(Контекст);
//В модуле документа
Процедура ОбработкаПроведения(ЗначениеПроведения = 0)
	клДвижение = СоздатьОбъект("Вязание.Документ.ДвижениеМПЗ");
	клДвижение.УстановитьКонтекст(Контекст);
	Попытка
		СтатусВозврата(клДвижение.ОбработкаПроведения(ЗначениеПроведения));
	Исключение
		СтатусВозврата(0);
		Сообщить("Не удалось провести " + ТекущийДокумент() + " по причине:
		|" + ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры 


Что позволяет довольно много изменений делать "на лету", не выгоняя юзверей из 1С.
Но !? Ужас?! при изменении типового документа (ПУБ) "ДвижениеМПЗ" наткнулся на странное поведение:
Если программно вызывать ввод на основании таким образом:
Код
Выбрать все
	докДвижение = СоздатьОбъект("Документ.ДвижениеМПЗ");
	докДвижение.АвтоВремяТекущее();
	докДвижение.Новый();
	докДвижение.Записать();
	клДвижение = СоздатьОбъект("Вязание.Документ.ДвижениеМПЗ");
	клДвижение.УстановитьКонтекст(докДвижение);
	клДвижение.ВводНаОсновании(Осн); 


Запрос (ЗапросМПЗ = СоздатьОбъект("Запрос")) ничего не возвращает.
Но если делать заполнение интерактивное (ОткрытьФорму("Документ.ДвижениеМПЗ", КонтекстФормы, Осн)) - все ок.
Все параметры ОДИНАКОВЫ!
Временно ушел от использования запроса в сторону использования функции ВыгрузитьИтоги регистра МХ, но это неправильно.
Помогите разобраться ...

P.S.: Понял, что не ясна задача: Автоматизация процесса выдачи подготовленного заранее материала требует автоматического заполнения перемещения и вывода двух экземпляров ПФ по сканированию кода документа, т.е. без рук/клавы/мышки/юзера.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Конфликт программного ввода на основании и запроса
Ответ #1 - 22. Ноября 2010 :: 08:13
Печать  
Ты не путай код модуля формы и код создания документа !
указанный тобой код в конце модуля формы выполняется только при открытии формы. При создании документа через СоздатьОбъект этот код естественно не вызовется.
Юзай создание не документа, а непосредственно объекта класса.
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Конфликт программного ввода на основании и запроса
Ответ #2 - 22. Ноября 2010 :: 09:03
Печать  
Dmitry The Wing писал(а) 22. Ноября 2010 :: 07:41:
т.е. в модуле формы и проведения наличествует лишь перенаправление вызовов в класс


А чтож перехватчик не используешь?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Конфликт программного ввода на основании и запроса
Ответ #3 - 22. Ноября 2010 :: 09:03
Печать  
artbear писал(а) 22. Ноября 2010 :: 08:13:
Ты не путай код модуля формы и код создания документа !
указанный тобой код в конце модуля формы выполняется только при открытии формы. При создании документа через СоздатьОбъект этот код естественно не вызовется.
Юзай создание не документа, а непосредственно объекта класса.

Я не путаю. Работает именно класс (в форме вообще нет кода, кроме перенаправлений вызовов). Если присмотришься внимательнее, заметишь, что объект документа создается и передается в класс в качестве контекста.
Непонятки вызывает поведение объекта Запрос: он не возвращает данных. Текст и параметры запроса проверялись в режиме отладки. Совпадают на 100%.

chessman писал(а) 22. Ноября 2010 :: 09:03:
А чтож перехватчик не используешь?

Перехватчик я только начал использовать, и для данной задачи он не имеет смысла (на данный момент работает только внешний журнал регистрации событий).
Классы позволяют разным объектам смотреть в нутро друг друга и пользовать общие функции.
Также нет проблем в работе с документами и справочниками, без создания их форм и т.д., при этом сохраняя полный функционал, доступный ранее только из форм.
Из модуля проведения становятся доступны функции формы, ранее дублировавшиеся.
Проблема только одна - объект Запрос ведет себя как-то неестественно.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Конфликт программного ввода на основании и запроса
Ответ #4 - 22. Ноября 2010 :: 12:54
Печать  
Лады, был неправ по этому пункту.
Добавь проверку в клДвижение.УстановитьКонтекст
например - Сообщить(ТипЗначенияСтр(контДока))
и контДока.Выбран()
и проверь в обоих случаях вызова
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Конфликт программного ввода на основании и запроса
Ответ #5 - 23. Ноября 2010 :: 02:21
Печать  
artbear писал(а) 22. Ноября 2010 :: 12:54:
Лады, был неправ по этому пункту.
Добавь проверку в клДвижение.УстановитьКонтекст
например - Сообщить(ТипЗначенияСтр(контДока))
и контДока.Выбран()
и проверь в обоих случаях вызова

Такая проверка есть в базовом классе Общие.Документ (метод не перекрывается в наследниках):
Код
Выбрать все
Процедура УстановитьКонтекст(кКонт) Экспорт
	Сам = Сам(Контекст);
	Если (ПустоеЗначение(кКонт) = 1) и (кКонт.Выбран() = 0) Тогда
		Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		ТекстОшибки = "Ошибка передачи контекста: пустота";
		//#exinfo
		Модуль.ВыброситьИскл(, ТекстОшибки);
	ИначеЕсли (ТипЗначенияСтр(кКонт) <> "ГрупповойКонтекст") и (ТипЗначенияСтр(кКонт) <> "Документ") Тогда
		Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		ТекстОшибки = "Ошибка передачи контекста: не ГрупповойКонтекст и не Документ";
		//#exinfo
		Модуль.ВыброситьИскл(, ТекстОшибки);
	ИначеЕсли ТипЗначенияСтр(кКонт.ТекущийДокумент()) <> "Документ" Тогда
		Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		ТекстОшибки = "Ошибка передачи контекста: не Документ";
		//#exinfo
		Модуль.ВыброситьИскл(, ТекстОшибки);
	ИначеЕсли Сам.КонтекстПроверен(кКонт) = 1 Тогда
		Конт = кКонт;
		Сам.ЗаменитьБазовыйОбъект("Документ", Конт);
	КонецЕсли;
КонецПроцедуры // УстановитьКонтекст 


В текущем классе перекрыта еще одна функция:
Код
Выбрать все
Функция КонтекстПроверен(лКонт) Экспорт
	Если лКонт.ТекущийДокумент().Вид() <> "ДвижениеМПЗ" Тогда
		Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		ТекстОшибки = "Ошибка передачи контекста: не Документ.ДвижениеМПЗ";
		//#exinfo
		Модуль.ВыброситьИскл(, ТекстОшибки);
		Возврат 0;
	КонецЕсли;
	Возврат 1;
КонецФункции // КонтекстПроверен 


В общем, разница то есть. Когда класс работает в интерактивном режиме - тип контекста - ГрупповойКонтекст формы документа, а когда в программном, то "Документ.ДвижениеМПЗ", но во всех других случаях, кроме ввода на основании - это не играет роли... Или же это касается только запроса...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать