Имя: Пароль:
1C
1С v8
Конвертация данных. Как создать единицу измерения
,
0 olo_lo1
 
25.01.13
01:25
Переношу данные по справочнику Номенклатура.
Как сделать так, что бы если у номенклатуры не выбрана единица измерения она создавалась автоматом при переносе по владельцу - элементу номенклатуры..
1 sanja26
 
25.01.13
01:52
Какая-то определенная что-ли?
ПриЗагрузке можно или послеЗагрузки.
Объект.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию

Если Единицы измерения подчиненный справочник, а не просто реквизит, то надо каждый раз создавать тут же новую
2 olo_lo1
 
25.01.13
08:47
да, подчиненный, каждый раз создавать штуки
3 ks_83
 
25.01.13
08:52
Можно после окончательной загрузки по всей загруженной номенклатуре пробежаться и насоздавать эти единицы. Так быстрее работать будет.
4 olo_lo1
 
25.01.13
08:53
(3) класс, а можно описать как это сделать
5 fenixx
 
25.01.13
08:55
в ПКО справочника "Номенклатура" в обработчике "После загрузки" добавь проверку на существования единицы измерения для Объекта. Если не существует - создаешь
6 olo_lo1
 
25.01.13
08:57
(5) я в конвертации не силен, напиши пож пример
7 fenixx
 
25.01.13
09:04
(6) Извини, дружище, моё дело - стратегия. Тут объяснения полдня занять могут, в зависимости от твоей не сильности в КД. Ищи где правила конвертации объектов (ПКО), где там соответствующий обработчик. Там хелп есть, посмотри примеры из типовых конвертиций. Успехов )
8 vitek89
 
25.01.13
09:07
(0) А они разве не создаются? Там же есть такая штука - поля поиска. Если данные не находятся в приемнике по этим полям, то создается новый элемент
9 cw014
 
25.01.13
09:07
(6) Никто ничего просто так писать не будет
10 Deamonicus
 
25.01.13
09:12
после загрузки добавляешь:

Если НЕ ЗначениеЗаполнено(Объект.ЕдиницаИзмерения) Тогда
   НовЕд = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
   
   //тут далее заполняешь реквизиты...
   НовЕд.Наименование = .....
   НовЕд.Владелец = Объект.Ссылка;
   НовЕд.Записать();    
   Объект = НовЕд.Ссылка;

КонецЕсли;
11 olo_lo1
 
25.01.13
11:37
(10) спасибо!
12 olo_lo1
 
25.01.13
11:44
КД - вообще крутейшая вещь, интересно кто ее разработал...
13 olo_lo1
 
25.01.13
11:44
и придумал
14 cw014
 
25.01.13
11:46
(12) Ее никто не разработал. Это инопланетная технология, привезенная на с альфы центавра, и внедренная людьми в черном в массы
15 olo_lo1
 
25.01.13
11:59
(10) хотел уточнить - а для чего вот эта последняя строчка
Объект = НовЕд.Ссылка;
16 Redkiy
 
25.01.13
12:05
(15) найдешь обработчик, куда этот код вставить, прочитаешь хэлп по обработчику и все поймешь (надеюсь)
17 ДемонМаксвелла
 
25.01.13
12:06
Объект.ЕдиницаИзмерения = НовЕд.Ссылка;
18 olo_lo1
 
25.01.13
13:22
Вот что пишет при загрузке ..
Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(4842)}: Ошибка записи объекта
   ТипОбъекта             =  Номенклатура
   Объект                 =  шт
   ОписаниеОшибки         =  Метод объекта не обнаружен (Записать)
   ПозицияМодуля          =  Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(4835)
19 hhhh
 
25.01.13
13:31
(18)

Если НЕ Объект.ЭтоГруппа Тогда
Если НЕ ЗначениеЗаполнено(Объект.ЕдиницаИзмерения) Тогда
   НовЕд = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
   
   //тут далее заполняешь реквизиты...

   НовЕд.Наименование = .....
   НовЕд.Владелец = Объект.Ссылка;
   НовЕд.Записать();    
   Объект = НовЕд.Ссылка;

КонецЕсли;
КонецЕсли;
20 olo_lo1
 
25.01.13
13:39
(19) теперь вот это

Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1620)}: Ошибка в обработчике события ПослеЗагрузкиОбъекта
   ИмяПКО                 =  Номенклатура
   ТипОбъекта             =  Номенклатура
   Объект                 =  моя номенклатура1
   Обработчик             =  ПослеЗагрузкиОбъекта
   ОписаниеОшибки         =  Ошибка при вызове метода контекста (Записать): Значение поля "Номенклатура" не заполнено или заполнено неверно
   ПозицияМодуля          =  (8)
   КодСообщения           =  21
21 Naumov
 
25.01.13
13:48
Ребята, а не учили перед созданием подчиненных объектов записывать прежде владельца?
22 Naumov
 
25.01.13
13:52
вариантов решения этой задачи несколько:
1) после загрузки номенклатуры записывать подчиненный, как тут предлагают.
2) для этапа выгрузки создать ПКО, которое будет подчиненный объект выгружать. При загрузке все самой загрузится.
23 olo_lo1
 
25.01.13
13:57
(22) так это же в предопред процедуре ПОСЛЕЗАГРУЗКИОБЪЕКТА прописывается..
24 Йохохо
 
25.01.13
14:03
(18)(20) похоже ты упорно пихаешь в Справочник.ЕдиницыИзмерения в ПКО Номенклатура
25 olo_lo1
 
25.01.13
14:04
(24) ну да..я не понимаю зачем создавать новый ПКО номенклатура
26 Naumov
 
25.01.13
14:06
(23) А описание обработчика почитай, чтобы понять когда он вызывается.
27 zladenuw
 
25.01.13
14:10
(23) да и все работает.

Попытка    
   Если НЕ Объект.ЭтоГруппа Тогда
//        Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
       Объект.ВидНоменклатуры=  Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Услуга");
Если ОбъектНайден или НЕ ЗначениеЗаполнено(Объект.БазоваяЕдиницаИзмерения) Тогда
       Объект.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("н/год").Ссылка;
       Объект.Записать();
КонецЕсли;        
       
       СпрЕД = Справочники.ЕдиницыИзмерения;
       НайденЕд = СпрЕд.НайтипоНаименованию("н/год",,,Объект.Ссылка).Ссылка;
   Если СпрЕД.пустаяСсылка() = НайденЕд Тогда
       Единица = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
       Единица.Наименование = "н/год";
       Единица.Коэффициент = 1;
       Единица.ЕдиницаПоКлассификатору = Объект.БазоваяЕдиницаИзмерения;
       Единица.Владелец = Объект.Ссылка;
       Единица.Записать();
       Ед = Единица.Ссылка;
   Иначе
       Ед = НайденЕд;
   КонецЕсли;
//    
//    
   Если ОбъектНайден Тогда
       Если НЕ ЗначениеЗаполнено(Объект.ЕдиницаДляОтчетов) Тогда
           Объект.ЕдиницаДляОтчетов = Ед;
           Объект.ЕдиницаИзмеренияМест = Ед;
           Объект.ЕдиницаХраненияОстатков = Ед;
           Объект.Записать();
       //Иначе
           //НеЗамещатьОбъект = Истина;
       КонецЕсли;        
   иначе
       Объект.ЕдиницаДляОтчетов = Ед;
       Объект.ЕдиницаИзмеренияМест = Ед;
       Объект.ЕдиницаХраненияОстатков = Ед;
       Объект.Записать();
   КонецЕсли;    
//            
   КонецЕсли;
Исключение
// //ОписаниеОшибки();
КонецПопытки
28 olo_lo1
 
25.01.13
14:17
(27) судя по всему либо у тебя 2 ПКО на номенклатуре либо он находит нужную номенклатуру и к ней уже подтягивает ед изм, иначе работать это не должно..
29 Йохохо
 
25.01.13
14:27
(25) эм, всё классно, и код рабочий, и вообще
но по (18) и (20) у тебя в ПослеЗагрузкиОбъекта ПКО Номенклатура Объект СправочникОбъект.ЕдиницыИзмерения. я не знаю, как еще пояснить мою догадку, она слишком бредовая
30 Naumov
 
25.01.13
21:10
(28) Это почему же не должно?
31 olo_lo1
 
25.01.13
21:20
(30) так вы сами себе тогда противоречите в (21)
32 olo_lo1
 
25.01.13
21:24
После загрузки
Условия возникновения события:
Событие выполняется после прочтения и установки атрибутов объекта из файла, но до его записи в информационную базу. Возможна модификация загруженного объекта.

Соответственно создаться подчиненный объект по владкльцу как в 27 может только если владелец уже есть в базе. Видимо это работает если он в 22 раза конвертацию делает.
33 Naumov
 
26.01.13
02:07
(32) в (27) он записывает номенклатуру (в событии после загрузки( делать это не кто не запрещает)), а потом создает подчиненный элемент.
Просто тебе перед применением твоего алгоритма создания элемента нужно просто ставить
Объект.Записать()