Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12

Почему не копируется иерархия?

04.05.2013, 07:59. Показов 5177. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите пожалуйста почему в этом коде не копируется иерархия в справочник 2 и изменяется иерархия первого?
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
&НаСервере
Процедура Рекурсия(Группа=Неопределено)
  Выборка=Справочники.Спр1.Выбрать(?(Группа=Неопределено,Справочники.Спр1.ПустаяСсылка(),Группа));
  Пока Выборка.Следующий() Цикл
      
      Если Выборка.ЭтоГруппа Тогда
      НоваяЗапись = Справочники.Спр2.СоздатьГруппу();
      НоваяЗапись.Родитель = Выборка.Родитель.Наименование;
      НоваяЗапись.Наименование = Выборка.Ссылка.Наименование;
      НоваяЗапись.Код = Выборка.Ссылка.Код;
      НоваяЗапись.Записать();
      Иначе
      НоваяЗапись = Справочники.Спр2.СоздатьЭлемент();
      НоваяЗапись.Родитель = Выборка.Родитель.Наименование;
      НоваяЗапись.Наименование = Выборка.Ссылка.Наименование;
      НоваяЗапись.Код = Выборка.Ссылка.Код;
      НоваяЗапись.Записать();
  КонецЕсли;
  Рекурсия(Выборка.Ссылка);
КонецЦикла;
 
 
 Если Выборка.Родитель <> Справочники.Спр1.пустаяСсылка() Тогда 
   РодительКод = Выборка.Код;
   Элемент = Выборка.Ссылка;
 //-------------
Родитель = Справочники.Спр2.НайтиПоКоду(РодительКод);
  Если Родитель <> Справочники.Спр2.ПустаяСсылка() Тогда 
   ЭлементОбъект = Выборка.ПолучитьОбъект();//Элемент.ПолучитьОбъект();
   ЭлементОбъект.Родитель = Родитель;
   ЭлементОбъект.Записать();
  Иначе 
   Сообщить("Не нашли родителя с кодом: " + РодительКод);
  КонецЕсли;
 КонецЕсли; 
    
КонецПроцедуры
Сильно не пинайте я только начал изучать 1С
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2013, 07:59
Ответы с готовыми решениями:

Почему не копируется файл?
function Copy dim fso,df,f1,f2 set fso = CreateObject (&quot;Scripting.FileSystemObject&quot;) df = &quot;kiu.txt&quot; f1 = &quot;\testeprogrx3.vbs&quot; f2...

Почему не копируется архив?
А вот такой вопросец, через планировщик задач делаю архив с помощью 7z. Дописал в батник всего одну строчку, и она не работает, и я не...

почему не копируется с компа на МР3 плеер Texet T-79
почему не копируется с компа на МР3 плеер Texet T-79

24
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
04.05.2013, 11:04
скрипт нерабочий. Перепиши через запрос.
а так же ЗаполнитьЗначенияСвойств(Приёмник,Источн ик)

Добавлено через 1 минуту
алгоритм непонятен: справочники синхронизируются? Тогда где НайтиПоКоду()? И вообще каковы ключи синхронизации? Если тупо копируется, тогда где очистка приёмника?

Добавлено через 1 минуту
Рекурсия не нужна, если проверять наличие родителя и откладывать запись при отсутствии
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 11:19  [ТС]
В общем дело такое: есть 2 справочника Спр1 и Спр2 в одной базе, Спр1 заполнен с иерархией, Спр2 пустой, мне нужно скопировать Спр1 в Спр2 с сохранением иерархии. Скрипт рабочий если до него добавить
1C
1
2
3
4
&НаКлиенте
Процедура ВыполнитьНаСервере(Команда)
      Рекурсия();
КонецПроцедуры
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
04.05.2013, 11:46
Цитата Сообщение от duk337 Посмотреть сообщение
Рекурсия не нужна, если проверять наличие родителя и откладывать запись при отсутствии
а, ну да. Это я психанул спросонья: родителя-то надо заменять на родного
То есть, тема закрыта?
А вообще там напутано, но разобраться - ой не сегодня

Добавлено через 15 минут
ну трабл же?
Цитата Сообщение от Hutu Посмотреть сообщение
1C
1
2
3
4
Пока Выборка.Следующий() Цикл
...
 КонецЦикла;
 Если Выборка.Родитель <> Справочники.Спр1.пустаяСсылка() Тогда //==== какая тут Выборка?
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.05.2013, 12:08
duk337 прав, тут не нужна рекурсия (если можно избежать рекурсии - нужно это делать).

Тут достаточно выборки запросом всей иерархии элемента и последовательное создание всех элементов выборки во втором справочнике
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 12:16  [ТС]
duk337, Нет тема не закрыта.
1C
1
Если Выборка.Родитель <> Справочники.Спр1.пустаяСсылка() Тогда // тут проверяется наличие родителя в строке
Dethmontt, Запросом по иерархии делал уже, да и не в рекурсии тут дело, рекурсия отрабатывает отлично и копирует все элементы Спр1 в Спр2, проблема в присвоении родителя элементам Спр2...
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
04.05.2013, 12:29
Цитата Сообщение от Hutu Посмотреть сообщение
Если Выборка.Родитель
Выборка к этому моменту исчерпана.

Цитата Сообщение от Dethmontt Посмотреть сообщение
duk337 прав,
эх вот и не прав . При создании родителя надо проверить его родителя. Тут рекурсия нужна. Можно сделать без различия группа/элемент. Не забывать передавать параметр по значению (по умолчанию по ссылке передаётся)
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 12:35  [ТС]
Подскажите что нужно сделать, я уже хз сколько времени на одном месте застрял. =(
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.05.2013, 12:46

Не по теме:

Рекурсия работает нормально! Только не работает!

Мне нравятся такие отыветы



Добавлено через 3 минуты
Цитата Сообщение от duk337 Посмотреть сообщение
Тут рекурсия нужна
Зачем тут рекурсия?
Делаем выборку в две колонки
Ссылка|Родитель

Порядок по иерархии.
Т.е. Сначала группа самого верхнего уровня и до самого низа

Перебераем выборку создаем самый верхний уровень, на последнем проходе создаем ссылку на элемент (К этому времени все родители уже созданы!!!) Осталось элементу присвоить родителя из выборки
1
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
04.05.2013, 12:51
Цитата Сообщение от Hutu Посмотреть сообщение
Подскажите что нужно сделать, я уже хз сколько времени на одном месте застрял. =(
Рекурсия - дело такое, что тоньше, чем восток. Dethmontt подсказал, как без неё обойтись. Хотя я, честно, туплю сегодня страшно.

Не по теме:

(поехал в баню)

0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 12:52  [ТС]
Нужно именно переменные использовать. Через таблицу уже делал.
0
 Аватар для duk337
2956 / 1768 / 84
Регистрация: 03.11.2011
Сообщений: 8,280
04.05.2013, 12:56
Цитата Сообщение от Hutu Посмотреть сообщение
Нужно именно переменные использовать
куда без них... А что имеется в виду?
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 13:03  [ТС]
Использовать не таблицу значений, а две переменные вместо неё. По сути вот эти
1C
1
2
 РодительКод = Выборка.Код;
 Элемент = Выборка.Ссылка;
в данном коде.
Немного подправил код,

Кликните здесь для просмотра всего текста

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
&НаКлиенте
Процедура ВыполнитьНаСервере1(Команда)
      Рекурсия();
КонецПроцедуры
 
&НаСервере
Процедура Рекурсия(Группа=Неопределено)
  Выборка=Справочники.Спр1.Выбрать(?(Группа=Неопределено,Справочники.Спр1.ПустаяСсылка(),Группа));
  Пока Выборка.Следующий() Цикл
      
      Если Выборка.ЭтоГруппа Тогда
      НоваяЗапись = Справочники.Спр2.СоздатьГруппу();
      НоваяЗапись.Родитель = Выборка.Родитель.Наименование;
      НоваяЗапись.Наименование = Выборка.Ссылка.Наименование;
      НоваяЗапись.Код = Выборка.Ссылка.Код;
      НоваяЗапись.Записать();
      Иначе
      НоваяЗапись = Справочники.Спр2.СоздатьЭлемент();
      НоваяЗапись.Родитель = Выборка.Родитель.Наименование;
      НоваяЗапись.Наименование = Выборка.Ссылка.Наименование;
      НоваяЗапись.Код = Выборка.Ссылка.Код;
      НоваяЗапись.Записать();
  КонецЕсли;
  
КонецЦикла;
 
 
 Если Выборка.Родитель  <> Справочники.Спр1.пустаяСсылка() Тогда 
   РодительКод = Выборка.Код;
   Элемент = Выборка.Ссылка;
 //-------------
Родитель = Справочники.Спр2.НайтиПоКоду(РодительКод);
  Если Родитель <> Справочники.Спр1.ПустаяСсылка() Тогда 
   ЭлементОбъект = Родитель.ПолучитьОбъект();
   ЭлементОбъект.Родитель = Родитель;
   ЭлементОбъект.Записать();
  Иначе 
   Сообщить("Не нашли родителя с кодом: " + РодительКод);
  КонецЕсли;
 КонецЕсли; 
  
 Рекурсия(Выборка.Ссылка); 
  
    
    
КонецПроцедуры


выдаёт ошибку:
1C
1
2
3
4
{Форма.Форма.Форма(34)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
   ЭлементОбъект = Родитель.ПолучитьОбъект();
по причине:
Элемент не выбран!
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.05.2013, 13:16
Без всякой рекурсии
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    СкопироватьСтроку(ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные);
    
КонецПроцедуры
 
Процедура СкопироватьСтроку(Строка)
 
    Запрос = Новый Запрос("ВЫБРАТЬ
                          | Спр1.Ссылка КАК Ссылка,
                          | Спр1.Родитель КАК Родитель
                          |ИЗ
                          | Справочник.Спр1 КАК Спр1
                          |ГДЕ
                          | Спр1.Ссылка = &Ссылка
                          |ИТОГИ ПО
                          | Родитель ИЕРАРХИЯ");
                          
    Запрос.УстановитьПараметр("Ссылка",Строка.Ссылка);
    
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    ПредыдущийРодитель = Справочники.Спр2.ПустаяСсылка();
    
    Пока Выборка.Следующий() Цикл 
        СпрСсылка = Справочники.Спр2.НайтиПоНаименованию(Выборка.Родитель.Наименование,Истина);
        Если СпрСсылка.Пустая() Тогда 
            ОбъектСпр = Справочники.Спр2.СоздатьГруппу();
            ЗаполнитьЗначенияСвойств(ОбъектСпр,Выборка.Родитель,,"Владелец,Родитель,ЭтоГруппа");
            ОбъектСпр.Родитель = ПредыдущийРодитель;
            ОбъектСпр.ОбменДанными.Загрузка = Истина;
            ОбъектСпр.Записать();
            СпрСсылка = ОбъектСпр.Ссылка;
        КонецЕсли;
        ПредыдущийРодитель = СпрСсылка;
        Выборка2 = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Если Выборка2.Следующий() Тогда 
            ЭлементСпр = Справочники.Спр2.НайтиПоНаименованию(Выборка2.Ссылка.Наименование,Истина);
            Если ЭлементСпр.Пустая() Тогда 
                ОбъСпр = Справочники.Спр2.СоздатьЭлемент();
                ЗаполнитьЗначенияСвойств(ОбъСпр,Выборка2.Ссылка,,"Владелец,Родитель,ЭтоГруппа");
                ОбъСпр.Родитель = ПредыдущийРодитель;
                ОбъСпр.ОбменДанными.Загрузка = Истина;
                ОбъСпр.Записать();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;   
 
КонецПроцедуры
1
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 13:21  [ТС]
Dethmontt, Большое спасибо, но с запросами я ещё не работал, чуть позже разберу Ваш пример. А пока нужно разобраться как рекурсивно это сделать.
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.05.2013, 13:26
Чо тут разбираться Спр1 замени везде на свой справочник источник копирования, а спр2 - на свой справочник приемник копирования

Добавлено через 54 секунды
Ctrl+H - замена текста
0
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 13:30  [ТС]
Dethmontt, Это Вы про своё решение?
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.05.2013, 13:41
При помощи рекурсии
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Процедура ОсновныеДействияФормыСкопироватьРекурсивно(Кнопка)
    
    СкопироватьРекурсивно(ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные);
    
КонецПроцедуры
 
Процедура СкопироватьРекурсивно(Строка)
 
    СсылкаНаСпр = Строка.Ссылка;
    СпрСсылка = Справочники.Спр2.НайтиПоНаименованию(СсылкаНаСпр.Наименование,Истина);
    Если СпрСсылка.Пустая() Тогда 
        СпрОб = Справочники.Спр2.СоздатьЭлемент();
        ЗаполнитьЗначенияСвойств(СпрОб,СсылкаНаСпр,,"Владелец,Родитель,ЭтоГруппа");
        СпрОб.Родитель = СоздатьРодителейРекурсивно(СсылкаНаСпр.Родитель);
        СпрОб.Записать();
    КонецЕсли; 
 
КонецПроцедуры
 
Функция СоздатьРодителейРекурсивно(Родитель)
 
    Если Родитель = Неопределено или Родитель.Пустая() Тогда 
        Возврат Справочники.Спр2.ПустаяСсылка();
    КонецЕсли;
    
    СпрРод = Справочники.Спр2.НайтиПоНаименованию(Родитель.Наименование,Истина);
    Если СпрРод.Пустая() Тогда 
        СпрОб = Справочники.Спр2.СоздатьГруппу();
        ЗаполнитьЗначенияСвойств(СпрОб,Родитель,,"Владелец,Родитель,ЭтоГруппа");
        СпрОб.Родитель = СоздатьРодителейРекурсивно(Родитель.Родитель);
        СпрОб.Записать();
        СпрРод = СпрОб.Ссылка;
    КонецЕсли;
    Возврат СпрРод;
 
КонецФункции
1
0 / 0 / 0
Регистрация: 04.05.2013
Сообщений: 12
04.05.2013, 14:03  [ТС]
Ещё раз спасибо. Но в моём то коде что я неправильно делаю?
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,701
Записей в блоге: 1
04.05.2013, 14:04
Цитата Сообщение от Hutu Посмотреть сообщение
Но в моём то коде что я неправильно делаю?
Все!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2013, 14:04
Помогаю со студенческими работами здесь

Почему не копируется с компа на МР3 плеер Texet T-79?
почему не копируется с компа на МР3 плеер Texet T-79

Почему файл базы данных копируется в папку bin/Debug?
моя база данных Access располагается в Data Directory, и, когда я подключаю ее к приложению с помощью Binding Source и запускаю приложение,...

Почему значение переменной при вычислении копируется в буфер обмена
Доброго времени суток. Сделал программку, которая по даблклику на метке увеличивает ее значение на 1. Подскажите, пожалуйста,...

Если объект копируется по ссылке, то почему копия сохраняется при обнулении оригинала?
Господа, почему срабатывает alert(b.p); ? var a = {}; var b = a; a.p = 1; a = null; alert(a.x); // даёт ошибку ...

Почему при двойном клике по любому Label его текст копируется в буфер обмена?
Почему при двойном клике по любому Label его текст копируется в буфер обмена? ЗАЧЕМ это сделано и как это убрать? PS: у меня нет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru