CopyDoc BS (Привязка внешних файлов в 7.7)




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *