Компьютер

ЧП Куликов Михаил Михайлович

Тел:

+380-(50)-589-55-02

Loading
Мы в социальных сетях...

    -  Вконтакте
    -  Facebook
    -  Google+
    -  Twitter
    -  LiveJournal
    -  Я.ру
    -  Одноклассники
    -  RSS
    -  Мой Круг
    -  YouTube
Прочее...

/images/certificate_small.png

Анализ: траст сайта it-kmm.com
Внимание!!! Заработал на 100% новый сервис.

Отбор по шаблону в 1С 7.7

Программированием в 1С занимаюсь очень давно. Писались и свои конфигурации "с нуля" (как-то написал розничный магазин для частного предпринимателя, даже парочку продал), разбирались и модернизировались типовые конфигурации, даже сторонние закрытые конфигурации. Ну например, "Рарус" РБК для Украины, тяжелая штуковина, ну ничего, и с этим "монстриком" разобрались. Количество внешних и внутренних отчетов, так это просто тьма, ну просто не мерено.

А вот на днях мне один заказчик подкинул заказик, халтурка небольшая. Надо было сделать простенькую по продажам и закупкам с небольшим количеством отборов. И еще заказчик запросил выгрузку результатов отчета в Microsoft Excel. Данный факт меня почему-то заинтересовал. Поинтересовался, а зачем такой функционал? С таблицами и сама 1С не плохо справляется, бери и записывай себе на здоровье в *.xls . А мы говорит, в Excel сортировку и отбор делаем по шаблону, используя различные маски. Ну типа *маша?111* . Так давай это в 1С сотворим говорю.

Погуглил на 1С и шаблон и как оказалось не так уж и много информации есть. На каком-то из форумов (очень старых) нашел очень бурное обсуждение данного вопроса. Варианты были разные, от банально "тупого" перебора до использования внешних компонент, в том числе и родных из Windows типа VB. Внешние компоненты - это конечно "круто", наличие регулярных выражений (если кто знает что это такое), но есть один момент - пользователь, как правило - "чайник". Максимум на что его хватит - это звездочка и знак вопроса.

И вот в одном месте я таки "подглядел" идею решения, просто и эффективно. Правда у автора там была то-ли ошибка, то-ли так и хотелось, в "оригинале", например если исходная строка "12345", а шаблон "?5" - функция находила это подходящим. Плюс ко всему, не обрабатывалась "*".

В общем, вот результат, полученный и проверенный мной:

//
//Строка="12345" действительно соответствует шаблону="5". Пример: "пуск" -> "найти", напишем "ged" - и в результате найдем и regedit.exe и т.п.
//Тоесть, если-же строка="12345" не должна соответствовать шаблону = "5" (а только со звездочками "*5*"), тогда необходимо добавить справа и слева стоп-символы к шаблону и к строке.
//Готовая для работы функция:
//
Функция Парсер(Знач ИсхСтрока,Знач ШаблонПоиска, Знач Точность = 0)
Симв127 = Симв(127);
//Защитим кавычки, запятые, и знака доллара
ИсхСтрока = стрЗаменить(ИсхСтрока,"""",Симв127);
ИсхСтрока = стрЗаменить(ИсхСтрока,",",Симв127);
ИсхСтрока = стрЗаменить(ИсхСтрока,"$",Симв127);
ШаблонПоиска = стрЗаменить(ШаблонПоиска,"""",Симв127);
ШаблонПоиска = стрЗаменить(ШаблонПоиска,",",Симв127);
ШаблонПоиска = стрЗаменить(ШаблонПоиска,"$",Симв127);

Если Точность = 1 Тогда //Добавим еще и стоп-символы
ШаблонПоиска = "$" + ШаблонПоиска + "$";
ИсхСтрока = "$" + ИсхСтрока + "$";
КонецЕсли;

Ш = """" + ШаблонПоиска + """";
Ш = стрЗаменить(Ш,"*",""",""*"",""");
Ш = стрЗаменить(Ш,"?",""",""?"",""");

спСлов = СоздатьОбъект("СписокЗначений");
спСлов.ИзСтрокиСРазделителями(Ш);
ЕстьЗв = 0;
Для Сч = 1 По спСлов.РазмерСписка() Цикл
Слово = спСлов.ПолучитьЗначение(Сч);
Если ПустаяСтрока(Слово) = 1 Тогда
Продолжить;
КонецЕсли;
ДлинаСтроки = СтрДлина(ИсхСтрока);
ДлинаСлова = СтрДлина(Слово);
Если (ДлинаСтроки > 0) Тогда
Если Слово = "?" Тогда
ИсхСтрока = Сред(ИсхСтрока,2); // Пропустим один символ
ИначеЕсли Слово = "*" Тогда //Запомним что была *
ЕстьЗв = 1;
Иначе
Поз = Найти(ИсхСтрока,Слово);
Если Поз = 0 Тогда // Нет такого
Возврат 0;
КонецЕсли;
Если (Поз = 1) ИЛИ (ЕстьЗв = 1) Тогда // Если с 1-й то есть шаблон, иначе можно только Если была *
ЕстьЗв = 0; // Мы использовали ее по любому
ИсхСтрока = Сред(ИсхСтрока, Поз+ДлинаСлова); // Выкинем найденное
Иначе
Возврат 0; //Нашли но где-то глубоко, не подходит без *
КонецЕсли;
КонецЕсли;
Иначе
Возврат 0;
КонецЕсли;
КонецЦикла;
Возврат 1;
КонецФункции

P.S.
Нашел ссылку на форум www.forum.mista.ru/topic.php?id=30225

Автор: Михаил Куликов

.

Если хотите узнать больше о недвижимости в Болгарии, то http://www.ilgabg.com/ поможет Вам в этом

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

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

DT

Курсы валют:

UAH

1 USD = 26.810 26.316
1 EUR = 31.646 30.960
1 RUR = 00.480 00.450

Антивирусы в формате SaaS
Подписаться письмом

Спонсоры...

SP:   LF:   PP:  

ubuntu == © Куликов М.М. (2011)
Сертифицированный партнер Dr.Web Free secondary DNS uaRating Rambler's Top100 Рейтинг@Mail.ru bigmir)net TOP 100 Яндекс цитирования Ranker Рейтинг сайта в веб-каталоге misto.zp.ua TOP.zp.ua