Имя: Пароль:
1C
 
Как дописать объекты в справочник?
0 Олеся999
 
28.10.15
10:43
Подскажите пожалуйста как лучше доделать ?
Смысл такой мне нужно  загрузить объекты в справочник, но если там уже имеются такие объекты то мы с ними ничего не делаем , а если таких нет то мы до записываем.
То есть нам нужно сравнивать по коду.

    
    Запрос3 = Новый Запрос;
    Запрос3.Текст = "ВЫБРАТЬ
                    |    dbo_FWVer.ID,
                    |    dbo_FWVer.Name
                    |ИЗ
                    |    ВнешнийИсточникДанных.ТК.Таблица.dbo_FWVer КАК dbo_FWVer";
          Результат3=Запрос3.Выполнить();
    
    
     Для каждого Стр3 из Результат3.Выгрузить() Цикл
        ID   = Стр3.ID;
        Name = Стр3.Name;
    
    Повторы=Справочники.Прошивки_версии.НайтиПоКоду();
Если Повторы = Неопределено Тогда
        СотрудникОбъект2 = Справочники.Прошивки_версии.СоздатьЭлемент();
        СотрудникОбъект2.Код = ID;
        СотрудникОбъект2.Наименование = Name;
        СотрудникОбъект2.Записать();
        Повторы =СотрудникОбъект2.Ссылка;
КонецЕсли;
1 Ненавижу 1С
 
гуру
28.10.15
10:45
Повторы=Справочники.Прошивки_версии.НайтиПоКоду();

что ищется то?
2 Любопытная
 
28.10.15
10:46
Лучше в запросе сразу отобрать из первой таблицы только те записи, которых нет в справочнике и уже по ним дописывать данные
3 Олеся999
 
28.10.15
11:04
(2)
Типо так что ли? :

Повторы=Справочники.Прошивки_версии.НайтиПоКоду();
    
    
    Запрос3 = Новый Запрос;
    Запрос3.Текст = "ВЫБРАТЬ
                    |    dbo_FWVer.ID,
                    |    dbo_FWVer.Name
                    |ИЗ
                    |    ВнешнийИсточникДанных.ТК.Таблица.dbo_FWVer КАК dbo_FWVer
                    |ГДЕ
                    |    dbo_FWVer.ID <> &Повторы";
     Запрос3.УстановитьПараметр("Повторы",Повторы);

    Результат3=Запрос3.Выполнить();
    Для каждого Стр3 из Результат3.Выгрузить() Цикл
        ID   = Стр3.ID;
        Name = Стр3.Name;
        СотрудникОбъект2 = Справочники.Прошивки_версии.СоздатьЭлемент();
        СотрудникОбъект2.Код = ID;
        СотрудникОбъект2.Наименование = Name;
        СотрудникОбъект2.Записать();



(1) Нужно найти код Справочники.Прошивки_версии
4 Любопытная
 
28.10.15
11:06
Не, совсем не так.
Какое из двух полей таблицы внешних данных у вас должно совпадать с кодом справочника Прошивки_версии?
5 Олеся999
 
28.10.15
11:07
(4) dbo_FWVer.ID
6 Любопытная
 
28.10.15
11:09
Ну вот и делайте левое соединение справочника к вашей внешней таблице по код = Id и потом выбирайте те данные, где ссылки на справочник нет. Примерно так
7 разработчик 1с
 
28.10.15
11:10
Для каждого Стр3 из Результат3.Выгрузить() Цикл
бесконечный цикл же будет
8 Олеся999
 
28.10.15
11:13
(7) ну забыла  КонецЦикла;
9 Олеся999
 
28.10.15
11:17
(6) "ВЫБРАТЬ
                    |    dbo_FWVer.ID,
                    |    dbo_FWVer.Name,
                    |    Прошивки_версии.Код,
                    |    Прошивки_версии.Наименование
                    |ИЗ
                    |    ВнешнийИсточникДанных.ТК.Таблица.dbo_FWVer КАК dbo_FWVer
                    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Прошивки_версии КАК Прошивки_версии
                    |        ПО dbo_FWVer.ID = Прошивки_версии.Код";

А ккое условие будет ?
10 НЕА123
 
28.10.15
11:19
Справочник.Прошивки_версии.Ссылка IS NULL
11 Олеся999
 
28.10.15
11:48
(10) Это куда?
12 itlikbez
 
28.10.15
11:48
(7) Не будет там бесконечного цикла.
13 НЕА123
 
28.10.15
11:50
(11)
в ГДЕ

ЗЫ
ты уж, это... скромнее надо быть...
14 Jonny_Khomich
 
28.10.15
11:52
уууу ... Олеся, ты беда ходячая. Скажи где работаешь, позвоню чтобы узнали про тебя и твои вопросы.
15 БатКор
 
28.10.15
11:58
Слушай Любопытную (6) Дело говорит
16 Олеся999
 
28.10.15
12:21
А так нельзя ?
   Запрос3 = Новый Запрос;
    Запрос3.Текст = "ВЫБРАТЬ
                    |    dbo_FWVer.ID,
                    |    dbo_FWVer.Name
                    |ИЗ
                    |    ВнешнийИсточникДанных.ТК.Таблица.dbo_FWVer КАК dbo_FWVer";
    
    Результат3=Запрос3.Выполнить();
    Для каждого Стр3 из Результат3.Выгрузить() Цикл
        
        ID   = Стр3.ID;
        Name = Стр3.Name;
        
        СотрудникОбъект3 = Справочники.Прошивки_версии.НайтиПоКоду(ID);
        Если СотрудникОбъект3 <> ID Тогда
        СотрудникОбъект2 = Справочники.Прошивки_версии.СоздатьЭлемент();
                    СотрудникОбъект2.Код = ID;
            СотрудникОбъект2.Наименование = Name;
    СотрудникОбъект2.Записать();
Иначе
    КонецЕсли;
17 разработчик 1с
 
28.10.15
12:24
(16) запусти
интересно, сколько элементов создаст
18 rabbidX
 
28.10.15
12:27
Так нельзя.
Нельзя ссылку на справочник со строкой сравнивать.
Результат.Выгрузить() помести сначала в таблицу, потом обходи.
в (6) + (10) быстрее будет
19 rabbidX
 
28.10.15
12:28
И имена переменным давай поосмысленней.
20 Любопытная
 
28.10.15
12:30
Если СотрудникОбъект3 <> ID Тогда
заменить на
Если ЗначениеЗаполнено(СотрудникОбъект3) Тогда

И взлетит
21 Олеся999
 
28.10.15
12:31
(18)        (9) Так я пробовала....пишет ошибку : Получение данных из нескольких источников данных недопустимо
22 Любопытная
 
28.10.15
12:33
(21) Вероятно хорошо бы данные из внешнего источника завернуть во временную таблицу.
Хотя тоже не факт конечно)
23 Олеся999
 
28.10.15
12:34
(20) попробовала  пишет :

{Документ.SQLДанные.Форма.ФормаДокумента.Форма(432)}: Ошибка при вызове метода контекста (Записать)
    СотрудникОбъект2.Записать();
по причине:
Значение "1" поля "Код" не уникально
24 cw014
 
28.10.15
12:34
ВЫБРАТЬ
    dbo_FWVer.ID,
    dbo_FWVer.Name,
    Прошивки_версии.Код,
    Прошивки_версии.Наименование
ИЗ
    ВнешнийИсточникДанных.ТК.Таблица.dbo_FWVer КАК dbo_FWVer
ГДЕ dbo_FWVer.ID НЕ В (ВЫБРАТЬ РАЗЛИЧНЫЕ
Код
ИЗ Справочник.Прошивки_версии)


Так отработает?
25 Олеся999
 
28.10.15
12:38
(24) {Документ.SQLДанные.Форма.ФормаДокумента.Форма(428)}: Ошибка при вызове метода контекста (Выполнить)
    Результат3=Запрос3.Выполнить();
по причине:
{(10, 4)}: Таблица не найдена "Справочники.Прошивки_версии"
ИЗ <<?>>Справочники.Прошивки_версии)
26 cw014
 
28.10.15
12:40
(25)СправочниК.Прошивки_версии
27 Любопытная
 
28.10.15
12:40
(23) Дык у вас там ID может неуникальные, я ж не знаю, что вы получаете из запроса
28 Любопытная
 
28.10.15
12:41
Хотя нет, нормально ж все должно быть
Давай код целиком сюда
29 Олеся999
 
28.10.15
12:41
(26) тогда ИЗ <<?>>.Прошивки_версии)
30 Олеся999
 
28.10.15
12:42
(28)    Запрос3 = Новый Запрос;
    Запрос3.Текст = "ВЫБРАТЬ
                    |    dbo_FWVer.ID,
                    |    dbo_FWVer.Name
                    |ИЗ
                    |    ВнешнийИсточникДанных.ТК.Таблица.dbo_FWVer КАК dbo_FWVer";
                    
                    
                    

    Результат3=Запрос3.Выполнить();
    Для каждого Стр3 из Результат3.Выгрузить() Цикл
        
        ID   = Стр3.ID;
        Name = Стр3.Name;
        
        СотрудникОбъект3 = Справочники.Прошивки_версии.НайтиПоКоду(ID);
        Если ЗначениеЗаполнено(СотрудникОбъект3) Тогда
        СотрудникОбъект2 = Справочники.Прошивки_версии.СоздатьЭлемент();
                    СотрудникОбъект2.Код = ID;
            СотрудникОбъект2.Наименование = Name;
    СотрудникОбъект2.Записать();
Иначе
    КонецЕсли;
        
            
        КонецЦикла;
31 cw014
 
28.10.15
12:43
(29) Что именно вы из запроса дернули? Попробуйте весь запрос взять
32 cw014
 
28.10.15
12:43
И точную ошибку описать
33 Любопытная
 
28.10.15
12:46
(30) если НЕ ЗначениеЗаполнено :)
34 Любопытная
 
28.10.15
12:47
Нужно же и свою головушку включать немножко)
35 Олеся999
 
28.10.15
12:47
(32) {Документ.SQLДанные.Форма.ФормаДокумента.Форма(428)}: Ошибка при вызове метода контекста (Выполнить)
    Результат3=Запрос3.Выполнить();
по причине:
{(4, 1)}: Поле не найдено "Прошивки_версии.Код"
<<?>>Прошивки_версии.Код,
36 Олеся999
 
28.10.15
12:50
(34) (33) Все заработало спасибо!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс