CopyDoc BS (Привязка внешних файлов в 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='\

52 Comments

  1. vcv

    1. Если пользователь нажмет «Просмотреть», можно изменить файл и сохранить. Даже случайно, наобдуманно. Желая, например, всего лишь подправить контрастность перед печатью. Не айс.

    2. Если нажать кнопку «Изменить» предлагается прицепить новый файл. Старый при этом не удаляется, висит мертвым грузом. А ссылка из программы на новый файл указывает.

    3. Операции с файлами ни как не отражаются в журнале регистрации. Это уже не мелкая придирка, это серьезный косяк.

    4. Если после прицепления файлов поменять контрагента в документе (бывает, ошиблись), файлы перестают показываться у этого документа. Они вообще ни у какого документа не показываются, их можно увидеть только при установленной галочке «Все документы контрагента». И вообще получается нелогичность. «Прицепляем» файлы в документе и, как физуально воспринимается, к документу, но при оказываются они прикреплены к контрагенту, а в документе вроде как исчезли.

    Reply
  2. ZeBeR

    Спасибо за содержательный комментарий.

    по п.1 — я сторонник сознательного использования компьютера, поэтому для меня это не косяк.

    по п.2 — знаю об этом, возникает только если выбран файл с др. расширением. случается оч.редко, но поправлю.

    по п.4 — не замечал, но согласен, буду исправлять.

    и самое интересное

    по п.3 — ??? а как это сделать? и так ли это критично, ведь на данные 1С оперции с этми файлами не влияют?

    Reply
  3. CheBurator

    как правило — внешние файлы не жизненно важны, поэтому имхо — пихать инфу о них в базу — излишне, но это — только имхо.

    Reply
  4. ZeBeR

    (3) Чтоб понять жизненность, надо постоять у копира и поготовить копии документов сначала для камеральной по НДС, потом по встречной проверке с одним контрагентом, потом с другим и т.д., в следующем квартале опять … При этом копируются часто одни и те же договора, СФ, накладные, акты …

    Надо учесть как бухи это делают: сначала формируют карточку счета (или какой-нибудь реестр), смотрят какие документы проходили (номера, даты, договора), потом лезут в папки, вытаскивают, ксерят, убирают обратно в папки, а здесь … зашел в документ, открыл копию, распечатал, закрыл.

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

    Reply
  5. Ёпрст

    Вообще, все документы от имени поставщика и так можно распечатать..самому из 1с.

    Нафига это хранить?…

    Reply
  6. ZeBeR

    (5) угу и подписать можно и печать поставить и прям за всех за всех… и по встречке они потом точно такие же представят …

    И вообще зачем бухгалтера все документы хранят, если их в любой момент распечатать можно?

    Reply
  7. Ёпрст

    (6) Ну и ? Оригиналы и так хранятся подшитыми..

    Сканы то один хрен заверять придётся..

    Нафига они нужны ?…

    Reply
  8. Ёпрст

    +7 И печать и подпись.. это семечки.

    Reply
  9. Ёпрст

    + Справочник для этих целей можно и не делать вообще..

    Достаточно правильно обозвать файло и привет, взяв за основу ID документа + ID клиентоса и всё… + тип файла — накладная/договор и т.д..

    Reply
  10. Ёпрст

    +9 и искать файло по маске — найдется не быстро, а очень быстро.

    Итого — одна внешняя обработка, которая «цепляется» к типовым без изменения кода + 0 изменений в мд-нике.

    Reply
  11. ZeBeR

    (7) см. 4 коммент.+описание там подробно написано зачем. Копии для этих целей не заверяют у контрагентов. А хранение сканов значительно сокращает время на подготовку копий.

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

    Reply
  12. ZeBeR

    (9) (10) Может ты и прав, не возражаю, если кто-нибудь выложит подобное решение.

    я не программист, тем более такого уровня как ты, а бухгалтер, поэтому как понимаю, так и делаю, возможно не самым оптимальным способом, но решаю свою проблему и это работает!

    и думаю будет полезно другим бухам.

    Reply
  13. Noy

    Вообще идея правильная (вспомните хотя бы про сертификаты — очень схожая задача, которую думаю многие решали)! Есть вопросы к реализации, но… Если это работает, то в любом случае + (хотя бы за идею и ее достижение на практике)

    Reply
  14. ZeBeR

    (13) Спасибо за поддержку, а то думал совсем запинают

    Reply
  15. Ёпрст

    (11) Это всё понятно, но оно того стоит ? К вам часто ходит в гости налоговая для встречных проверок ?

    :))

    Reply
  16. Ёпрст

    +15 нам и так хватает сканить серты/справкиб ..гтд и т.д

    Reply
  17. ZeBeR

    (15) они не ходят, они письма шлют и попробуй не ответь …

    Reply
  18. Арчибальд

    Согласен с (13). Вариантов реализации море, конечно. Камин, вон держит хранилище версий. Я бы добавил в конфу общий реквизит документов.

    А задача распространенная, так что плюс.

    Reply
  19. Ёпрст

    (18) Ну и ? Смысл то какой от общего реквизита ?

    🙂

    Reply
  20. ZeBeR

    (16) а сканить или нет это должен главбух решать, может ему легче ксерить… на все воля его. И сканить в этом случае должны сами бухи.

    Reply
  21. Ёпрст

    (20) проще поставщиков попросить — и так вышлют в любом виде.

    Reply
  22. Арчибальд

    (19) Имя скана хранить.

    Reply
  23. ZeBeR

    (22) а если надо несколько файлов привязать?

    Reply
  24. Ёпрст

    (23) Тогда строка неогр длины и храни что хочешь… но это один хрен моветон..

    Проще имя файла правильно создать и всё.

    Reply
  25. Арчибальд

    (23)Да хоть дерево папок.

    Reply
  26. vcv

    У меня аналогичная задача решена. Что ломать копья, надо или не надо? В конкретном случае бывает надо: регистрация спецификаций и договоров, сертификатов, качественных удостоверений, ж/д квитанций…, привязка этих документов к различным объектам в 1С с миграцией в РБД… Тоже решил что справочник практичней.

    (2) По третьему пункту, в журнале регистрации не отражается, потому что со справочником работаешь программно из обработки. Программно тогда и отражай с журнале регистрации. Зачем обработки-то? Две обработки фактически делают то же самое, что и форма справочника, форма списка справочника. Отражение в журнале регистрации полезно хотя бы для того, что если бух будет утверждать, что «прикрепил» файл к документу, а программа его сама удалила, будет хоть где посмотреть, а «был ли мальчик».

    Reply
  27. CheBurator

    Слушайте Епрста! Он — гуру! и я такого же мнения придерживаюсь! работает все на внешних файлах с привязкой по «ид» — и никакого геморроя.. и конфа — без изменений.. и решение клонируется — простым копированием пары обработок…

    Reply
  28. ZeBeR

    (26) Спасибо, единственные практичные комментарии.

    Про форму справочника — это правильно, это все упростит и не надо гемороится с журналом регистрации.

    Пока оставлю все как есть и буду готовить v.2 с учетом всех замечаний.

    Reply
  29. ZeBeR

    (27) Епрст — гуру, кто же спорит,и идея хорошая вот только мне слабо написать то что он предлагает. Я про «ид»-то узнал недавно, а как с ним работать до сих пор не знаю. 😳

    Может разрешите доработать свою программку, с учетом замечаний vcv? 🙁

    Reply
  30. CheBurator

    посмотри на всякий случай вот это:

    http://infostart.ru/public/15239/

    http://infostart.ru/public/17125/

    http://infostart.ru/public/15355/

    Reply
  31. vcv

    (29) Гуру, конечно, слушать надо, но не слепо им следовать.

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

    Но если встают требования по, например, регистрации входящих номеров и дат документов, привязки одного файла к нескольким объектам ИБ (например документ, договор, контрагент), возникает потребность в организации хранения дополнительных реквизитов файлов, дополнительных индексов для быстрого доступа… Тут уже оправдано становится введение справочника в базе. Но можно и не вводить, а построить индексы во внешних файлах, а дополнительные реквизиты держать в NTFS-потоках…

    Решать в любом случае автору, он ближе всех советчиков видит специфику требований и, хочется надеяться, лучше всех советчиков ее понимает (грустная шутка с намеком).

    Reply
  32. Доня

    Автору: Я воспользовалась обработкой — добавила ее в свою базу — все заработало!

    Обработка мне очень понравилась. Что-то подобное хотелось в 1С иметь!

    Но есть воросы:

    1) Вы предлагаете DEMO — объясните — какие ограничения?

    2) При обновлении конфиги надо заново добовлять это?

    3) А можно из этого сделать ВНЕШНЮЮ обработку? — это будеть вообще супер!

    Днозначно +

    Спасибо

    Reply
  33. ZeBeR

    (32) в Демо нет никаких ограничений. Сделал демо, чтоб можно было поюзать без установки в свою базу.

    При обновлении надо следить за изменениями в гл.модуле и справочниках «Контрагенты» и «Договоры». В гл. модуль каждый раз придется дописывать, а вот со справочников можно просто снять галочку при обновлении, т.к. они редко изменяются.

    Что касается внешней обработки см. комментарии выше.

    Reply
  34. Арчибальд

    (32)

    3) можно

    2) <Поправить процедуру «глДействия» в глобальном модуле.

    Добавить кнопку «Оригиналы» и соответствующую процедуру в формы справочников «Контрагенты» и «Договоры».> — Это заново

    1) Это не демо-конфигурация, а демонстрация доработки конфигурации.

    Автор, извиняй 😉

    Reply
  35. vcv

    (32)

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

    Reply
  36. ZeBeR

    (35)(32) кстати, вначале хотел сделать именно через внешние печатные формы, но потом решил что через кнопку «действия» будет удобнее.

    Reply
  37. vcv

    (36) Ну а что-ж тогда не сделал? Функционала у тебя минимум. Избавился бы от справочников. «Типы документов» сделал бы в виде подпапок в папке для хранения документов, имя файла делал бы из внутреннего идентификатора документа ЗначениеВСтрокуВнутр(), что бы найти все документы по контрагенту выбирать по графе отбора документы контрагента, а по документам уже файлы из папки. И скорость нормальная, и изменения конфигурации не требует.

    Вообще разбивать по подпапкам может оказаться очень полезным. У меня вон уже почти 32000 файлов в одной папке. За полгода. Для NTSF это немного, но динамика процесса начинает напрягать.

    Reply
  38. Доня

    (37) А если это можно доработать, то наверное Автор не будет возрожать?

    Процедуру понимаю, но слаба в написании.

    Прошу нижайше! Сделайте внешнюю форму.

    Автору — не возрожаете?

    Reply
  39. vcv

    (38) Эээээ… Ну вы, мадам прямо как из коммунизма вышли 🙂 Можно бесплатно поделиться чем-то сделанным за деньги работодателя (зарплату). Можно бесплатно раздать то, что возжелалось сделать для себя любимого. Но делать нахаляву под заказ — извините, как минимум за пиво или чай с плюшками.

    Reply
  40. Доня

    Окатили!

    Извините, размечталась,

    Reply
  41. Доня

    Автору

    Работает кроме:

    в кнопке «Действия» не появилось «Оригигалы документов»

    Где мне подправить — подскажите пжл!

    Reply
  42. vcv

    (41) «Поправить процедуру «глДействия» в глобальном модуле.»

    Это делалось?

    Reply
  43. GSoft

    а я у себя пошел несколько другим путем



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

    Это понадобилось для того чтобы можно было файлы хранить как вне БД так и копировать внутрь каталога БД и сохранять относительные пути к файлам. Что дает возможность при создании файловой копии БД пользоваться всем набором сохраненных файлов

    Reply
  44. vcv

    (44) Плохо только, что без использования внешних компонент 7.7 отвратительно масштабирует формы с двумя табличными частями. И если работу с файлами нужно вставить в кучу документов, замучаешься в каждый модифицировать. А при обновлении конфы совсем весело может получиться.

    Reply
  45. GSoft

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

    Задумка была в возможности подключать доки, а наиболее важные кидать в БД с сохранением относительных путей

    Хотя если сильно поднапрячься то можно все вынести в один блок глобального модуля и используя инсертер от Альфа добавлять вызов нужных процедур в процедуру ПриОткрытии

    Reply
  46. Доня

    (42) Спасибо, подправила, теперь вижу.

    Reply
  47. GenTay

    Обработка очень хороша!!!!

    Reply
  48. KurchataQ

    Реализация идеи и идея чень и очень хороша. Респект и уважуха. Главное, код открыт, можно довинтить для себя. В, принципе, любая идея здесь — это код даВинчивай сам. Так держать!

    Reply
  49. BAE1234567

    «Спасибочки ОГРОМНОЕ!!» — сказала бы я, если бы скачала файл конфигурации, а он у меня не скачивается.. Но это, конечно, не вина автора.

    Изменила почту — все пришло! СПАСИБО!!

    Reply
  50. Гость

    Неплохое приложение

    Reply
  51. gamletspb

    Неплохая идея, но есть одно но: т.к. все хранится в одном справочнике, то при достаточно большом количестве элементов все это дело начнет серьезно торомозить. Провел нагрузочный тест: добавил 10000 элементов — обработка «ОригиналыДокументов» стала открываться секунд за 5. Что не удивительно, т.к выборка элементов для текущего объекта ведется простым перебором всех элементов справочника. Соответственно годится это только для небольших объемов.

    Reply

Leave a Comment

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