|
Проблема в обработчике события "ПриКопировании" | ☑ | ||
---|---|---|---|---|
0
megabax
09.03.12
✎
13:40
|
Добрый день. Подскжаие плз, кто знает, решиение вот такой проблемы при обработке подписки на событиипри копировании. И так, делаю так:
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт спец=ПолучитьСпецификацию(ОбъектКопирования.Ссылка); Если Не ЗначениеЗаполнено(спец) тогда возврат; конецесли; Если Вопрос("Скопировать спецификацию (номенклатура будет сразу записана)?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда Запрос=Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура, | СпецификацииНоменклатурыИсходныеКомплектующие.Количество, | СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка |ИЗ | Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие |ГДЕ | СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка = &Ссылка" ; Запрос.УстановитьПараметр("Ссылка",спец); Выборка=Запрос.Выполнить().Выбрать(); Ссылка=Неопределено; Об=Справочники.СпецификацииНоменклатуры.СоздатьЭлемент(); Пока Выборка.Следующий() цикл стр=Об.ИсходныеКомплектующие.Добавить(); стр.Количество=Выборка.Количество; стр.Номенклатура=Выборка.Номенклатура; Ссылка=Выборка.Ссылка; конеццикла; Если Ссылка<>Неопределено тогда Источник.Записать(); ОбИст=Ссылка.ПолучитьОбъект(); Об.Владелец=Источник.Ссылка; Об.Количество=ОбИст.Количество; Об.Наименование=ОбИст.Наименование; Об.Записать(); Источник.ОсновнаяСпецификацияНоменклатуры=Об.Ссылка; Источник.Записать(); конецесли; конецесли; КонецПроцедуры Но элемент справчоника открывается не записанный. Более того, в базе таки появляется записанный объект. Тоесть, Объект в "Источник" и в форме, которая открывается при копировании плюсиком разные. Получается, юзеру придется закрывать эту форму не сохраняя, а потом открывать уже записанный элемент справочника. Это не порядок, подскажите плз, как лечить? |
|||
1
ale-sarin
09.03.12
✎
13:48
|
Думаю, что есть разница между Источник и ОбъектКопирования.
|
|||
2
Naumov
09.03.12
✎
13:48
|
какой объект копируется?
|
|||
3
ale-sarin
09.03.12
✎
13:49
|
Что-то я фигню спорол. А что есть Источник, а что ОбъектКопирования?
|
|||
4
megabax
09.03.12
✎
13:53
|
2, копироуется элемент справочник аноменклатуры. Требуется одновременно скопировать спецификацию.
Но так как спецификация это справочник, подченный номенклатуре, то туда наде еще и ссылку на владельца указать. Для этого и приходиться записывать сам скпирвоанынй элемент справочника. 3, ОбъектКопирования - это тот элемент справочника, откуда копируется Источник - куда копируется. |
|||
5
ale-sarin
09.03.12
✎
13:54
|
Блин, понял. Источник - это новый элемент.
Думаю, что дело в том, что его записывать не надо. А по-другому, у спецификации владельца не задать. Проблема. ВИдимо, другое событие надо использовать. |
|||
6
Tatitutu
09.03.12
✎
13:57
|
(0) на кой в цикле у тебя
Ссылка=Выборка.Ссылка; |
|||
7
megabax
09.03.12
✎
14:15
|
6, ну да, действительно, не нужено Ссылка=Выборка.Ссылка;
просто я сперва написал одним способом, потом передела, но еще не убрал ненунжный код: неще не работает ни "причесывать" ранно 5, мда, жесть. А событий то других подходящих и нету |
|||
8
ale-sarin
09.03.12
✎
14:17
|
Ну надо разбить на два этапа.
1. Открыть пользователю записанный новый элесмент. Тут проблем нет. 2. Что-то типа отказ при автоматическом создании. Только вот нет отказа, СтандартнаяОбработка тоже нет. Черт знает. |
|||
9
megabax
09.03.12
✎
14:23
|
оказывается, если сделать так:
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт Источник.Наименование="ывавыаыва"; возврат; ... то объект в форме тот же самый октрывается. Изменение наименование правильно отрабатываестя Блин, пальцы бы пообрывать программера, которые такие ограничения сделал, что записывать.... придется думать и делать через заднее место... |
|||
10
Живой Ископаемый
09.03.12
✎
14:48
|
Владельца можно задать через установитьссылкунового.. при еще незаписанном владельце
|
|||
11
megabax
09.03.12
✎
14:52
|
10, спасибо, хотя я уже извартился вот так, но попробую через установитьССылкнового, это наверное, будет более правильно:
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт спец=ПолучитьСпецификацию(ОбъектКопирования.Ссылка); Если Не ЗначениеЗаполнено(спец) тогда возврат; конецесли; Если Вопрос("Скопировать спецификацию (копирование произойдет при записи)?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда Источник.Комментарий="###"+ОбъектКопирования.Код+"### создано копированием"; конецесли; КонецПроцедуры Процедура шапЗаписьНоменклатурыПриЗаписи(Источник, Отказ) Экспорт Если Лев(Источник.Комментарий,3)<>"###" тогда возврат; конецесли; Стр=Прав(Источник.Комментарий,стрДлина(Источник.Комментарий)-3); ДлинаКода=Найти(стр,"###"); Код=Лев(стр,ДлинаКода-1); спр=Справочники.Номенклатура.НайтиПоКоду(Код); если Не ЗначениеЗаполнено(спр) тогда сообщить("Ошибка копирования спецификации",СтатусСообщения.ОченьВажное); возврат; конецесли; спец=ПолучитьСпецификацию(спр); ИсхОб=спец.ПолучитьОбъект(); Если ЗначениеЗаполнено(спец) тогда Об=Справочники.СпецификацииНоменклатуры.СоздатьЭлемент(); для каждого Выборка из ИсхОб.ИсходныеКомплектующие цикл стр=Об.ИсходныеКомплектующие.Добавить(); стр.Количество=Выборка.Количество; стр.Номенклатура=Выборка.Номенклатура; конеццикла; Об.Владелец=Источник.Ссылка; Об.Количество=ИсхОб.Количество; Об.Наименование=ИсхОб.Наименование; Об.Записать(); Источник.ОсновнаяСпецификацияНоменклатуры=Об.Ссылка; Источник.Комментарий=стрЗаменить(Источник.Комментарий,"###","@@@"); Источник.Записать(); конецесли; КонецПроцедуры |
|||
12
Живой Ископаемый
09.03.12
✎
14:56
|
это будет штатно. не понял что решает приведенный код, но может я и проблему не понял также...
еще можно конечно скопировать спецификацию подчинив ее сначала исходному объекту. а потом, когда новый (скопированный элемент) будет записан, то переподчинить ее ему. |
|||
13
megabax
09.03.12
✎
15:01
|
12, ээ.. что то не получось через установить ссылку нового, делаю так
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт спец=ПолучитьСпецификацию(ОбъектКопирования.Ссылка); Если Не ЗначениеЗаполнено(спец) тогда возврат; конецесли; Источник.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор())); Если Вопрос("Скопировать спецификацию?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда ИсхОб=спец.ПолучитьОбъект(); Если ЗначениеЗаполнено(спец) тогда Об=Справочники.СпецификацииНоменклатуры.СоздатьЭлемент(); для каждого Выборка из ИсхОб.ИсходныеКомплектующие цикл стр=Об.ИсходныеКомплектующие.Добавить(); стр.Количество=Выборка.Количество; стр.Номенклатура=Выборка.Номенклатура; конеццикла; Об.Владелец=Источник.Ссылка; Об.Количество=ИсхОб.Количество; Об.Наименование=ИсхОб.Наименование; Об.Записать(); Источник.ОсновнаяСпецификацияНоменклатуры=Об.Ссылка; конецесли; конецесли; КонецПроцедуры говорить владелец не задан или задан неверно, ругается на Об.Записать(); подскажите плз, в чем проблема? |
|||
14
Naumov
09.03.12
✎
15:10
|
Источник.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор()));
читаем ПолучитьСсылкунового() |
|||
15
megabax
09.03.12
✎
15:28
|
Сделал вот так:
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт спец=ПолучитьСпецификацию(ОбъектКопирования.Ссылка); Если Не ЗначениеЗаполнено(спец) тогда возврат; конецесли; Источник.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку()); Если Вопрос("Скопировать спецификацию?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда ИсхОб=спец.ПолучитьОбъект(); Если ЗначениеЗаполнено(спец) тогда Об=Справочники.СпецификацииНоменклатуры.СоздатьЭлемент(); для каждого Выборка из ИсхОб.ИсходныеКомплектующие цикл стр=Об.ИсходныеКомплектующие.Добавить(); стр.Количество=Выборка.Количество; стр.Номенклатура=Выборка.Номенклатура; конеццикла; Об.Владелец=Источник.ПолучитьСсылкуНового(); //!!!!!!! Об.Количество=ИсхОб.Количество; Об.Наименование=ИсхОб.Наименование; Об.Записать(); Источник.ОсновнаяСпецификацияНоменклатуры=Об.Ссылка; конецесли; конецесли; КонецПроцедуры все тоже самое |
|||
16
Живой Ископаемый
09.03.12
✎
15:30
|
||||
17
Живой Ископаемый
09.03.12
✎
15:32
|
должно получиться, теперь правильно.
поставь точку останова на Об.Количество=ИсхОб.Количество; и посмотри чему равен Об.Владелец. |
|||
18
megabax
09.03.12
✎
16:04
|
Владелец равен <Объект не найден> (47:bcc760eb69b0894f11e169dfa58924c8)
тоже саоме возвращает Источник.ПолучитьСсылкуНового() начинает возвращать после Источник.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку()); но когда дохожу до Об.Записать(); вылатет с ошибкой |
|||
19
Живой Ископаемый
09.03.12
✎
17:42
|
с какой ошибкой? Ставил ОбменДанными.Загрузка = Истина?
|
|||
20
megabax
10.03.12
✎
00:19
|
19, вылетает с ошибкой "Владелец не задан или задан енверно".
А при чем тут ОбменДанными.Загрузка = Истина? |
|||
21
megabax
10.03.12
✎
00:23
|
Сделал Источник.ОбменДанными.Загрузка=истина;, все равно не помогло
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт спец=ПолучитьСпецификацию(ОбъектКопирования.Ссылка); Если Не ЗначениеЗаполнено(спец) тогда возврат; конецесли; Источник.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку()); Если Вопрос("Скопировать спецификацию?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда ИсхОб=спец.ПолучитьОбъект(); Если ЗначениеЗаполнено(спец) тогда Об=Справочники.СпецификацииНоменклатуры.СоздатьЭлемент(); для каждого Выборка из ИсхОб.ИсходныеКомплектующие цикл стр=Об.ИсходныеКомплектующие.Добавить(); стр.Количество=Выборка.Количество; стр.Номенклатура=Выборка.Номенклатура; конеццикла; Источник.ОбменДанными.Загрузка=истина; //!!!!!! Об.Владелец=Источник.ПолучитьСсылкуНового(); Об.Количество=ИсхОб.Количество; Об.Наименование=ИсхОб.Наименование; Об.Записать(); Источник.ОсновнаяСпецификацияНоменклатуры=Об.Ссылка; конецесли; конецесли; КонецПроцедуры |
|||
22
megabax
10.03.12
✎
00:32
|
Сделал так:
Процедура ТоварПриКопировании(Источник, ОбъектКопирования) Экспорт спец=ПолучитьСпецификацию(ОбъектКопирования.Ссылка); Если Не ЗначениеЗаполнено(спец) тогда возврат; конецесли; Источник.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку()); Если Вопрос("Скопировать спецификацию?",РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да тогда ИсхОб=спец.ПолучитьОбъект(); Если ЗначениеЗаполнено(спец) тогда Об=Справочники.СпецификацииНоменклатуры.СоздатьЭлемент(); для каждого Выборка из ИсхОб.ИсходныеКомплектующие цикл стр=Об.ИсходныеКомплектующие.Добавить(); стр.Количество=Выборка.Количество; стр.Номенклатура=Выборка.Номенклатура; конеццикла; Об.ОбменДанными.Загрузка=истина; //!!!!!! //Источник.Записать(); Об.Владелец=Источник.ПолучитьСсылкуНового(); //Об.Владелец=Источник.Ссылка; Об.Количество=ИсхОб.Количество; Об.Наименование=ИсхОб.Наименование; Об.Наименование="################"; Об.Записать(); Источник.ОсновнаяСпецификацияНоменклатуры=Об.Ссылка; конецесли; конецесли; КонецПроцедуры теперь не ругается, но создает спецификацю с владельцем "<Объект не найден>...", и, естетсвенно, у вновь созданного элемента номеклатуры не оказыается никакой скопированной специйикации. Че делать, хэлп ми, плизззз |
|||
23
ale-sarin
10.03.12
✎
11:07
|
(22) Насколько я понял, теперь для "вновь созданного элемента номеклатуры" нужно установить ссылку из "<Объект не найден>..."
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |