IE 2018

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

Обработки - Обработка документов

обработка управляемые формы

5
В этой публикации описан способ поиска документов по представлению. Очень полезен бывает, когда вы получаете отчет со списком документов, с которыми вам потом нужно что-то сделать, например перепровести пачкой, или ещё чего. Как обычно в своём стиле, не претендуя на нетленку, выкладываю странный, но бесплатный и работающий код с пояснениями. Вы можете использовать его где хотите, и делать с ним что хотите.

Часть 1. Многабукаф

Кому лень читать - можно сразу скроллить вниз к обработке.

Итак, задача поставлена, и теперь нам нужно понять, являются ли входящие строки представлениями документов.

Тут на помощь приходят регулярные выражения и шикарная публикация: Регулярные выражения без внешних компонент? Легко!

Точка входа в самом низу ОбработатьДокументы(МассивПредставлений) ей мы отдаем массив строк представлений.

&НаКлиенте
Функция ПостроитьФабрикуXDTO(Фасет)
	Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(
                "<Model xmlns=""http://v8.1c.ru/8.1/xdto"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""Model"">
                |<package targetNamespace=""sample-my-package"">
                |<valueType name=""testtypes"" base=""xs:string"">
                |<pattern>" + Фасет + "</pattern>
                |</valueType>
                |<objectType name=""TestObj"">
                |<property xmlns:d4p1=""sample-my-package"" name=""TestItem"" type=""d4p1:testtypes""/>
                |</objectType>
                |</package>
                |</Model>");

    Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
    МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
    Пакет = МояФабрикаXDTO.Пакеты.Получить("sample-my-package");
    Тест = МояФабрикаXDTO.Создать(Пакет.Получить("TestObj"));
	
	Возврат Тест;
КонецФункции

&НаКлиенте
Функция ПроверитьСтроку(Фабрика, Строка)
    Попытка
        Фабрика.TestItem = Строка;
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

&НаКлиенте
Функция ПроверитьПредставление(Фабрика, ДокументСтрокой)
	Возврат ПроверитьСтроку(Фабрика,ДокументСтрокой);
КонецФункции

&НаКлиенте
Функция ОбработатьДокументы(МассивПредставлений)
	ДокументыКОбработке = Новый Массив;
	
	Фабрика = ПостроитьФабрикуXDTO(".*\sот\s\d{2}\.\d{2}.\d{4}\s\d{1,2}:\d{2}:\d{2}");
	
	Для Каждого ДокументСтрокой ИЗ МассивПредставлений Цикл
		Если СокрЛП(ДокументСтрокой) = "" тогда
			Продолжить;
		КонецЕсли;
		ДокументСтрокойСЛП = СокрЛП(ДокументСтрокой);
		Если ПроверитьПредставление(Фабрика,ДокументСтрокойСЛП) тогда
			ДокументыКОбработке.Добавить(ДокументСтрокойСЛП);
		Иначе
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Строка """+ДокументСтрокойСЛП+""" не выглядит как представление документа";
			Сообщение.Сообщить();
		КонецЕсли;
	КонецЦикла;
	
	Результат = ОбработатьДокументыСервер(ДокументыКОбработке);
	
	Возврат Результат;
КонецФункции

Как вы знаете, строка документа состоит из синонима документа, номера и даты. Для определения вида документа по синониму построим список синонимов документов конфигурации:

&НаСервере
Функция ПолучитьТЗМетаданныхДокументов()
	КвалификаторыСтроки = Новый КвалификаторыСтроки(250);
    ОписаниеСтроки = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
	
	КвалификаторыЧисла = Новый КвалификаторыЧисла(3, 0, ДопустимыйЗнак.Неотрицательный);
    ОписаниеЧисла = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
	
	ТЗМетаданные = Новый ТаблицаЗначений;
	ТЗМетаданные.Колонки.Добавить("Имя", ОписаниеСтроки);
	ТЗМетаданные.Колонки.Добавить("Синоним", ОписаниеСтроки);
	ТЗМетаданные.Колонки.Добавить("Вес", ОписаниеЧисла);
	
	Для Каждого ЭлементМетаданных ИЗ Метаданные.Документы Цикл
		НС = ТЗМетаданные.Добавить();
		ЗаполнитьЗначенияСвойств(НС,ЭлементМетаданных);
		НС.Вес = СтрДлина(ЭлементМетаданных.Синоним);
		Если ЗначениеЗаполнено(ЭлементМетаданных.ПредставлениеОбъекта) Тогда
			НС.Синоним = ЭлементМетаданных.ПредставлениеОбъекта;
		КонецЕсли;
	КонецЦикла;
	
	ТЗМетаданные.Сортировать("Вес Убыв,Синоним");
	Возврат ТЗМетаданные;
КонецФункции

Тут всё просто - пробежались по метаданным документов, собрали все синонимы и имена документов и отсортировали по убыванию длины строки. Большой соблазн сразу разбить строку представления по " от ", но бывают синонимы документов, которые содержат " от " в своем тексте, например "Приход товаров от поставщика 1 от 03.05.2018 00:00:00". Поэтому искать будем от максимальной длины строки. Кто-то может захотеть искать последний " от " в представлении, но мне захотелось так.

Ну и, наконец, собираем всё в кучку:

//Возвращает документ по имени, номеру и дате
&НаСервере
Функция ВернутьДок(Имя,НомерДок,ДатаДок)
	Возврат Документы[Имя].НайтиПоНомеру(НомерДок,ДатаДок);
КонецФункции

&НаСервере
Функция ОбработатьДокументыСервер(СписокПредставлений)
	//Построили ТЗ синонимов и имен документов
	ТЗМетаданных = ПолучитьТЗМетаданныхДокументов();
	МассивСсылок = Новый Массив; ///Пустой массив результата
	//Для каждой строки из списка представлений
	Для Каждого ПредставлениеДок ИЗ СписокПредставлений Цикл
		//Пробегаем по имеющимся синонимам метаданных от самых длинных
		//Тут, конечно, можно покопаться с грязной строкой и не бегать
		//по ТЗ синонимов, а получить просто отбором, но мне лень
		Для Каждого ШаблонПоиска ИЗ ТЗМетаданных Цикл
			//и прикладываем к имеющейся "грязной" строке документа
			Если Найти(ПредставлениеДок,ШаблонПоиска.Синоним) Тогда
				//Если нашли - исключаем из неё синоним,
				//Теперь нужно получить из хвоста номер и дату
				СтрокаНомерДата = СокрЛП(СтрЗаменить(ПредставлениеДок,ШаблонПоиска.Синоним,""));
				//Разбили по " от " хвост. В первом элементе массива номер - во втором дата
				МассивНомерДата = СтрокаВМассивСтрок(СтрокаНомердата," от ");
				НомерДок = СокрЛП(МассивНомерДата[0]);
				//Пересоберем дату строкой к типу Дата 1С
				СтрокаДата = СокрЛП(МассивНомерДата[1]);
				ДатаПоЭлементам = СтрЗаменить(СтрЗаменить(СтрокаДата," ",":"),".",":");
				МассивЭлементовДаты = СтрокаВМассивСтрок(ДатаПоЭлементам,":");
				//02.06.2017 16:02:44
				// 0  1    2  3  4  5
				ДатаДок = Дата(МассивЭлементовДаты[2],МассивЭлементовДаты[1],МассивЭлементовДаты[0],
				  	       МассивЭлементовДаты[3],МассивЭлементовДаты[4],МассивЭлементовДаты[5]);
				//Получим нужный документ	
				НайденныйДок = ВернутьДок(ШаблонПоиска.Имя,НомерДок,ДатаДок);
				Если ЗначениеЗаполнено(НайденныйДок) Тогда
					//Нашли и добавили в массив ссылок
					МассивСсылок.Добавить(НайденныйДок);
				Иначе
					Сообщение = Новый СообщениеПользователю;
					Сообщение.Текст = "Документ """+ПредставлениеДок+""" не найден";
					Сообщение.Сообщить();
				КонецЕсли;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат МассивСсылок;
КонецФункции

Ну вот, вкратце, так. Вы можете использовать куски кода и написать свою обработку, а можете скачать за 1$m нижеописанную обработку, чем порадуете меня и сэкономите свое время.

Часть 2. Обработка

Итак, для ленивых, и тех, кто просто хочет поделиться $m.

Так как обычно я нищенствую, я не знаю, чем обработка отличается от других, присутствующих на инфостарте, ибо я их не скачивал.

Тестировалась на платформах: 8.2.19+, 8.3.11

Эта обработка была создана, чтобы искать ссылки на документы по текстовому представлению, допустим из сообщений или отчетов, и:
- в разных позах перепроводить найденные документы;
- сдвигать выбранные документы на заданное количество секунд вместе с движениями, что иногда бывает полезно при выстраивании правильных последовательностей. Эта часть функционала работает так, как Пакетный сдвиг документов по дате, со всеми вытекающими последствиями и предупреждениями, почитайте, пожалуйста, и загляните в код, чтобы вы понимали что именно она делает с вашими движениями.

5

Скачать файлы

Наименование Файл Версия Размер
Обработка документов по представлению
.epf 13,28Kb
04.05.18
3
.epf 1.0.1 13,28Kb 3 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. paulpit 20 04.05.18 15:04 Сейчас в теме
Если в представлении документа в скобках прописан вид операции, то так понимаю, такой документ не идентифицируется?
2. GOshaSaveiko 27 04.05.18 15:10 Сейчас в теме
(1) Можете строку с таким документом показать, пожалуйста?
Может получиться так, что найдется. Если синоним документа присутствует в представлении документа, то он, поочерёдно прикладывая синонимы из метаданных определит вид документа. Правда, могут возникнуть трудности потом с нахожденеим номера. Напишите мне свою электропочту в личку - я скину вам обработку - протестируем.
3. paulpit 20 04.05.18 15:44 Сейчас в теме
(2)paulpit@yandex.ru пока не могу найти, но помню раньше встречал вид операции в представлении документа.
Еще не смогли найти Счет-фактура выданный на аванс NNNNN (А) от 31.03.2018 23:59:59
(А) - мешается.
4. GOshaSaveiko 27 04.05.18 15:54 Сейчас в теме
(3) есть подозрение, что это номер видоизменяется. То есть в форме номер - синтетический, а-ля "НомерДок". А реальный номер документа NNNNN (А) с видимостью 0
отправил на почту.
5. paulpit 20 04.05.18 15:58 Сейчас в теме
(4) Постфикс (А) - это требование законодательства по НДС.
6. GOshaSaveiko 27 04.05.18 16:10 Сейчас в теме
(5) Или ото https://its.1c.ru/db/v8312doc#bookmark:dev:TI000000279:
ДокументМенеджер.<Имя документа>.ОбработкаПолученияПредставления (DocumentManager.<Имя документа>.PresentationGetProcessing)
ДокументМенеджер.<Имя документа> (DocumentManager.<Имя документа>)
ОбработкаПолученияПредставления (PresentationGetProcessing)
Синтаксис:

ОбработкаПолученияПредставления(<Данные>, <Представление>, <СтандартнаяОбработка>)
Параметры:

<Данные>

Тип: Структура.
Содержит значения полей, из которых формируется представление.
<Представление>

Тип: Строка.
Строка, в которую нужно поместить представление объекта или ссылки.
<СтандартнаяОбработка>

Тип: Булево.
В данный параметр передается признак формирования стандартного представления объекта или ссылки.
Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Значение по умолчанию: Истина.
Описание:

Вызывается при получении представления объекта или ссылки.
Замечание:

Безопасный режим на время исполнения данного обработчика будет отключен. Данное замечание не относится к обработчикам событий, расположенным в расширении конфигурации.
Показать


Если так - то ещё не понятно, что лучше написать - свой костыль по получению номера для каждого типа документов, где стандартное представление изменено, или заморочиться на универсальность, что, на мой взгляд, не стоит затраченных усилий и результата
7. admrez 12 15.06.18 17:29 Сейчас в теме
Сформировал отчет дебиторская задолженность по срокам долга. Скормил обработке список из отчета, но документы не определились - пишет "строка не выглядит ка представление документа"
Идея отчета очень интересная и нужная.

Может я что-то делаю не так?

УТ11.4.3.174
Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07, 19.07.2016 20:33:07
Реализация товаров и услуг ДНТА-000622 от 28.07.2016 16:00:46, 28.07.2016 16:00:46
Реализация товаров и услуг ДНТА-000687 от 16.08.2016 20:04:34, 16.08.2016 20:04:34
Реализация товаров и услуг ДНТА-000741 от 01.09.2016 18:52:31, 01.09.2016 18:52:31
Реализация товаров и услуг ДНТА-000805 от 15.09.2016 21:28:45, 15.09.2016 21:28:45
8. admrez 12 15.06.18 17:39 Сейчас в теме
Если подать в виде Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07 - то тогда определяется документ. Но теряется смысл обработки. Как можно обойти все, что после запятой?
9. admrez 12 15.06.18 17:47 Сейчас в теме
Изменили в отчеты формат вывода - вроде стало получаться. Жизненно необходима фича
1. Убрать первые символы в строке в количестве N штук
2. Убрать последние символы в строке в количестве N штук
10. GOshaSaveiko 27 15.06.18 23:54 Сейчас в теме
(9) добрый день. Таки да. Строка первоначально не выглядела как представление документа. Он бы вам ничего не нашел. Обычно есть способ вывести только регистратор. Если он вывел дополнительно дату через запятую, то в настройках отчёта можно попросить не выводить реквизиты в отдельной колонке. Либо сформировать отчёт без поля дата. Код обработки расписан очень подробно и вашу просьбу вы можете легко дописать самостоятельно в одну строчку кода, либо подготовить данные в excel. Я учту ваши пожелания, если соберусь переписывать обработку для получения документов с кастомным представлением. Спасибо.
Оставьте свое сообщение