Конвертер XLS -> MXL для 1С 8.1, 8.2, 8.3




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

56 Comments

  1. izhorets

    Обработка великолепно справляется со своими функциями.

    Желательно к полю «XLS»добавить функцию выбор файла.

    Reply
  2. bulpi

    Молодца!

    И все-таки есть подозрение, что можно быстрее 🙂

    Reply
  3. amyd

    круто!!! теперь есть обработка перегона из екселя в mxl

    + есть перегон из mxl в HTML

    .. мяка…. можно теперь средставами 1С через сервак перегонять ексель в красивые письма и не гемороится.. респект и уважуха!!!! 🙂

    Reply
  4. sondarium

    Спасибо за поддержку!

    Reply
  5. cool.dkf

    Ай, да молодец!!!

    Reply
  6. artbear

    Из XLS в mxl перегоняется хорошо, полученный файл в 1С-Предприятии выглядит также, как и в Excel.

    Но есть одно НО: если полученный файл попробовать вставить как макет табличного документа в Конфигураторе, форматирование останется, но все поля будут пустыми. Например, полученный файл открываем в Конфигураторе, выделяем все (нажимаю пустую ячейку на пересечении 1 строки и 1 столбца), копируем и вставляем в макет.

    Конечно, решение есть: перед вставкой выделяем все ячейки (ВАЖНО: не строки/столбцы, не всю таблицу, а именно ячейки), и в свойствах убираем галочку «Содержит значение», после этого можно копировать, как написано выше, и все будет в порядке.

    Можно ли что-то с этим сделать на этапе конвертации в данной обработке? или это все-таки особенность работы Конфигуратора?

    ЗЫ есть ли еще аналогичные хорошие конверторы XLS->MXL для 8.1/8.2 ?

    Reply
  7. cool.vlad4

    (7) как вариант, йокселем в mxl7.7, а потом уже 1С в mxl8. В этом плане йоксель,конечно, вне конкуренций — группировки он без труда делает и т.д.

    PS ….но надо проверить, давно я ентого не делал…

    Reply
  8. Borisych

    Качну — надо испытать, а то всё руки не дойдут никак переделать обработку для 7.7 под 8.х 🙂

    Reply
  9. sondarium
    artbear пишет:

    ЗЫ есть ли еще аналогичные хорошие конверторы XLS->MXL для 8.1/8.2 ?

    Насколько я знаю, моя единственная. Потому и сделал.

    Reply
  10. martsevao2

    хор

    Reply
  11. Skazal

    Отлично работает. Претензий нет.

    Reply
  12. revril

    спасибо за обработку))

    Reply
  13. revril

    ценная вещь=)

    Reply
  14. KayuIra

    Отличная уникальная вещь! Спасибо автору! 🙂

    Reply
  15. revril

    огромное спасибо))

    Reply
  16. Tpakmop

    спасибо!

    Reply
  17. metmetmet

    Очень нужная и полезная вещь!

    С ней печатные формы создавать на раз-два получается!

    Спасибо автору большое!

    Reply
  18. Ponommax

    А установленный офис ей требуется?

    Reply
  19. alexm73

    Нескромный вопрос: а что-то подобное, для OpenOffice/LibreOffice не планируется?

    Reply
  20. sondarium

    (21) alexm73, я не планирую

    (20) Ponommax, требуется

    Reply
  21. w-w-w-w-w-w-

    А я всегда лист копировал с Excel в Работа с Файлами и не изобретал велосипед

    Reply
  22. Veduin

    А нельзя было одним архивом, сначала скачалось под 8.1, пришлось зайти снова скачать под 8.2

    Reply
  23. sondarium

    (24) Veduin, в правилах публикации не рекомендуется обработки в архив сжимать

    Reply
  24. Veduin

    Тестирование немного затянулось… Сейчас много различных конверторов XLS->MXL здесь представлено.

    В отношение данного образца, скажу что справилась с задачей неплохо, не получилось точной копии екселя, немного пришлось все таки дорисовывать, но все же хорошо!

    Reply
  25. ediks

    (0) Взял файл EXCEL с группировками строк в 2 уровня.(кстати, сохраненный средствами 1С из табличного документа).

    Вот что имеем в результате конвертирования:

    1. Группировки не создаются — все идет плоским списком. Это для меня пока некритично.

    2. Строки в последней группировке не создаются вообще, если группировка свернута до 1-го уровня. Создается только одна строка первого уровня. Развернул группировку в файле EXCEL, сохранил файл, запустил обработку — все ОК. Вот это уже потенциальная потеря данных :).

    ЗЫ. Попробовал конвертировать бухгалтерский баланс — в целом неплохо. Но не всегда получается объединение ячеек.

    Все равно ПЛЮС.

    Reply
  26. sam441

    Респект, спасибо пригодилась, только один момент в случае если количество строк или колонок > 1000 появляется неразрывный пробел и выходит ошибка, нужно подправить строки 305 и 340 на

    Ячейка = Т.Область(«R» + Формат(ТекСтрока,»ЧГ=») + «C» + Формат(ТекКолонка,»ЧГ=») + «:» + «R» + Формат(ТекСтрока,»ЧГ=») + «C» + Формат(ТекКолонка,»ЧГ=»));
    Reply
  27. Tarlich

    Выручала не раз !

    Reply
  28. oleglega

    Добрый день! Вопрос к автору за сколько продадите эту обработку очень надо!

    Reply
  29. oleglega

    вопрос снимаем. с другого источника скачал.

    Reply
  30. yuraos

    Что-нибудь полагается 100-тому проголосовавшему клиенту???

    🙂

    Reply
  31. sondarium

    oleglega, обработка бесплатна! Эту обработку я изначально делал даром и для всех.

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

    Reply
  32. oleglega

    а инфостарт предлагает скачать за деньги. вот …

    Reply
  33. sondarium

    А теперь всё ещё просит денег?

    Reply
  34. oleglega

    а сейчас без проблем!) Спасибо большущее! )

    Reply
  35. sondarium

    Пожалуйста, надеюсь, пригодится!

    Reply
  36. revil

    Жаль, что инфостарт за скачивание требует денег за скачивание.. (

    Пришлось качать с другого источника.

    Автору респект за обработку!

    Reply
  37. Alex353

    комментарии респектуют, а у меня обработка файл XLS из одного несложного листа никак переварить не может. Бегунок ползет слева направо минут 20 и потом наглухо зависает. Было у кого-нибудь такое?

    Reply
  38. sondarium

    (40) Alex353, не пришлёте мне файл, который не переваривается?

    Reply
  39. Alex353

    (41) выслал. Все-таки файл за полчаса сделался в лучшем виде. Непонятно только что так долго, может процесс так тормозят объединения ячеек? По отладчику понять на чем виснет не удалось.

    Reply
  40. adc3

    Добрый день! Обработка замечательная, а от себя могу поделиться маленьким полезным, на мой взгляд, дополнением. В процедуре КнопкаВыполнитьНажатие() модуля формы необходимо «обрамить» блок записи значения в ячейку оператором условия следующего вида:

    // Запись значения
    Если ЗначениеЗаполнено(Источник.Value) Тогда // СТРОКА ДОБАВЛЕНА
    Попытка
    Ячейка.СодержитЗначение = Истина;
    Ячейка.Значение = СокрЛП(Источник.Value);
    Исключение // это объединённая область
    КонецПопытки;
    КонецЕсли; // СТРОКА ДОБАВЛЕНА
    

    Показать

    Это приведет к тому, что в созданном табличном документе пустые ячейки не будут перекрывать текст из соседних ячеек, который «вылез» на эти пустые ячейки.

    Спасибо!

    Reply
  41. sondarium

    (43) adc3, спасибо, применил Ваши оптимизации.

    Reply
  42. practik1c

    Спасибо за обработку, сэкономил время. До этого писали про долгое время выполнения, у меня тоже при конвертации зависла наглухо. Как оказалось на заднем плане открылось модальное окно экселя с вопросом сохранить изменения в файле или нет. Вот это окошко и держит процесс на финальной стадии. Чтобы его увидеть нужно свернуть текущее окно с 1С.

    Reply
  43. Spacer

    Спасибо! Пожалуй лучший вариант по качеству обработки из тех что я нашел на инфостарте.

    Reply
  44. ZhokhovM

    Добрый день! В вашей обработке 8.2 исключите, пожалуйста, признак того, что ячейка содержит значение, а то я копирую макет после конвертации обработки 8.2, вставляю его в свою обработку и переоткрываю его, вижу что весь текст пропал, оказывается что это связано со свойством «Содержит значение».

    Reply
  45. ZhokhovM

    (47) ZhokhovM, думаю это связано с нововведением 1С:Предприятие 8.3 (8.3.5.1068).

    Reply
  46. Xershi

    (48) ZhokhovM, сам спросил себе и ответил?

    Reply
  47. NNomad

    Спасибо за обработку.

    Но обработка не переносит примечания к ячейкам.

    Решил проблему добавлением следующего кода:

    // Запись примечания
    Попытка
    _Примечание = СокрЛП(СтрЗаменить(Источник.Comment.Shape.AlternativeText,»Подпись: «,»»));  // Источник.Comment.Text  ????
    Если ЗначениеЗаполнено(_Примечание) Тогда
    Ячейка.Примечание.Текст = _Примечание;
    КонецЕсли;
    Исключение
    КонецПопытки;

    Решение не очень красивое, но работает.

    Reply
  48. ZhokhovM

    (49) Xershi, решил проблему закомментированием следующего кода:

    //ОбластьТаб.СодержитЗначение = Истина;

    //ОбластьТаб.Значение = СокрЛП(Источник.Cells.Value);

    ОбластьТаб.Текст = СокрЛП(Источник.Cells.Value);

    и

    //Ячейка.СодержитЗначение = Истина;

    //Ячейка.Значение = СокрЛП(Источник.Value);

    Ячейка.Текст = СокрЛП(Источник.Cells.Value);

    Текст при копировании больше не пропадает. Кому надо, заменяйте!

    Reply
  49. free-lancer-2018

    Для 8.2 работает без проблем. Облегчила мне работу. Спасибо автору.

    Reply
  50. Ёпрст

    На счет готового решения, есть йоксель и решение на нем — отдельная утилита (exe-ник)

    yoksel-stand-alone

    ЗЫ: а так да, на снеговике других поделок не видел, на клюшках реализаций, как минимум 4 штуки есть.

    Reply
  51. vladir

    Отличная штука. Спасибо!

    Reply
  52. andrey-ya

    выгрузил из бухгалтерии 3.0 справочник контрагентов в xml. пробую его прочитать данной обработкой в упп на платформе 8.2. выдаёт ошибку «не удалось создать Com объект». печалька.

    Reply
  53. pimenushka

    Совершенно врет по цветам и ориентации текста. Подходит только для черно-белых документов с несложной структурой.

    Reply
  54. sondarium

    (13) с огромным запозданием, пожалуйста!

    Reply
  55. user1138369

    а

    Reply
  56. serko8547

    Респект Автору!

    Reply

Leave a Comment

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