8.х Не передается параметр в запрос

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Maero, 3 июл 2016.

  1. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Простейший код, элементарный запрос, а как какое-то наваждение - не работает:
    Код:
                        Запрос = Новый Запрос;
                        Запрос.УстановитьПараметр("НаименованиеКонтрагента",НаимПолн);
                        Запрос.Текст = "ВЫБРАТЬ
                                       |    Контрагенты.Ссылка
                                       |ИЗ
                                       |    Справочник.Контрагенты КАК Контрагенты
                                       |ГДЕ
                                       |    Контрагенты.НаименованиеПолное ПОДОБНО &НаименованиеКонтрагента";
                        ПоискНаимПолн = Запрос.Выполнить().Выбрать();
    Ищу в справочнике, в реквизите типа "строка неопределенной длины", по конкретному, имеющемуся в моей ТЗ названию контрагента, хранящемуся в переменной типа "строка". Передаю в переменную эту строку с помощью Запрос.УстановитьПараметр, а при отладке показывает, что в НаименованиеКонтрагента ничего не передается, хотя должно же прийти значение из переменной НаимПолн. Соответственно, ссылку на справочник из запроса не получаю.

    Что я не учел?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Каким образом в НаимПолн присваивается значение?
  3. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Из Таблицы значений:
    Код:
            Для Каждого ТекущаяСтрока Из ТЗ Цикл
               
                НаимПолн = ТекущаяСтрока.KRED_NAME;
    А в ТЗ - считываю строки из XML.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Покажите полностью код
  5. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    пока вот такой кусок готов:

    Код:
    &НаСервере
    Процедура ПрочитатьXmlНаСервере(XmlФайл);
       
        ПутьКФайлу = XmlФайл[0];
       
        ЧтениеXml = Новый ЧтениеXml;
        ЧтениеXml.ОткрытьФайл(ПутьКФайлу);
       
        ТЗ = Новый ТаблицаЗначений;
       
        ТЗ.Колонки.Добавить("KRED_CODE");
        ТЗ.Колонки.Добавить("KRED_NAME");
        ТЗ.Колонки.Добавить("KRED_OKPO");
        ТЗ.Колонки.Добавить("KRED_VAT");
       
        //Переменная для имен новых элементов
        ИмяНовЭл = Неопределено;
        //Проверка на нужность атрибута
        НужнАтр = 0;
       
        Пока ЧтениеXml.Прочитать() Цикл
            Если ЧтениеXml.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                ЧтениеXml.ПрочитатьАтрибут();
                           
                Если ЧтениеXml.Имя = "Record" Тогда           
                        НоваяСтрока = ТЗ.Добавить();
                КонецЕсли;   
           
                //Проверяем - нужная ли нам строка? Если да - сохраняем имя элемента и отмечаем, что строка - нужная.
               
                Если ЧтениеXml.Имя = "KRED_CODE" Или ЧтениеXml.Имя = "KRED_NAME" Или ЧтениеXml.Имя = "KRED_OKPO" Или ЧтениеXml.Имя = "KRED_VAT" Тогда
                    ИмяНовЭл = ЧтениеXml.Имя;
                    НужнАтр = 1;
                КонецЕсли;
            КонецЕсли;
           
            //Вносим значение в колонку, если это нужный атрибут
            Если ЧтениеXml.ТипУзла = ТипУзлаXml.Текст Тогда
                Если НужнАтр = 1 Тогда
                    НоваяСтрока[ИмяНовЭл] = ЧтениеXml.Значение;
                    НужнАтр = 0;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
       
        //--------Перенос полученных данных в справочник контрагентов--------
       
        //Есть ли значения в таблице?
        Если ТЗ.Количество() <> 0 Тогда
           
            //Если в таблице есть значения (проверили выше) - создаем для них группу
            //Создаем группу, если таковой нет, если есть - запоминаем ее
            ПоискГр = Справочники.Контрагенты.НайтиПоНаименованию("ЗагруженныеИзXml");
            Если ПоискГр.Пустая() Тогда
                Нов = Справочники["Контрагенты"].СоздатьГруппу();
                Нов.Наименование = "ЗагруженныеИзXml";
                Нов.Записать();
            Иначе
                НовГр = Справочники.Контрагенты.НайтиПоНаименованию("ЗагруженныеИзXml");
            КонецЕсли;
           
            //Перебираем строки ТЗ и заносим в справочник
            Для Каждого ТекущаяСтрока Из ТЗ Цикл
               
                КодЕДРПОУ = ТекущаяСтрока.KRED_OKPO;
                НаимПолн = ТекущаяСтрока.KRED_NAME;
               
    
                //В случае, если у загруженного контрагента есть ЕДРПОУ - ищем
                Если КодЕДРПОУ <> "" Тогда
                    ПоискЕДРПОУ = Справочники.Контрагенты.НайтиПоРеквизиту("КодПоЕДРПОУ",КодЕДРПОУ);
                   
                    //Если контрагента с таким ЕДРПОУ нет - тогда проверяем по имени
                    Если ПоискЕДРПОУ.Пустая() Тогда
                        Запрос = Новый Запрос;
                        Запрос.УстановитьПараметр("НаименованиеКонтрагента",НаимПолн);
                        Запрос.Текст = "ВЫБРАТЬ
                                      |    Контрагенты.Ссылка
                                      |ИЗ
                                      |    Справочник.Контрагенты КАК Контрагенты
                                      |ГДЕ
                                      |    Контрагенты.НаименованиеПолное ПОДОБНО &НаименованиеКонтрагента";
                        ПоискНаимПолн = Запрос.Выполнить().Выбрать();
                                           
                        //Если контрагента с заданным ЕДРПОУ и именем нет - создаем
                        Если ПоискНаимПолн.Пустая() Тогда
                            НовЭл = Справочники.Контрагенты.СоздатьЭлемент();
                            НовЭл.НаименованиеПолное = ТекущаяСтрока.KRED_NAME;
                            НовЭл.КодПоЕДРПОУ = ТекущаяСтрока.KRED_OKPO;
                            НовЭл.Родитель = НовГр.Ссылка;
                            НовЭл.Записать();
               
                        КонецЕсли;   
                    КонецЕсли;   
                КонецЕсли;
            КонецЦикла;   
        КонецЕсли;   
       
    КонецПроцедуры
    
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    1) Посмотрите таблицу значений перед Если ТЗ.Количество() <> 0 Тогда. Действительно ли колонки заполнены нужными значениями?
    2) чему равно Запрос.УстановитьПараметр("НаименованиеКонтрагента",НаимПолн); в этой строке?
  7. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    1. Да, все точно. И в НаимПолн передается первое значение (название контрагента) тоже точно.
    2. По shift-F9 отображает, что Запрос.УстановитьПараметр("НаименованиеКонтрагента",НаимПолн) - "{(1)}: Обращение к процедуре объекта как к функции (УстановитьПараметр)"
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Сама переменная НаимПолн в этой строке чему равна?
  9. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    По очереди, в цикле, все значения поля KRED_NAME из строк ТЗ, то есть строковая переменная с названием контрагента - проверил, все ок.


    Проверил: если условие проверки по имени убрать, то у меня вполне корректно заполняются оба реквизита (ПолноеНазвание и КодПоЕДРПОУ) в Справочнике Контрагенты. Но мне нужно, чтобы существующих в справочнике контрагентов оно не загружало повторно. Проверка по ЕДРПОУ проходит отлично, а вот тут - упирается. Ну и потом, из-за того, что значение ПоискНаимПолн получается неопределенным, алгоритм не отрабатывает проверку с условием "ПоискНаимПолн.Пустая()"...
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Оно отрабатывает корректно, просто получается выборка, а не ссылка. Вам нужно спозиционироваться на первом элементе выборки.
  11. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Я понял. Подскажите, пожалуйста, как?
    И еще: я в табло включил НаименованиеКонтрагента, и оно показывает "значение не определено". Я думал, в этом проблема?
  12. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Вместо ПоискНаимПолн.пустая() нужно сделать ПоискНаимПолн.Следующий() и дальше уже проверять ПоискНаимПолн.Ссылка.Пустая()
  13. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Сделал так:
    Код:
                       
                        ПоискНаимПолн = Запрос.Выполнить().Выбрать();
                                           
                        //Если контрагента с заданным ЕДРПОУ и именем нет - создаем
                        ПоискНаимПолн.Следующий();
                        Если ПоискНаимПолн.Ссылка.Пустая() Тогда
    
    
    Выдает ошибку:

    В режиме отладке после отработки запроса проверяю значения:
    переменная НаименованиеКонтрагента - "Переменная не определена"
    переменная ПоискНаимПолн - тип "ВыборкаИзРезультатовЗапроса", а свойство Ссылка в ней говорит "Ошибка чтения значения"
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Проверять значение в выборке нужно после позиционирования на элементе выборки.
    По поводу ошибки - значит в выборке нет элементов.

    Правильнее будет делать так:

    Код:
    ПоискНаимПолн = Запрос.Выполнить().Выбрать();
    
    //Если контрагента с заданным ЕДРПОУ и именем нет - создаем
    Если ПоискНаимПолн.Следующий() Тогда
    
    НовЭл = ПоискНаимПолн.Ссылка;
    
    Иначе
    
    НовЭл = Справочники.Контрагенты.СоздатьЭлемент();
    НовЭл.НаименованиеПолное = ТекущаяСтрока.KRED_NAME;
    НовЭл.КодПоЕДРПОУ = ТекущаяСтрока.KRED_OKPO;
    НовЭл.Родитель = НовГр.Ссылка;
    НовЭл.Записать();
    
    КонецЕсли;
    Maero и roofless нравится это.
  15. TopicStarter Overlay
    Maero
    Offline

    Maero

    Регистрация:
    17 май 2016
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Спасибо!
    Работает.

Поделиться этой страницей