Имя: Пароль:
1C
1С v8
Родитель элемента справочника
0 _Дайвер_
 
02.08.17
11:11
КомСоединение;
База(1) и База(2);
Из базы (1) передаю элемент, если у элемента есть родитель, то нужно пихнуть его в ту же папку в базе(2).
Как это проще всего сделать, кто сталкивался?
В качестве параметра передаю имя папки с типом строка у элемента.
В отладчике Выборка пишет метод не найден, и в результате отправляет "Пусто".
    OLEЗапрос = Соединение.NewObject("Запрос");
    OLEЗапрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенты.Родитель.Наименование КАК Родитель1,
    |    Контрагенты.Родитель.Родитель.Наименование КАК Родитель2,
    |    Контрагенты.Родитель.Родитель.Родитель.Наименование КАК Родитель3,
    |    Контрагенты.Родитель.Родитель.Родитель.Родитель.Наименование КАК Родитель4,
    |    Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование КАК Родитель5,
    |    Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование КАК Родитель6
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование = &Наименование";
    OLEЗапрос.УстановитьПараметр("Наименование", НаименованиеГруппы);
    Выборка = OLEЗапрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка;
    Иначе
        Возврат "Пусто";
    КонецЕсли;
1 Heckfy
 
02.08.17
11:14
Код кривой. Ограничен уровнем иерархии. Посмотри в типовых РБД. Используй ГУИД объекта.
2 Ненавижу 1С
 
гуру
02.08.17
11:15
"В отладчике Выборка пишет метод не найден" - какой метод?
3 Zmich
 
02.08.17
11:15
(0). У всех родителей вышестоящих уровней одно и то же Наименование что ли?
4 Ненавижу 1С
 
гуру
02.08.17
11:15
а вообще эпично:


|ГДЕ
    |    Контрагенты.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование = &Наименование
    |    И Контрагенты.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование = &Наименование

они что все у вас одинаково названы?

может там ИЛИ нужно?
5 _Дайвер_
 
02.08.17
11:15
(1) Базы разные, ГУИД может отличаться, решил что по наименованию найти, а по поводу ограниченности это да
6 _Дайвер_
 
02.08.17
11:16
(4) Сорянчик, исправлю
7 Heckfy
 
02.08.17
11:17
(5) То есть ты на 100% уверен, что дублей по наименованию нету?
8 Heckfy
 
02.08.17
11:18
+7 И не будет в будущем?
9 _Дайвер_
 
02.08.17
11:20
(7) Шанс не велик но есть, запар блин вот такой
10 _Дайвер_
 
02.08.17
11:21
http://screenshot.ru/upload/image/S8XQ
Это в отладчике
11 drcrasher
 
02.08.17
11:24
(0) познай глубокий смысл слова "рекурсия"
12 Ненавижу 1С
 
гуру
02.08.17
11:26
(10) давай еще меньше информации
13 catena
 
02.08.17
11:26
(10)Это на какой строке такая картина?
14 _Дайвер_
 
02.08.17
11:26
(13) (12) Выборка = OLEЗапрос.Выполнить().Выбрать();
15 Ненавижу 1С
 
гуру
02.08.17
11:28
(14) ну поля еще не доступны допустим, а вот так написать в отладчике?

Выборка.Количество()
16 catena
 
02.08.17
11:29
(14)Ну так на такой строке и не через оле такая картина будет.
17 _Дайвер_
 
02.08.17
11:30
(15) Значение 0
18 _Дайвер_
 
02.08.17
11:48
В консоли запросов в Базе(2) выполняю запрос
Группа уже есть, через базу(1) я ее создавал, если ее нет.
Первый результат выдал NULL на 6 уровней групп
После того как я в эту группу записал вручную элемент, выдал.
Второй результат
http://screenshot.ru/upload/image/S8Xv
19 Ненавижу 1С
 
гуру
02.08.17
12:23
(18) продолжай наблюдения
20 dezss
 
02.08.17
12:29
ИМХО, в НаименованиеГруппы хранится наименование первого родителя, так что остальные будут всегда пустые.
Тебе нужно наименование и глубина, так будет немножко правильней.
Глубину можешь узнать через транзитивное замыкание, например.
21 _Дайвер_
 
02.08.17
16:45
После долгих мучений было решено остановиться на таком варианте, потому как запросом их вытащить я не нашел способ адекватный.
            Если ЗначениеЗаполнено(ТекСтрока.Ссылка.Родитель) Тогда
                Ссылка = Соединение.Справочники.Контрагенты.НайтиПоНаименованию(ТекСтрока.Ссылка.Родитель.Наименование);
                Если НЕ Ссылка.Пустой() И НЕ Ссылка.ЭтоГруппа Тогда
                    Контрагент.Родитель = Соединение.Справочники.Контрагенты.НайтиПоНаименованию(ТекСтрока.Ссылка.Родитель.Наименование);
                Иначе
                    Группа = Соединение.Справочники.Контрагенты.СоздатьГруппу();
                    Группа.Наименование = ТекСтрока.Ссылка.Родитель.Наименование;
                    Группа.Записать();
                    Сообщить("Записана новая группа " + Группа.Наименование);
                    Контрагент.Родитель = Соединение.Справочники.Контрагенты.НайтиПоНаименованию(ТекСтрока.Ссылка.Родитель.Наименование);
                КонецЕсли;
            КонецЕсли;
22 _Дайвер_
 
02.08.17
16:46
Контрагент.Родитель = Ссылка; Во!
23 _Дайвер_
 
02.08.17
16:46
После первого условия
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший