Версия для печати темы (https://pro1c.org.ua/index.php?s=bb3d12303f9d426f91c090043cf4bac8&showtopic=1204)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ перенос иерархического справочника между конфигурациями

Автор: suhar 26.11.09, 22:28

Помогите пож.!
Есть 2 конфы, из одной надо вытащить справочник в другую. Справочник иерархический.
На данном этапе есть подключение к другой базе и могу вытащить все записи справочника но без разбития по группам.

Автор: MATEVI 26.11.09, 23:48

Цитата(suhar @ 26.11.09, 23:28) *
Помогите пож.!
Есть 2 конфы, из одной надо вытащить справочник в другую. Справочник иерархический.
На данном этапе есть подключение к другой базе и могу вытащить все записи справочника но без разбития по группам.

Ну а вчем проблема то?
Если Спр.ЭтоГруппа() Тогда
ТекГруппа =Спр.ТекущийЭлемент();
КонецЕсли; находим в текущей конфе
Потом в другой создаем Группу с помощью
запоминаем и.
Спр1.Родитель=... используем в другой где создаем...

Автор: Ardi 26.11.09, 23:53

Если СпрИсточник.Владелец.Код<>0 Тогда
Ищем по коду справочник владелец в текущей базе. Если его нету - создаём. и в рекурсии создаём всех владельцев владельца.
присваиваем ТекНовому справочника владельца..

-----
А если нужно перенести все справочники - то владельцев владельцев перенести и без рекурсии можно.

Автор: suhar 27.11.09, 5:24

Цитата(MATEVI @ 27.11.09, 0:48) *
Ну а вчем проблема то?
Если Спр.ЭтоГруппа() Тогда
ТекГруппа =Спр.ТекущийЭлемент();
КонецЕсли; находим в текущей конфе
Потом в другой создаем Группу с помощью
запоминаем и.
Спр1.Родитель=... используем в другой где создаем...


не совсем понятна логика. спр - справочник-приемник, спр1 - справочник-источник;
спр1.ВэбратьЭлементы();
пока спр1.ПолучитьЭлемент() цикл
если спр1.ЭтоГруппа()=1 тогда
спр.НоваяГруппа();
спр.Наименование=Спр1.ТекущийЭлемент();
спр.Записать();
//как дальше проводить проверку и записывать элементы в нужную группу

Автор: Winter 27.11.09, 9:53

Цитата(Ardi @ 27.11.09, 0:53) *
Если СпрИсточник.Владелец.Код<>0 Тогда
Ищем по коду справочник владелец в текущей базе. Если его нету - создаём. и в рекурсии создаём всех владельцев владельца.
присваиваем ТекНовому справочника владельца..

-----
А если нужно перенести все справочники - то владельцев владельцев перенести и без рекурсии можно.


Не путай иерархический справочник и подчиненный. Человека интересует именно иерархический. А вообще почему для этих целей не воспользоваться универсальной обработкой Transref.ert?

Автор: Winter 27.11.09, 9:59

Цитата(suhar @ 27.11.09, 6:24) *
не совсем понятна логика. спр - справочник-приемник, спр1 - справочник-источник;
спр1.ВэбратьЭлементы();
пока спр1.ПолучитьЭлемент() цикл
если спр1.ЭтоГруппа()=1 тогда
спр.НоваяГруппа();
спр.Наименование=Спр1.ТекущийЭлемент();
спр.Записать();
//как дальше проводить проверку и записывать элементы в нужную группу


Во-первых, для удобства синхронизируй код, т.е. Не только наименование переноси, но и код. Если код нет возможности, вводи новый реквизит в справочник (в старых конфигурациях был такой реквизит для этого СтарыйПолныйКод) и вноси туда значение переносимого элемента/группы справочника.
Потом проверяешь родителя и его поиск (это я сделал бы через отдельную функцию)
Если Спр1.Родитель.Выбран() =1 Тогда
Если Род.НайтиПоКоду(Спр1.Родитель.Код)=1 Тогда
Спр.Родитель = Род.ТекущийЭлемент()
КонецЕсли;
КонецЕсли;

Род - в этом случае тот же справочник, что и Спр.

Автор: suhar 27.11.09, 14:53

Цитата(Winter @ 27.11.09, 10:59) *
Во-первых, для удобства синхронизируй код, т.е. Не только наименование переноси, но и код. Если код нет возможности, вводи новый реквизит в справочник (в старых конфигурациях был такой реквизит для этого СтарыйПолныйКод) и вноси туда значение переносимого элемента/группы справочника.
Потом проверяешь родителя и его поиск (это я сделал бы через отдельную функцию)
Если Спр1.Родитель.Выбран() =1 Тогда
Если Род.НайтиПоКоду(Спр1.Родитель.Код)=1 Тогда
Спр.Родитель = Род.ТекущийЭлемент()
КонецЕсли;
КонецЕсли;

Род - в этом случае тот же справочник, что и Спр.

б..., не могу записать элемент внутри группы-родителя, элемент записывается в корне справочника, т.е. уровень 1.
Как я понимаю атрибут Родитель должен указывать на группу родителя и записывать элемент в группу родителя.
как это можно организовать. даже простейший пример не работает (если логика этого примера верна)))):

спр=СоздатьОбъект("Справочник.Товар");
спр.новый();
спр.родитель="FDD"; <-------|
спр.код="1991"; //этодолжно попасть в группу------|
спр.наименование="1";//
спр.Записать();

Автор: zetovich 27.11.09, 15:31

Цитата(suhar @ 27.11.09, 15:53) *
б..., не могу записать элемент внутри группы-родителя, элемент записывается в корне справочника, т.е. уровень 1.
Как я понимаю атрибут Родитель должен указывать на группу родителя и записывать элемент в группу родителя.
как это можно организовать. даже простейший пример не работает (если логика этого примера верна)))):

спр=СоздатьОбъект("Справочник.Товар");
спр.новый();
спр.родитель="FDD"; <-------|
спр.код="1991"; //этодолжно попасть в группу------|
спр.наименование="1";//
спр.Записать();

ё маё......
1.ищем родителя (если нужно)
2.нашли....
3. если нашли указываем на родителя....ток не строка, а ссылка на элемент.
....думайте

Автор: Winter 27.11.09, 17:27

Цитата(suhar @ 27.11.09, 15:53) *
б..., не могу записать элемент внутри группы-родителя, элемент записывается в корне справочника, т.е. уровень 1.
Как я понимаю атрибут Родитель должен указывать на группу родителя и записывать элемент в группу родителя.
как это можно организовать. даже простейший пример не работает (если логика этого примера верна)))):

спр=СоздатьОбъект("Справочник.Товар");
спр.новый();
спр.родитель="FDD"; <-------|
спр.код="1991"; //этодолжно попасть в группу------|
спр.наименование="1";//
спр.Записать();


Читай внимательно как я написал:
Спр.Родитель = Род.ТекущийЭлемент()
Только в этом случае ты запишешь в группу, а не в корень

Автор: kapelka_vodu 30.11.09, 9:55

Цитата(suhar @ 26.11.09, 23:28) *
Помогите пож.!
Есть 2 конфы, из одной надо вытащить справочник в другую. Справочник иерархический.
На данном этапе есть подключение к другой базе и могу вытащить все записи справочника но без разбития по группам.

напиши свое мыло, я скину тебе универсальную обработку для переноса справочника по группам

Автор: suhar 04.12.09, 17:55

Цитата(kapelka_vodu @ 30.11.09, 10:55) *
напиши свое мыло, я скину тебе универсальную обработку для переноса справочника по группам

y.t.suhar@gmail.com

Автор: Кузьмич 07.12.09, 8:56

На ИТСе есть стандартная обработка: tranref.ert называется

Автор: suhar 07.12.09, 23:51

Цитата(Winter @ 27.11.09, 18:27) *
Читай внимательно как я написал:
Спр.Родитель = Род.ТекущийЭлемент()
Только в этом случае ты запишешь в группу, а не в корень

прошу изв., но можно еще раз обьяснить - ничего не выходит.
как начать процедуру выборки, как проверить и записать.
вариантов множество перепробывал, выдает ошибки, а точнее 1с вылетает)).
===
ТоварыКпиОле.ВыбратьЭлементы(); //я выбираю элементы с другого справочника
Пока ТоварыКпиОле.ПолучитьЭлемент()=1 Цикл //пока идет выбрка
Если ТоварыКпиОле.Родитель.Выбран() =1 Тогда // если родитель из другого справочника выбран
Если ТоварыКпи.НайтиПоКоду(ТоварыКпиОле.Родитель.Код)=1 Тогда //ищу родителя в справочнике приемнике если есть родитель такой
ТоварыКпи.Родитель = ТоварыКпи.ТекущийЭлемент(); //вот здесь уже нипанятна((, как записать сам элемент и как производится в таком случае запись группы???

Автор: Ardi 08.12.09, 0:30

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

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

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

Автор: kapelka_vodu 10.12.09, 21:40

Цитата(suhar @ 04.12.09, 18:55) *
y.t.suhar@gmail.com

Отправила, смотрите почту.

Автор: suhar 11.12.09, 17:07

Цитата(kapelka_vodu @ 10.12.09, 22:40) *
Отправила, смотрите почту.

повтори пожайлуста

Автор: suhar 11.12.09, 19:01

Цитата(Winter @ 27.11.09, 18:27) *
Читай внимательно как я написал:
Спр.Родитель = Род.ТекущийЭлемент()
Только в этом случае ты запишешь в группу, а не в корень

Спр.Родитель = Спр.ТекущийЭлемент();
1с вообще вылетает, с ошибками

Автор: Ardi 12.12.09, 1:01

Цитата(suhar @ 11.12.09, 20:01) *
Спр.Родитель = Спр.ТекущийЭлемент();
1с вообще вылетает, с ошибками

Ты что? Издеваешся?

Автор: suhar 12.12.09, 18:01

Цитата(Ardi @ 12.12.09, 2:01) *
Ты что? Издеваешся?

не понял? че эт я изд.?

Автор: MATEVI 12.12.09, 20:05

Цитата(suhar @ 12.12.09, 19:01) *
не понял? че эт я изд.?

Вам же написали "Спр.Родитель = Род.ТекущийЭлемент()"
а не
Спр.Родитель = Спр.ТекущийЭлемент();
Как пишете Вы.

Автор: suhar 12.12.09, 22:07

Цитата(MATEVI @ 12.12.09, 21:05) *
Вам же написали "Спр.Родитель = Род.ТекущийЭлемент()"
а не
Спр.Родитель = Спр.ТекущийЭлемент();
Как пишете Вы.

но и написали что Род тоже что и Спр.
Мне что надо ссылаться на 3 справочника 2 из которых одинаковые?

Автор: Ardi 12.12.09, 23:29

Там одинаковые ТИПЫ двух справочников.
А самих элементов/групп несколько.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua