|
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
|
http://infostart.ru/public/19085/
например |
|||
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) Как всегда актуальный вопрос. Где фотки в профиле :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |