Имя: Пароль:
1C
1С v8
поиск контрагента по наименованию и родителю
0 r2d24
 
12.12.13
12:19
Надо вывести наименование контрагента, у которого "Наименование" равно переменной "Контр", и "Родитель" равен переменной "РодитКонтр".


Текст = новый ТекстовыйДокумент;
Текст.Прочитать(ПолеВвода1 + "\" +"ДоговораКонтрагентов.txt");
Запр = новый Запрос;
Запр.Текст="ВЫБРАТЬ
           |    Контрагенты.Ссылка
           |ИЗ
           |    Справочник.Контрагенты КАК Контрагенты
           |ГДЕ
           |    Контрагенты.Наименование = &Наименование
           |    И Контрагенты.Родитель = &Родитель";
          
            
Для р = 1 по Текст.КоличествоСтрок() Цикл
    Слово = РазобратьДоговор(Текст.ПолучитьСтроку(р));// эта функция, она разбивает строку текстового документа на 4 части //:"наименование контрагента", "наименование договора контрагента", "уровень договора", "родитель контрагента" - но это не надо, так, для пояснения
    Контр=Слово[1]; //наименование контрагента
    Догов=Слово[2];
    УровКонтр=Число(Слово[3]);
    РодитКонтр=Слово[4];// родитель контрагента            
    Запр.УстановитьПараметр("Наименование", Контр);
    Запр.УстановитьПараметр("Родитель", РодитКонтр);
    Результат = Запр.Выполнить();
    Если Результат.Пустой() Тогда
        Выборка=Результат.Выбрать();
        Сообщить(Выборка.Ссылка.Наименование);
    КонецЕсли;
КонецЦикла
1 Godofsin
 
12.12.13
12:26
Родитель это ссылка
2 samozvanec
 
12.12.13
12:26
"Результат = Запр.Выполнить();
    Если Результат.Пустой() Тогда
        Выборка=Результат.Выбрать();
        Сообщить(Выборка.Ссылка.Наименование);
    КонецЕсли;"

нуну
3 Godofsin
 
12.12.13
12:26
запрос в цикле = ай-яй-яй
4 Godofsin
 
12.12.13
12:27
и (2) тоже в точку
5 samozvanec
 
12.12.13
12:29
(0) а можно взглянуть на функцию, которая разбивает строку текстового документа на 4 части? любопытно очень
6 r2d24
 
12.12.13
12:31
(5)
Функция РазобратьДоговор(Стр)
    Слово = Новый Массив(30);
    
    Для Каждого ТекСлово Из Слово Цикл
        ТекСлово="";
    КонецЦикла;
    
    текСлово="";Номер=0;
    Для Ц=1 По СтрДлина(Стр) Цикл
        Символ=Сред(Стр,Ц,1);
        Если Символ="|" Тогда
            Номер        = Номер+1;
            Слово[Номер] = текСлово;
            текСлово     = "";
        Иначе
            текСлово     = текСлово+Символ;
        КонецЕсли;    
    КонецЦикла;    
    
    Возврат Слово;
КонецФункции
7 r2d24
 
12.12.13
12:33
+(6) она не совсем на 4 части разбивает, а разбивает ровно на  столько, сколько символов "|" в строке, у меня таких символов 4
8 r2d24
 
12.12.13
12:41
Кто нибудь может подсказать ошибку в коде?

Текст = новый ТекстовыйДокумент;
Текст.Прочитать(ПолеВвода1 + "\" +"ДоговораКонтрагентов.txt");
Запр = новый Запрос;
Запр.Текст="ВЫБРАТЬ
           |    Контрагенты.Ссылка
           |ИЗ
           |    Справочник.Контрагенты КАК Контрагенты
           |ГДЕ
           |    Контрагенты.Наименование = &Наименование
           |    И Контрагенты.Родитель = &Родитель";
          
            
Для р = 1 по Текст.КоличествоСтрок() Цикл
    Слово = РазобратьДоговор(Текст.ПолучитьСтроку(р));// эта функция, она разбивает строку текстового документа на 4 части //:"наименование контрагента", "наименование договора контрагента", "уровень договора", "родитель контрагента" - но это не надо, так, для пояснения

    Контр=Слово[1]; //наименование контрагента

    Догов=Слово[2];
    УровКонтр=Число(Слово[3]);
    РодитКонтр=Слово[4];// родитель контрагента            

    Запр.УстановитьПараметр("Наименование", Контр);
    Запр.УстановитьПараметр("Родитель", РодитКонтр);
    Результат = Запр.Выполнить();
    Если НЕ Результат.Пустой() Тогда
        Выборка=Результат.Выбрать();
        Сообщить(Выборка.Ссылка.Наименование);
    КонецЕсли;
КонецЦикла
9 МихаилМ
 
12.12.13
12:41
что за бред

Для Каждого ТекСлово Из Слово Цикл
        ТекСлово="";
    КонецЦикла;
10 Жан Пердежон
 
12.12.13
12:44
|    И Контрагенты.Родитель.Наименование = &Родитель";
11 r2d24
 
12.12.13
12:44
(9) знаю, но ошибка не там
12 Жан Пердежон
 
12.12.13
12:44
но код все равно уг
13 AaNnDdRrEeYy
 
12.12.13
12:45
табе в (1) подсказали, Родтель - это ссылка, а ты ее в запросе со строкой сравниваещь.
14 МихаилМ
 
12.12.13
12:45
+(9)
из-за таких как (0)
появляются ветки
Почему классические программисты ненавидят 1с-ников?
15 AaNnDdRrEeYy
 
12.12.13
12:46
(11) выборку позиционировать надо методом Следующий()... у тебя этого нету.
16 r2d24
 
12.12.13
12:46
(10) не, не то
17 AaNnDdRrEeYy
 
12.12.13
12:50
Результат = Запр.Выполнить();
    Если Результат.Пустой() Тогда // Результат Пустой!!!! что ты из него получить еще что-то хочещь?
        Выборка=Результат.Выбрать();
        Сообщить(Выборка.Ссылка.Наименование);
    КонецЕсли;

//////////////////////////////////////////
Результат = Запр.Выполнить();
    Если НЕ Результат.Пустой() Тогда

        Выборка=Результат.Выбрать();
Если Выборка.Следующий() ТОгда //ПОзиционируешся на первом элементе выборки.
        Сообщить(Выборка.Ссылка.Наименование);
КонецЕсли;
    КонецЕсли;
18 r2d24
 
12.12.13
12:50
(13) и что это значит, ее нельзя сравнивать? Почему наименование можно сравнить?
19 AaNnDdRrEeYy
 
12.12.13
12:52
(18) можно сравнивать, только результат будет ложь.
Ты себя выдал, троль. завязывай.
20 Жан Пердежон
 
12.12.13
12:52
(16) все то + еще у тебя Выброка.следующий() пропущено
21 hhhh
 
12.12.13
12:53
(18) потому что наименование - это строка.

(16) попробуйте

    текСлово="";Номер=1;
22 hhhh
 
12.12.13
12:53
да и Выборка.Следующий()