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

04.05.18

Задачи пользователя - Поиск данных

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

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

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

Часть 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

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

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

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

9600 руб.

14.05.2012    155134    324    252    

556

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42473    10    24    

38

Поиск номенклатуры в интернете (Розница 2.3, Управление торговлей 11.4)

Розничная торговля WEB-интеграция Поиск данных Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Альтернатива сервису 1С Номенклатура, не требует подписки ИТС, ищет данные в открытых источниках. Для поиска товара по штрихкоду в сети интернет, полезно для первоначального заполнения базы.

1999 руб.

15.10.2020    18389    22    63    

23

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3890    ke.92@mail.ru    16    

60

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8570    YA_418728146    6    

139

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2024    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16020    131    sapervodichka    112    

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

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

<Данные>

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

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

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

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

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


Если так - то ещё не понятно, что лучше написать - свой костыль по получению номера для каждого типа документов, где стандартное представление изменено, или заморочиться на универсальность, что, на мой взгляд, не стоит затраченных усилий и результата
7. admrez 21 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 21 15.06.18 17:39 Сейчас в теме
Если подать в виде Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07 - то тогда определяется документ. Но теряется смысл обработки. Как можно обойти все, что после запятой?
9. admrez 21 15.06.18 17:47 Сейчас в теме
Изменили в отчеты формат вывода - вроде стало получаться. Жизненно необходима фича
1. Убрать первые символы в строке в количестве N штук
2. Убрать последние символы в строке в количестве N штук
10. GOshaSaveiko 38 15.06.18 23:54 Сейчас в теме
(9) добрый день. Таки да. Строка первоначально не выглядела как представление документа. Он бы вам ничего не нашел. Обычно есть способ вывести только регистратор. Если он вывел дополнительно дату через запятую, то в настройках отчёта можно попросить не выводить реквизиты в отдельной колонке. Либо сформировать отчёт без поля дата. Код обработки расписан очень подробно и вашу просьбу вы можете легко дописать самостоятельно в одну строчку кода, либо подготовить данные в excel. Я учту ваши пожелания, если соберусь переписывать обработку для получения документов с кастомным представлением. Спасибо.
11. Adiga126 31 19.12.21 19:53 Сейчас в теме
Здравствуйте. Не хватает функции СтрокаВМассивСтрок()
12. GOshaSaveiko 38 22.12.21 13:59 Сейчас в теме
(11), в самой обработке она, конечно есть. Тут просто описан принцип, для тех, кто может и хочет сэкономить $m. Я не сомневаюсь, что вы можете написать ее самостоятельно.
13. Adiga126 31 01.01.22 19:36 Сейчас в теме
Конечно. Применил для своей обработки. Спасибо. Очень помогла ваша публикация.
Оставьте свое сообщение