Универсальная обработка для загрузки данных из Экселя в табличную часть документа




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

80 Comments

  1. tango

    Можно ли считать дамой девушку, имевшую диск ИТС? ну, более-менее регулярно

    Reply
  2. ОбнажЁнная_Маха

    (1) Не поняла шутки юмора… Что Вы имеете ввиду?

    Reply
  3. tango

    Цитата из ИТС, если Вы понимаете, что я имею в виду на этот раз:

    Обработка ЗагрузкаДанныхИзТабличногоДокумента.epf находится в каталоге 1СITSEXEExtRepsUnireps8

    Это по-существу. А тон вызван предчувствием появления у вас трех и более плюсиков за это.

    Reply
  4. Abadonna

    >Можно ли считать дамой девушку

    Все женщины делятся на:

    — дам

    — не дам

    — дам, но не Вам

    😉

    Reply
  5. ОбнажЁнная_Маха

    Цитата из ИТС, если Вы понимаете, что я имею в виду на этот раз:Обработка ЗагрузкаДанныхИзТабличногоДокумента.epf находится в каталоге 1СITSEXEExtRepsUnireps8

    (3) а, я так и думала! 🙂 Ну и что?? Просто интересно мне было самой такую штуку написать — вот я и написала :)))

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

    а вас что — завидки берут?? Так не мужское это дело, товарищ, чужие плюсики считать и эмоции отрицательные по поводу их количества растущего испытывать 😛

    Reply
  6. vasilykushnir

    (5)Ай да молодца, девочка! Браво!

    Reply
  7. tango

    (4) ок. правильный вопрос: чем делится девушка с ИТСом? раньше, говорят, в парках девушки были с ВЕСЛОм, гипсовые. они никак не делились, поэтому их больше нету. а у нас есть. жизнерадостные от того, что тоже пишут.

    Reply
  8. Lapitskiy

    Это недолго. Пока замуж не возьмут. Потом желание программировать у девушек пропадает напрочь.

    Reply
  9. Abadonna

    (9) Не всегда. Знаю одну мадам, замужем. Мало того — муж крутой бизнесмен, и ей ваще работать не обязательно. Программит, ходит на работу — ей этого хочется

    Reply
  10. ОбнажЁнная_Маха

    я вобще понять не могу, какая связь между желанием заниматься любимым делом (неважно, каким, например программированием) и личной жизнью… Опыт подсказывает, что одно другому ни капельки не мешает! 🙂

    Reply
  11. cs25

    Достойно !!! Плюсуем !!!

    Reply
  12. tango

    «опыт подсказывает, что… не могу понять» 🙂 даже «я вообще не могу понять» 🙂

    Reply
  13. ded00786

    Чего пристали к девушке… или к мадам… или к мадмуазель… в общем к Махе 🙂

    Если человек программирует и ему это нравится, то какая нахр..н разница парень это или девушка, пусть даже «ОбнажЁнная»???

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

    Хотя, опять-же, какая к черту разница…

    Reply
  14. vasilykushnir

    (13) Ну не скажи… Бог для того и создал женщин, чтобы:

    а) к ним приставать

    б) мужики не спились от счастья…

    или б) — все таки была первоначальная задумка?…

    А относительно логики… Все-таки такой дисскусии не место в теме разработки. А Маху никто не обижает (капелька иронии еще никому не вредила) и даже смирились, что она Обнаженная.

    Reply
  15. tango

    между прочим, никто не может утверждать, что этот учаснег — женскава полу

    Reply
  16. Abadonna

    (15) я могу 😉

    Reply
  17. tango

    так она москвичка? ну…

    Reply
  18. Abadonna

    (17) Вообще-то город в профайле указан 🙂

    Reply
  19. ded00786

    (13) 🙂

    (15) Откуда такая неприязнь? Или вы знакомы? А нас дурите? 😉

    Reply
  20. rasswet

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

    Reply
  21. blacky64

    Полезненько… ThanX!

    Reply
  22. MX

    Подобный велосипед давно катается на дисках ИТС. Но и этот неплох, поставил плюсик.

    Reply
  23. CheBurator

    подобный велосипед лайт-версия на 7.7 позволяет грузить и быстро соотносить «похожие» названия… (продемонстрировано на примере заявок загрузок покупателей)

    http://www.infostart.ru/profile/174/projects/393/

    .. спрашивается: а что нового в *-ке…? 😉

    Reply
  24. asvel

    1C и Женщина = две вещи совместные! Плюс!

    Reply
  25. RegrZ

    Умница, красиво и оригинально 🙂

    Reply
  26. poppy

    Сделаю девушке приятно — оставлю комментарий!

    Мдааа… Лучше-б я не смотрела эту обработку. Только расстроилась.

    Некрасиво и неоригинально. Куча ошибок и ляпов.

    Особый шедевр — выбор вида документа… Жесть. 🙁

    Имхо в коде опреатор Выполнить лишний. Такой функционал можно реализовать и без него.

    Например, вместо:

    Код
       СтрокаДляВыполнения = "ВспомогательныйРеквизит = Документы." + Документ.Метаданные().Имя + ".ПолучитьФормуНовогоДокумента();";
       Выполнить(СтрокаДляВыполнения);
    ...
          Выполнить("ЗагружаемаяТЧ = ВспомогательныйРеквизит.ДокументОбъект." + ЭлементыФормы.ТабличныеЧастиДока.ТекущиеДанные.НаименованиеТЧ + ";");
    

    Показать полностью

    можно написать:

    Код
       ВспомогательныйРеквизит = Документы[Документ.Метаданные().Имя].ПолучитьФормуНовогоДокумента();
    ...
          ЗагружаемаяТЧ = ВспомогательныйРеквизит.ДокументОбъект[ЭлементыФормы.ТабличныеЧастиДока.ТекущиеДанные.НаименованиеТЧ];
    

    Показать полностью

    Reply
  27. tango

    (29) люди смотрят на маху, как она пишет, а не на то, что она написала

    Reply
  28. nvetal

    А загружает ли он с группировками?

    Reply
  29. Fixator

    Согласен с Che

    Reply
  30. gp42

    ОбнажЁнная_Маха исправь такую ошибку

    У тебя метод НайтиПоНаименованию(<значение ячейки из Excel>)

    Теперь такой момент, у меня в наименованиях товаров встречаються кавычки например (телевизор «Philips»)

    метод НайтиПоНаименованию(«телевизор «P<?>hilips»») выдает ошибку …..

    Продумай вариант замены кавычки » на две ковычки «»

    Reply
  31. gp42

    сними с пароля модуль отчета, я его немного доработать хочу

    Reply
  32. poppy

    (35)

    Можно обойтись и без замены кавычек. Если отказаться от оператора "Выполнить". О чем говорилось в (29).

    Код:

    Код
    Выполнить("Если " + строка.ТипРеквизитаТЧДока + ".НайтиПоНаименованию(""" +
    ДокЭксель.Sheets(1).Cells(счСтрок,счКолонок).Value + """) = " +
    строка.ТипРеквизитаТЧДока + ".ПустаяСсылка() тогда " +
    "Ответ = Вопрос(""Элемент справочника " +
    Прав(строка.ТипРеквизитаТЧДока,СтрДлина(строка.ТипРеквизитаТЧДока) -
    Найти(строка.ТипРеквизитаТЧДока,".")) + " с наименованием " +
    ДокЭксель.Sheets(1).Cells(счСтрок,счКолонок).Value +
    " не найден! Добавить элемент??"", Режим, , , ""Вопрос"");" +
    "Если Ответ = КодВозвратаДиалога.Да Тогда ФормаЭлемента = " +
    строка.ТипРеквизитаТЧДока +
    ".СоздатьЭлемент().ПолучитьФорму(); ФормаЭлемента.Элементыформы.Наименование.Значение = """ +
    ДокЭксель.Sheets(1).Cells(счСтрок,счКолонок).Value +
    """; ФормаЭлемента.ОткрытьМодально(); СтрокаТЧ." + строка.РеквизитТЧДока +
    " = " + строка.ТипРеквизитаТЧДока + ".НайтиПоНаименованию(""" +
    ДокЭксель.Sheets(1).Cells(счСтрок,счКолонок).Value +
    """); КонецЕсли; КонецЕсли;");
    

    Показать полностью

    Заменить на:

    Код
    Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СтрокаТЧ[Строка.РеквизитТЧДока])) Тогда
       
       Спр = Новый(ТипЗнч(СтрокаТЧ[Строка.РеквизитТЧДока]));
       Наименование = ДокЭксель.Sheets(1).Cells(счСтрок,счКолонок).Value;
       
       Если Справочники[Спр.Метаданные().Имя].НайтиПоНаименованию(Наименование).Пустая() Тогда
          Ответ = Вопрос("Элемент справочника " + Спр.Метаданные().Имя + " с наименованием " +
          Наименование + " не найден! Добавить элемент??", РежимДиалогаВопрос.ДаНет, , , "Вопрос");
          Если Ответ = КодВозвратаДиалога.Да Тогда
             ФормаЭлемента = Справочники[Спр.Метаданные().Имя].СоздатьЭлемент().ПолучитьФорму();
             ФормаЭлемента.Элементыформы.Наименование.Значение = Наименование;
             ФормаЭлемента.ОткрытьМодально();
             СтрокаТЧ[Строка.РеквизитТЧДока] = ФормаЭлемента.Ссылка;
          КонецЕсли;
       КонецЕсли;
    КонецЕсли;
    

    Показать полностью

    Reply
  33. VicAlex

    Сделать бы еще поиск не только по Наименованию, но и по выбранному реквизиту.

    Могут быть элементы с одинаковыми наименованиями, но с каким-то «ключевым» реквизитом.

    Reply
  34. Sergey K

    Зачем закрывать модуль обработки..

    я предполагаю, ничего сверхъестественного там нет.. 🙂

    Reply
  35. ОбнажЁнная_Маха

    (39) А чтобы не видно было моего некрасивого и неоптимального кода! 😀

    Reply
  36. gutentag

    А как загрузить данные в Операцию(хотя бы в бух.учет) ?

    Reply
  37. strah4

    Мммм… не понял, а почему справочники по наименованию? Имена ж не уникальны. Или я туплю?

    Reply
  38. vitae

    +1

    Reply
  39. grey82

    Жаль, что код модуля закрыт. Хотелось бы взглянуть, как некоторые моменты реализованы. Может что нить полезное почерпнул бы.

    Reply
  40. Redmonkey

    У меня почему-то не находит элементы справочника, надо загрузить 5500 номеннклатур в установку цен, может я что-то не то делаю? помогите плиз

    Reply
  41. Атеист33

    тут все разбирают по делу или по полу ?

    Reply
  42. Redmonkey

    объясните как пользоваться пожалуйста(

    Reply
  43. 1981ink

    Народ кто нить для 7ки подобное видел

    Reply
  44. Solo1

    на локальной восьмерке все работает на ура, а на сетевой выдает ошибку (может, это не от восьмерки зависит, я не знаю). Объясните, пожалуйста, как исправить.

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

    ДокЭксель = ПолучитьCOMОбъект(ПутьКФайлу);

    по причине:

    Ошибка получения объекта COM: Класс не зарегистрирован

    Reply
  45. Solo1

    Люди! Объясните кто-нибудь как сделать, чтобы обработка работала!!

    Reply
  46. nikser

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

    Reply
  47. Asima

    В обновленной конфигурации 1с7.7. (7.70.165) ни обна из обработок по заполнению накладных из EXCEl не работает выдает ошибку (104) поле агрегатного объекта не обнаружено (ВИД) как исправить?

    Очень нужна такая обработка, подскажите!

    Reply
  48. ОбнажЁнная_Маха

    ❗ Внимание! Пароль снят, доступ к телу открыт! Теперь всё в ваших руках, товарисчи!

    Reply
  49. sairus

    открываю в 1с v8.1 говорит ошибка при вызове метода создать, даже в конфигураторе не открывается… :-/

    Reply
  50. Enverkadirov

    Спасибочки +++

    Reply
  51. DoctorRoza

    У армянского радио сросили: «Что общего у морских свинок и девушек — программистов?»

    «Первые никак не относятся ни свиньям ни к морю, также как и вторые ни к девушкам ни к программистам» — ответило армянское радио. 😀 (Шутка!)

    Reply
  52. bela88

    Спасибо!!!

    Reply
  53. Doubl

    Огромное спасибо! Обработка очень помогла. Самим писать времени не было, а тут очень вовремя попалась)

    Reply
  54. MrXaN

    Как можно оставить девушку без внимания))), Спасибо девушке что она у нас есть.

    Reply
  55. K_Tanusik

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

    Reply
  56. SGordon1

    под новый эксел (xslsx) надо подшаманить строку соединения…

    Reply
  57. borman

    плюсану не скачивая

    приятно делать девушке приятно

    Reply
  58. vovgun

    Спасибо, полезная весч, один раз попользовал, надеюсь что буду ещё, кстати товарищи дорогие, любимые, как заработать баллов, ато я всё просрал и тепреь не могу качнуть очень нужную весч)) Написанно, что чем больше напишешь — тем больше баллов накинут, короче надо по-больше потыкать по кнопкам, хотя нате вам анекдот, всё больше пользы))):

    Стою в пробке, причем реально стою, минут 15 уже. От нечего делать начинаю головой крутить. Ну и замечаю, что левее стоит машинка, а в ней магнитола светится как у меня (я на джипе, чуть выше сижу). Заинтриговался. Достал пульт и выключил мужику магнитолу. Пауза, он ее включил. Я ему звук отрегулировал, каналы настроил. В общем, минут 10 мужика доводил до белого каления. Он аж панельку снял…

    и есчо:

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

    Reply
  59. umtz

    очень надо импорт в тис 7.70.027 для украины из екселя

    Reply
  60. rodoz32

    молодец!хорошая обработка!

    Reply
  61. Anton_prezident

    Крутяк,можно теперь тз по заливке номенклатуры не делать)

    Reply
  62. SSO

    Как раз занимаюсь загрузкой справочников в 1С из EXCEL. Так что очень помогла данная разработка. Спасибо.

    Reply
  63. tehas

    сенк, за обработку

    Reply
  64. natnat3
    vovgun пишет:

    Спасибо, полезная весч, один раз попользовал, надеюсь что буду ещё, кстати товарищи дорогие, любимые, как заработать баллов, ато я всё просрал и тепреь не могу качнуть очень нужную весч)) Написанно, что чем больше напишешь — тем больше баллов накинут, короче надо по-больше потыкать по кнопкам, хотя нате вам анекдот, всё больше пользы))):

    Реально посмешил, молодца!

    Reply
  65. xxx6662000

    Как то нужно было нечто подобное.

    Спасибо! посмотрим что тут есть

    Reply
  66. piffoff

    А отличия от ИТСовской обработки есть или это одно и тоже.? А то чет не понятен этот момент. Написать его в заголовок

    Reply
  67. svad1

    качнем посмотрим

    Reply
  68. shavrova.v

    Единственное что хотела добавить, было бы неплохо написать какую-нибудь обработочку, более менее универсальную по выгрузке табличных частей из документов. И выложить на сайте в одном архиве две обработки, так сказать для полной комплектации.

    Reply
  69. alexm73

    А такую же обработку, но из LibreOffice кто-нибудь видел? А то фриваре наступает…

    Reply
  70. svetanik

    Поставлю плюсик, т.к. по-моему я эту обработку использовала-заточила для себя 😉 Спасибочки.

    Reply
  71. yuraos

    Плиззз, если скачиваете — «плюсаните» рейтинг, оставьте комментарий… сделайте девушке приятно! 🙂

    +504 — куда больше ???

    Могу также «приятный» анегдот рассказать…

    Reply
  72. Zas1402

    автору спасибо за старания

    Reply
  73. agrustny

    Низкое качество

    Reply
  74. vln

    Пишет — «Внешняя обработка не может быть прочитана текущей версией программы»

    Reply
  75. vln

    извините, после конвертации в конфигураторе открылось

    Reply
  76. tali6272

    Добрый день. Подскажите, что я делаю не так? Не загружается номенклатура

    Reply
  77. merlin1975

    Здравия!

    Спасибо аз обработку. Такой вопрос: инициализация колонок, строк и др. проходит правильно, но один из реквизитов ТЧ — ссылка на справочник и при выполнении обработки он не заполняется… Посоветуйте, что надо поменять.

    Reply
  78. ssn5810

    почему в описании нет что это не управляемые формы ????

    Reply
  79. МихаилМ

    (85) 10 лет назад не было УФ

    Reply
  80. ssn5810

    сейчас есть, очень большой труд написать 2 слова…

    Reply

Leave a Comment

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