J1C — Java API для 1С:Предприятие 7.7




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2024-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='\

41 Comments

  1. IsiKosta

    У семерки открылось второе дыхание 😉

    Reply
  2. fastwriter

    Вещь полезная, так как у 7.7 и 8.х разные рыночные ниши.

    Правда, боюсь, что агрессивный маркетинг самой 1С приведет к тому что 7.7 окончательно потеряет популярность, что скажется на популярности данной разработки. Но будем надеяться, что этого не произойдет.

    Reply
  3. marsohod

    Вах !!! 😀

    Reply
  4. Трактор

    Это бы да лет 5 назад. Была бы бомба.

    Reply
  5. bulpi

    Умные люди! ( В частности, автор) А объясните не настолько умным людям, ЗАЧЕМ это? Где, к примеру, применить?

    Reply
  6. gildebrand

    (5) http://j1c.ru/j1c/node/1 Там же есть и пример доступа через Web

    Reply
  7. bulpi

    (6)

    Спасибо Крутизну проета оценил 😀 Потрясен масштабами и бесплатностью 😀

    Reply
  8. Antoska

    Не смотрел пока, но… Правильно ли я понял, что используя J1C можно реализовать логику проведения документа отличную от указанной в конфигурации? Если так, то об этом надо предупреждать и я бы рекомендовал пользоватся встроенными функциями проведения документов. А то ведь можно и ошибиться реализовывая алгоритм проведения отличный от описанного в модуле проведения документа и к чему это может привести пока не ясно…

    Желаю успехов 😉 и жду версию для фаловой базы.

    Reply
  9. gildebrand

    (8)

    Правильно ли я понял, что используя J1C можно реализовать логику проведения документа отличную от указанной в конфигурации? Если так, то об этом надо предупреждать

    В документации и на сайте об этом рассказано. Замечу только, что «просто так», случайно провести документ не получится. Необходимо создать класс наследник от базового класса j1c V.DocumentObject и затем реализовать его метод close() (это аналог процедуры проведения в 1с).

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

    Если вы под функциями имели в виду хранимые процедуры самой 1С — то да, они используются. Это процедуры главным образом отвечают за пересчет итогов (как бух. так и регистров). Так что в этом смысле используется родной механизм 1С.

    Reply
  10. Antoska

    Но ведь можно и «просто так», случайно «создать класс наследник от базового класса j1c V.DocumentObject и затем реализовать его метод close()» 😉

    Значит реализовать альтернативный алгоритм проведения таки нельзя..? Вы правы надо всё же почитать документацию 🙂

    Под функциями я имел ввиду вызов процедур Провести(), Записать(), Удалить() и далее в таком духе… Именно они и должны обеспечить выполнение хранимых процедур. Ну, да вы в курсе 🙂

    А процедуры обработки проведения документа могут делать, что угодно… Это уже от задач зависит. Частенько, кстати, делают записи в истории периодических реквизитов 🙂

    Вот ещё вопрос (пока не почитал документацию 😳 ) — есить ли возможность получить данные из таблиц формируемых отчётами и обработками? Ну… Мало ли 😉 ?

    З.Ы. Ушёл читать документацию…

    Reply
  11. gildebrand

    Значит реализовать альтернативный алгоритм проведения таки нельзя..?

    Почему же нельзя — наследуете и реализовываете protected методы 🙂

    Под функциями я имел ввиду вызов процедур Провести(), Записать(), Удалить() и далее в таком духе

    В j1c они представлены методами: close(), write(), delete() соответственно

    При кроме того, так же как и для close(), есть protected методы аналоги ПриЗаписи(), ПриОтменеПроведения и т.п.

    Частенько, кстати, делают записи в истории периодических реквизитов

    У класса V7.CatalogObject есть метод:

    void j1c.ru.V7.CatalogObject.setAttribute(String name, Object value, Date date, DocumentReference document)
    Установить значение периодического реквизитого справочника в контексте документа.
    
    Parameters:
    name Имя атрибута
    value значение атрибута
    date Дата значения атрибута
    document Документ, в контексте которого будет установлено значение

    в реализации метода close() вызывайте его — все очень похоже как в 1С 🙂

    есить ли возможность получить данные из таблиц формируемых отчётами и обработками?

    нет, такой возможности нет — как вы себе это представляете? j1c работает вне 1с, но с ее базой. Клиент 1с для j1c не нужен и не используется никак.

    Reply
  12. support

    А можно где-то посмотреть, как выводиться справочник в веб?

    И можно ли сделать вывод журнала, документа и его проведение?

    Reply
  13. gildebrand

    (12)

    А можно где-то посмотреть, как выводиться справочник в веб

    Вот здесь статья-пример создания сервлета с помощью сервлета http://j1c.ru/j1c/node/23

    В прикрепленных файлах картинки, как выглядит стартер, для сервера приложения j1c (из примера) и соответственно справочник контрагенты типовой комплексной. Вы именно это хотели посмотреть?

    И можно ли сделать вывод журнала, документа и его проведение?

    Конечно можно (как я понял вы про веб спрашиваете). Конечно, для документов нужно не забыть реализовать модуль проведения.

    Reply
  14. support

    (13) не локальный сервер, а публичный сервер есть?

    Reply
  15. gildebrand

    (14) Нет, нету такого. А что вам это даст? Ну увидите вы вебе хтмл странички с показом списка. Откуда вы можете «быть уверенным» что данные берутся из 1С?

    Я вам рекомендую скачать http://j1c.ru/files/download/DemoWebService.zip отсюда демопример, положить это вебприложение в каталог контейнера сервлетов (например Tomcat) — и самиму посмотреть одним глазом в 1С, а другим в браузер.

    Reply
  16. support

    (15) Тогда сделайте такой демосервер, чтобы можно было документ создать, подобрать номенклатуру, провести.

    Reply
  17. quick

    Жесть! Как давно об этом я мечтал :))) Красавчеги!

    Reply
  18. Winston Kent

    Я правильно понимаю, что можно создать базу в 1С, а запускать и работать с базой при помощи J1C?

    Reply
  19. gildebrand

    (18) Правильно. J1C это программное апи к данным. При этом можно работать одновременно, как клиентом 1С так и j1c (база должна быть sql формата).

    Reply
  20. Winston Kent

    (19) Круто! Надо попробывать. А как установить ее?

    Reply
  21. gildebrand

    (20) Скачиваете апи (jar Файл), указываете javac путь к нему (подключаете то бишь библиотеку). Создаете свои классы используя классы апи. Примеры можно найти здесь: http://j1c.ru

    Reply
  22. Winston Kent

    (21) Спасибо!

    Reply
  23. O-Planet

    Клюшки — вечны!

    +

    Reply
  24. Makdir

    Хорошая вещь. Желаю успешного развития этому проекту!

    +

    Reply
  25. gildebrand

    Выложил обновление. Альфа — 0.0.70

    Изменения с момента первой публикации:

    1. Реализована поддержка DBF формата.

    2. Существенно изменена (переработана) объектная модель (дрейф к 8-ке).

    3. Доработана модель запросов к данным — поддержка нотации 1CPP

    4. Переработка модели запуска класса V7.

    Reply
  26. gildebrand

    Выложил 0.0.72 версию.

    В версии:

    1. Развитие поддержки DBF формата ИБ.

    Принципиальное изменение к подходу анализа текста запросов. Для анализа и разбора текста запросов был реализован jsqlparser с использованием JavaCC.

    Это позволит в дальнейшем легко развивать язык запросов. В следующих релизах будет доработан функционал языка запросов в нотации 1CPP.

    2. Реализация виртуальных таблиц:

    $РегистрОстатки.<ИмяРегистра>([<ГраницаРасчета>][,

    <Соединение>][,

    <Условие>][,

    <Измерение>][,<Ресурс>]

    ) [as <Алиас>]

    $РегистрОбороты.<ИмяРегистра>([<НачалоПериода>][, <КонецПериода>][,<Периодичность>][,

    <Соединение>][,

    <Условие>][,

    <Измерение>][,<Ресурс>]

    ) [as <Алиас>]



    $РегистрОстаткиОбороты.<ИмяРегистра>([<НачалоПериода>][, <КонецПериода>][, <Периодичность>][,<МетодДополнения>][,

    <Соединение>][,

    <Условие>][,

    <Измерение>][,<Ресурс>]

    ) [as <Алиас>]



    Подробное описание работы следует. Пока можно попробовать работу с помощью консоли запросов. Консоль запросов Консоль

    Reply
  27. gildebrand

    Выход 0.0.73 версии 0.0.73 версия

    Reply
  28. здрасте

    Сайт j1C недоступен. Уже неделю. Надеюсь что временно и тема будет развиваться. Задумал пошшупать, а тут такая засада.

    Reply
  29. gildebrand

    28 Сайт заработал, можно смотреть.

    Reply
  30. compil7

    А что с сайтом j1C? Сейчас не доступен?

    Reply
  31. vit_ms

    Хотел купить эту разработку, но сайт j1C недоступен с 2011 года… так проект закрыт или нет?

    И система покупки какая-то сложная, скажите, сколько я должен за нее заплатить и все, не нужны мне в нагрузку другие разработки. Советский Союз какой-то — хотите купить хорошую книгу, купите еще 2 ненужных.

    Аватар еще пришлось какой-то искать обязательно, что за усложнения жизни?!

    Reply
  32. awk

    (0) Проект еще жив?

    Reply
  33. andrey314

    (29) А можно как то заполучить потестировать вашу разработку? А то сайт не работает…

    Reply
  34. tindir

    Судя по последним комментариям загнулась тема…а жаль…было бы очень полезно использвать такую библиотеку для веба и разработки мелких фронтов для разездных товарищей. Хотя, есть же 8.3…проснулись, отряхнулись…

    Reply
  35. f13

    (33) andrey314, если уж так интересно, можно покопаться в http://web.archive.org/web/20100704020117/http://j1c.ru/j1c/

    Reply
  36. Alakbar33

    f13. К сожалению Ваша ссылка не работает «Page cannot be crawled or displayed due to robots.txt.». Очевидно авторы сайта ставили ограничение на архивирование сайта. Можно ли как-то в другом месте покопаться ? Тема не умерла — возможна реставрация 1С7.7 с помощью новых технологий, так бизнес-процессы, бизнес-логика, сами пользователи-бухгалтеры в компаниях остались те же. Буду признателен за ответ.

    Reply
  37. kozorez

    сайт http://j1c.ru не работает…

    Reply
  38. kozorez

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

    Reply
  39. Alister

    Вообще печально с 7.7, столько разного интересного было придумано (1cpp, formex, openconf и т.п.), а теперь 7.7 это исключение, везде уже 8-ка.

    Reply
  40. Antoska

    (39) Alister, Не везде! Очень много специализированных конфигураций на 7.7 написано. У меня на предприятии до сих пор такая конфа работает. И я её поддерживаю 🙂 Вот только, конкретно эта разработка, мне не пригодилась.

    Reply
  41. dreadlord

    На веб архиве есть только текст страниц нет зипов для загрузки… печаль… люблю 7.7 терпеть не могу 8! С 7-и скорее сменю род деятельности чем сяду на 8 (оч много своих малких конфигураций… 18-лет разработки), а с 8-кой не срослось, не знаю почему, перегорел наверно, 42 скоро.

    Парни, если у кого есть архив даной разработки… dreadlord@rambler.ru ! Спасибо

    Reply

Leave a Comment

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