Перенос справочников, остатков и документов




Принцип обмена данными из 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='\

47 Comments

  1. Арчибальд

    А скрин?

    Reply
  2. Nina_pn

    Чего то база не подцепляется

    Reply
  3. dedkov

    База может не подцеплятся, если она, например, не проиндексированна… попробуйте поставить галочку «монопольно».

    Скрин попробую счас добавить.

    Reply
  4. dedkov

    Кстати рекомендую таблицы соответствия сохранять, мне это пригодилось.

    Reply
  5. константин

    «Перечисление»

    ТекОбъект.УстановитьАтрибут( ТаблицаДокументов.ПолучитьЗначение( ЖЖ_, «Наименование» )ОСОДВ1.2.ERT(1810)}: Поле агрегатного объекта

    не обнаружено (Идентификатор)

    Наверное надо установить проверку на пустое значение…

    Reply
  6. dedkov

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

    Кстати если кто-нибудь поучаствует в совершенствовании обработки, будет просто прекрасно…

    Вродь все мы хотим сделать этот мир лучше.

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

    (6) Не обещаю. Но подумаю…

    Reply
  8. marsohod

    Сыровато…

    При подключении к базе выдается диалог регистрации, хотя она есть в списке зарегистрированных баз 1С…

    Через OLE, вообще-то, при переносе данных надо всегда подключаться монопольно…

    Reply
  9. marsohod

    (8) Сорри, смотрел на portable-версии 1С, наверное поэтому запрашивала регистрацию базы.

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

    Упс! Здесь есть уже…

    Reply
  11. lexkex

    По моему удобнее получать данные из Оле, чем передавать их туда 🙂

    Reply
  12. lexkex

    Весч интересная надо будет потестить ))

    Reply
  13. dedkov

    11, так и есть за исключением пометки на удаление перенесенных документов, ито если это необходимо.

    Reply
  14. dedkov

    Теперь программа умеет делать из остатков бо бухитогам документы. 💡

    Reply
  15. 07071977

    Нужно перенести справочники из одной базы в другую. Я конечно и тупой, но может кто-то объяснит как пользоваться этой обработкой. заранее огромный респект 😮

    Reply
  16. dedkov

    (15) В мануале описаны этапы переноса информации. на каком этапе возникает проблема? Из какой базы в какую делаем перенос? В каком городе находится уважаемый пользователь?

    Reply
  17. dedkov

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

    Reply
  18. 07071977

    Сорри, если непонятно изложил вопрос! Вот проблема по порядку:

    1. Есть рабочая база 1с:Предприятие 7.7 для бюджетных учреждений релиз 633.

    2. Бухгалтера решили завести еще одну базу для другого подразделения.

    Моя задача перенести коды КБК Справочники-Организационная структура-Балансодержатели-#наименовани балансодержателя# двойной клик- вкладка Коды КБК. А так же Справочники-Бюджетная классификация-КБК.

    Что хотел спросить: как запустить обработку ОСОДв1.3.ert? а именно куда ее нужно поместить и чтосделать чтоб у меня появилось окно как на скриншоте? что значит через OLE? на какомто форуме прочитал про обработку Tranref.ert которая вроде по описанию сможет мне помоч, скачал, но и сней тож ума не дал. Подкажите, плиз,что делать? ❓

    Reply
  19. dedkov

    (18), поместить ее можно куда угодно в пределах доступности меню «файл-открыть»… собственно открыть её как внешнюю обработку, т.е. нажать «файл-открыть».

    Reply
  20. mechail72

    Думаю пригодится 🙂

    Reply
  21. Pic_nic

    uri-fl. Перенес номенклатуру из ТиС, все корректно (за исключение, «абсолютного переноса»-я думал помеченные на удаление объекты он переносить не станет)

    ❓ Не смог перенести остатки по счетам, хотя бы по тем же товарам…

    В инструкции про остатки ни слово, можно пояснить!??

    Reply
  22. dedkov

    (21).Pic_nic, для того что бы перенести остатки по регистрам, нужно немного исхотриться, программа была разработана для работы с бух. итогами, но если есть желание и необходимость то всегда можно ухитриться… например если сформировать документ списание по всем товарам в исходной базе и загрузить этот документ как ввод остатков. Кастыль, но вариант рабочий.

    Reply
  23. Pic_nic

    (22) Так, а зачем вкладка «ОСТАТКИ»!??

    если он их не тащит?

    и…

    я думал помеченные на удаление объекты он переносить не станет

    😉 можно ли с этим бороться, да бы не раздувать номенклатуру!??

    Reply
  24. dedkov

    (23) Pic_nic. Вкладка остатки нужна для работы с бух. итогами.

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

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

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

    Reply
  25. Pic_nic

    🙂 Спасибо!

    Reply
  26. Хранитель

    При переносе документов выдает следующую ошибку:

    СоответствиеДокументыТекст.Записать( ИмяФайлаСоотДок );

    {C:TEMP1СOSOD_V1_3ОСОДВ1.3.ERT(370)}: Неверное имя файла!

    Подскажите плиз как ее исправить!

    Переношу из 464 конфы в 508. Бух учет 7,7

    Reply
  27. dedkov

    (26) Рекомендую прочитать мануал. Там написано.

    Нужно задать имя файла соответствий на вкладке документы, нажав кнопочку «..»

    Reply
  28. Хранитель

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

    Подскажите плиз еще:

    При переносе остатков выскакивает такое сообщение:

    Если ( ( Уровень <= УровеньКонецШапка ) Или ( УровеньКонецШапка = -1 ) ) Тогда

    {C:TEMP1СOSOD_V1_3ОСОДВ1.3.ERT(1249)}: Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)

    Reply
  29. dedkov

    (28) Эт нужно ковырятся, при наличии времени просмотрю, а если есть желание, то можно и в коде самому поковыряться:).

    Reply
  30. radomicheva

    Спасибо за обработку давно искала такую

    Reply
  31. NeSober

    «Неудачная попытка подключения к базе»

    Не могу никак подключить и даже в монопольном режиме(

    Reply
  32. dedkov

    Если после всего написанного есть проблемы с подключением, мне на ум приходит только:

    проверьте кодовую страницу ИБ и проиндексируйтесь с помощью конфигуратора.

    Reply
  33. vers139

    (28) Та же ошибка. Вопрос автору: УровеньКонецШапка присваивает -1 только в том случае, если РежимДокумент = 0. Соответственно, при переносе остатков по коду 1С сюда не заходит и УровеньКонецШапка остаётся неопределённым. Пробовал перенести всё, выбрав период, где заведомо нет документов. Не помогло.

    После изучения кода, проб и ошибок нашёл как подредактировать обработку, чтобы работала. Не могу прикрепить файл. Если кому надо, могу выложить на народ.

    Reply
  34. dedkov

    Товарищи, завтра или послезавтра постараюсь выложить версию без этой ошибки. потерпите пожалуйсат

    Reply
  35. kz___alex

    всем привет. а есть аналогичные обработки?

    проблема такая. есть 2 идентичные базы.

    первая база велась с 2005 года по 31.12.09. с 1-го января сделали чистую базу и перенесли только справочники (без остатков). по текущий день пользователи забивают в ней документы.

    теперь с 1-й базы нужно перенести остатки на 31.12.09. структура баз абсолютно одинаковая.

    Reply
  36. lihomanov

    Скинь рабочею обработку!!!! Заранее спасибо!!! 😀

    Reply
  37. dedkov

    Всех прошу меня простить за то что до сих пор не выложил обработку. Извините меня пожалуйста. Уделяю время другим делам. Но для тех кто хочет переносить остатки не из регистров подойдет версия 2. она рабочая и оттестированная… Версия 3 делалсь для переноса остатков из регистров и получилась костылявая.

    ПС. Актуальность работ для 7.7 снижается. Let’s go to 8 version.

    Reply
  38. mimoist

    Вот только немного не понятно, в какой базе надо запускать обработку? В источнике или в приемнике?

    Reply
  39. vers139

    (38) обработка запускается в источнике. В поле «Каталог базы» — путь к базе-приёмнику.

    Reply
  40. Nikola178
    vers139 пишет:

    (28) Та же ошибка. Вопрос автору: УровеньКонецШапка присваивает -1 только в том случае, если РежимДокумент = 0. Соответственно, при переносе остатков по коду 1С сюда не заходит и УровеньКонецШапка остаётся неопределённым. Пробовал перенести всё, выбрав период, где заведомо нет документов. Не помогло.

    После изучения кода, проб и ошибок нашёл как подредактировать обработку, чтобы работала. Не могу прикрепить файл. Если кому надо, могу выложить на народ.

    Доброго времени суток….Выдается такая ж ошибка » Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)»…плиз, если не сложно киньте рабочую версию на ящик Nik178@list.ru …надо срочно перенести остатки..

    Заранее большое спасибо!!!

    Reply
  41. Arin

    Спасибо!!!

    Reply
  42. dedkov

    (41) Слава Богу!

    Кстати я выложил снова версию 1.2. Там не должно быть проблемы с «УровеньКонецШапки». Если кому нужна будет именно 1.3 обращайтесь лично.

    Reply
  43. ela

    Спасибки

    Reply
  44. Famza

    (0) Пробовал остатки перенести — все отлично, почти… Не переносит документы как субконто. Неужели для этого нужно перенести документы все? Ошибка выскакивает в строке 914:

    ЕстьвСоот = ЗнДляЗапСуб.НайтиПоНомеру( ТекДок_.НомерДок, ТекДок_.ДатаДок, ТекДок_.Вид( ) );

    И не хватает все-таки объяснялки.

    ЗЫ. Валюта тож не перенеслась (((

    Reply
  45. ACE$

    по каким реквизитам выполняется поиск справочников в базе-приемнике?

    Reply
  46. Evgeny-st

    Все Ок!

    Reply
  47. Evgeny-st

    Добрый день!

    Открываю обработку в Бух 7.7 УСН (релиз 220), нажимаю кнопку «Обновить», выдает ошибку:

    Для Индекс=1 По БазаОле.Метаданные.Справочник() Цикл

    {D:ОБРАБОТКИ7.7ОСОДВ1.3.ERT(1559)}: Значение не представляет агрегатный объект (Метаданные)

    Причем когда открываю в Бух 7.7 ОСН (релиз 570) там все нормально читает.

    Что не так?

    Reply

Leave a Comment

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