Имя: Пароль:
1C
1С v8
Проблема в обработчике события "ПриКопировании"
,
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) Насколько я понял, теперь для "вновь созданного элемента номеклатуры" нужно установить ссылку из "<Объект не найден>..."