1. Stanislav1993 06.11.18 06:45 Сейчас в теме

Дублирование значений

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

&НаКлиенте
Процедура ПоискПоКоду(Команда)
	НовСтр = Объект.ЗаказКлиента.Добавить();
	Если ПолучитьНазваниеБлюда(НазваниеБлюда) <> Неопределено Тогда
		НовСтр.Блюдо = ПолучитьНазваниеБлюда(НазваниеБлюда)[0];	
	конецЕсли;	
КонецПроцедуры

Показать
Ответы
Избранное Подписка Сортировка: Древо
2. Denis_CFO 13 06.11.18 06:55 Сейчас в теме
(1) в запросе отбора по блюду нет...
Добавьте вот такое:
"ВЫБРАТЬ
    |    Блюда.Ссылка КАК Ссылка,
    |    Блюда.Код КАК Код,
    |    Блюда.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Блюда КАК Блюда
    | Где Ссылка.Наименование = &Блюдо";

Запрос.УстановитьПараметр("Блюдо", "%"+Блюдо+"%");
4. Denis_CFO 13 06.11.18 07:01 Сейчас в теме
(1)
Если ПолучитьНазваниеБлюда(НазваниеБлюда) <> Неопределено Тогда
НовСтр.Блюдо = ПолучитьНазваниеБлюда(НазваниеБлюда)[0];
конецЕсли;

Вот здесь для чего дважды вызываете функцию ПолучитьНазваниеБлюда(НазваниеБлюда)?
7. Stanislav1993 06.11.18 07:35 Сейчас в теме
(4) А как на ваш взгляд сделать проще?)
9. Denis_CFO 13 06.11.18 07:40 Сейчас в теме
(7)
&НаКлиенте
Процедура ПоискПоКоду(Команда)
    НовСтр = Объект.ЗаказКлиента.Добавить();
    лБлюдо = ПолучитьНазваниеБлюда(НазваниеБлюда);
Если лБлюдо <> Неопределено Тогда
        НовСтр.Блюдо = лБлюдо[0];    
    конецЕсли;    
КонецПроцедуры

Но и это не самое рабочее решение, по-крайней мере не для продакшена.
11. Stanislav1993 06.11.18 08:36 Сейчас в теме
(9)У меня все равно идет дублирование данных в строках
12. Denis_CFO 13 06.11.18 08:39 Сейчас в теме
(11) Можно где-нибудь листинг всего кода документа посмотреть?
13. Stanislav1993 06.11.18 08:41 Сейчас в теме
(12)
&НаКлиенте
Процедура ПоискПоКоду(Команда)
	НовСтр = Объект.ЗаказКлиента.Добавить();
	лБлюдо = ПолучитьНазваниеБлюда(НазваниеБлюда);
	Если лБлюдо<> Неопределено Тогда
		НовСтр.Блюдо = лБлюдо[0];
	КонецЕсли;
	
	
КонецПроцедуры

&НаКлиенте
Функция ПолучитьНазваниеБлюда(Блюдо)
	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Блюда.Ссылка КАК Ссылка,
	|	Блюда.Код КАК Код,
	|	Блюда.Наименование КАК Наименование
	|ИЗ
	|	Справочник.Блюда КАК Блюда";
	
	Запрос.УстановитьПараметр("Блюдо", "%"+Блюдо+"%");
	РезультатЗапроса = Запрос.Выполнить();
	Массив = Новый Массив(4);
	Если не РезультатЗапроса.Пустой()Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Если Выборка.Следующий()Тогда
			Массив.Вставить(0,Выборка.Ссылка);
			Массив.Вставить(1,Выборка.Код);
			Возврат Массив;
		КонецЕсли;
	Иначе
		Возврат Неопределено;
		
	КонецЕсли;
	
КонецФункции


Показать
14. Stanislav1993 06.11.18 08:42 Сейчас в теме
16. Denis_CFO 13 06.11.18 09:00 Сейчас в теме
(14) вот тебе конфа в ней справочник блюда и документ Формирование заказа.Посмотри, в ней все работает.
Прикрепленные файлы:
1Cv8.dt
18. Stanislav1993 06.11.18 09:04 Сейчас в теме
(16) Вероятнее всего у меня мистика с 1с-кой на ноуте. Я загрузил. Выбираю "СЯ"/нажимаю "Поиск" - в результате "Пустая Строка"
19. Denis_CFO 13 06.11.18 09:05 Сейчас в теме
(18)
Выбираю "СЯ"/нажимаю "Поиск"
там нет такого блюда, в названии которого есть "СЯ"
21. Stanislav1993 06.11.18 09:08 Сейчас в теме
(19)Даже "СА" тоже не находит
22. Denis_CFO 13 06.11.18 09:09 Сейчас в теме
(21) а какие наименования в справочнике блюда есть?
23. Denis_CFO 13 06.11.18 09:10 Сейчас в теме
25. Stanislav1993 06.11.18 09:11 Сейчас в теме
(23)Ахаха) Я же не буду врать)) Говорю же, "АС" - не видит, а вот "ЧА" видит
27. Denis_CFO 13 06.11.18 09:15 Сейчас в теме
(25)
Я же не буду врать))
это банальная невнимательность. Читать сообщения нужно внимательно.
24. Stanislav1993 06.11.18 09:10 Сейчас в теме
(19)Сейчас создал "Чай и дал код "ЧА" - работает.
А вот "АС- апельсиновый сок" не работает
26. Denis_CFO 13 06.11.18 09:13 Сейчас в теме
(24) и не будет. Запрос выбирает из базы в данном случае только четкую последовательность в НАИМЕНОВАНИИ блюда:

Какие_То_Символы_АС_Какие_то_Символы

Тебе или параметр в запросе нужно по-другому строить, либо другой метод поиска (полнотекстовый, например) использовать.
28. Stanislav1993 06.11.18 09:27 Сейчас в теме
(26)Хорошо, спасибо. Буду думать
29. Denis_CFO 13 06.11.18 11:17 Сейчас в теме
(28)
Хорошо, спасибо. Буду думать
получилось заказ победить?
15. spacecraft 06.11.18 08:58 Сейчас в теме
(13) несколько раз уже указали:
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Блюда.Ссылка КАК Ссылка,
    |    Блюда.Код КАК Код,
    |    Блюда.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Блюда КАК Блюда
    |ГДЕ
    |    Блюда.Ссылка = &Блюдо";
    
    Запрос.УстановитьПараметр("Блюдо", Блюдо");
Показать

Без конструкции " |ГДЕ Блюда.Ссылка = &Блюдо" будет выборка всего справочника.
17. Stanislav1993 06.11.18 09:00 Сейчас в теме
(15)выборка идет, только повторяются строки при выборе другого блюда
20. spacecraft 06.11.18 09:07 Сейчас в теме
(17) выборка идет всегда по первому элементу выборки.
Для вашего случая код должен быть следующий:
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Блюда.Ссылка КАК Ссылка,
    |    Блюда.Код КАК Код,
    |    Блюда.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Блюда КАК Блюда
    |ГДЕ
    |    Блюда.Наименование Подобно &Блюдо";
    
    Запрос.УстановитьПараметр("Блюдо", "%"+Блюдо+"%");
Показать
3. Denis_CFO 13 06.11.18 07:00 Сейчас в теме
Да и вообще архитектура непонятна, зачем гонять массив, если нужно просто строку наименования получить.
Если это Ваше решение, попробуйте другую архитектуру.
5. Stanislav1993 06.11.18 07:18 Сейчас в теме
Даже так происходит повторное дублирование
&НаСервере
Функция Получить(Блюдо)
			//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Блюда.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Блюда КАК Блюда";
	
	РезультатЗапроса = Запрос.Выполнить();
	Запрос.УстановитьПараметр("Блюдо",Блюдо);
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Возврат ВыборкаДетальныеЗаписи.Ссылка;
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

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

Показать
Прикрепленные файлы:
6. Denis_CFO 13 06.11.18 07:26 Сейчас в теме
(5) Ищите, что ещё происходит с ТЧ, эти две функции добавляют только одну позицию.
8. Stanislav1993 06.11.18 07:38 Сейчас в теме
(6)
Сейчас этот пример попробую

&НаКлиенте
Процедура ПоискПоКоду(Команда)
	НовСтр = Объект.ЗаказКлиента.Добавить();
	НовСтр.Блюдо = Получить(НазваниеБлюда);
	Сообщить(НовСтр.Блюдо);
	

КонецПроцедуры

&НаСервере
Функция Получить(Блюдо)
			//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Блюда.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Блюда КАК Блюда
		|ГДЕ
		|	Блюда.Ссылка = &Блюдо";
	
	РезультатЗапроса = Запрос.Выполнить();
	Запрос.УстановитьПараметр("Блюдо", "%"+Блюдо+"%");
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Возврат ВыборкаДетальныеЗаписи.Ссылка;
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

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

Показать
10. Denis_CFO 13 06.11.18 07:43 Сейчас в теме
Смысл такой - меньше обращений у серверу.
Ну и без конфигурации сложно что-то сказать, надо целиком структуру посмотреть.
30. App0st0l 17 06.11.18 12:38 Сейчас в теме
 Запрос.Текст = 
        "ВЫБРАТЬ
        |    Блюда.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Блюда КАК Блюда
        |ГДЕ
        |    Блюда.Ссылка = &Блюдо";
    
    РезультатЗапроса = Запрос.Выполнить();
    Запрос.УстановитьПараметр("Блюдо", "%"+Блюдо+"%");
Показать


Это работать не будет т.к. в таком случае нужно передать ссылку а вы передадите строку с процентами
Denis_CFO; +1 Ответить
32. Denis_CFO 13 06.11.18 12:48 Сейчас в теме
(30)
а вы передадите строку с процентами
точно. Потом ниже через подобно исправился.
33. App0st0l 17 06.11.18 12:52 Сейчас в теме
(32)
Блюда.Ссылка Подобно &Блюдо


такая конструкция тоже не взлетит, нужно строку со сторокой сравнивать, типа того

Блюда.Наименование Подобно &Блюдо
35. Denis_CFO 13 06.11.18 12:56 Сейчас в теме
(33) точно.
Но судя по молчанию ТС-а его уже этот вопрос не волнует.
36. spacecraft 06.11.18 13:01 Сейчас в теме
(30) в (20) уже был такой ответ. Но похоже автору уже не важно.
31. App0st0l 17 06.11.18 12:41 Сейчас в теме
Вам просто нужен поиск номенклатуры? Что такое блюдо на входе, строка?
34. App0st0l 17 06.11.18 12:54 Сейчас в теме
т.к. если блюдо это ссылка то зачем эти танцы? Блюдо.Код?
37. Stanislav1993 06.11.18 13:23 Сейчас в теме
(34)да поиск по коду.
Например Реквизит Код-АС, Реквизит Наименование - Апельсиновый сок.
Тип у обоих реквизитов - Строка.
Документ ФормированиеЗаказа, в строке поиска блюда вбиваю АС и в табличную часть попадает "Апельсиновый сок"..
38. Denis_CFO 13 06.11.18 13:38 Сейчас в теме
(37) а с Ананасовым соком сработает?
42. Stanislav1993 06.11.18 15:51 Сейчас в теме
39. App0st0l 17 06.11.18 14:45 Сейчас в теме
В таком случае ввод по строке в свойствах справочника просто не катит?
Прикрепленные файлы:
41. Stanislav1993 06.11.18 15:51 Сейчас в теме
(39)у меня это свойство так и стоит
40. App0st0l 17 06.11.18 14:50 Сейчас в теме
Или просто
Справочник.Блюда.НайтиПоКоду("АС");
43. App0st0l 17 06.11.18 16:15 Сейчас в теме
Посмотри в цф как реализовано
Прикрепленные файлы:
1Cv8.cf
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Программист 1С
Москва
Полный день

Программист 1С
Видное
Полный день

Программист 1С
Москва
зарплата до 120 000 руб.
Полный день

Программист 1С
Ростов-на-Дону
зарплата до 120 000 руб.
Полный день