Для целей автоматического сопоставления справочников из разных баз данных при загрузке табличных частей документов была написана эта функция, к которой в итоге был прикручен визуальный интерфейс. На практике вполне оправдала себя и позволила за разумное время автоматически заполнять большие документы.
Файлы
ВНИМАНИЕ:
Файлы из Базы знаний - это исходный код разработки.
Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы.
Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных.
Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже
заказов».
0% комиссии — оплата напрямую исполнителю;
Исполнители любого масштаба — от отдельных специалистов до команд под проект;
Прямой обмен контактами между заказчиком и исполнителем;
Безопасная сделка — при необходимости;
Рейтинги, кейсы и прозрачная система откликов.
В основе лежит функция нечеткого сравнения, разбивающая искомую строку на части, последовательно уменьшающиеся в длине, начиная с полной длины искомого, и ищущая совпадение в строке сравнения. Если совпадение найдено, совпадающие части удаляются из обеих строк, и происходит рекурсивное обращение к самой себе с накоплением результатов совпадения вплоть до размера искомых строк в 2 символа.
Результатом является рейтинг совпадения, который потом переводится в %. Параметрами же самой функции поиска является в том числе значение требуемой достоверности, а также временной таймаут, а возвращает она в случае успеха ссылку на элемент справочника.
Процедура написана на языке 1С, потому не является оптимизированной по скорости, но со своими задачами вполне справляется на справочнике порядка 7000 элементов.
Для интерактивного ее варианта (и отладки) было добавлено отображение списка 20 лучших результатов с рейтингами и подстроками совпадения.
История версий:
1.02
Отбор без групп удален из запроса, выведен в цикл перебора результатов (вызывал ошибку в справочниках без групп)
Достоверность по умолчанию установлена в 80% (при 0% - была ошибка)
Полный контроль над изменениями в 1С без нагрузки на вашу базу. Мгновенный доступ к истории изменений, удобное сравнение и откат данных в один клик.
Простой отчет с визуальным отображением изменений
Откат на любую версию объекта в два клика
История изменения данных хранится во внешней базе
Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.
Решение для автоматической сверки данных между любыми конфигурациями 1С. Помогает контролировать и проверять обмены, проверять наличие документов при переносах данных, находить изменения в закрытых периодах
Данная обработка позволит Вам легко и просто, а главное - быстро, выполнить сравнение данных между ЛЮБЫМИ базами (и РИБ, по правилам конвертаций) по контрольным суммам выбранных объектов баз 1С, работающих на платформах 8.3 и выше. Удобный и понятный интерфейс в виде "мастера". Высокая скорость сравнения достигается за счет специального алгоритма расчета контрольной суммы объекта/записи и сравнения по данным суммам объектов 2х баз через файл. Имеется возможность выбора реквизитов, по которым система будет сравнивать объекты. Сравнение количества записей в движениях документов, возможность сравнивать данные по правилам конвертации и не только! Выбор объектов конфигурации для КАЖДОГО узла в отдельности с индивидуальным отбором для каждого объекта конфигурации, работа с FTP, сохранение или загрузка настроек, сохранение или загрузка результата сравнения, регистрация на обмен объекта и его движений. (Обновление от 12.11.2024, версия 2.2-2.5)
1.обработка позволяет автоматически вычислить дубли и привести их к единому наименованию во всех документах.
2.так же есть возможность в документах поменять счета учета для номенклатуры. Например разные бухгалтера оформляют поступление одного и того же товара - один занес на 10.01, второй на 41.01 в результате в ОСВ у нас минусы. В обработке есть возможность наглядно увидеть такие ошибки и тут же их поправить не бегая по всем документам. Достаточно поставить галочку у номенклатуры и указать счет учета который надо найти и счет учета на который надо его заменить. Обработка сама вычислит документы в которых номенклатура с галочкой была задействована и заменит счета учета. Что бы не было излишнего изменения документов, в обработке указываются типы документов, где операция замены счета разрешена (например Поступление ТМЦ, Реализация, Отчет о розничных продажах, возврат покупателю итд.)
Умное сравнение табличных документов с визуальной подсветкой. В отличие от стандартного сравнения, обработка ищет отличия по ключевому значению, игнорируя сдвиги строк. Результат — цветовая маркировка добавленных, удаленных и измененных строк прямо в документе + точный лог расхождений по каждой ячейке.
Практический кейс исследовательской разработки (R&D) с использованием искусственного интеллекта и нейросетей в 1С для поиска по прайсам поставщиков.
Рассматривается гибридный поиск (Hybrid Search: векторный + полнотекстовый), позволяющий находить товары по смыслу, а не по буквам — даже при сленге, опечатках и разном написании.
Решение работает полностью локально, без облаков, и интегрируется с 1С.
Расширение добавляет возможность в 1С в любых полях и отборах выбирать значения не только Код, Наименование или Номер, но и Уникальный идентификатор, Навигационную ссылку, Объект не найден, Представление документа.
Ну, по факту - конечно. Зависит от размера справочника линейно и в большей степени от длины строки сравнения. Запрос оптимизирован для ускоренного поиска по подобию началу строки поиска, в реальных условиях это помогает в большинстве случаев, тогда скорость поиска в пределах единиц секунд, если же случай сложный, то перебираются все остальные варианты, время в таком случае может достигать десятков секунд. Запрос выглядит так:
Запрос=Новый Запрос("ВЫБРАТЬ
| Справочник.Наименование КАК Наименование,
| Справочник.Ссылка,
| Выбор Когда (Справочник.Наименование Подобно &Начало)
| Тогда 0 Иначе 1 Конец КАК Подобие
| ИЗ Справочник."+Справочник+" КАК Справочник
| ГДЕ
| НЕ Справочник.ПометкаУдаления
| И НЕ Справочник.ЭтоГруппа
|УПОРЯДОЧИТЬ ПО
| Подобие, Наименование");
Запрос.УстановитьПараметр("Начало","%"+Сред(Искомое,1,5)+"%");
(2) ааа, то есть просто запрос на подобно, а если в фразе несколько слов, то вначале разбиваете строку на слова, и каждое слово ищете на подобно, а затем получаете результат, который соответствует обоим вариантам?
Нет, процедура сравнения всегда одинаковая - с разбиением на части (не на слова, перед сравнением все пробелы, спецсимволы убираются), просто из предположения, что совпадающие с началом строки поиска более вероятны, позволяет поиск ускорить в большинстве случаев.
V.Nikonov, какую достоверность ставите? У меня все находило на автомате при значении порядка 60% при загрузке табличной части из другой базы с похожей, но все же местами отличающейся наименованиями номенлатурой.
UPD: вот попробовал с номенклатурой
(7) CheBurator, а зачем, собственно? Интересно было реализовать именно на языке 1С. Сама функция сравнения небольшая, симпатичная, рекурсивная. Не черный ящик, все можно подстроить. Это приложение конечно малоприменимо на практике, только для демонстрации, но и в реале функция уже поработала, и сейчас на ее основе закончил обработку сравнения-сопоставления таблиц - весьма работоспособна.
Добрый день.
1. При поиске в демо базе Ботинки женские обработка находит только в справочнике Номенклатура Ботинки женские демисезонные, хотя в справочнике есть и Ботинки женские натуральная кожа, т.е не совсем рабочий алгоритм.
2. При вводе в поле Ищем данных пишет Ошибка деления на ноль.
(9) kn, спасибо за замечание! Устранил, сейчас выложу изменения. Дело в том, что изначально поиск предназначался для поиска одного подходящего значения, поэтому при 100% совпадении с поисковой строкой поиск прерывается. Для данной демонстрации это неверно, потому следует в процедуре "НечеткийПоиск" закомментировать строчку
Если Рез=100 Тогда Прервать КонецЕсли;
Ошибка деления на 0 - очевидно при 0 достоверности, также поправил - по умолчанию устанавливается значение 80%.
Описанный алгоритм может искажать результат, т.к. найденный кусок "вырывается" и остаток строки "склеивается" для продолжения поиска в ней.
Например, ищем " кдличному" в строке "+ 10% кличномудисконту": находим сразу кусок "личному" и получаем на следующем шаге, что ищем "кд" в строке "+ 10% кдисконту" и находим кусок "кд", хотя в исходной строке, где ищем, такого сочетания не было.
Пример не очень красивый ), просто как наглядная демонстрация.
Может как-то совершенствовали алгоритм, чтобы учесть это?
(11) Спасибо за замечание. Согласен. Алгоритм не совершенствовал, но в данном случае могу предложить навскидку на место вырезанного фрагмента вставить какой нибудь спецсимвол, и сравнивать дальше. Это надо пробовать, конечно...
(12) - тоже думал про этот вариант, но тогда надо и в строку поиска и в искомую вставлять.. да и символ должен гарантированно отсутствовать в этих строках + потребуется корректировать определение рейтинга, т.к. искусственно увеличиваем длину строк
Можете пояснить смысл и назначение переменной "Огр"?
А еще лучше, если есть какая ссылка на описание метода или название используемого метода поиска..(12)
(13) Рейтинг придется считать по-другому, исключая вставленные спецсимволы, которые кстати друг за дружкой подряд наверно идти не должны - можно лишние убирать.
Огр - порог длины осмысленной подстроки для сравнения, 2 символа и короче - уже не сравниваются. А "Длина/10" - это похоже атавизм, можно убрать из кода.
Метод сравнения источника не имел, так что все здесь :)
На днях попробую добавить в алгоритм замену на подстроку...
Попробовал, не удержался. Просто вместо пустой строки вставил спецсимвол с кодом 27
Стр1=СтрЗаменить(Строка1,Иск,Символ(27));
Стр2=СтрЗаменить(Строка2,Иск,Символ(27));
Алгоритм не сломался, рейтинг тоже работает, если ли от этого толк - не понять без хорошего примера.
Еще из пожеланий: как по мне было бы логичнее, чтобы найденные кусочки были в порядке их следования в исходной строке
(15) - ок, спасибо, буду иметь ввиду
(17) Спасибо! На самом деле этот демо интерфейс не показывает настоящую цель обработки - она делалась для сравнения похожих справочников и подбора наиболее подходящего элемента, пример - отождествление сходных справочников номенклатуры разных предприятий. Пока не увидел возможности с помощью регулярных выражений решить эту задачу точнее и быстрее.