Почему может на работать НайтиПоНомеру()?

1. zhenyat 6 18.11.21 12:45 Сейчас в теме
Здравствуйте.
Покажу кусочек из Табло отладки:

ИщемНомер = "ТИ003965"
ИщемДату = '24.09.21'

объект.НайтиПоНомеру(ИщемНомер, ИщемДату) = 0
объект.НайтиПоНомеру( "ТИ003965", '24.09.21') = 1


Почему когда в метод поставляется переменные - документ не находится, а если подставить значения переменных - то находится?
Я не понимать :(
По теме из базы знаний
Найденные решения
8. spacecraft 18.11.21 14:06 Сейчас в теме
(4)
Код разбирает текстовую строку типа "Оплата за товар (чайники) по сч.№ТИ003965 от 24.09.21"

(4)
Год = Сред(Месяц_Год, ПозицияТочки + 1);

ИщемДату = Дата(Число(Год), Число(Месяц), Число(День));

Год получается 21, а не 2021. Сделайте проверку на количество цифр в году и если только 2, то добавьте до полного значения года.
user1671936; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. user1671936 1 18.11.21 13:39 Сейчас в теме
(1) Добрый день. У вас именно так прописано в коде : ИщемНомер = "ТИ003965"
ИщемДату = '24.09.21'? Ошибок никаких не выдает при проверке? Так попробуйте ИщемДату = Дата('20210924').
4. zhenyat 6 18.11.21 13:47 Сейчас в теме
(3) Не совсем так, эти переменные вычисляются
Самое интересное что некоторые документы таки находятся!

Код разбирает текстовую строку типа "Оплата за товар (чайники) по сч.№ТИ003965 от 24.09.21" из платёжного поручения для вычленения документа по которому пришла оплата

Вот полный код:
			//{Поиск документа			
			ИщемНомер = "";
			ИщемДату = "";
			
			спсМесяцыСтрокой = СоздатьОбъект("СписокЗначений");
			спсМесяцыСтрокой.ДобавитьЗначение(1, "янв");
			спсМесяцыСтрокой.ДобавитьЗначение(2, "фев");
			спсМесяцыСтрокой.ДобавитьЗначение(3, "мар");
			спсМесяцыСтрокой.ДобавитьЗначение(4, "апр");
			спсМесяцыСтрокой.ДобавитьЗначение(5, "мая");
			спсМесяцыСтрокой.ДобавитьЗначение(6, "июн");
			спсМесяцыСтрокой.ДобавитьЗначение(7, "июл");
			спсМесяцыСтрокой.ДобавитьЗначение(8, "авг");
			спсМесяцыСтрокой.ДобавитьЗначение(9, "сен");
			спсМесяцыСтрокой.ДобавитьЗначение(10, "окт");
			спсМесяцыСтрокой.ДобавитьЗначение(11, "ноя");
			спсМесяцыСтрокой.ДобавитьЗначение(12, "дек");

			ПозицияНомера = Найти(Назначение, "№");
			Позиция_от_ = Найти(Назначение, " от ");
			
			Если ПозицияНомера <> 0 Тогда
				ИщемНомер = СокрЛП(Сред(Назначение, ПозицияНомера + 1, Позиция_от_ - ПозицияНомера));
			КонецЕсли;
			
			Если Позиция_от_ <> 0 Тогда

				ИщемДату = Сред(Назначение, Позиция_от_ + 4, 16);  //максимум 16 символов, если месяц строкой "сентября"
				ИщемДату = СтрЗаменить(ИщемДату, " ", ".");  //заменяем возможные пробелы на "."

				ПозицияТочки =  Найти(ИщемДату, ".");
				День = Лев(ИщемДату, ПозицияТочки - 1);
				Месяц_Год = Сред(ИщемДату, ПозицияТочки + 1);
				
				ПозицияТочки =  Найти(Месяц_Год, ".");
				Месяц = Лев(Месяц_Год, ПозицияТочки - 1);
				Если Число(Месяц) = 0 Тогда  //значит месяц прописью
					Месяц = спсМесяцыСтрокой.Получить(Нрег(Лев(Месяц, 3)));
				КонецЕсли;
					
				Год = Сред(Месяц_Год, ПозицияТочки + 1);
				
				ИщемДату = Дата(Число(Год), Число(Месяц), Число(День));
				
			КонецЕсли;

			Если Найти(Нрег(Назначение), "фактур") > 0 Тогда
				//ищем фактуру
				объект = СоздатьОбъект("Документ.СчетФактураН");
				Сообщить("Ищем " + объект.Вид() + " №" + ИщемНомер + " от " + ИщемДату);
				Если объект.НайтиПоНомеру(ИщемНомер, ИщемДату) = 1 Тогда
					Сообщить("..найден!");					
					Конт.ДокументПоставки = объект.ДокументОснование;
					Договор = объект.ДокументОснование.Договор;
				Иначе
					Сообщить("..не найден!", "!");
				КонецЕсли;
			ИначеЕсли Найти(Нрег(Назначение), "накладн") > 0 Тогда
				//ищем накладную
				объект = СоздатьОбъект("Документ.РасходнаяНакладная");
				Сообщить("Ищем " + объект.Вид() + " №" + ИщемНомер + " от " + ИщемДату);
				Если объект.НайтиПоНомеру(ИщемНомер, ИщемДату) = 1 Тогда
					Сообщить("..найден!");					
					Конт.ДокументПоставки = объект.ТекущийДокумент();
					Договор = объект.Договор;
				Иначе
					Сообщить("..не найден!", "!");
				КонецЕсли;
			ИначеЕсли (Найти(Нрег(Назначение), "счет") > 0) или (Найти(Нрег(Назначение), "сч.") > 0) Тогда
				//ищем счет
				объект = СоздатьОбъект("Документ.Счет");
				Сообщить("Ищем " + объект.Вид() + " №" + ИщемНомер + " от " + ИщемДату);
				Если объект.НайтиПоНомеру(ИщемНомер, ИщемДату) = 1 Тогда
					Сообщить("..найден!");					
					Конт.ДокументПоставки = объект.ТекущийДокумент();
					Договор = объект.Договор;
				Иначе
					Сообщить("..не найден!", "!");
				КонецЕсли;
			КонецЕсли;
Показать
8. spacecraft 18.11.21 14:06 Сейчас в теме
(4)
Код разбирает текстовую строку типа "Оплата за товар (чайники) по сч.№ТИ003965 от 24.09.21"

(4)
Год = Сред(Месяц_Год, ПозицияТочки + 1);

ИщемДату = Дата(Число(Год), Число(Месяц), Число(День));

Год получается 21, а не 2021. Сделайте проверку на количество цифр в году и если только 2, то добавьте до полного значения года.
user1671936; +1 Ответить
11. zhenyat 6 18.11.21 15:04 Сейчас в теме
(8)Хм, а почему тогда если значение '24.09.21' подставить напрямую, не через переменную - то документ находится?
13. spacecraft 18.11.21 15:15 Сейчас в теме
(11) в настройка 1С указано использовать 2 знака в качестве года. В таком случае ('24.09.21') он похоже 21 воспринимает правильно. А когда указываете в конструкторе Год(21), то он будет восприниматься дословно как 21 год.
14. zhenyat 6 18.11.21 15:15 Сейчас в теме
12. zhenyat 6 18.11.21 15:15 Сейчас в теме
(8)Спасибо, вы оказались правы, переделала кусок на
				Год = Число(Сред(Месяц_Год, ПозицияТочки + 1));
				Если СтрДлина(Год) < 4 Тогда
					Год = "20" + Год;
				КонецЕсли;
				
				ИщемДату = Дата(Число(Год), Число(Месяц), Число(День));

И всё заработало!
Иваныч; +1 Ответить
2. Airlord 18.11.21 13:04 Сейчас в теме
Добрый день! значит что-то в переменные передается не так.
5. zhenyat 6 18.11.21 13:51 Сейчас в теме
(2)В табло отладки во вторую строку "объект.НайтиПоНомеру()" я не ручками набрала номер и даьу, а скопипастила значения переменных из того же табло.
:(
6. user1671936 1 18.11.21 14:03 Сейчас в теме
(5) Как вариант у вас не заходит в условие Если Позиция_от_ <> 0 , где и определяется дата, соответственно при поиске значение "ИщемДату" пустое.
7. user1671936 1 18.11.21 14:05 Сейчас в теме
(5) если же в это условие заходит, то посмотрите, какое значение у строки ИщемДату = Дата(Число(Год), Число(Месяц), Число(День));
9. user1671936 1 18.11.21 14:20 Сейчас в теме
(5) Если в данной строке дата со времене ( если мне память не изменяет, то формат у нее должен быть такой 24.09.2021 0:00:00), а в документе дата без времени стоит, то не найдет документы.Вам нужно будет тогда вот эту часть кода закомментить

 ИщемДату = Сред(Назначение, Позиция_от_ + 4, 16);  //максимум 16 символов, если месяц строкой "сентября"
                ИщемДату = СтрЗаменить(ИщемДату, " ", ".");  //заменяем возможные пробелы на "."

                ПозицияТочки =  Найти(ИщемДату, ".");
                День = Лев(ИщемДату, ПозицияТочки - 1);
                Месяц_Год = Сред(ИщемДату, ПозицияТочки + 1);
                
                ПозицияТочки =  Найти(Месяц_Год, ".");
                Месяц = Лев(Месяц_Год, ПозицияТочки - 1);
                Если Число(Месяц) = 0 Тогда  //значит месяц прописью
                    Месяц = спсМесяцыСтрокой.Получить(Нрег(Лев(Месяц, 3)));
                КонецЕсли;
Показать


Так как она теряет смысл, а уже в полученном результате искать символ ":" и вычетать 3 символа

ДатаВремя = Дата(Число(Год), Число(Месяц), Число(День));
Символ = Найти(ДатаВремя, ":");
ИщемДату = Лев(ДатаВремя, Символ-3) ;
15. zhenyat 6 18.11.21 15:24 Сейчас в теме
(9)Нет, в 7-ке Дата - это только дата, без времени :(
10. meriferi 18.11.21 15:00 Сейчас в теме
ИщемДату = Дата(1,1,1);
Поставьте условие, если дата осталась пустой, то поиск только по номеру
16. Airlord 18.11.21 16:08 Сейчас в теме
А не пробовали "разбирать" строку по принципу Арабской вязи - "справа - налево"? СокрЛП(ПоисковаяСтрока) и вперед. за что оплачено - последняя инфа, которая нужна.
17. zhenyat 6 22.11.21 12:54 Сейчас в теме
(16)не совсем поняла мысль :(, на самом же деле строка не заканчивается на дате документа, там же ещё много информации не нужной - ндс и пр.
18. Airlord 22.11.21 15:55 Сейчас в теме
(17)Добрый день! Понял. Но если там много информации, то наверное есть какая-то маска строки - по ней и разбирать.
19. zhenyat 6 25.11.21 18:02 Сейчас в теме
(18)Ну вообще то говоря наверное какая то маска есть - большинство клиентов готовит платёжные документы в какой-нибудь 1С-ке, где эта строка более-менее формализована, но не у всех же 1С, так что пришлось извращаться - вон в итоге попались строки в которых перед номером документа не оказалось символа "№" - пришлось определять слово с номером документа по префиксу...
Оставьте свое сообщение

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