Склонение украинских ФИО, должностей и подразделений в семи падежах. DLL с поддержкой OLE.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

48 Comments

  1. vip

    Падежей в русском и украинском вроде шесть.

    А вот в венгерском 126.

    Слабо расширение для венгерского сделать? 🙂

    Reply
  2. tarasenkov

    Слабо 🙂

    Reply
  3. Abadonna

    (1) Андрей, а ты откуда мадьярский знаешь? 😉

    Reply
  4. vip

    (3) Да я и китайским, как ты знаешь, в совершенстве владею :)))

    Reply
  5. astonvilla

    Минус за «Стоимость регистрации одного рабочего места: 500 грн.».

    Как по мне — дороговато.

    Reply
  6. vasilykushnir

    (5) Не многовато, а дохырища! Минусы не ставлю принципиально, хотя руки чешутся….

    Reply
  7. astonvilla

    (6) А я не смог удержаться, хотя до этого тоже не ставил 🙁

    «На 07.11.2007 стоимость исходных текстов под Turbo Delphi либо 1С 7.7 составляет 10’000 грн.»

    Имхо звучит как фраза из «Буря в стакане» — когда они торговализь за гравицапу :))

    Reply
  8. vip

    (6)(7) Да пошутил парень.

    Reply
  9. JohnyDeath

    А 500 грн это скока на деревянные?

    Reply
  10. astonvilla

    100$

    Reply
  11. astonvilla

    (8) Тут пошутил, на проклабе, и еще в десятке мест где выложил?

    Не, он вполне серъезно.

    Reply
  12. tarasenkov

    Господа если вас не устраивает цена, вы можете приобрести исходнии Padeg.dll (русской библиотеки),

    цены представлены здесь: http://www.delphikingdom.com/zip/pd_Docs.zip

    и переделать под украинский язык.

    В таком случае себестоимость исходных кодов может быть как ниже так и выше,

    это зависит от себестоимости вашего времени на разработку и тестирование.

    Продажу исходников я воспринимаю как выход с рынка, ведь что помешает

    купившему исходники продавать программу от своего имени?

    Объем рынка очень и очень скромный — небольшим фирмам такая штукенция ни к чему.

    А организациям с численностью сотрудников от 600 и выше возможно будет интересна,

    я считаю, для них эта цена не покажется высокой.

    Спасибо за оказанный интерес,

    напоминаю, вы можете зарегистрировать сабж бесплатно.

    Он благополучно протестирован на списке в 1500 сотрудников.

    Reply
  13. v.l.

    Ща SoftIce запустю…

    Reply
  14. real_seer

    Все таки нет предела наглости отдельных личностей…

    Товарищ (не нам) Тарасенков занялся плагиатом… Исходники мы ему точно не продавили…

    Как один из авторов библиотеки склонения на русском официально уведомляю, что есть версия библиотеки для украинского языка. С некоторыми недоработками (не было среди нас знающего украинский), но зато совершенно бесплатна.

    Предлагаю (это самый действенный способ) хорошо знающему украинский язык исходники для портирования, с условием выпуска бесплатной сборки библиотеки для украинского языка. Прощу обращаться ко мне или Гене напрямую или через сайт «Королевства…» http://www.delphikingdom.com/asp/viewitem.asp?catalogid=412

    Кстати. Исходники нашей версии были изначально открыты, пока не нашелся один, опять же «не нам» :-), товарищ? который опубликовал их от своего имени, с нашими же коментариями и ошибками…

    И наконец… «Не нам» товарищ Тарасенков, случайно не думаете ли вы закупать сало для отправки в Россию и Белорусию на все суммы?

    Reply
  15. NDeclin

    С позволения и по настоянию авторов padeg.dll опубликовал альтернативный вариант украинской сборки http://infostart.ru/profile/8349/projects/803/

    Клон первой русской версии. Cыровата, конечно, да и функций маловато, но текущий расклад вынуждает…

    Reply
  16. tarasenkov

    Эх, где же вы были, господа, когда мне так нужна была украинская версия?

    Ведь на форуме delphikingdom посвященному русской версии библиотеки не единожды встречался вопрос об украинской версии, и ответа на него я там так и не нашел.

    В итоге, не найдя достойной библиотеки склонения пришлось написать свою, писал к тому же на 1с, но чтобы как-то окупить расходы и защитить свой труд портировал на Delphi в DLL. Библиотека склонения на русском стала достойным примером для подражания в части экспортируемых функций и OLE. И для того чтобы пользователям русской версии библиотеки было проще использовать мою, ну и конечно, чтобы не писать документацию, интерфейс функций экспорта был выполнен в соответствии с документацией русской версии.

    Я считаю насчет наглости и плагиата вы немного погорячились, поскольку ни исходников русской библиотеки ни некой украинской библиотеки я не видел и не использовал, и требую извинений на этот счет.

    Насчет бесплатной версии, напоминаю, временно осуществляется бесплатная регистрация.

    Reply
  17. NDeclin

    (16) Ведь на форуме delphikingdom посвященному русской версии библиотеки не единожды встречался вопрос об украинской версии, и ответа на него я там так и не нашел.

    В обсуждении вопрос за все время встречался ровно 2 раза: 21-11-2002 и 12-09-2007.

    Зато была масса вопросов по русской сборке, вот в этом направлении («где же вы были…») и работали.

    В (14) предложен самый разумный вариант развития событий (ИМХО).

    Reply
  18. real_seer

    > Эх, где же вы были, господа, когда мне так нужна была украинская версия?

    Не единожды отвечали лично (и я, и Гена), что не знаем мы украинского. Однажды у нас брали исходники с той же целью добавления украинского, но тот человек так и не довел работу до конца (это точно были не вы).

    На форуме в «Королевстве…», если помните, были вопросы про *’nix версию. Так вот, к нам обратились с просьбой предоставить исходники, дали, в обмен на будущие. И сейчас активно переводят под Unix на С. И сейчас дадим исходники с условием сохранения условий лицензии как и для русского языка (вкратце: платное только коммерческое использование).

    Готов принести свои изменения если библиотека действительно была портирована и унифицирован интерфейс.

    Однако ваших исходников мы тоже не видели.

    Reply
  19. Abadonna

    (18) Я мужика по фамилии Кличко как склонять на украинском?

    Кличке, Кличком, Кличку? :)))))

    Reply
  20. Cortes

    Идея хорошая. Но есть недостатки. Довольно весомые недостатки, из-за которых жалко тратить деньги на приобретение коммерческой версии.

    Reply
  21. O-Planet

    Хм… А чем украинские от русских отличаются? Я помнится такое писал средствами языка за час-полтора…

    Reply
  22. tarasenkov

    (21) Не могу объективно судить об отличиях, так как для русского языка не писал.

    Reply
  23. Cortes

    Пардон. Я, кажется, не совсем туда написал свое мнение.

    Отзыв (20) относился к предыдущей публикации на эту тему, ссылку почему-то найти не могу.

    Reply
  24. Genius_SV

    Подскажите пожалуйста как использовать это компоненту в 1С 8.1 ?

    То что я пробовал :

    1.

    Код
       Попытка
          ЗагрузитьВнешнююКомпоненту("padeg_ua.dll");
          Падеж_УА = Новый ("padeg_ua.Declension");
       Исключение
          Сообщить("Не загружен ""padeg_ua.dll""!", СтатусСообщения.Важное);
       КонецПопытки;
    

    Показать полностью

    -> "Исключение"…

    2.

    Код
       Попытка
          ЗагрузитьВнешнююКомпоненту("ule.dll");
          Падеж_УА = Новый ("AddIn.ULE");
       Исключение
          Сообщить("Не загружен ""ule.dll""!", СтатусСообщения.Важное);
       КонецПопытки;
       
       Попытка
          Падеж_УА.TransmuteInto("padeg_ua.Declension");
       Исключение
          Сообщить("Не загружен ""padeg_ua.dll""!", СтатусСообщения.Важное);
       КонецПопытки;
    

    Показать полностью

    -> "Вываливается" 1С, хотя пару раз работало, что наталкивает на мысль "должно работать" …

    В случае успешной работы компоненты в 1С 8.1, рассматривается вариант покупки.

    Reply
  25. tarasenkov

    1. Регистрируете COM объект: regsvr32.exe <Путь>Padeg_ua.dll

    2. Код подключения:

    Код
     Скл = Новый COMОбъект("Padeg_ua.Declension");
    
    Падеж = 5; // Творительный
    
    выб = Справочники.Сотрудники.Выбрать();
    Пока выб.Следующий() Цикл
      Если выб.ЭтоГруппа тогда
       Продолжить;
      КонецЕсли;
      ФИО = ТРег(выб.ФамилияУкр) + " " + ТРег(выб.ИмяУкр) + " " + ТРег(выб.ОтчествоУкр);
      Должность = выб.Должность.Наименование;
      Отдел = выб.Отдел.Наименование;
      Результат = Скл.GetFIOPadegFS(ФИО, "", Падеж) + ", " + Скл.GetFullAppointmentPadeg(Должность, Отдел, Падеж);
      Сообщить(Результат);
    КонецЦикла;

    Показать полностью

    Reply
  26. Mahone

    Сколько будет стоить полная версия padeg_ua.dll под Delphi и как ее можно приобрести??? Спасибо

    Reply
  27. sokir

    Неправильно склоняет:

    GetFullAppointmentPadeg(«Голова правління»,»»,3) выдаёт «головій правлінні», а надо «голові правлиння».

    Или это ограничение демоверсии?

    Всё остальное по должностям вроде верно.

    Reply
  28. support

    Тест

    Reply
  29. tarasenkov

    Выложена полнофункциональная версия с исходными кодами, других исправлений и изменений нет.

    Reply
  30. krosaf4eg

    padeg_ua.dll из исходников отличается по размеру с той, что в примерах

    почему-то не склоняет в родительном и давательном падежах, оставляет так как есть 😥

    с остальными падежами все нормально

    Reply
  31. yuraer

    почему-то не склоняет в родительном и давательном падежах, оставляет так как есть

    с остальными падежами все нормально

    аналогичная ситуация

    Reply
  32. vip

    (32) Наверное потому, что давательного падежа нету.

    Есть дательный. И извратительный.

    Reply
  33. krosaf4eg

    упс… дательном 😳

    Reply
  34. tarasenkov

    Извиняйте, люди добрые, поправил, в дательном и родительном теперь склоняет

    Reply
  35. palamars

    Спасибо полезную штуковину, поставил «плюс».

    Нужно доработать склонение фамилий — существительных с чередованием і — о: Чорновіл — Чорновола, Чорноволу

    Reply
  36. BunnyBoy

    Добрый день. А есть ли библиотека с функциями склонения украинских фамилий, имен… без КОМ-сервера как это сделано в русской версии?

    Reply
  37. BunnyBoy

    Ввиду отсутствия соответствующих прав невозможна регистрация библиотеки. Есть ли какое-нибудь решение?

    Reply
  38. tarasenkov

    > А есть ли библиотека с функциями склонения украинских фамилий, имен… без КОМ-сервера как это сделано в русской версии?

    Это она и есть =) работает и без КОМ-сервера, смотрите пример вызова из Дельфи

    Reply
  39. getikalex

    Специально зарегился, чтоб сказать большое спасибо. Очень помогло при склонении имен в рассылках из excel.

    Reply
  40. Spacer

    (1) vip, в украинском на самом деле не 6 падежей, а 7.

    Есть еще такой 7-й хитрый падеж — «кличний» называется.:)

    Reply
  41. Spacer

    Обнаружил неправильное склонение фамилии «Палій».

    Сейчас склоняет так:

    1 Палій Олексій Іванович

    2 Палього Олексія Івановича

    3 Пальому Олексію Івановичу

    4 Палого Олексія Івановича

    5 Палім Олексієм Івановичем

    6 Пальому Олексієві Івановичеві

    7 Палій Олексію Івановиче

    Нужно так:

    Називний Палій Олексій Іванович

    Родовий Палія Олексія Івановича

    Давальний Палію Олексію Івановичу

    Знахідний Палія Олексія Івановича

    Орудний Палієм Олексієм Івановичем

    Місцевий Палії Олексії Івановичі

    Кличний Палію Олексію Івановиче

    Можно ли это как-то исправить?

    Reply
  42. Shrek2015

    бедные венгры 🙂 как они так живут?

    Reply
  43. tarasenkov

    (42) Spacer, можете внести в словарь исключений — файл «Padeg_ua.dic»

    Reply
  44. Spacer

    (44) А как это сделать? Я смотрел описание словаря на сайте компоненты padeg.dll.

    Там написано что в файле словаря должно быть 16 секций.

    Перепробовал разные варианты, но ничего не помогло.

    Reply
  45. dj_serega

    Спасибо. Пока работает как нужно.

    Немного инфы о поключении:

    1. Регистрируем компоненту

    2. Создаем COM

    3. Добавляем dll в созданный COM.

    4. Предоставляем доступ пользователю к COM

    5. Пользуемся.

    Reply
  46. dj_serega

    не получилось обработать файл исключений 🙁

    Получилось. Нужно вызвать функцию:

    UpdateDictionary.

    ОбъектСклонения = Новый COMОбъект(«Padeg_ua.Declension»);
    ОбъектСклонения.UpdateDictionary();
    Reply
  47. gupdn

    При склонении фамилий на -ок не происходит выпадения гласной (Костючок— Костючока вместо Костючка). Список исключений вроде не решает

    Reply
  48. UserPro

    За працю ПЛЮС

    Reply

Leave a Comment

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