Имя: Пароль:
1C
1С v8
Ошибка при обмене, что не так с конвертацией
,
0 AugustBlack
 
26.09.11
21:38
Настраиваю план обмена между БП и Док, с использованием стандартных правил между Бухгалтерией и Документоборотом. Переношу справочники Контрагенты и Конт. лица. Там есть алгоритм для переноса контактной информации..
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Тип");
КоллекцияОбъектов.Колонки.Добавить("Вид");
КоллекцияОбъектов.Колонки.Добавить("Представление");
КоллекцияОбъектов.Колонки.Добавить("ЗначенияПолей");
КоллекцияОбъектов.Колонки.Добавить("Страна");
КоллекцияОбъектов.Колонки.Добавить("Регион");
КоллекцияОбъектов.Колонки.Добавить("Город");
КоллекцияОбъектов.Колонки.Добавить("АдресЭП");
КоллекцияОбъектов.Колонки.Добавить("ДоменноеИмяСервера");
КоллекцияОбъектов.Колонки.Добавить("НомерТелефона");
КоллекцияОбъектов.Колонки.Добавить("НомерТелефонаБезКодов");

Запрос = Новый Запрос("
|ВЫБРАТЬ
|    КонтактнаяИнформация.Тип КАК Тип,
|    КонтактнаяИнформация.Вид КАК Вид,
|    КонтактнаяИнформация.Представление КАК Представление,
|    КонтактнаяИнформация.Поле1 КАК Поле1,
|    КонтактнаяИнформация.Поле2 КАК Поле2,
|    КонтактнаяИнформация.Поле3 КАК Поле3,
|    КонтактнаяИнформация.Поле4 КАК Поле4,
|    КонтактнаяИнформация.Поле5 КАК Поле5,
|    КонтактнаяИнформация.Поле6 КАК Поле6,
|    КонтактнаяИнформация.Поле7 КАК Поле7,
|    КонтактнаяИнформация.Поле8 КАК Поле8,
|    КонтактнаяИнформация.Поле9 КАК Поле9
|ИЗ
|    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
|    КонтактнаяИнформация.Объект = &ОбъектКИ
|");

Запрос.УстановитьПараметр("ОбъектКИ", Источник.Ссылка);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   НоваяСтрока = КоллекцияОбъектов.Добавить();
   ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
   
   Если Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
       НоваяСтрока.ЗначенияПолей = "Индекс=" + Выборка.Поле1 + Символы.ПС
          + "Регион="           + Выборка.Поле2 + Символы.ПС
          + "Район="            + Выборка.Поле3 + Символы.ПС
          + "Город="            + Выборка.Поле4 + Символы.ПС
          + "НаселенныйПункт="  + Выборка.Поле5 + Символы.ПС
          + "Улица="            + Выборка.Поле6 + Символы.ПС
          + "Дом="              + Выборка.Поле7 + Символы.ПС
          + "Корпус="           + Выборка.Поле8 + Символы.ПС
          + "Квартира="         + Выборка.Поле9 + Символы.ПС
          + "ТипДома=дом"       + Символы.ПС
          + "ТипКорпуса=корпус" + Символы.ПС
          + "ТипКвартиры=кв.";
   ИначеЕсли Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
       НоваяСтрока.ЗначенияПолей = "КодСтраны="     + Выборка.Поле1 + Символы.ПС
          + "КодГорода="     + Выборка.Поле2 + Символы.ПС
          + "НомерТелефона=" + Выборка.Поле3 + Символы.ПС
          + "Добавочный="    + Выборка.Поле4;

       НоваяСтрока.НомерТелефонаБезКодов = Выборка.Поле3;
       НоваяСтрока.НомерТелефона         = Выборка.Поле1 + Выборка.Поле2 + Выборка.Поле3;
   ИначеЕсли Выборка.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
       НоваяСтрока.АдресЭП = Выборка.Представление;
   КонецЕсли;
КонецЦикла;

Так вот при загрузке данных в Документооборот выдает ошибку:
Ошибка обращения к табличной части объекта. Табличная часть объекта не может быть изменена.
   ТипОбъекта             =  Справочник объект: Корреспонденты
   Объект                 =  СОТРУДНИКИ
   ОписаниеОшибки         =  Ошибка при вызове метода контекста (Очистить): Объект недоступен для изменения.
   ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(5805)
   Текст                  =  Имя табличной части: КонтактнаяИнформация
   КСообщенияОбОшибках    =  83

отсюда СОТРУДНИКИ это группа а не элемент..Я так понимаю он пытается обратится к табличной части группы но т.к ее попросту нету и заканивает ошибкой или почему так?
дописываю в алгоритм переноса контакт. информации уже это:
Если НЕ Источник.Ссылка.ЭтоГруппа Тогда
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Тип");
КоллекцияОбъектов.Колонки.Добавить("Вид");
....такое ощущение как будьто условие не срабатывает. Помогите пожалуйста решить эту задачу, замучался с ними ужасно:(
1 AugustBlack
 
26.09.11
21:44
Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(5805) - вот процедура
Процедура ЗагрузитьТабличнуюЧасть(Объект, ИмяТабличнойЧасти, ОбщаяИнформацияОТипеДокумента, НужноЗаписатьОбъект, ПараметрыОбъекта, ПКО)
   
   Перем КлючевыеПоляПоиска;
   Перем МассивКлючевыхПолейПоиска;
   
   Результат = ПолучитьКлючевыеПоляПоискаПоТабличнойЧасти(ПКО, ИмяТабличнойЧасти, МассивКлючевыхПолейПоиска, КлючевыеПоляПоиска);
   
   Если Не Результат Тогда
       одПропустить(ФайлОбмена);
       Возврат;
   КонецЕсли;
   
   ТабличнаяЧастьОбъекта = Объект[ИмяТабличнойЧасти];
   
   ИмяКолонкиИтератора = "КлючевоеПолеИтератораЗначений";
   
   КоллекцияОбъекта     = ТабличнаяЧастьОбъекта.Выгрузить();
   КоллекцияФайлаОбмена = КоллекцияОбъекта.СкопироватьКолонки();
   
   ЗаполнитьКоллекциюФайлаОбмена(КоллекцияФайлаОбмена, ИмяТабличнойЧасти, ОбщаяИнформацияОТипеДокумента, ПараметрыОбъекта, МассивКлючевыхПолейПоиска);
   
   ДобавитьИтераторТаблице(КоллекцияФайлаОбмена, +1, ИмяКолонкиИтератора);
   ДобавитьИтераторТаблице(КоллекцияОбъекта,     -1, ИмяКолонкиИтератора);
   
   КоллекцияГруппировки = ИнициализацияТаблицыПоКлючевымПолям(МассивКлючевыхПолейПоиска);
   КоллекцияГруппировки.Колонки.Добавить(ИмяКолонкиИтератора);
   
   ЗаполнитьЗначенияСвойствТаблицы(КоллекцияФайлаОбмена, КоллекцияГруппировки);
   ЗаполнитьЗначенияСвойствТаблицы(КоллекцияОбъекта,     КоллекцияГруппировки);
   
   КоллекцияГруппировки.Свернуть(КлючевыеПоляПоиска, ИмяКолонкиИтератора);
   
   // очищаем табличную часть объекта
//здесь ругается
   Попытка
       ТабличнаяЧастьОбъекта.Очистить();
   Исключение
       
       Текст = НСтр("ru = 'Имя табличной части: %1'");
       
       ЗП = ПолучитьСтруктуруЗаписиПротокола(83, ОписаниеОшибки());
       ЗП.Объект     = Объект;
       ЗП.ТипОбъекта = ТипЗнч(Объект);
       ЗП.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Текст, ИмяТабличнойЧасти);
       ЗаписатьВПротоколВыполнения(83, ЗП);
       
       одПропустить(ФайлОбмена);
       Возврат;
   КонецПопытки;
   
   Для Каждого СтрокаКоллекции ИЗ КоллекцияГруппировки Цикл
       
       // получаем структуру отбора
       Отбор = Новый Структура();
       
       Для Каждого ИмяПоля ИЗ МассивКлючевыхПолейПоиска Цикл
           
           Отбор.Вставить(ИмяПоля, СтрокаКоллекции[ИмяПоля]);
           
       КонецЦикла;
       
       Если СтрокаКоллекции[ИмяКолонкиИтератора] = 0 Тогда
           
           //заполняем строки табличной части из старой версии объекта
           СтрокиКоллекцииОбъекта = КоллекцияОбъекта.НайтиСтроки(Отбор);
           
       Иначе
           
           // заполняем строки табличной части из коллекции файла обмена
           СтрокиКоллекцииОбъекта = КоллекцияФайлаОбмена.НайтиСтроки(Отбор);
           
       КонецЕсли;
       
       // добавляем строки табличной части объекта
       Для Каждого СтрокаКоллекции ИЗ СтрокиКоллекцииОбъекта Цикл
           
           ЗаполнитьЗначенияСвойств(ТабличнаяЧастьОбъекта.Добавить(), СтрокаКоллекции);
           
       КонецЦикла;
       
       НужноЗаписатьОбъект = Истина;
       
   КонецЦикла;
   
КонецПроцедуры
2 AugustBlack
 
27.09.11
06:23
up, актуально
3 SIS72
 
27.09.11
07:15
Если перенос только этих 2 справочников - можешь и сам написать правила - почитай здесь http://www.mykod.info (конвертация с нуля)
4 SIS72
 
27.09.11
07:24
Кстати с чем то подобным встречался - если переносишь много справочников - перенеси сначало эти 2, а потом остальные - звучит глупо но мне однажды помогло
5 AugustBlack
 
27.09.11
08:30
(4) SIS72 спасиба там я читал..вообщем стандартные правила не совсем подходят, я их чуть чуть допилил. В универсальной выгрузке правила работают, в планах остановка на ошибке(
6 SuperMario
 
27.09.11
08:53
(0) нужно отказаться от выгрузки таб. части если объект ЭтоГруппа.
А у тебя в ПКГС
+code
Если НЕ Источник.Ссылка.ЭтоГруппа Тогда
+code
все равно передают в приемник, что таб. часть у СОТРУДНИКИ есть, только она пустая.
7 AugustBlack
 
27.09.11
09:02
(6)  SuperMario а как это сделать в конвертации??
8 AugustBlack
 
27.09.11
09:07
или где это сделать? не дописывать же мне код в обработку КонвертацияОбъектовИнформационныхБаз
9 SuperMario
 
27.09.11
09:30
В ПКГС в обработчик ПередВыгрузкой
Отказ = Источник.ЭтоГруппа;
10 AugustBlack
 
27.09.11
09:41
добавил теперь план обмена ругается на это:
Ошибка в обработчике события ПередВыгрузкойОбъекта
   ПВД                    =  Контрагенты
   Объект                 =  Торговый дом "Комплексный"  (Справочник объект: Контрагенты)
   Обработчик             =  ПередВыгрузкойОбъектаВыборки
   ОписаниеОшибки         =  Метод объекта не обнаружен (ЭтоГруппа)
   ПозицияМодуля          =  (1)
   КСообщенияОбОшибках    =  33
Т_Т
11 SuperMario
 
27.09.11
09:48
Так у тебя и выборка идет по произвольному алгоритму.
Смотри в ПВД Контрагенты. Наверняка запрос. Добавь признак группы.
12 SuperMario
 
27.09.11
09:55
(10) и ошибка в ПВД и не того ПКо, который в (0) описан.

Ничего не понял. Куда вставил отказ от выгрузки?

Нужно для ПКО Корреспонденты в ПередВыгрузкой ПКГС
13 AugustBlack
 
27.09.11
10:05
соррь.в пвд видать лишнее было написано,удалил оттуда.
http://imglink.ru/show-image.php?id=2e00d52db6264c2ca90a596027177630 посмотрите пожалуйста. вот сюда нада?
поставил туда, при загрузке в ДО, все равно ошибка(

Ошибка обращения к табличной части объекта. Табличная часть объекта не может быть изменена.
   ТипОбъекта             =  Справочник объект: Корреспонденты
   Объект                 =  СОТРУДНИКИ
   ОписаниеОшибки         =  Ошибка при вызове метода контекста (Очистить): Объект недоступен для изменения.
   ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(5805)
   Текст                  =  Имя табличной части: ДополнительныеРеквизиты
   КСообщенияОбОшибках    =  83
14 SuperMario
 
27.09.11
10:16
(13) ну и что не понятно?
Теперь ругается на таб. часть Дополнительные документы.
А ты поставил только для таб. части Контактной информации ;)
15 SuperMario
 
27.09.11
10:20
(13) сорь.
попутал  с ДополнительныеРеквизиты
16 SuperMario
 
27.09.11
10:23
А какие у тебя реквизиты поиска стоят для этого ПКО?
Не получилось ли так, что в источнике "СОТРУДНИКИ" - это элемент справочника, а в приемнике это группа?
Поиск по свойству "ЭтоГруппа" стоит?
17 AugustBlack
 
27.09.11
10:36
дадада, Поиск по ИНН и по ЭтоГруппа. Т.е убрать его? в стандартных правилах так стояло я решил не трогать.
18 SuperMario
 
27.09.11
10:40
НЕт. Поиск по Этогруппа нужен обязательно. Иначе косанет.
Тогда отказ от выгрузки ДополнительныеРеквизиты для групп должен решить проблему.
19 AugustBlack
 
27.09.11
10:45
добавил отказ для ДополнительныеРеквизиты:
Ошибка обращения к табличной части объекта. Табличная часть объекта не может быть изменена.
   ТипОбъекта             =  Справочник объект: Корреспонденты
   Объект                 =  СОТРУДНИКИ
   ОписаниеОшибки         =  Ошибка при вызове метода контекста (Очистить): Объект недоступен для изменения.
   ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(5805)
   Текст                  =  Имя табличной части: КонтактнаяИнформация
   КСообщенияОбОшибках    =  83
20 AugustBlack
 
27.09.11
10:48
в xml файле записи:
<Код>11</Код>
                       <Наименование> --&gt; КонтактнаяИнформация</Наименование>
                       <Порядок>600</Порядок>
                       <Источник Имя="" Вид=""/>
                       <Приемник Имя="КонтактнаяИнформация" Вид="ТабличнаяЧасть"/>
                       <ПередОбработкойВыгрузки>Выполнить(Алгоритмы.ПереносКИ);</ПередОбработкойВыгрузки>
                       <ПередВыгрузкой>Отказ = Источник.ЭтоГруппа;
</ПередВыгрузкой>

вопрос правильно ли алгоритм для выгрузки стоит в процедуре
ПередОбработкойВыгрузки ? в стандартных правилах так. мб в этом дело??
21 AugustBlack
 
27.09.11
10:50
может отказ перед ПередОбработкойВыгрузки запихнуть??
22 AugustBlack
 
27.09.11
11:00
вродь получилось=)) спасиба  SuperMario, поставил отказ перед обработкой..
Перед обработкой
Условия возникновения события
Событие выполняется перед обработкой группы свойств, например, перед выгрузкой табличной части. Возможен отказ от выгрузки. Можно определить произвольную коллекцию, являющуюся источником данных.
Отказ = Источник.ЭтоГруппа;
Выполнить(Алгоритмы.ПереносКИ);
23 SuperMario
 
27.09.11
11:06
(22) Удачи!