Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 12:38

Изменить поиск в обработке

Автор SkyNetYar, 30 ноя 2015, 21:16

0 Пользователей и 1 гость просматривают эту тему.

SkyNetYar

Добрый день! УТ 11.1.10 (8.3.7)

Обработка импорта из EXCEL,заполняет документ из файла,ищет номенклатуру в справочнике Номенклатура по наименованию,если не находит то создает ее,и переносит в документ.
Помогите изменить условие поиска с Номенклатура.наименование на Номенклатура.доп реквизит "номенклатура поставщика" строковый тип.
&НаСервере
Функция ПолучитьНоменклатуру( мЗначения, фСоздаватьНовые = Истина )

Запрос = Новый Запрос;

Если мЗначения.Свойство("ШтрихКод") Тогда
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ
| 1 КАК ПорядокВывода,
| Штрихкоды.Номенклатура КАК Ссылка,
| Штрихкоды.Номенклатура.Артикул как Артикул
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод = &Штрихкод
| И Штрихкоды.Номенклатура Ссылка Справочник.Номенклатура
|
|ОБЪЕДИНИТЬ ВСЕ
|";
Запрос.УстановитьПараметр("ШтрихКод", мЗначения.ШтрихКод);
КонецЕсли;

Если мЗначения.Свойство("Артикул") Тогда
мЗначения.Артикул = Формат(мЗначения.Артикул, "ЧГ=0");
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ
| 2 КАК ПорядокВывода,
| Номенклатура.Ссылка,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование = &НаименованиеТочно
| И Номенклатура.Артикул = &Артикул
| И Номенклатура.ЭтоГруппа = Ложь
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 3,
| Номенклатура.Ссылка,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул
| И Номенклатура.ЭтоГруппа = Ложь
|
|ОБЪЕДИНИТЬ ВСЕ
|";
Запрос.УстановитьПараметр("Артикул", мЗначения.Артикул);
КонецЕсли;

Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ
| 4,
| Номенклатура.Ссылка,
| Номенклатура.Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование = &НаименованиеТочно
| И Номенклатура.ЭтоГруппа = Ложь";
//|
//|ОБЪЕДИНИТЬ ВСЕ
//|
//|ВЫБРАТЬ
//| 5,
//| НоменклатураПоставщиков.Номенклатура,
//| НоменклатураПоставщиков.Номенклатура.Артикул
//|ИЗ
//| Справочник.НоменклатураПоставщиков КАК НоменклатураПоставщиков
//|ГДЕ
//| Номенклатура.Наименование = &НаименованиеТочно
//| И Номенклатура.ЭтоГруппа = Ложь";
//////////////////////////////////////////////////////////////////////
Запрос.УстановитьПараметр("НаименованиеТочно", мЗначения.Наименование);
Запрос.УстановитьПараметр("НаименованиеПодобно", Строка(мЗначения.Наименование)+"%");
Запрос.УстановитьПараметр("НаименованиеПриблизительно", "%"+Строка(мЗначения.Наименование)+"%");

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

//ШтрихКод может другой передаваться - его записываем в карточку
Если мЗначения.Свойство("ШтрихКод") Тогда
Если мЗначения.ШтрихКод <> "" Тогда
Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Штрихкод.Установить(мЗначения.ШтрихКод);
//
НовыйШК = Набор.Добавить();
НовыйШК.Штрихкод = мЗначения.ШтрихКод;
НовыйШК.Номенклатура = Результат.Ссылка;
НовыйШК.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
Набор.Записать();
КонецЕсли;
КонецЕсли;

Для Каждого Свойство из мЗначения Цикл
//Доп реквизиты
//Сообщить(мДопРеквизиты.НайтиПоЗначению(Свойство.Ключ)<> Неопределено);
СтрокиДоп = мДопРеквизиты.НайтиСтроки(Новый Структура("ПредставлениеБезНедСимволов",Свойство.Ключ));


Если СтрокиДоп.Количество() > 0 Тогда

СтрокаДопРеквизита = СтрокиДоп.Получить(0);

Отбор = Новый Структура;
Отбор.Вставить("Свойство", СтрокаДопРеквизита.Ссылка);
РеквизитОбъекта = Результат.Ссылка.ДополнительныеРеквизиты.НайтиСтроки(Отбор);


Если Перезаписывать = Истина Тогда //Если флажок то перезаписываем доп значения без условий. //+
НоменклатураОбъект = Результат.Ссылка.ПолучитьОбъект();  //+
ДобавитьРеквизит(НоменклатураОбъект, СтрокаДопРеквизита.Ссылка, Свойство.Значение); //+
    НоменклатураОбъект.Записать();                           //+
Иначе 
Если РеквизитОбъекта.Количество() = 0 Тогда  //Записываем только если пустой доп реквизит.

     НоменклатураОбъект = Результат.Ссылка.ПолучитьОбъект();
     ДобавитьРеквизит(НоменклатураОбъект, СтрокаДопРеквизита.Ссылка, Свойство.Значение);
     НоменклатураОбъект.Записать();

КонецЕсли;
КонецЕсли;
КонецЕсли;

//-Доп реквизиты
КонецЦикла;

Возврат Результат.Ссылка;

ИначеЕсли фСоздаватьНовые Тогда

фУслуга = Ложь;
Если мЗначения.Свойство("Группа") Тогда
фУслуга = ?(Сред(мЗначения.Группа, 1, 2)="У ", Истина, Ложь);
КонецЕсли;

ТекОбъект = Справочники.Номенклатура.СоздатьЭлемент();
Для Каждого Свойство из мЗначения Цикл
Если ТекОбъект.Метаданные().Реквизиты.Найти(Свойство.Ключ) <> Неопределено Тогда
ТекОбъект[Свойство.Ключ] = Свойство.Значение;
КонецЕсли;

//Доп реквизиты
//Сообщить(мДопРеквизиты.НайтиПоЗначению(Свойство.Ключ)<> Неопределено);
СтрокиДоп = мДопРеквизиты.НайтиСтроки(Новый Структура("ПредставлениеБезНедСимволов",Свойство.Ключ));
Если СтрокиДоп.Количество() > 0 Тогда

СтрокаДопРеквизита = СтрокиДоп.Получить(0);
//пИмяСвойства = СтрЗаменить(Строка(Свойство.Ключ), "_", " ");
//пИмяСвойства = ЗаменитьНедопустимыеСимволыВИмениФайла(Строка(Свойство.Ключ),"_");
ДобавитьРеквизит(ТекОбъект, СтрокаДопРеквизита.Ссылка, Свойство.Значение);
КонецЕсли;
//-Доп реквизиты

КонецЦикла;

Если мЗначения.Свойство("Артикул") Тогда
ТекОбъект.Артикул = мЗначения.Артикул;
Иначе
ТекОбъект.Артикул = z_ОбщийМодуль.ПолучитьНовыйАртикул();
КонецЕсли;

ТекОбъект.Наименование = мЗначения.Наименование;
ТекОбъект.НаименованиеПолное = мЗначения.Наименование;
ТекОбъект.ВидНоменклатуры = ?(фУслуга, Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Услуга"), Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар"));
ТекОбъект.ТипНоменклатуры = ?(фУслуга, Перечисления.ТипыНоменклатуры.Услуга, Перечисления.ТипыНоменклатуры.Товар);
ТекОбъект.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;
//ТекОбъект.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры;
ТекОбъект.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать;
ТекОбъект.ИспользоватьУпаковки = Ложь;
ТекОбъект.КодДляПоиска = ТекОбъект.Артикул;
ТекОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
ТекОбъект.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
ТекОбъект.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");

Если мЗначения.Свойство("Производитель") Тогда
ТекОбъект.Производитель = ПолучитьПроизводителя(мЗначения.Производитель);
КонецЕсли;

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

фЗаписан = Ложь;
//Записываем для использования в дальнейшем как владельца
Попытка
ТекОбъект.Записать();
фЗаписан = Истина;
Исключение
ТекОбъект.Наименование = ТекОбъект.Наименование + " ("+ТекОбъект.Артикул+")";
ТекОбъект.НаименованиеПолное = ТекОбъект.Наименование + " ("+ТекОбъект.Артикул+")";
Попытка
ТекОбъект.Записать();
фЗаписан = Истина;
Исключение
Сообщить("Наименование " + ТекОбъект.Наименование + " не уникально !!!");
КонецПопытки;
КонецПопытки;

Если фЗаписан Тогда
//Штрих-коды !!!
пКод = ТекОбъект.Артикул;
Попытка
пКод = Число(пКод);
Исключение
пКод = 0;
КонецПопытки;
Если пКод <> 0 Тогда
НовыйШтрихкод = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
НовыйШтрихкод.Номенклатура = ТекОбъект.Ссылка;
пШтрихкод = "2"+Формат(пКод, "ЧЦ=11; ЧВН=; ЧГ=");
НовыйШтрихкод.Штрихкод = пШтрихкод+РегистрыСведений.ШтрихкодыНоменклатуры.КонтрольныйСимволEAN(пШтрихкод, 13);
//НовыйШтрихкод.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
НовыйШтрихкод.Записать();
КонецЕсли;

Если мЗначения.Свойство("ШтрихКод") Тогда
Если мЗначения.ШтрихКод <> "" Тогда
Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Штрихкод.Установить(мЗначения.ШтрихКод);
//
НовыйШК = Набор.Добавить();
НовыйШК.Штрихкод = мЗначения.ШтрихКод;
НовыйШК.Номенклатура = ТекОбъект.Ссылка;
//НовыйШК.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
Набор.Записать();
КонецЕсли;
КонецЕсли;
//-Штрих-коды

Возврат ТекОбъект.Ссылка;
Иначе

Возврат Справочники.Номенклатура.ПустаяСсылка();

КонецЕсли;

КонецЕсли;

Возврат Неопределено;

КонецФункции


Думаю что надо изменить запрос на что то типа
Запрос = Новый Запрос;
Запрос.Текст =  "ВЫБРАТЬ
                | ДополнительныеРеквизитыИСведения.Наименование КАК Наименование,
                | ДополнительныеРеквизитыИСведения.Ссылка
                |ИЗ
                | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
                |ГДЕ
                | ДополнительныеРеквизитыИСведения.НаборСвойств = &НаборСвойств";
Запрос.УстановитьПараметр("НаборСвойств",Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура_Общие);
РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

has

Попробуй искать не через "=", а через "ПОДОБНО"

Luzer1C

Нужно заменить это
Номенклатура.Наименование = &НаименованиеТочно
на
Номенклатура.НоменклатураПоставщика = &НаименованиеТочно
Халамбалам.

SkyNetYar

Дополнительный реквизит в смысле не реквизит который был создан в конфигураторе, а через Предприятие Изменен состав дополнительных реквизитов и добавлено строковое поле "Номенклатура поставщика"

Пробую так
"ВЫБРАТЬ
                              | 4,
                              | Номенклатура.Ссылка,
                              | Номенклатура.Артикул,
                              | Номенклатура.ДополнительныеРеквизиты.(
                              | ТекстоваяСтрока
                              | )
                              |ИЗ
                              | Справочник.Номенклатура КАК Номенклатура
                              |ГДЕ
                              //| Номенклатура.Наименование = &НаименованиеТочно
                              | Номенклатура.ЭтоГруппа = ЛОЖЬ
                              | И Номенклатура.ДополнительныеРеквизиты.ТекстоваяСтрока ПОДОБНО &НаименованиеТочно";

Создает новую номенклатуру при изменении наименования и дописывает артикул в наименование ниже по коду..
Но не ищет именнно по строке дополнительного реквизита.. :dfbsdfbsdf:
Добавлено: 01 дек 2015, 12:19


Через консоль запросов получает пустое значение строки,они не тут хранятся?
Добавлено: 01 дек 2015, 14:58


Разобрался!
Вот решение,может пригодится кому!
Запрос.Текст = Запрос.Текст + "
  |ВЫБРАТЬ
  |таб.Ссылка,
  |таб.Ссылка.Артикул КАК Артикул
  |ИЗ
  |Справочник.Номенклатура.ДополнительныеРеквизиты КАК таб
  |ГДЕ
  |таб.Значение=&НаименованиеТочно
  |И таб.Свойство=&Свойство
  |И НЕ таб.Ссылка.ЭтоГруппа";
Запрос.УстановитьПараметр("Свойство" , ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номенклатура поставщика"));
Запрос.УстановитьПараметр("НаименованиеТочно", мЗначения.Наименование);

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск