Перенос справочников из 7.7 в 8.1 (OLE) с переносом групп




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

38 Comments

  1. agentesecreto

    ну вот сам файл

    Reply
  2. _also

    На КД не быстрее?

    Reply
  3. Redrick

    Помогите пожалуйста разобраться. При переносе говорит

    Перед записью в элементе справочника «Номенклатура» необходимо заполнить «базовая единица»!

    Перед записью в элементе справочника «Номенклатура» необходимо заполнить «вид номенклатуры»!

    Я запутался, что делать? Класификатор едениц. изм. заполнил, виды номенклатуры тоже.

    Reply
  4. Redrick

    Все разобрался, извините за беспокойство

    Reply
  5. isn

    добрый день, господа, выложите данную обработку или пошли пожалуйста мне на почту isn978@gmail.com , а то я не могу скачать.

    Reply
  6. suxo

    запустил в УТ 10.3

    указываю путь к базе торговля склад

    нажимаю подключить — пишет

    {Форма.Форма(237)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса

    V7=Новый COMОбъект(«V77s.Application»);

    по причине:

    Недопустимая строка с указанием класса

    Reply
  7. mikhailmv
    Redrick пишет:

    Все разобрался, извините за беспокойство

    Помогите пожалуйста и мне разобраться, а то уж несколько ней именно с это проблемой вожусь.

    Спасибо!

    Reply
  8. mikhailmv

    УРА!

    И до меня дошло!!!

    Спасибо дорогой Автор!

    Reply
  9. si4

    Спасибо автору, за актуальную прогу! Именно то что нужно.

    Reply
  10. pahmelos

    Автор! у вас мега актуальная обработака тлько при подключении базы 7.7 вылезла ошибка как в (6) {Форма.Форма(237)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса

    V7=Новый COMОбъект(«V77s.Application»);

    по причине:

    Недопустимая строка с указанием класса

    что делать?

    Reply
  11. 6есик

    Эта ошибка значит что у вас не подымается оле объект, возможно вы просто скопировали папку с бинарником 1с (7.7), или инсталили и при первом заходе в программу у вас было не достаточно прав доступа, и программа не сделала своих записей в реестре виндовс. Решается данная проблемма инсталляцией 1с-ки (7.7) и потом первый раз её нужно запустить под учетной записью администратора.

    Reply
  12. provnick

    Все так прекрасно начиналось:

    Загружается: .0000945 <Бакалея>, уровень 1

    Загружается: .0001909 <Аджика>, уровень 2

    Загружается: .0000053 <Блюда быстрого приготовления>, уровень 2

    Загружается: .0001981 <Big Bon>, уровень 3

    Загружается: .0002172 <Mivimex>, уровень 3

    Загружается: .0001592 <Podravka>, уровень 3

    и т.д.

    вдруг ошибка: {Форма.Форма(167)}: Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!

    ЭлОбъект=Эл.ПОлучитьОбъект();

    по причине:

    Элемент не выбран!

    Что может быть?

    Reply
  13. provnick

    И еще, все наименования, что записались в базу — названия папок и не одного элемента

    Reply
  14. Erhov_egor

    скачать другую может обработку?

    Reply
  15. Erhov_egor

    или это невозможно?

    Reply
  16. Erhov_egor

    а может легче самому написать

    Reply
  17. provnick

    Заменил Эл = Спр.НайтиПоКоду(Спр77.Код) на Эл = Спр.НайтиПоНаименованию(Спр77.Наименование) теперь группы сформировались правильно, но элементы не записались и вышла ошибка: {Форма.Форма(199)}: Ошибка при получении значения атрибута контекста (ПолноеНаименование): Неизвестная ошибка

    Эл[СокрЛП(СтрокаСт.Реквизит)] = Спр77[СокрЛП(СтрокаСт.Реквизит_77)];

    Reply
  18. provnick

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

    Reply
  19. provnick

    да уж, что то никак не хочет элемент записывать: Загружается: 00034527 <Аджика»Боген»кавказская 130гр.>, уровень 3 Ошибка:Перед записью в элементе справочника «Номенклатура» необходимо заполнить «базовая единица»! В семерке реквизит БазоваяЕдиница тип Справочник.ЕдиницыИзмерения в 8ке БазоваяЕдиницаИзмерения тип СправочникСсылка.КлассификаторЕдиницИзмерения

    Reply
  20. provnick

    Может забредут сюда (3) и (8), что й то у меня с единицами никак (Ошибка:Перед записью в элементе справочника «Номенклатура» необходимо заполнить «базовая единица»!) или может кто подскажет?

    Reply
  21. jshadow

    Спасибо автору! Именно то что мне было нужно для переноса огромной кучи номенклатуры из БП7 в УТ8.

    Reply
  22. ok1infos

    Автору спасибо, но ошибочка с названием объекта решается вот так

    было V7=Новый COMОбъект(«V77s.Application»);

    стало V7=Новый COMОбъект(«V77.Application»);

    Reply
  23. Murik_1984

    Спасибо автору. Так а что на счет ошибки:

    вдруг ошибка: {Форма.Форма(167)}: Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!

    ЭлОбъект=Эл.ПолучитьОбъект();

    по причине:

    Элемент не выбран!

    Что может быть?

    У меня тоже такая ошибка. Возможно, что элемент заблокировался в 7.7. Или произошла какая-то ошибка при выборке элементов из 7.7.

    Reply
  24. kavrov

    Автору спасибо. Очень полезный материал. Мне обработка пригодилась при переходе с 7.7 на 8.2.

    Reply
  25. marishka60632

    спасибо автору. Но с помощью конвертации данных и правда все это более универсально сделать можно

    Reply
  26. saur

    Хорошо отработала, есть предложения:

    1. добавить возможность наложения фильтров для переносимого справочника (хотябы по группе)

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

    Reply
  27. xDee

    Спасибо автору. А ошибка так и не исправлена:

    {Форма.Форма(167)}: Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!

    ЭлОбъект=Эл.ПолучитьОбъект();

    по причине:

    Элемент не выбран!

    Что может быть?

    У меня тоже такая ошибка.

    Reply
  28. mari0210

    запустила в БГУ 1.0.10.2

    указываю путь к базе торговля склад

    нажимаю подключить — пишет

    {Форма.Форма(237)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса

    V7=Новый COMОбъект(«V77s.Application»);

    по причине:

    Недопустимая строка с указанием класса

    Reply
  29. mari0210

    разобралась с этой ошибкой….но ничего не грузится….тишина….что не так? сопоставление для каждого реквизита надо делать? а если надо только догрузить? а очищать уже имеющийся справочник не надо…не получается…

    Reply
  30. agentesecreto

    (29) mari0210,

    сопоставление надо делать для каждого реквизита

    если не совпадают типы — придется дописывать обработку

    насчет «догрузить» уже не помню как оно работает, мне догружать не нужно было, наоборот была цель как раз отладить разовую загрузку начисто

    Reply
  31. mari0210

    спасибо за ответ, переделала отчет, загрузила ,вернее сказать до грузила…спасибо за опыт)))

    Reply
  32. www2007

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

    Reply
  33. mail-simferopol@rambler.ru

    А если не сложно закиньте обработку на mail-simferopol@rambler.ru

    и не ясно, что делать с единицами и типом товара?

    Reply
  34. agentesecreto

    (33) bereznoy, закинул на мыло

    с единицами и типом товара честно говорят сам не понял что происходит у народа, я не сталкивался с такоцй проблемой, ну вон пишут что разобрались сами как-то, возможно надо чтобы в справочнике единиц была хоть какая-то единица (или в константах единица по умолчанию), а в справочнике типов хотя бы один тип «Товар»

    Reply
  35. Uran

    Универсальная штучка. Работает в 8.2. Как простой и универсальный вариант для небольших работ — хорошая обработка.

    Reply
  36. MartyNSK

    Плюсанул, когда быстро надо тогда возможно пригодится, а так ведь есть типовые средства http://infostart.ru/public/150080/, да и КД в конце концов есть.

    Reply
  37. MartyNSK

    Ой, про типовые средства это я погорячился, тут отбор по справочнику есть, сорри)

    Reply
  38. Stepan_1c

    зря скачал… придется всё же через кд.

    Reply

Leave a Comment

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