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

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

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

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

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

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

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

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

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

Тебе или параметр в запросе нужно по-другому строить, либо другой метод поиска (полнотекстовый, например) использовать.
28. Stanislav1993 06.11.18 09:27 Сейчас в теме
(26)Хорошо, спасибо. Буду думать
29. Denis_CFO 9 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 9 06.11.18 07:00 Сейчас в теме
Да и вообще архитектура непонятна, зачем гонять массив, если нужно просто строку наименования получить.
Если это Ваше решение, попробуйте другую архитектуру.
5. Stanislav1993 06.11.18 07:18 Сейчас в теме
Даже так происходит повторное дублирование
&НаСервере
Функция Получить(Блюдо)
			//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Блюда.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Блюда КАК Блюда";
	
	РезультатЗапроса = Запрос.Выполнить();
	Запрос.УстановитьПараметр("Блюдо",Блюдо);
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Возврат ВыборкаДетальныеЗаписи.Ссылка;
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

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

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

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

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

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

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

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


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


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

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

Вакансии

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

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

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

Руководитель группы сервисов ЭДО, ЭЦП и криптографии
Москва
зарплата от 150 000 руб.
Полный день

Руководитель группы интеграций (1С)
Москва
зарплата от 150 000 руб.
Полный день