Имя: Пароль:
1C
1C 7.7
v7: Выгрузка подчиненного справочника через OLE
, ,
0 anita135
 
06.08.14
03:21
Делаю перенос справочника между базами из справочника Организации (подчин. ДенежныеСчета) в Контрагенты (подчин. БанкСчетаКонтрагентов).
Проблема в том, что владелец не устанавливается.

СпрОлеОрг=БазаОле.CreateObject("Справочник.Организации");
СпрОрг=СоздатьОбъект("Справочник.Контрагенты");
СпрОлеСч=БазаОле.CreateObject("Справочник.ДенежныеСчета");
СпрСчет = СоздатьОбъект("Справочник.БанкСчетаКонтрагентов");

СпрОлеОрг.ВыбратьЭлементы();
Пока СпрОлеОрг.ПолучитьЭлемент()=1 Цикл
    СпрОрг.Новый();
    СпрОрг.Код=СпрОлеОрг.Код;
    СпрОрг.Наименование=СпрОлеОрг.Наименование;
    
    СпрСчет.ИспользоватьВладельца(СпрОрг.ТекущийЭлемент());  
    СпрОлеСч.ИспользоватьВладельца(СпрОлеОрг.ТекущийЭлемент());
    СпрОлеСч.ВыбратьЭлементы();  
    Пока СпрОлеСч.ПолучитьЭлемент()=1 Цикл  
        СпрСчет.Новый();      
        СпрСчет.Номер = "111";
        СпрСчет.Записать();
        КонецЦикла;
    СпрОрг.Записать();
КонецЦикла;

Ошибка:
СпрСчет.Записать();
{D:\KPI\OLE.ERT(61)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!
1 ASV
 
06.08.14
03:27
СпрСчет.Владелец= СпрОрг.ТекущийЭлемент()
2 ASV
 
06.08.14
03:28
СпрОрг.Записать();  передвинуть вверх, перед счетами
3 anita135
 
06.08.14
03:47
так?

СпрСчет.ИспользоватьВладельца(СпрОрг.ТекущийЭлемент());  
    СпрОлеСч.ИспользоватьВладельца(СпрОлеОрг.ТекущийЭлемент());
    СпрОлеСч.ВыбратьЭлементы();  
    СпрОрг.Записать();
    Пока СпрОлеСч.ПолучитьЭлемент()=1 Цикл  
        СпрСчет.Владелец=СпрОрг.ТекущийЭлемент();
        СпрСчет.Новый();      
        СпрСчет.Записать();
    КонецЦикла;
КонецЦикла;

выдает ошибку:
СпрСчет.Владелец=СпрОрг.ТекущийЭлемент();
{D:\KPI\OLE.ERT(61)}: Не выбран элемент!
4 ASV
 
06.08.14
04:27
СпрОлеОрг.ВыбратьЭлементы();
Пока СпрОлеОрг.ПолучитьЭлемент()=1 Цикл
    СпрОрг.Новый();
    СпрОрг.Код=СпрОлеОрг.Код;
    СпрОрг.Наименование=СпрОлеОрг.Наименование;
    СпрОрг.Записать();  
    //СпрСчет.ИспользоватьВладельца(СпрОрг.ТекущийЭлемент());  
    СпрОлеСч.ИспользоватьВладельца(СпрОлеОрг.ТекущийЭлемент());
    СпрОлеСч.ВыбратьЭлементы();  
    Пока СпрОлеСч.ПолучитьЭлемент()=1 Цикл  
        СпрСчет.Новый();      
        СпрСчет.Номер = "111";
        СпрСчет.Владелец=СпрОрг.ТекущийЭлемент();
        СпрСчет.Записать();
        КонецЦикла;

КонецЦикла;

Ошибка:
5 ДенисЧ
 
06.08.14
07:56
(3) Вместо
СпрСчет.Владелец=СпрОрг.ТекущийЭлемент();
сделай
СпрСчет.ИспользоватьВладельца(СпрОрг.ТекущийЭлемент());
6 anita135
 
06.08.14
15:07
Эта часть сработала.

Новая проблема не могу перенести группу как группа. Без проверки СпрОрг.ЭтоГруппа()=1 все делается обычными элементами, а с проверкой все запихивает как группа.

СпрОлеОрг=БазаОле.CreateObject("Справочник.Организации");
СпрОрг=СоздатьОбъект("Справочник.Контрагенты");
СпрОлеСч=БазаОле.CreateObject("Справочник.ДенежныеСчета");
СпрСчет = СоздатьОбъект("Справочник.БанкСчетаКонтрагентов");

СпрОлеОрг.ВыбратьЭлементы();
Пока СпрОлеОрг.ПолучитьЭлемент()=1 Цикл    
    Если СпрОрг.ЭтоГруппа()=1 Тогда
        СпрОрг.НоваяГруппа();
        СпрОрг.Код=СпрОлеОрг.Код;  
        СпрОрг.Наименование=СпрОлеОрг.Наименование;    
        СпрОрг.Записать();
        Сообщить("Группа "+СпрОлеОрг.Код+"--- "+СпрСчет.Наименование);
    Иначе
        СпрОрг.Новый();
        СпрОрг.Код=СпрОлеОрг.Код;
        СпрОрг.Наименование=СпрОлеОрг.Наименование;
               СпрОрг.Записать();
        КонецЕсли;
        КонецЦикла;
7 Ёпрст
 
06.08.14
15:09
Если СпрОрг.ЭтоГруппа()=1 Тогда

вот это замени на
Если СпрОЛЛЛЛЛЕЕЕЕЕЕЕОрг.ЭтоГруппа()=1 Тогда
8 ДенисЧ
 
06.08.14
15:09
"Пока СпрОлеОрг.ПолучитьЭлемент()=1 Цикл    
Если СпрОрг.ЭтоГруппа()=1 Тогда
     СпрОрг.НоваяГруппа();
"

Ничего не смущает?
А если внимательней приглядеться?
9 Ёпрст
 
06.08.14
15:10
и это, всё же наименования переменных от снеговика более читабельные, хоть ии длинююююющие, там меньше таких ошибок нелепых из-за невнимательности
10 anita135
 
06.08.14
15:30
Мда... Уже увидела и исправила на ОЛЕ.

Только создается группа - хорошо, но как установить родителя.
11 Ёпрст
 
06.08.14
15:31
(10) ИспользоватьРодителя вестимо
12 Ёпрст
 
06.08.14
15:31
вообще, всё это лепится в примитивной рекурсии
13 Ёпрст
 
06.08.14
15:32
но можно и за 2 прохода - в начале слепить всё в кучу, потом ужо проставить родителей.
14 anita135
 
06.08.14
15:33
СпрОрг.Родитель=СпрОлеОрг.Родитель;
не работает, что не так?

Я первый раз занимаюсь таким вопросом... да 1с учила года 2 назад... Сори за глупые вопросы ;)
15 anita135
 
06.08.14
15:38
(12) (13) верю, что так правильно... но с рекурсией боюсь не подружится да и времени мАло...
16 Ёпрст
 
06.08.14
15:40
(14) по оле передаются только простые типы данных - строка число и дата.. всё остальное - нет

писать Родитель = РодительВОлеБазе - бессмысленно, фирштейн ?
Ибо это агрегатные объекты из РАЗНЫХ баз..
17 Ёпрст
 
06.08.14
15:42
если времени мало - проще взять готовый универсальный перенос данных, либо основанный на оле (типа унниверсам) либо на текстовых документах (типа импорт/экспорт 77. ерт)
18 Ёпрст
 
06.08.14
15:42
и.. не кодить ничего самому,..вообще :)
19 Ёпрст
 
06.08.14
15:44
20 anita135
 
06.08.14
15:56
Вариант взять готовое не подходит. Есть конкретный вопрос возможно ли запихнуть элемент в группу и как это сделать.
21 Ёпрст
 
06.08.14
16:04
(20) ИспользоватьРодителя
или напрямую Элем.Родитель = нужный (это способ плох тем, что может быть присвоен не уникальный код)
22 Ёпрст
 
06.08.14
16:06
для начала, нужно определиться, по какому реквизиты ты собираешься синхрить справочники в разных базах, по коду ? По Наименованию ? По значению реквизита ?..
затем ужо примитив - обход одного справочника, поиск его в другой базе, если нет - создать, если есть - запомнить..
23 Ёпрст
 
06.08.14
16:07
иначе..наплодишь дублей тоннами, при каждом запуске своей поделки
24 anita135
 
06.08.14
16:07
Пишу СпрОрг.Родитель="бюджет" не ставит.
25 anita135
 
06.08.14
16:08
Работаю исключительно с одним справочником, после не удачного запуска обработки удаляю все из него.
26 Ёпрст
 
06.08.14
16:11
(24) да ужж..
присваивать строку заместо элемента, вас где учили ?
27 anita135
 
06.08.14
16:20
(26) логично((
но надо же с чего-то начинать...
28 anita135
 
06.08.14
17:32
Все окончательно запуталась и не понимаю...

Как найти родителя элемента?
29 Ёпрст
 
06.08.14
17:34
(28)

.Родитель
30 Ёпрст
 
06.08.14
17:35
самый примитив - синхронизация по коду элемента, т.е лепить в базе элементы с тем же кодом, что и в оле базе.
Далее - просто поиск по коду. Усё.
31 anita135
 
06.08.14
18:52
Не понимаю... Подскажите, пожалуйста

Если СпрОлеОрг.ЭтоГруппа()=1 Тогда
  СпрОрг.НоваяГруппа();
  СпрОрг.Код=СпрОлеОрг.Код;  
  СпрОрг.Наименование=СпрОлеОрг.Наименование;    
  СпрОрг.Записать();
  Код=СпрОлеОрг.Код;
  Сообщить("Группа "+СпрОлеОрг.Код+"--- "+СпрСчет.Наименование);
Иначе        
  СпрОлеОрг.НайтиПоКоду(Код);
  СпрОрг.ИспользоватьРодителя(СпрОлеОрг.ТекущийЭлемент());  
  СпрОрг.Новый();
  СпрОрг.Код=СпрОлеОрг.Код;
  СпрОрг.Наименование=СпрОлеОрг.Наименование;
  Сообщить("Строка "+СпрОлеОрг.Код+"--- "+СпрСчет.Наименование+"--- "+СпрСчет.Родитель);
  СпрОрг.Записать();
КонецЕсли;

Выдает:
Группа 00390---
Строка 00390--- ---
СпрОрг.Записать();
{D:\KPI\OLE.ERT(78)}: Код не уникальный!
32 hhhh
 
06.08.14
22:02
второй раз записываешь организацию. записала ведь уже.
33 anita135
 
06.08.14
22:42
(32) это понятно.

Переделала кусок в Иначе

СпрОрг.НайтиПоКоду(СпрОлеОрг.Родитель.Код);
Родитель = СпрОрг.ТекущийЭлемент();
СпрОрг.Новый();
СпрОрг.Родитель = Родитель;
СпрОрг.Код=СпрОлеОрг.Код;
СпрОрг.Наименование=СпрОлеОрг.Наименование;
СпрОрг.Записать();

Заполнение справочника выполняется, но в группы не заносит.
СпрОрг.НайтиПоКоду(СпрОлеОрг.Родитель.Код) возвращает всегда 0.
34 Pasha
 
06.08.14
23:38
(0) а чем КД не нравится? Удобнее и надежнее
35 anita135
 
07.08.14
17:38
Сделала так, возможно каряво, но работает. Пока в частном случае для каждого уровня элементов.

Если СпрОлеОрг.Уровень()=1 тогда   //Определяем уровень
  Родитель=Число(СпрОлеОрг.ТекущийЭлемент().Родитель.Код);
  Сообщить("Родитель "+Родитель);
  Если СпрОрг.НайтиПоКоду(Родитель)=0 тогда
    Сообщить("Не нашел родителя "+Родитель);
  Иначе                                        
    НайдРод=СпрОрг.ТекущийЭлемент();
    Сообщить("Нашел родителя "+Родитель+"--"+НайдРод);
  КонецЕсли;      
  Если СпрОлеОрг.ЭтоГруппа()=1 Тогда    //проверка группа
    СпрОрг.НоваяГруппа();
    СпрОрг.Родитель=НайдРод;
    СпрОрг.Код=СпрОлеОрг.Код;  
    СпрОрг.Наименование=СпрОлеОрг.Наименование;    
    СпрОрг.Записать();
    Сообщить("Группа "+СпрОрг.Код+"--- "+СпрОрг.Наименование+"--- "+СпрОрг.Родитель);
  Иначе    
    СпрОрг.Новый();  
    СпрОрг.Родитель=НайдРод;
    СпрОрг.Код=СпрОлеОрг.Код;
    СпрОрг.Наименование=СпрОлеОрг.Наименование;
    СпрОрг.Записать();    
    Сообщить("Строка "+СпрОрг.Код+"--- "+СпрОрг.Наименование+"--- "+СпрОрг.Родитель);
  КонецЕсли;  //проверка этоГруппа  
КонецЕсли;    //проверка уровень
36 DigitalDolphin
 
07.08.14
18:43
(0) Как всегда актуальный вопрос. Где фотки в профиле :-)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn