<?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) Дело в том, что там не чистый «Аспект». В течение 7 лет его дорабатывали, в итоге там появились партии, ГТД, некое подобие «холдингов» 1С-овских, переработан механизм иерархии номенклатуры, валютный учет изменен и т.п. Поэтому обработка будет малополезна. А вот про алгоритм могу рассказать… возможно, кого-то наведет на светлые мысли в аналогичных задачах (если кому-то покажется интересным — оформлю отдельной статьей):
Итак, после недельного ковыряния в DBF-ках Аспекта (параллельно со сдачей диплома) и попыткой сопоставить реальность данных с документацией на БД (а в «Аспекте», надо заметить, изначально очень хорошее описание БД, только вот доработчики моей базы поленились) в голову пришла светлая мысль — ведь есть чудесная софтина от мелкомягких, называется Access!!! Это чудо предоставляет достаточно широкие возможности по импорту/экспорту. В ней можно создать таблицы, источниками данных которых будут мои DBF’ки. Так я и сделал… в итоге получил набор таблиц в БД Access, ну а дальше дело техники. В Access нарисовал схему данных, указал типы связей. Все стало вставать на свои места. Посмотрел на выполненную схему данных, вроде стало понятно, каким образом рассчитываются партии по гтд, по какому признаку объединяются контрагенты и т.п.
Все в том же Access с помощью конструктора запросов (а он там достаточно удобный, согласитесь) получил нужные мне выборки в удобной форме и без необходимости еще как-то объединять таблицы.
Дальше кому как удобней — можно импорт напрямую из Access, можно экспортом результатов запросов в *.xls(x), *.dbf и т.п.
Я использовал экспорт запросов в DBF, т.к. до Access начиналось все именно с этого, и обработка по импорту уже была готова.
К слову, для импорта из DBF в 1С использовалась компонента GameWithFire.
Вот такой вот универсальный метод переноса данных получился.
Позже работники фирмы, для которой делал перенос, использовали мою БД Access для поиска косяков в ведении учета (коих нашлось не мало, а в Аспекте их вообще нереально было найти).
Метод хорош тем, что для компоновки данных особых знаний не требуется — интерфейс Access интуитивно понятен, данные всегда актуальны (т.к. используется связь таблиц с файлами для импорта) , можно обойтись без написания кода в vba и не париться с компоновкой данных запросами (честно говоря, после моего перехода на 8.1 у меня уже сложности с написанием SQL запросов «от руки», в которых нужно объединить более 3х таблиц, а в Access конструктором запроса я без труда скомпоновал данные из 9 таблиц в одном запросе).
Фигасе камент получился….
Сам вот делал загрузку из dbf-файлов сразу в 1С-ку. В основном конечно это касалось Справочников …
Обработка хорошая!
Только уберите, пожалуйста, фразу «, ставьте плюсы, если понравилось.». За Вас уже все написали. Сразу перед оценкой сообщества. А администрация рассматривает такие фразы как выклянчивание плюсов и не одобряет!
Оригинальная идея!
(6) ты про обработку или про импорт?
(5) прошу прощения, в первый раз выкладываю что-то )
(7) Про обработку.
Полезная вещь, спасибо!
Сам сейчас пишу правила из 77 в 8.
Действительно надо смотреть внутрь объектов, чтобы понять «как там внутри». Тут и писать ничего не надо. Консоль запросов и все. «Выбрать * Из ХХХ».
Так что из полезного — код. Если надо.
(11) Это упрек? Если так, то, насколько я знаю, в Вашем варианте без временных таблиц не обойтись, а если еще и табличные части…
А Вы попробовали обработку в действии? Может быть Вы концепт не уловили?
З.Ы. Если неправильно понял, то прошу прощения.
(12) Нет.
Не понял насчет временных таблиц. Зачем? Консолью смотрю любые реквизиты шапки или любые ТЧ доков и спр. Смотри сколько влезет. Понятно, что в одним запросом не увидеть и реквизитов шапки и все ТЧ — сделай несколько запросов (1+КоличествоТЧ)
Вот в 7.7 такого универсального механизма нет.
Ну а формирование кода — плюс, если надо.
Из обработки менять реквизиты можно?
класная , удобная вешь
(14) Сори за задержку. А встречный вопрос: надо ли? Если исходить из цели — нет. Ведь изменение реквизитов, скажем, в документе вызовет необходимость его проведения… ну и т.д.
(15) плюсы ставить не забываем 😉
При формировании кода не хватает заполнения реквизитов значениями. Если реквизиты НЕ справочникидокументы, то их при формировании можно было бы и присвоить.
(18) Не совсем понял. Т. е. формировать код для создания текущего одъекта? Если приведешь пример, когда этого нехватает — сделаю и обновлю. И спасибо скажу ;).
Пример:
Надо мне сделать новый док РеализацияТиУ. Беру готовый. формирую код. Тут ОК.
Потом руками пишу напротив отражать в учете истину, по перечислениям — тупо смотрю в обработку на вид и значение и пишу руками (Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия).
Если бы такие значения были уже присвоены согласно образцу — было бы быстрее.
А то работаю негром
(20) ОК. На выходных сделаю. Спасибо.
Обновил. Прошу прощения за задержку.
Еще, по-моему, надо бы добавить в «Тип значения» для числовых и строковых реквизитов и их длину.
(23) Надо бы, тока я не знаю как 🙁
(21) ЗНАЧИТЕЛЬНО лучше. Однако:
1. Значения типа план счетов теряются при переносе в код. В доке есть, в таблице показывается, в коде пусто, только тип.
2. Перечисления в контексте данной задачи лучше считать не ссылочным, а заполнять сразу как и примитивные типы (числострокадата). То же вероятно относится и к плану счетов.
3. Может заполнять ТЧ по образцу первой строки? Не настаиваю.
4. Длина: Рекв.Тип.КвалификаторыЧисла.Разрядность и РазрядностьДробнойЧасти
(25) 1. Догадывался, но не на чем было проверить 🙁
2. Согласен, но не придумал (или не додумал… уже не помню), как их вытаскивать. Имя же нельзя для элемента получить, а синоним не всегда с ним совпадает. Подскажите, как засунуть?
3. Она так и заполняется… проблема возникает, когда ТЧ пустая.
4. Спасибо, на этих выходных обновлю еще разок.
(25.4) А со строками как (чеб не мучаться)? В т. ч. неогр. длины?
(26)
http://screencast.com/t/0VdrZ1vEgq
2. Не понял про перечисления. Они ж работают у тебя, тока заполняются вместе со справочниками. Пусть заполняются с числами и строками.
3. Анализирую реализацию. Формирует код ТЧ товары, но значения не подставляет. ТЧ не пустая.
4. Строки и т.п
(+ добавлено, — удалено, * испраВлено, #k8SjZc9Dxk переработано)
=))
Дошли руки наконец-то 😀
Спасибо агромадное от обычного пользователя. несколько суток ручной работы съэкономила
Спасибо! Действительно очень нужная вещь!)))