<?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='\
1. Если пользователь нажмет «Просмотреть», можно изменить файл и сохранить. Даже случайно, наобдуманно. Желая, например, всего лишь подправить контрастность перед печатью. Не айс.
2. Если нажать кнопку «Изменить» предлагается прицепить новый файл. Старый при этом не удаляется, висит мертвым грузом. А ссылка из программы на новый файл указывает.
3. Операции с файлами ни как не отражаются в журнале регистрации. Это уже не мелкая придирка, это серьезный косяк.
4. Если после прицепления файлов поменять контрагента в документе (бывает, ошиблись), файлы перестают показываться у этого документа. Они вообще ни у какого документа не показываются, их можно увидеть только при установленной галочке «Все документы контрагента». И вообще получается нелогичность. «Прицепляем» файлы в документе и, как физуально воспринимается, к документу, но при оказываются они прикреплены к контрагенту, а в документе вроде как исчезли.
Спасибо за содержательный комментарий.
по п.1 — я сторонник сознательного использования компьютера, поэтому для меня это не косяк.
по п.2 — знаю об этом, возникает только если выбран файл с др. расширением. случается оч.редко, но поправлю.
по п.4 — не замечал, но согласен, буду исправлять.
и самое интересное
по п.3 — ??? а как это сделать? и так ли это критично, ведь на данные 1С оперции с этми файлами не влияют?
как правило — внешние файлы не жизненно важны, поэтому имхо — пихать инфу о них в базу — излишне, но это — только имхо.
(3) Чтоб понять жизненность, надо постоять у копира и поготовить копии документов сначала для камеральной по НДС, потом по встречной проверке с одним контрагентом, потом с другим и т.д., в следующем квартале опять … При этом копируются часто одни и те же договора, СФ, накладные, акты …
Надо учесть как бухи это делают: сначала формируют карточку счета (или какой-нибудь реестр), смотрят какие документы проходили (номера, даты, договора), потом лезут в папки, вытаскивают, ксерят, убирают обратно в папки, а здесь … зашел в документ, открыл копию, распечатал, закрыл.
Количество документов большое и такой массив информации надо как-то структурировать, создавать инструменты для отбора и быстрого поиска, а зачем если 1С бухгалтерия и есть такая структура и инструмент, всеравно бух. будет смотреть сначала в 1С.
Вообще, все документы от имени поставщика и так можно распечатать..самому из 1с.
Нафига это хранить?…
(5) угу и подписать можно и печать поставить и прям за всех за всех… и по встречке они потом точно такие же представят …
И вообще зачем бухгалтера все документы хранят, если их в любой момент распечатать можно?
(6) Ну и ? Оригиналы и так хранятся подшитыми..
Сканы то один хрен заверять придётся..
Нафига они нужны ?…
+7 И печать и подпись.. это семечки.
+ Справочник для этих целей можно и не делать вообще..
Достаточно правильно обозвать файло и привет, взяв за основу ID документа + ID клиентоса и всё… + тип файла — накладная/договор и т.д..
+9 и искать файло по маске — найдется не быстро, а очень быстро.
Итого — одна внешняя обработка, которая «цепляется» к типовым без изменения кода + 0 изменений в мд-нике.
(7) см. 4 коммент.+описание там подробно написано зачем. Копии для этих целей не заверяют у контрагентов. А хранение сканов значительно сокращает время на подготовку копий.
а вообще это все для ленивых, которым влом по десять раз копировать одно и тоже, а легче отсканировать один раз.
(9) (10) Может ты и прав, не возражаю, если кто-нибудь выложит подобное решение.
я не программист, тем более такого уровня как ты, а бухгалтер, поэтому как понимаю, так и делаю, возможно не самым оптимальным способом, но решаю свою проблему и это работает!
и думаю будет полезно другим бухам.
Вообще идея правильная (вспомните хотя бы про сертификаты — очень схожая задача, которую думаю многие решали)! Есть вопросы к реализации, но… Если это работает, то в любом случае + (хотя бы за идею и ее достижение на практике)
(13) Спасибо за поддержку, а то думал совсем запинают
(11) Это всё понятно, но оно того стоит ? К вам часто ходит в гости налоговая для встречных проверок ?
:))
+15 нам и так хватает сканить серты/справкиб ..гтд и т.д
(15) они не ходят, они письма шлют и попробуй не ответь …
Согласен с (13). Вариантов реализации море, конечно. Камин, вон держит хранилище версий. Я бы добавил в конфу общий реквизит документов.
А задача распространенная, так что плюс.
(18) Ну и ? Смысл то какой от общего реквизита ?
🙂
(16) а сканить или нет это должен главбух решать, может ему легче ксерить… на все воля его. И сканить в этом случае должны сами бухи.
(20) проще поставщиков попросить — и так вышлют в любом виде.
(19) Имя скана хранить.
(22) а если надо несколько файлов привязать?
(23) Тогда строка неогр длины и храни что хочешь… но это один хрен моветон..
Проще имя файла правильно создать и всё.
(23)Да хоть дерево папок.
У меня аналогичная задача решена. Что ломать копья, надо или не надо? В конкретном случае бывает надо: регистрация спецификаций и договоров, сертификатов, качественных удостоверений, ж/д квитанций…, привязка этих документов к различным объектам в 1С с миграцией в РБД… Тоже решил что справочник практичней.
(2) По третьему пункту, в журнале регистрации не отражается, потому что со справочником работаешь программно из обработки. Программно тогда и отражай с журнале регистрации. Зачем обработки-то? Две обработки фактически делают то же самое, что и форма справочника, форма списка справочника. Отражение в журнале регистрации полезно хотя бы для того, что если бух будет утверждать, что «прикрепил» файл к документу, а программа его сама удалила, будет хоть где посмотреть, а «был ли мальчик».
Слушайте Епрста! Он — гуру! и я такого же мнения придерживаюсь! работает все на внешних файлах с привязкой по «ид» — и никакого геморроя.. и конфа — без изменений.. и решение клонируется — простым копированием пары обработок…
(26) Спасибо, единственные практичные комментарии.
Про форму справочника — это правильно, это все упростит и не надо гемороится с журналом регистрации.
Пока оставлю все как есть и буду готовить v.2 с учетом всех замечаний.
(27) Епрст — гуру, кто же спорит,и идея хорошая вот только мне слабо написать то что он предлагает. Я про «ид»-то узнал недавно, а как с ним работать до сих пор не знаю. 😳
Может разрешите доработать свою программку, с учетом замечаний vcv? 🙁
посмотри на всякий случай вот это:
(29) Гуру, конечно, слушать надо, но не слепо им следовать.
В отдельном случае, когда нужно просто хранить файлы, привязанные к одному объекту, Ёпрст безусловно прав, его вариант проще, элегантнее, позволяет избежать дублирования информации, устраняет вероятные проблемы с рассогласованием справочника и каталога с файлами. Вдобавок проще клонируется на множество баз, может работать без изменения конфигурации, что важно для базовых или защищенных конфигураций…
Но если встают требования по, например, регистрации входящих номеров и дат документов, привязки одного файла к нескольким объектам ИБ (например документ, договор, контрагент), возникает потребность в организации хранения дополнительных реквизитов файлов, дополнительных индексов для быстрого доступа… Тут уже оправдано становится введение справочника в базе. Но можно и не вводить, а построить индексы во внешних файлах, а дополнительные реквизиты держать в NTFS-потоках…
Решать в любом случае автору, он ближе всех советчиков видит специфику требований и, хочется надеяться, лучше всех советчиков ее понимает (грустная шутка с намеком).
Автору: Я воспользовалась обработкой — добавила ее в свою базу — все заработало!
Обработка мне очень понравилась. Что-то подобное хотелось в 1С иметь!
Но есть воросы:
1) Вы предлагаете DEMO — объясните — какие ограничения?
2) При обновлении конфиги надо заново добовлять это?
3) А можно из этого сделать ВНЕШНЮЮ обработку? — это будеть вообще супер!
Днозначно +
Спасибо
(32) в Демо нет никаких ограничений. Сделал демо, чтоб можно было поюзать без установки в свою базу.
При обновлении надо следить за изменениями в гл.модуле и справочниках «Контрагенты» и «Договоры». В гл. модуль каждый раз придется дописывать, а вот со справочников можно просто снять галочку при обновлении, т.к. они редко изменяются.
Что касается внешней обработки см. комментарии выше.
(32)
3) можно
2) <Поправить процедуру «глДействия» в глобальном модуле.
Добавить кнопку «Оригиналы» и соответствующую процедуру в формы справочников «Контрагенты» и «Договоры».> — Это заново
1) Это не демо-конфигурация, а демонстрация доработки конфигурации.
Автор, извиняй 😉
(32)
Сделать внешнюю обработку в принципе можно, но без изменения конфигурации не сделаешь ее вызов из документов и справочников. Разве что в виде внешней печатной формы, но это не красиво, да и не все справочники/документы имеют поддержку внешних печатных форм (в типовых конфигурациях).
(35)(32) кстати, вначале хотел сделать именно через внешние печатные формы, но потом решил что через кнопку «действия» будет удобнее.
(36) Ну а что-ж тогда не сделал? Функционала у тебя минимум. Избавился бы от справочников. «Типы документов» сделал бы в виде подпапок в папке для хранения документов, имя файла делал бы из внутреннего идентификатора документа ЗначениеВСтрокуВнутр(), что бы найти все документы по контрагенту выбирать по графе отбора документы контрагента, а по документам уже файлы из папки. И скорость нормальная, и изменения конфигурации не требует.
Вообще разбивать по подпапкам может оказаться очень полезным. У меня вон уже почти 32000 файлов в одной папке. За полгода. Для NTSF это немного, но динамика процесса начинает напрягать.
(37) А если это можно доработать, то наверное Автор не будет возрожать?
Процедуру понимаю, но слаба в написании.
Прошу нижайше! Сделайте внешнюю форму.
Автору — не возрожаете?
(38) Эээээ… Ну вы, мадам прямо как из коммунизма вышли 🙂 Можно бесплатно поделиться чем-то сделанным за деньги работодателя (зарплату). Можно бесплатно раздать то, что возжелалось сделать для себя любимого. Но делать нахаляву под заказ — извините, как минимум за пиво или чай с плюшками.
Окатили!
Извините, размечталась,
Автору
Работает кроме:
в кнопке «Действия» не появилось «Оригигалы документов»
Где мне подправить — подскажите пжл!
(41) «Поправить процедуру «глДействия» в глобальном модуле.»
Это делалось?
а я у себя пошел несколько другим путем
создал справочник внешних документов, в элемента которого хранится ссылка на файл и объект-владелец.
Это понадобилось для того чтобы можно было файлы хранить как вне БД так и копировать внутрь каталога БД и сохранять относительные пути к файлам. Что дает возможность при создании файловой копии БД пользоваться всем набором сохраненных файлов
(44) Плохо только, что без использования внешних компонент 7.7 отвратительно масштабирует формы с двумя табличными частями. И если работу с файлами нужно вставить в кучу документов, замучаешься в каждый модифицировать. А при обновлении конфы совсем весело может получиться.
(45) полностью согласен, но поскольку этот механизм придумывался для новых конф, то вопрос обновлений сильно не встает.
Задумка была в возможности подключать доки, а наиболее важные кидать в БД с сохранением относительных путей
Хотя если сильно поднапрячься то можно все вынести в один блок глобального модуля и используя инсертер от Альфа добавлять вызов нужных процедур в процедуру ПриОткрытии
(42) Спасибо, подправила, теперь вижу.
Обработка очень хороша!!!!
Реализация идеи и идея чень и очень хороша. Респект и уважуха. Главное, код открыт, можно довинтить для себя. В, принципе, любая идея здесь — это код даВинчивай сам. Так держать!
«Спасибочки ОГРОМНОЕ!!» — сказала бы я, если бы скачала файл конфигурации, а он у меня не скачивается.. Но это, конечно, не вина автора.
Изменила почту — все пришло! СПАСИБО!!
Неплохое приложение
Неплохая идея, но есть одно но: т.к. все хранится в одном справочнике, то при достаточно большом количестве элементов все это дело начнет серьезно торомозить. Провел нагрузочный тест: добавил 10000 элементов — обработка «ОригиналыДокументов» стала открываться секунд за 5. Что не удивительно, т.к выборка элементов для текущего объекта ведется простым перебором всех элементов справочника. Соответственно годится это только для небольших объемов.