Функция поиска по нескольким словам в макете

Функция была написана для поиска строки «Универсальный передаточный документ». Иногда эта строка переносится на другие строки через символ перевода строки, иногда пишется через пробелы. Пришлось написать свою функцию поиска.

Несмотря на свои возможности, она работает быстро, потому что базируется на типовом поиске.

Функция НайтиОбластиСТекстами(ТД, М, ИгнорироватьРегистр = истина)
	
	ИскОбласть = Неопределено;
	Пока Истина Цикл
		ИскОбласть = ТД.НайтиТекст(М[0]
		,ИскОбласть,,, ложь,Истина, ИгнорироватьРегистр); //Не точное соответствие, Вперед, Игнорировать регистр, начиная с ИскОбласть
		Если ИскОбласть = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;          
		Если ИгнорироватьРегистр Тогда
			Текст = ВРЕГ(ИскОбласть.Текст);
		Иначе                              
			Текст = ИскОбласть.Текст;
		КонецЕсли;      
		Найдено = истина;
		Для Инд = 2 ПО М.Количество() Цикл   
			Искомое = М[Инд-1];
			Если ИгнорироватьРегистр Тогда
				Искомое = ВРЕГ(Искомое);
			КонецЕсли;
			Если Найти(Текст, Искомое) = 0 Тогда
				Найдено = ложь;
				Прервать; //Строка не подходит
			КонецЕсли;
		КонецЦикла;           
		Если Найдено Тогда
			Возврат ИскОбласть;
		КонецЕсли;
	КонецЦикла;
	
КонецФункции

Примеры использования в коде разбора УПД из Excel:

	ИскОбласть = НайтиОбластиСТекстами(ТД, 	СтрРазделить("Универсальный;передаточный;документ", ";"));	
	
	Если ИскОбласть = Неопределено Тогда
		Р.Текст = "Не найден текст ""Универсальный передаточный документ""";
		Р.ЭтоУПД = ложь;
		Возврат Р;
	КонецЕсли;    
	
	Р.ЭтоУПД = Истина;
	
	//Ищем заголовок документа Универсальный передаточный документ
	ИскОбласть = ТД.НайтиТекст(
	"Счет-фактура №", ,,, истина); //Ячейку целиком
	
	Если ИскОбласть = Неопределено Тогда
		Р.Текст = "Не найден текст ""Счет-фактура №""";
		Р.ЭтоУПД = ложь;
		Возврат Р;
	КонецЕсли;       
	
	//Скорее всего это УПД
	Р.ЭтоУПД = Истина;   
	
	//Это УПД от поставщика, тут ищем его ИНН/КПП
	ИскОбласть = ТД.НайтиТекст(
	"ИНН/КПП продавца:", ,,, истина); //Ячейку целиком
	Если ИскОбласть = Неопределено Тогда
		Р.Текст = "Не найден текст ""ИНН/КПП продавца:""";
		Р.ЭтоУПД = ложь;
		Возврат Р;
	КонецЕсли;           
	
	ИННКППТекст = ОбластьСправа(ТД, ИскОбласть).Текст; 
	ИННКПП = РазбитьИННКППЧерезДробь(ИННКППТекст);
	ИскКонтрагент = НайтиКонтрагентаПоИННКПП(ИННКПП.ИНН, ИННКПП.КПП);
	Если Не ЗначениеЗаполнено(ИскКонтрагент) Тогда   
		Р.ОК = ложь;
		Р.Текст = "Не найден контрагент по ИНН/КПП: " + ИННКППТекст;
		Возврат Р;
	КонецЕсли;
		
	Сообщить("    Контрагент: " + ИскКонтрагент + " ИНН/КПП: " + ИННКППТекст);

	
	ИскОбласть = ТД.НайтиТекст(
	"№ п/п", ,,, истина); //Ячейку целиком
	Если ИскОбласть = Неопределено Тогда
		Р.ОК = ложь;
		Р.Текст = "Не найдена область ""№ п/п""";
		Возврат Р;
	КонецЕсли;           
	КолонкаНомераПП = ИскОбласть.Лево;
	
	НачальнаяСтрокаТоваров = ИскОбласть.Верх + 1;
	
	ИскОбласть = НайтиОбластиСТекстами(ТД, 	СтрРазделить("Код;товара;работ;услуг", ";"));	
	Если ИскОбласть = Неопределено Тогда
		Р.ОК = ложь;
		Р.Текст = "Не найдена область ""Код товара работ услуг""";
		Возврат Р;
	КонецЕсли;           
	КолонкаКодаТовара = ИскОбласть.Лево;

	ИскОбласть = НайтиОбластиСТекстами(ТД, 	СтрРазделить("Наименование;товара;описание;выполненных;работ", ";"));	
	Если ИскОбласть = Неопределено Тогда
		Р.ОК = ложь;
		Р.Текст = "Не найдена область ""Наименование товара описание выполненных работ""";
		Возврат Р;
	КонецЕсли;           
	КолонкаНаименованияТовара = ИскОбласть.Лево;
	
	ИскОбласть = НайтиОбластиСТекстами(ТД, 	СтрРазделить("Коли;чество;объем", ";"));	
	Если ИскОбласть = Неопределено Тогда
		Р.ОК = ложь;
		Р.Текст = "Не найдена область ""Коли чество объем""";
		Возврат Р;
	КонецЕсли;           
	КолонкаКоличестваТовара = ИскОбласть.Лево;  
	
	ИскОбласть = НайтиОбластиСТекстами(ТД, 	СтрРазделить("Цена;тариф;за;единицу;измерения", ";"));	
	Если ИскОбласть = Неопределено Тогда
		Р.ОК = ложь;
		Р.Текст = "Не найдена область ""Цена тариф за единицу измерения""";
		Возврат Р;
	КонецЕсли;           
	КолонкаЦенаТовара = ИскОбласть.Лево;  

	
		ИскОбласть = НайтиОбластиСТекстами(ТД, 	СтрРазделить("Стоимость;товаров;с;налогом;всего", ";"));	
	Если ИскОбласть = Неопределено Тогда
		Р.ОК = ложь;
		Р.Текст = "Не найдена область ""Стоимость товаров с налогом всего""";
		Возврат Р;
	КонецЕсли;           
	КолонкаСуммаТовара = ИскОбласть.Лево;  

В принципе, можно доработать, чтобы искала последовательные слова, но и так нормально работает.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. Дыкелыпалы:

    На каком типовом поиске?! и что значит типовой поиск?! мил человек, ты бы написал, какой это поиск, линейный, нелинейный, за какое О(N)…., а то быстро, и типовой. Ну да быстро….

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *