Имя: Пароль:
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) он записывает номенклатуру (в событии после загрузки( делать это не кто не запрещает)), а потом создает подчиненный элемент.
Просто тебе перед применением твоего алгоритма создания элемента нужно просто ставить
Объект.Записать()
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший