8.х НайтиПоРеквизиту и строка неограниченной длины

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем MyNameNoName, 10 окт 2013.

  1. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Хотел отобрать нужные мне значения по комментарию, но для него не работает НайтиПоРеквизиту, так как это поле неограниченной длины.
    Следующий код не работает:
    Код:
    //код запроса
    Результат=Запрос.Выполнить().Выгрузить();
    Пока Результат.Следующий() Цикл
    Объект= Результат.Получить();
    //код
    
    А мне нужно Результат.ПолучитьОбъект();
    Или можно данные и не из запроса можно получить?
  2. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    можно сделать так
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать Спр.Ссылка КАК Элем ИЗ Спровочник.ВашСправочник КАК Спр";
    //ну в запрос свои условия добавьте
    Результат = Запрос.Выполинть().Выгрузить();
    Для каждого стр ИЗ Результат Цикл
    вашОбъект = стр.Элем.ПолучитьОбъект();
    //тут действия с объектом
    конецЦикла;
    Выгрузить() - это в таблицу значений и ваша конструкция Результат.Следующий() тут не катит, она для выборки. как таблицу обработать я вам показала, а для выборки надо указывать Выбрать() по типу

    Код:
    Результат = Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() Цикл ....
  3. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код:
    вашОбъект = стр.Элем.ПолучитьОбъект();
    
    Что такое Элем???
  4. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    в запросе посмотрите - это наименование поля в котором ссылка на элемент справочника
  5. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

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

    получается нужно как-то сам объект в запрос добавить.
  6. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну дык, обЪет по ссылке получается, а не по комментарию. Проведите аналогию с моим запросом
    Код:
    Запрос= Новый Запрос ("ВЫБРАТЬ
    |    Контрагенты.Комментарий,
    |Контрагенты.Ссылка КАК Элем
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Комментарий ПОДОБНО &Комментарий");
    Запрос.УстановитьПараметр("Комментарий", Комментарий);
    Результат=Запрос.Выполнить().Выгрузить();
    //тут дальше мой код
  7. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Спасибо, код работает, но не могу понять как сформировать исключение чтобы если объект не найден чтобы создавался новый объект
    Контрагенты = Справочники.Контрагенты.СоздатьЭлемент();
    Код:
    Запрос= Новый Запрос ("ВЫБРАТЬ
    |    Контрагенты.Комментарий,
    |    Контрагенты.Ссылка КАК Элем
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Комментарий ПОДОБНО &Комментарий");        
    Запрос.УстановитьПараметр("Комментарий", Комментарий);
    Результат=Запрос.Выполнить().Выгрузить();
    
    Для Каждого Элемент Из Результат Цикл
    Контрагенты = Элемент.Элем.ПолучитьОбъект();
    
    Уже все варианты перепробовал, но не завершились они успехом. Не могу понять логику.
  8. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    может так?
    Код:
    Запрос= Новый Запрос ("ВЫБРАТЬ
    |    Контрагенты.Комментарий,
    |    Контрагенты.Ссылка КАК Элем
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Комментарий ПОДОБНО &Комментарий");	   
    Запрос.УстановитьПараметр("Комментарий", "%" + Комментарий + "%");
    Результат=Запрос.Выполнить().Выгрузить();
    
    Если Результат.Количество() = 0 Тогда
    Контрагенты = Справочники.Контрагенты.СоздатьЭлемент();
    Иначе
    Для Каждого Элемент Из Результат Цикл
    Контрагенты = Элемент.Элем.ПолучитьОбъект();
  9. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    После выхода из цикла теряется значение.
    Код:
    Для Каждого Элемент Из Результат Цикл
    Контрагенты = Элемент.Элем.ПолучитьОбъект();
    
    Как из цикла передать объект Контрагент.
    Так как далее идет присвоение значений объекту.
  10. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    приведите ваш код. Переменная может "пропасть", только при переходе в другую процедуру и то, если ее обЪявить глобально, то она никуда не денется
  11. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код:
    дбф=Новый XBase;
    дбф.ОткрытьФайл("D:\555.dbf");
    
    Пока дбф.Следующая() Цикл  
    
    Комментарий = СокрЛП(дбф.Kod);
    Запрос= Новый Запрос ("ВЫБРАТЬ
    |    Контрагенты.Комментарий,
    |    Контрагенты.Ссылка КАК Элем
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Комментарий ПОДОБНО &Комментарий");        
    Запрос.УстановитьПараметр("Комментарий", Комментарий);
    Результат=Запрос.Выполнить().Выгрузить();
    
    Для Каждого Элемент Из Результат Цикл
    Контрагенты = Элемент.Элем.ПолучитьОбъект();
    //хочу закрыть тут цикл Для Каждого Элемент Из Результат Цикл
    Контрагенты.Наименование = СокрЛП(дбф.Naim);
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
    ИначеЕсли СокрЛП(дбф.UrFiz) = "ЮрЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    КонецЕсли;
    Контрагенты.Комментарий = СокрЛП(дбф.Kod);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ДокументУдостоверяющийЛичность = СокрЛП(дбф.Doc);
    КонецЕсли;
    Контрагенты.ИНН = СокрЛП(дбф.INN);
    // Код генерируется сам, внесем его в комментарий
    Контрагенты.КодПоОКПО = СокрЛП(дбф.KodOKPO);
    Контрагенты.КПП = СокрЛП(дбф.KPP);
    Контрагенты.НаименованиеПолное = СокрЛП(дбф.NaimPoln);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    КонецЦикла;
    
    КонецЦикла;
    
    дбф.ЗакрытьФайл();
    Сообщить("Загружено!");
    
    Если закрыть тут цикл то
    {Форма.Форма.Форма(23)}: Значение не является значением объектного типа (Наименование)
    Контрагенты.Наименование = СокрЛП(дбф.Naim);
  12. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Код:
    дбф=Новый XBase;
    дбф.ОткрытьФайл("D:\Контраг.dbf");
    
    Пока дбф.Следующая() Цикл  
    
    Комментарий = СокрЛП(дбф.Kod);
    Запрос= Новый Запрос ("ВЫБРАТЬ
    |    Контрагенты.Комментарий,
    |    Контрагенты.Ссылка КАК Элем
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Комментарий ПОДОБНО &Комментарий");        
    Запрос.УстановитьПараметр("Комментарий", Комментарий);
    Результат=Запрос.Выполнить().Выгрузить();
    
    Если Результат.Количество() = 0 Тогда
    Контрагенты = Справочники.Контрагенты.СоздатьЭлемент();
    Контрагенты.Наименование = СокрЛП(дбф.Naim);
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
    ИначеЕсли СокрЛП(дбф.UrFiz) = "ЮрЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    КонецЕсли;
    Контрагенты.Комментарий = СокрЛП(дбф.Kod);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ДокументУдостоверяющийЛичность = СокрЛП(дбф.Doc);
    КонецЕсли;
    Контрагенты.ИНН = СокрЛП(дбф.INN);
    // Код генерируется сам, внесем его в комментарий
    Контрагенты.КодПоОКПО = СокрЛП(дбф.KodOKPO);
    Контрагенты.КПП = СокрЛП(дбф.KPP);
    Контрагенты.НаименованиеПолное = СокрЛП(дбф.NaimPoln);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    
    Иначе
    Для Каждого Элемент Из Результат Цикл
    Контрагенты = Элемент.Элем.ПолучитьОбъект();
    Контрагенты.Наименование = СокрЛП(дбф.Naim);
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
    ИначеЕсли СокрЛП(дбф.UrFiz) = "ЮрЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    КонецЕсли;
    Контрагенты.Комментарий = СокрЛП(дбф.Kod);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ДокументУдостоверяющийЛичность = СокрЛП(дбф.Doc);
    КонецЕсли;
    Контрагенты.ИНН = СокрЛП(дбф.INN);
    // Код генерируется сам, внесем его в комментарий
    Контрагенты.КодПоОКПО = СокрЛП(дбф.KodOKPO);
    Контрагенты.КПП = СокрЛП(дбф.KPP);
    Контрагенты.НаименованиеПолное = СокрЛП(дбф.NaimPoln);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    КонецЦикла;
    КонецЕсли;
    
    КонецЦикла;
    
    дбф.ЗакрытьФайл();
    Сообщить("Загружено!");
    
    Получается такой код, нужно его упростить(идет задвоение кода).
  13. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
     дбф=Новый XBase;
    дбф.ОткрытьФайл("D:\555.dbf");
    
    Пока дбф.Следующая() Цикл 
    
    Комментарий = СокрЛП(дбф.Kod);
    Запрос= Новый Запрос ("ВЫБРАТЬ
    |    Контрагенты.Комментарий,
    |    Контрагенты.Ссылка КАК Элем
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.Комментарий ПОДОБНО &Комментарий");	   
    Запрос.УстановитьПараметр("Комментарий", Комментарий);
    Результат=Запрос.Выполнить().Выгрузить();
    
    Если Результат.Количество() = 0 Тогда
    Сообщить("Не найден контрагент");
    Иначе
    
    Для Каждого Элемент Из Результат Цикл
    Контрагенты = Элемент.Элем.ПолучитьОбъект();
    КонецЦикла;
    
    Контрагенты.Наименование = СокрЛП(дбф.Naim);
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
    ИначеЕсли СокрЛП(дбф.UrFiz) = "ЮрЛицо" Тогда
    Контрагенты.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    КонецЕсли;
    Контрагенты.Комментарий = СокрЛП(дбф.Kod);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    Если СокрЛП(дбф.UrFiz) = "ФизЛицо" Тогда
    Контрагенты.ДокументУдостоверяющийЛичность = СокрЛП(дбф.Doc);
    КонецЕсли;
    Контрагенты.ИНН = СокрЛП(дбф.INN);
    // Код генерируется сам, внесем его в комментарий
    Контрагенты.КодПоОКПО = СокрЛП(дбф.KodOKPO);
    Контрагенты.КПП = СокрЛП(дбф.KPP);
    Контрагенты.НаименованиеПолное = СокрЛП(дбф.NaimPoln);
    Попытка
    Контрагенты.Записать();
    Исключение
    Сообщить("Ошибка записи:" + СокрЛП(дбф.Kod));
    КонецПопытки;
    КонецЕсли;
    КонецЦикла;
    
    КонецЦикла;
    дбф.ЗакрытьФайл();
    Сообщить("Загружено!");
    если у вас в результате запроса данных нет, то соответственно в цикл где создается обЪект программа не зайдет и Контрагент будет Неопределено, потому и выдает ошибку

    если вам надо создать нового, если не нашли совпадения, то код надо будет подправить
  14. TopicStarter Overlay
    MyNameNoName
    Offline

    MyNameNoName Опытный в 1С

    Регистрация:
    17 май 2013
    Сообщения:
    931
    Симпатии:
    0
    Баллы:
    26
    Данные выгружаются нормально, а вот при загрузке проблема с контрагентами, в названии которых есть кавычки.
    Как занести эти значения?
  15. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а в чем роблема?

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