Поиск номенклатуры по коду

1. denis-sqluev 13.12.18 11:00 Сейчас в теме
Здравствуйте!

Розница 2.2 серверная

Делаю внешнюю обработку.
При программном заполнении Отчета о розничных продажах товар не находится по Коду номенклатуры.

НО документ заполняется в Файловом варианте базы.

В серверной базе отладчиком не получается остановиться.

Подскажите, пожалуйста, в чем может быть причина?

Заранее спасибо!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 13.12.18 11:17 Сейчас в теме
(1)
При программном заполнении Отчета о розничных продажах
- код ?
3. denis-sqluev 13.12.18 11:31 Сейчас в теме
(2)часть:
Отчет = НайтиДокОтчетККМ(НомерОтчета,ДатаДок,КассаККМ,ТекПользователь);
			Отчет.Товары.Очистить();
			Отчет.ОплатаПлатежнымиКартами.Очистить();
			Отчет.ВозвращенныеТовары.Очистить();
			РежимПроведения = РежимПроведенияДокумента.Неоперативный;
			ПродажиСвернутые = Продажи.Скопировать();
			
			Для Каждого Товар из  ПродажиСвернутые Цикл
				Если Товар.Сумма = 0 Тогда
					Продолжить;
				КонецЕсли;
				
				НайдТовар = Товар.Товар;
				
				СтрокаТЧ                            = Отчет.Товары.Добавить();
				СтрокаТЧ.Номенклатура               = Справочники.Номенклатура.НайтиПоКоду(Товар.Код);
				Сообщить(Строка(СтрокаТЧ.Номенклатура) + " / " + Строка(Товар.Код));
				//СтрокаТЧ.Упаковка.ЕдиницаИзмерения  		= НайдТовар.ЕдиницаИзмерения;
				//СтрокаТЧ.Коэффициент                = НайдТовар.ЕдиницаХраненияОстатков.Коэффициент;
				СтрокаТЧ.Количество                 = Товар.Количество;
				СтрокаТЧ.КоличествоУпаковок                 = Товар.Количество;

				СтрокаТЧ.Цена                       = Товар.Цена;
				СтрокаТЧ.Сумма                      = Товар.Сумма;
				СтрокаТЧ.Склад                      = выб.Склад;
				СтрокаТЧ.ПроцентСкидкиНаценки       = ?(Товар.Количество * Товар.Цена = 0, 0, 100 * (1 - Товар.Сумма / (Товар.Количество * Товар.Цена)));
				//ОбработкаТабличныхЧастей.ПриИзмененииЕдиницыТабЧасти(СтрокаТЧ, Отчет);
				СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
				//ОбработкаТабличнойЧастиТоварыСервер.РассчитатьСуммуНДСТабЧасти(СтрокаТЧ, Отчет);
				
				Если Товар.БезНал = 1 Тогда
					СтрокаТЧ = Отчет.ОплатаПлатежнымиКартами.Добавить();
					СтрокаТЧ.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоРеквизиту("ТипОплаты",Перечисления.ТипыОплатЧекаККМ.ПлатежнаяКарта);
					СтрокаТЧ.Сумма = Товар.Сумма;
					//ПроцентТорговойУступки = Отчет.ДоговорЭквайринга.ТарифыЗаРасчетноеОбслуживание[0].ПроцентТорговойУступки;
					//СтрокаТЧ.ПроцентТорговойУступки = ПроцентТорговойУступки;
					//СтрокаТЧ.СуммаТорговойУступки = Товар.Сумма*ПроцентТорговойУступки/100;
				КонецЕсли;
				
			КонецЦикла;
Показать


тут Продажи - это табл.значений
6. alex-l19041 8 13.12.18 12:01 Сейчас в теме
(3) тип значения
НайдТовар = Товар.Товар
и

СтрокаТЧ.Номенклатура
одинаковый ?
если да, то
Справочники.Номенклатура.НайтиПоКоду(Товар.Код)

Не надо
просто
СтрокаТЧ.Номенклатура = Товар.Товар
9. denis-sqluev 13.12.18 12:36 Сейчас в теме
(6)типы одинаковые

поменял на
//НайдТовар = Товар.Товар;
				
				СтрокаТЧ                            = Отчет.Товары.Добавить();
				//СтрокаТЧ.Номенклатура               = Справочники.Номенклатура.НайтиПоКоду(Товар.Код);
				СтрокаТЧ.Номенклатура               = Товар.Товар;


тоже не сработало
8. starjevschik 13.12.18 12:24 Сейчас в теме
ну для начала можно вместо отладки использовать вывод сообщений. Код, по которому ищем. Проверить типы (код номенклатуры число или строка, и что передаем в поиск). Поставить флажок "поиск по всем справочнике" (возможно, где-то раньше группа выбрана).
Потом дальше думать, если ничего не найдем.
10. denis-sqluev 13.12.18 12:39 Сейчас в теме
(8)сделал вывод "Номенклатура \ Код номенклатуры"

выводит " \ 12 345"

в самом документе в ТЧ если вручную вбить код, то выводится для выбора только одна номенклатура
12. starjevschik 13.12.18 12:44 Сейчас в теме
(10) пробел конечно прикольно, такое впечатление, что код - число, которое выводится как строка с группировкой по три.
Еще могу предложить такой вариант: пишем обработку, в которой в форме поле нужного типа, кнопка "найти" вызывает наш поиск. В поле забиваем разные строки и на опыте узнаем, что именно нужно для того, чтобы найти номенклатуру.
Написать такое минут пять надо, в форум дольше писать кмк.
11. denis-sqluev 13.12.18 12:40 Сейчас в теме
(8)код у элемента справочника строкового типа, и в коде тоже строковый получаю
4. denis-sqluev 13.12.18 11:35 Сейчас в теме
есть файлик, в котором есть коды номенклатуры, например, 12345.
но в базе код номенклатуры 12 345 с пробелом

в другой части кода при чтении файлика:
Для Счетчик=1 по Файл.КоличествоСтрок() Цикл
		ТекСтрока=сокрлп(Файл.получитьСтроку(Счетчик));
		Если ТекСтрока = "" Тогда
			Продолжить;
		КонецЕсли;	
		Спис = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекСтрока,";");
		Если Спис.Количество() < 12 Тогда
			Если ТекСтрока = "#" Тогда
				СчетчикСмены = 1;
			Иначе	
			    СчетчикСмены = СчетчикСмены + 1;
			КонецЕсли; 
			
			Если СчетчикСмены = 3 Тогда
				НомерСмены = ТекСтрока;
				СчетчикСмены = 0;
			КонецЕсли;
			Продолжить;
		КонецЕсли;	
		НомерТранзакции = Число(Спис[0]);
		ДатаТранзакции  = Дата(2000 + Число(Прав(Спис[1],2)),Число(Сред(Спис[1],4,2)),Число(Лев(Спис[1],2)),Число(Лев(Спис[2],2)),Число(Сред(Спис[2],4,2)),Число(Прав(Спис[2],2)));
		ВремяТранзакции  = Спис[2];
		ТипЧека  = Число(Спис[3]);
		НомерККМ  = Число(Спис[4]);
		НомерЧека  = Число(Спис[5]);
		
		Кассир  = Число(Спис[6]);
		Если СокрЛП(Спис[7]) = "" Тогда
			Код  = 0;
		Иначе
			Попытка
				//Код  = Число(Формат(Спис[7],"ЧРГ=' '"));
				Код  = Строка(Число(Спис[7]));
			Исключение
				//Сообщить("" + Код + " " + Счетчик)
			КонецПопытки;	
		КонецЕсли;	
		Секция  = Число(Спис[8]);
		Цена  = Число(Спис[9]);
		Количество  = Число(Спис[10]);
		Сумма  = Число(Спис[11]);
Показать



Код преобразуется так:
Код = Строка(Число(Спис[7]));

и получаю 12 345

в файловой базе так все нормально заполняется, а в серверной нет.

прикрепил всю обработку.
Прикрепленные файлы:
ВнешняяПОС.epf
13. Wolfich 13.12.18 13:05 Сейчас в теме
(4) Добавь в коде перед поиском номенклатуры вывод кода - сообщить(""+Код+":"+ТипЗнч(Код));
И какого типа код в справочнике номенклатура? - длина символов кода?
и посмотри в справочнике номенклатуры - может коды забиты с пробелами? - длина забитого кода?
14. denis-sqluev 13.12.18 13:21 Сейчас в теме
(13)сообщил "12 345:Строка"

в конфигураторе
Тип кода - Строка
Длина - 11

в предприятии у номенклатуры
Длина - 11
например "1 931 "
15. denis-sqluev 13.12.18 13:23 Сейчас в теме
(14)выше в примере длина кода 11 должна быть, после 931 еще 6 пробелов, после отправки сообщения они обрезались
16. spacecraft 13.12.18 13:38 Сейчас в теме
(14) сначала загрузили номенклатуру с неправильно форматированным кодом, а теперь пытаетесь находить ее по кривому форматированию.
Может проще переписать все коды номенклатуры к стандартным значения?
17. Wolfich 13.12.18 13:43 Сейчас в теме
(14)
в предприятии у номенклатуры
Длина - 11
например "1 931 "


т.е. заполнено 6 символов из 11. бывает другое количество?
18. Wolfich 13.12.18 13:47 Сейчас в теме
(14) и еще - скопируй в тему код номенклатуры "12 345"
19. starjevschik 13.12.18 14:12 Сейчас в теме
(14) а вот еще подумал, что пробел может быть разным. Если этот дурацкий код с пробелом копировали из какого-нибудь екселя, то там запросто может быть не пробел, а символ 160.
Я бы пожалуй начал бы с перекодировки, сделать всем нормальные коды 0000012345, потом уже играться с поиском. Пробел в код вставить, это какое-то особенно изысканное извращение все же.
20. denis-sqluev 13.12.18 14:22 Сейчас в теме
(19)вынес поиск номенклатуры в отдельную функцию на Сервере:

&НаСервере
Функция НайтиНаСервере(КодН,Номенклатура1)
	Сообщить(""+КодН+":"+ТипЗнч(КодН));
	Номенклатура1 = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(КодН));
	Если (Номенклатура1 = Неопределено) или (Номенклатура1.Пустая()) Тогда
		КодН = СтрЗаменить(КодН,Символ(160)," ");
		Номенклатура1 = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(КодН));
	КонецЕсли;
	Сообщить(Номенклатура1);
	Возврат Номенклатура1;
КонецФункции
Показать

получаю код как строку: Код = Строка(Число(Спис[7])); и передаю в функцию.
сначала ищу как получилось с символом Триад.
потом символ Триад меняю на пробел у тех позиций, у которых номер не понятно как заводили.

так заполнилось 650 строк.
3 не заполнились, потому что у них код 12345 - без пробела и символа триад - буду выяснять сколько их и "причесывать"
21. oleg-x 26 14.12.18 11:13 Сейчас в теме
(14) Пробел у кода получается при преобразование числа в строку, убирается так:
Сумма = СтрЗаменить(Сумма,Символы.НПП,"");
5. YannikAlx 43 13.12.18 11:59 Сейчас в теме
В серверном варианте необходимо включить отладку на сервере, чтобы отладчик работал...
-debug в строке запуска сервера 1С

Не заполняется в серверном вароианте скорее всего потому , что поиск номенклатуры необходимо делать в процедуре, выполняемой на сервере, а вы ищете на клиенте возможно...
7. YannikAlx 43 13.12.18 12:14 Сейчас в теме
У вас нет четкого понимания, какие процедуры можно выполнять на клиенте, а какие только на сервере....
желательно у каждой процедуры иметь четкое указание, где она будет выполняться, тогда вам же будет проще видеть что не так.
работать со справочниками можно только на сервере...
У вас поиск идет как раз в справочнике, а процедура пытается выполниться на клиенте...

Проверьте синтаксис контроль в серверном варианте - ошибки необходимо все исправить.
Хотя с вашими ошибками в файловом варианте все будет работать - потому что там нет разницы - клиент-сервер...
olga1512; alex-l19041; +2 Ответить
22. nestokay 62 14.12.18 14:31 Сейчас в теме
На сервере отладчик включен?
23. RSA512 16.12.18 02:32 Сейчас в теме
что как-то тут все запутано =)
из всех возможных проблем с поиском кодов Справочники.Номенклатура.НайтиПоКоду(Товар.Код) можно перечислить :
1. пробелы между символами кода лечится функцией СтрЗаменить() или Формат()
2. разная длина кодов как писал starjevschik добавь нули =) Прав("00000000"+ КОД, ДлинаКода)

З.Ы, отладка в помощь
24. olga1512 6 21.12.18 17:43 Сейчас в теме
1. нужно создать функцию на сервере которая будет искать элемент по коду и возвращать ссылку
2.На клиенте обратиться к ней и дальше уже ваши послед дейтсвия

не все выражения срабатывают в упр формах так в лоб как в обычном приложении. в правке посмотрите где можно использовать данную функцию :


сервер, толстый клиент...

СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
НайтиПоКоду (FindByCode)
Синтаксис:

НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
Параметры:

<Код> (обязательный)

Тип: Число; Строка.
Искомый код.
Строка или число в зависимости от настроек справочника в конфигураторе.
<ПоискПоПолномуКоду> (необязательный)

Тип: Булево.
Определяет режим поиска по полному коду. Истина - искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом "/".
Значение по умолчанию: Ложь
<Родитель> (необязательный)

Тип: СправочникСсылка.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
<Владелец> (необязательный)

Тип: СправочникСсылка.
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Возвращаемое значение:

Тип: СправочникСсылка.<Имя справочника>; Неопределено.
Если не существует ни одного элемента с требуемым кодом, то будет возвращена пустая ссылка.
Если для справочника код не задан (длина = 0), то будет возвращено Неопределено.
Описание:

Осуществляет поиск элемента по его коду.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот