Как из 1С правильно УКАЗАТЬ MS EXCEL как нужно печатать документы !




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

30 Comments

  1. gaglo

    Уважаемый Автор! Раз уж тема Экселя настолько интригует… Почему не сделано последних полшага упрощения? Не надо добавлять командную панель, на которую еще нужно и «нажатие» вручную. Надо сделать — в 1С — собственную кнопку «Сохранить в Эксель», которая будет впихивать в соответствующий файл (только сохрненный из 1С) процедуру Auto_open, которая (процедура) будет делать всю черновую работу, которую ВЫ (или кто-то) ей поручите, и которая (кнопка) будет запускать Эксель с загрузкой сохраненного файла; в Конце Концов, обходить уровень безопасности МС Офиса Вы уже умеете; и вот — нажав на кнопку 1С, всего лишь после некоторого ожидания (и без новых нажатий) получите уже приведенный к нужному виду документ…

    PS а ЧТО, 7.7 настолько много форматов забывает? Я никогда с ней не работал, всё 8.0-8.1-… Там вроде красиво сохраняется в формат Эксель…

    Reply
  2. Tatitutu

    (2)

    которая будет впихивать в соответствующий файл (только сохрненный из 1С) процедуру Auto_open

    не есть правильно, в каждой книге хранить макрос , а Auto_open вообще зло…

    а если человеку нужно отправить по почте ?

    я написал — это не есть ПРОГРАММА, это вариант — хороший вариант упрощения ручной работы.

    в Конце Концов, обходить уровень безопасности МС Офиса Вы уже умеете

    😀 я давнно это умел, наверное с рождения )))

    В данном случае представлен пример , который не снимает УРОВЕНЬ БЕЗОПАСНОСТИ МАКРОСОВ, а просто игнорирует штатными средствами офиса и если разобрать сам пример….кто знает тот поймет.

    Почему не сделано последних полшага упрощения?

    Каждый должен сам выбрать и сделать СВОЙ шаг…

    Я никогда с ней не работал

    так даже и не скачал файл, а судишь и судишь по шаблону — здесь немного другая ситуация….

    в этой простой обработке показан пример , как во внешнем отчете

    можно «скрытно» записать процедуры и функции на языке VBA и запускать на компьютере пользователя. Я видел много разработок в которых использует файл шаблона EXCEL c макросами.

    7.7 настолько много форматов забывает?

    — закрепление строк и столбцов (шапка документа при прокрутке остается на месте

    — ориентация страницы

    — повторяющиеся строки при печати

    — отображение сетки и заголовков

    — объединение (разъединение) объединенных ячеек

    — меняет направление вертикального текста

    — можно добавить колонтилы

    — можно добавить нумерацию листов

    — можно добавить фильтр с условиями

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

    — можно добавить формулы

    — сжать размер в РАЗЫ

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

    в теме показан принцип решения рутинной задачи.

    Reply
  3. Parazyte

    Неплохо 🙂

    Reply
  4. markers
    Цитата

    которая будет впихивать в соответствующий файл (только сохрненный из 1С) процедуру Auto_open

    не есть правильно, в каждой книге хранить макрос , а Auto_open вообще зло…

    а если человеку нужно отправить по почте ?

    я написал — это не есть ПРОГРАММА, это вариант — хороший вариант упрощения ручной работы.

    Вообще-то можно засунуть макрос в книгу, исполнить его и снести. я так делал!

    Reply
  5. ded00786

    4

    Вообще-то можно засунуть макрос в книгу, исполнить его и снести. я так делал!

    Хорошая мысль

    Reply
  6. legioner

    Очень правильное решение

    Reply
  7. gaglo

    (2)

    не есть правильно, в каждой книге хранить макрос

    и ещё раньше:

    не разумно будет каждый документ проверять на предмет наличия параметра из 1С

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

    Auto_open — зло, согласен; но написал так, для примера; markers вот подытожил, как надо бы делать.

    так даже и не скачал файл, а судишь и судишь по шаблону — здесь немного другая ситуация….

    … а тут я чего-то не понял… не понял… Не скачал, ибо куда мне его девать? Ясно же написал я, что с семеркой не работаю. И что значит «судишь»? Я минус влепить не пытался. Не судил. А обсуждал. Моя мысль: описанный в статье метод требует двух нажатий на кнопки: раз в 1С и второй уже в Екселе. Его можно улучшить, убрав необходимость в Екселе что-то нажимать.

    Или статью надо было назвать «Как из 1С правильно запихнуть новую командную панель в Ексель»? В этом отличие ситуации?

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

    Reply
  8. Tatitutu

    (4)

    Вообще-то можно засунуть макрос в книгу, исполнить его и снести. я так делал!

    можно , кто же спорит…но

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

    (думаю в моем данном примере способ более элегантый)

    — во вторых в твоем способе «На примере MS EXCEL если в файле есть макрос. То при открытии книги появится вопрос (открывать или не открывать) и предупреждение «типа макросы отключены». Все по честному…в настройках имеется 4 уровня безопасности (Очень высокая,Высокая,Средняя и Низкая)» — ты открываешь дыру в ОФИСЕ

    так если уровень безопасности выше Низкой, то ТВОЙ макрос не запустится. Знаю обойти можно, но опять же для каждого документа….лишняя трата времени

    — можешь выложить пример или это только слова ?

    Reply
  9. Tatitutu

    (7) Я тоже рад тебя снова слышать. Привет.

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

    нет немного не так ты понял

    — панель создается один раз (фишка как она создается — это намек)

    — а потом ВСЕ печатные формы из 1С (имеющие параметр) — одним кликом форматируются, преобразовываются именно так , как нужно нам.

    Вот сам проанализируй пример :

    — пользователь сформировал отчет в 1С, сохранил его где то в EXCEl

    открывает его (если таблица не стандартная) то

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

    И ты заходите Вы и нажимаете кнопочку (или настраиваете на автораспознование — да Вас на руках носить будут — правда не долго, быстро к хорошему привыкают.

    Reply
  10. Ish_2

    Засиделся ты на 77. Не скучно ?

    Reply
  11. aipnnov

    А если нет Exel не установили потому что дорогой, а шефу необходимо отправить именно в формате .xls, тогда как?

    Reply
  12. Tatitutu

    (10) да ладно…

    Как то уже отвечал кому- то

    8-ка — это работа, а 7 — это для души (хобби+EXCEL)

    Reply
  13. Tatitutu

    (11) Я же написал в шапке — что это пример разработки алгоритма.

    Не нужно искать причины и отговорки, нужно думать.

    Есть цель и задача должна быть выполнена.

    А если нет Exel не установили потому что дорогой, а шефу необходимо отправить именно в формате .xls, тогда как?

    и что он (ШЕФ) с этим файлом будет делать или у него дома пиратка ?

    — а если нет 1С, как сформировать отчет для шефа

    — а если нет компьютера

    — а если нет шефа

    — а….

    искать и применять другие решения , автоматизировать процес

    — Шеф, будет Еxcel — напишу программу которая из отчетов будет ляльку делать (не экономь)

    Reply
  14. aipnnov

    (13) Я понимаю, что мы «любим» офис и стоим на том, что каждый должен его иметь в офисе и дома, чтобы этот пример алгоритма использовать, и желательно «1С версии 6.0 или счеты с костяшками» для души так сказать…

    — Шеф, будет Еxcel — напишу программу которая из отчетов будет ляльку делать (не экономь)

    Если ты так разговариваешь со своим шефом, то я тебе не завидую…

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

    Почему-бы не представить пример алгоритма, для того-же самого сохранения в xcel через ООо или другие бесплатные альтернативы офиса.

    Reply
  15. Tatitutu

    (14)

    Если ты так разговариваешь со своим шефом, то я тебе не завидую…

    и не завидуй — зависть еще никого до добра не доводила

    Я — ШЕФ

    (и сам с собой только иногда разговариваю)

    Смотри, что в шапке написано:

    Сразу предупреждаю это не программа, а рассказ — как пошагово добиться нужного результата — одна из идей, а не панацея (с рабочим примером)

    Илья — ты ТОЖЕ даже не скачал файл и выражаешь свое мнение субъективно, ты скачай и сам — найди и расскажи , каким образом — формируется КОМАНДАЯ ПАНЕЛЬ «ФОРМАТ_1С»

    — только не говори , что с ключешками не работаешь , и EXCEL нет.

    Почему-бы не представить пример алгоритма, для того-же самого сохранения в xcel через ООо или другие бесплатные альтернативы офиса.

    так представь — молодым у нас дорога и работы не початый край. Удачи.

    Reply
  16. gaglo

    (9) — ну смутил ты мой покой!

    Докладываю, что домашнее задание выполнил, даже без семёрки.

    Действительно, настройка безопасности Офиса лихо обойдена.

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

    Но! Уж извини, элегантного во всем твоем способе нашел только одно: как спрятан в обработке готовый файл Екселя; я б до такого не додумался. (Теперь запомню!). А рожать новую панель в бедном Екселе — ну, ИМХО, неэлегантно.

    У моего «улучшения» же — есть один недостаток вельми большой: кнопку сохранения в Ексель надо делать нестандартную. И небось ко всем отчетам по отдельности привязывать. И на нем я ни капельки не настаиваю.

    Reply
  17. Tatitutu

    (16) Ну вот — совсем другое дело !!! Спасибо.

    Но! Уж извини, элегантного во всем твоем способе нашел только одно

    ты не поверишь, а это и есть сама суть этой обработки (мой маленький секретик)

    а то что:

    Ексель при следующем своем запуске, без вопросов,

    в этом нет никакого секрета, вопрос на запуск макроса задается офисом — если только он находится в локальной (открываемой) книге, если же он находится в личной книге МАКРОСОВ — да есть и такая) то все хорошо, но не из EXCEL ни из 1С — программно не запишешь макрос в личную книгу МАКРОСОВ — я в этом примере показал спобоб обхода.

    и в мой Ексель уже попала такая панель; только панель у меня не работает

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

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

    Разберем ексель на элементарные частицы! 😀

    Reply
  19. Serg O.

    Если директору надо… есть дополнительный стимул

    ПЕРЕВОДИТЬ весь учет на 8-ку (с нового года особенно!)

    хочет красоты — пусть раскошеливается

    кстати до кучи и компы обновить надо… мол 8-ка на «г…» — не работает,

    иииизззвииинитеееее……

    а так конечно можно левой рукой правое ухо чесать

    и изворачиваться кто как умеет,

    но это проблемы с ТАКИМ боссом — не решает!

    (есть такой личный опыт, к сожалению)

    Дави на кошелек и точка!

    или сработает или свои «хотения» требования к тебе лично поубавят…

    Reply
  20. vera024

    очень удобно. Спасибо 🙂

    Reply
  21. aipnnov

    Я посмотрел очень внимательно, давно уже не прикасался к 7.7 поэтому пришлось кое-что вспомнить. Молодец, ставлю +.

    Reply
  22. CheBurator

    все это можно и нужно рассматривать как «финты» и обучаловку — что, несомненно, полезно. Больший вопрос вызывает необходимость перекидки чего-то в эксель… это востребовано в соновном там где «бизнес-процессы» не «устоялись» или пока что непонятно что и как — вот и крутят в экселе пытаясь вытащить «что и как».. как только становится ясно — нафиг эксель, все считаем/показываем в 1Ске… ПО ВОЗМОЖНОСТИ!

    Reply
  23. Tatitutu

    (22) в последнее время много «брожу» по стране… и могу точно сказать ответить тебе на фразу

    «это востребовано в соновном там где «бизнес-процессы» не «устоялись»

    да это так и правильлно, но

    если сравнить по количеству использования EXCEL и 1С — у 1С шансов на успех намного меньше, во многих местах об 1С вообще не слышали и подозревают, что 1С есть и успешно существует, но за то EXCEL — это ЦАРЬ и БОГ — «основная офисная» программа.

    Reply
  24. larisab

    (22) У меня есть клиенты, которые используют 1С 77 по минимуму. Все остальное ведется в excel, масса отчетов и расчетов для отчетности в другой стране. Периодически просят различные выгрузки-загрузки. Перетаскивать в 1С их учет нет надобности, просто не профинансируют. Выгружать я конечно умею, а вот сделать дальнейшие манипуляции с данными в екселе научится надо. Немало клиентов существуют на зарубежные гранты — у них тоже актуально. В банках, пенсионных фондах excel один из основных инструментов.

    Reply
  25. d_z_k

    Хочу сказать, что эта тема вышла с ИТС диском за Декабрь 2009, и там есть все описание, то что здесь выложенно!!! 😮

    Reply
  26. Tatitutu

    (25) 😎 😮 ссылку(копипаст) скинь мне в личку если не трудно, ИТС давно уже не видел и не смотрел. Заинтриговал. Напиши в каком разделе

    (только что выборочно посмотрел — нет там ничего похожего) Поправь меня если это не так.

    Reply
  27. slimuz

    А на 1С 8 как передать параметры форматирования при сохранении в .xlsx ? Как найти модуль отвечающий за сохранение ?

    Reply
  28. aka AMIGO

    Файл PERSONAL.XLS в обработке не выводится. В отладчике видно, как процесс наступает на Объект.SaveAs(ИмяФайла):

    Попытка

    Объект.SaveAs(ИмяФайла);

    Исключение

    Сообщить(«Облом-с!»);

    КонецПопытки;

    и сообщает про облом.

    Файла нет.

    Reply
  29. Tatitutu

    (28) aka AMIGO, спасибо

    но это статье более 6 лет и MS EXCEL уже не тот ))) и права нужно другие для пользователя.

    Все работает — тут показан принцип (так сказать идея)

    Reply
  30. starik-2005

    Отправляйте начальникам в HTML — будет круто!

    Reply

Leave a Comment

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