Использование шаблонов Word для заполнения типовых договоров.




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

68 Comments

  1. kivas

    Прошу писать свои отзывы и предложения.

    Reply
  2. kivas

    народ, не вижу отзывов >:o

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

    В качестве отзыва: внятное описание, информативные скриншоты, наличие хелпа — просто душа отдыхает после предыдущего потока мусора. +2

    Reply
  4. kivas

    (3)описание существовало и раньше, только в содержание забыл включить

    вопрос всем:

    Так всеже комунибудь такая подсистема нужна?

    Reply
  5. Душелов

    (4) Нужна. Гуд.

    Reply
  6. kivas

    К стати процедура кнопки справочника сотрудников у меня вынесена во внешнюю печатную форму так что можно обойтись без изменения типового справочника.

    Reply
  7. kivas

    К стати ктонибудь тестировал на версиях офиса отличных от 2003?

    напишите отзывы

    Reply
  8. Tax

    Спасибо

    Reply
  9. Kyrales

    Есть вопрос. Допустим у меня будет задан параметр <ТекстПисьма> . Данные возьмуться из заполненного реквизита и сформируется в вордовском документе. А смогу ли я сохранить изменения сделанные в ворде опять в реквизите 1С?

    Reply
  10. kivas

    в моем примере в скриншоте » результат работы» не задан параметр :

    <Должность.Наименование должности> он так и выйдет в заполненом шаблоне.

    Reply
  11. kivas

    >> А смогу ли я сохранить изменения сделанные в ворде опять в реквизите 1С?

    пока нет, если честно, я даже не представляю как это реализовать в подобном решении.

    тут испольшуется замена строк в тексте, а не использование параметров Word-а.

    хотя все возможно, если кто имеет идеи по этому вопросу прошу сообщить

    Reply
  12. Kyrales

    (11) У меня типо твоей штуки тоже реализовано. Этот вопрос довольно интересный и покамест я тоже способов не вижу. Только юзать 8.2 🙂

    Reply
  13. kivas

    Еще один нюанс:

    в конфигурацию заложена возможность использования листов excel-я как шаблона.

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

    Reply
  14. ulen

    (4)Мне нужна но для формирования договоров контрагентов которые арендуют места на рынке… юристы часто перебивают текст договоров

    Reply
  15. kivas

    (14) ну так вперед

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

    Более того у меня нет привязки к каким либо объектам поэтому подсистему можно использовать в любом виде.

    если что пиши на аську.

    Reply
  16. kivas

    в продолжение (15) у меня эта подсистема какраз используется договорным отделом именно по причине в (14)

    Reply
  17. RandomDV

    Не думал добавить функционал по хранению «готовых» файлов не в БД, а просто в файловой системе, типа «C:ВсеВнешниеФайлы[ГИД_Сотрудника]файлы.*

    А то база может вспухнуть+возможно, в случае файлов, доступ будет быстрее…

    Reply
  18. Best_Raven

    Отличная обработка. +1

    Reply
  19. alexek

    Классная штука, пригодится +1

    Reply
  20. kivas

    (17)

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

    во-вторых — ИМХО поиск и разархивирование в файловой системе компа займет большее время чем распаковка 1С-кой хотя я не проверял

    Reply
  21. Оболтус

    А с 2007-м работает?

    Reply
  22. kivas

    не проверял.

    там используется «Execute» (замена) если 2007 это поддерживает, то должно сработать.

    Reply
  23. ulen

    (15)

    Спасибо )

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

    Reply
  24. Kyrales

    (21) Работает 🙂

    Reply
  25. Buxxter

    Как обстоят дела с таблицами?

    Reply
  26. kivas

    (25)

    Если Вы про wordовые таблицы то без проблемм.

    для excel есть отдельные процедуры в глобальном модуле.

    Reply
  27. Vladimir_Konyrev

    Вопрос-предложение: а нельзя ли сделать данную подсистему внешней обработкой? Например будет открывать что-то вроде «Рабочее место менеджера» в УТ? Спасибо!

    Reply
  28. kivas

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

    НО при помещении процедур заполнения шаблонов в другие модули (тоесть не в модуль приложения) у меня почемуто не срабатывали некоторые функции. С чем это связано, я не знаю, разбираться времени да и желания не было, так что что есть то есть.

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

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

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

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

    Reply
  29. xw7x

    вещь очень хорошая.

    Reply
  30. malikov_pro

    а такая-же замечательная штука только для OpenOffice есть?

    Reply
  31. kivas

    (30) ну если ваш опенофис поддерживает программне обращение к своим функциям, то переделок максимум на день, вся проблема в том что опенофисов развелось немерено, и для каждого писать программу не вижу смысла.

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

    ДУМАТЬ НАДО ШИРШЕ А ПОНИМАТЬ ГЛУБЖЕ 😉

    Reply
  32. Ivon

    А есть возможность вывести таблицу графика платежей, в которой количество платежей динамическое?

    Reply
  33. kivas

    (32) в араметр возвращается только одно значение. и заменяется на подстроку в тексте.

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

    Reply
  34. Ivon

    Понятно. Значит не может… У меня есть решение такой проблемы, но оно очень корявое. Но рабочее. Но такое корявое, что сам им пользоваться не хочу, поэтому жду, может кто чего придумает…

    Reply
  35. Pavshuk

    Помогите разобраться в следующей проблеме:

    установленная конфигурация создает шаблон в word. При создании регистрируется на событие Документ.close.

    При закрытии документа в 1с события не возникает.) На события Application.* регистрируется и работает все нормально. Но это не позволяет конфигурации работать нормально.

    Проверял на следующих компьютерах:

    Оболочка 1с 8.1.8.76 на всех компьютерах.

    — win XP home + office 2000

    — win XP home + office 2003

    — vista home + office 2007

    С чем это может быть связано? Стара версия версия 1С, или что-то другое?

    Спасибо.

    Reply
  36. kivas

    (35) этот вариант не рассматривался. действительно при закрытии документа в 1с не происходит ни каких действий.

    в будущей редакции я поставлю просто отключение обработчика, так как закрытие word -а, я лично, считаю некорректным.

    Reply
  37. Pavshuk

    (36) Наверное не правильно сформировал вопрос.

    Опишу ситуацию:

    1.Открываем форму «внешние кадровые документы».

    2.Нажимаем клавишу «+шаблон». Открывается word со сформированным документов.

    3. Редактируем документ и закрываем его (не закрывая word).

    После этого, по моим соображения в табличной части спарвочника «внешние кадровые документы» должна появиться строка хранящая в себе этот документ.

    Я так решил, прочитав строку

    ДобавитьОбработчик WordДокумент.close, ЗакрытиеДокументаWord;

    Так вот после закрытия документа в 1с события не генерируются.

    Сначало я подумал, что такого события в мое версии worda(2000) нет. Заменил строку на ДобавитьОбработчик MSWord.OnDocumentChange(уже точно не помню), ЗакрытиеДокументаWord; И программа рабоает, события в 1с генерируються).

    Затем я подумал, что такого close-события у документа нет. Тогда я его заменил на случайное, и такое событие регестрировать 1с отказался.

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

    Reply
  38. kivas

    (37) на сколько я знаю сначала формируется документ а затем распечатывается его печатная форма (или я не прав?) так почему же Вы создаете печатную форму, затем меняете документ, и закрываете его? (или я в чем то туплю сутра?)

    как я должен отследить что Вы закончили редактирование word -а (ИМХО только при закрытии документа word ведь компьютер, и даже я не телепат) вот при закрытии и происходит:

    1) временное сохранение двоичных данных word

    2) копирование этих данных в базу,

    3) удаление временного файла с винта

    4) обнуление внутренних переменных

    Если есть другой вариант с радостью рассмотрю его

    Reply
  39. kivas

    если имеется ввиду закрытие документа word без закрытия самой программы word то тогда возникают сложности при определении какой из документов именно закрылся, не создаем ли мы копию уже открытого документа, и т.д.

    для уменьшения ошибок при работе подсистемы было принято решение привязаться именно к закрытию программы word? а не к закрытию отдельного листа

    Reply
  40. Pavshuk

    (39) Вот как раз при закрытии приложения никаких действий и не происходит(

    Насколько я понимаю, за отслеживание этого события отвечает строка:

    ДобавитьОбработчик WordДокумент.close, ЗакрытиеДокументаWord;? Если это так то по каким-то причинам событие WordДокумент.close не отслеживается.

    Reply
  41. Kyrales

    Возможно ли в формируемый файл Word вставлять нужную мне картинку, как параметры текста?

    Reply
  42. kivas

    (41) в текущей редакции нет.

    Reply
  43. Kyrales

    (42) да это понятно что у тебя нет. Возможно ли вообще такое?!

    Reply
  44. AntonSirint

    (43) Из файла точно возможно, посмотри макросы в ворде, там и узнаешь ответ…

    Reply
  45. gagar9

    а как внедрить 1cv8.efd и куда если можно подробнее скажите пожалуиста avda@yandex.ru

    Reply
  46. eli1984

    Хорошая вещь. Вот тольо при создании шаблонов иногда говорит что конвертер mswrd632.wpc не удалось запустить, с чем это может быть связано? 😮

    Reply
  47. kivas

    (43) возможно добавить картинку, но при условии что она естьб на диске, тоесть надо сначала ее получить, сохранить в нужном месте, и вставить как картинку из файла.

    Reply
  48. spryn1

    Очень крутая обработка. Спасибо!

    Reply
  49. bsv2003

    Простите пожалуйста. А как устанавливать эту обработку? напишите подробнее…

    и можно ли ее использовать на 8.2?

    — Попытался объединить конфигурации, похоже, что неправильно, т.к. эта конфигурация полностью заменила мою — Бухгалтерия 1.6.

    Возможно ли объединить конфигурации (эту и Бухгалтерия 1.6 Упрощенка? или эта конфигурация только отдельно работает?

    Reply
  50. Muhin555

    Интересная обработка!!!

    При переносе ее в Зарплата и Управление Персоналом, редакция 2.5 (2.5.26.3) заметил следующую вещь:

    В справочнике «Шаблоны договоров» добавляю шаблон «Прием на работу в организацию» со сылкой на объект «Прием на работу в организацию», в нем создаю строку с существующим файлом «Образец.doc», тем самым создается строка «Образец» и ставлю галочку «Используется как печатная форма», но в документе «Прием на работу в организацию» кроме стандартных «Форма Т-1» и «Форма Т-1а» форма с именем «Образец» не цепляется… в чем причина? Может что не так сделал или не так понял? И каково назначение галочки «Используется как печатная форма»

    Офис стоит 2003….

    либо я не совсем понял фразу:

    «…а также в реквизит формы элемента «ДокументПроверки» Справочника «ОДР_Шаблоны_Параметры»»

    из справки в разделе «Конфигурация»

    Reply
  51. evg61

    Здравствуйте! Пытаюсь открыть файл шаблоны.cf — получаю сообщение:

    Ошибка при выполнении файловой операции ‘E:Word!шаблоны.cf’

    по причине:

    Неверный формат хранилища данных ‘file://E:/Word/!/шаблоны.cf’

    Подскажите пожалуйста, в чем может быть причина и как разрешить данную ситуацию?

    Спасибо!

    Reply
  52. evg61

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

    Reply
  53. kivas

    (51) галочка «Используется как печатная форма» используется как указатель подсистеме о том что выведенный шаблон НЕ предназначен для сохранения в базе данных, а используется только для создания и печати шаблона.

    Этот признак был создан еще до широкого использования внешних печатных форм а после их появления я как то на эту тему и не задумывался.

    (51) >>либо я не совсем понял фразу:

    «…а также в реквизит формы элемента «ДокументПроверки» Справочника «ОДР_Шаблоны_Параметры»»

    в справке написано:

    «Для добавления других объектов в работу с шаблонами необходимо добавить тип объекта в план видов характеристик «ОДР_ВидыДокументовДляШаблонов», а также в реквизит формы элемента «ДокументПроверки» Справочника «ОДР_Шаблоны_Параметры» после чего добавленный объект может работать с шаблонами »

    тоесть для того чтобы, например, добавить возможность работать с подсистемой Объекту конфигурации «Справочники.КонтактныеЛицаКонтрагентов» нужно в 2 местах указать этот объект:

    1. в возможных типах плана видов характеристик «ОДР_ВидыДокументовДляШаблонов»

    2. в возможных типах реквизита формы элемента «ДокументПроверки» Справочника «ОДР_Шаблоны_Параметры» (на закладке «реквизиты» формы элемента справочника)

    Reply
  54. kivas

    (50) объединять можно с любой имеющейся конфигурацией с приоритетом вашей конфигурации.

    на 8.2 переводить пока не пробовал, может у когото есть подобный опыт, то напишите.

    >> эта конфигурация только отдельно работает?

    Нет она специально создавалась для работы с другими конфигурациями, и без них она вообще бессмыслена.

    Reply
  55. nestern

    (53) а как разобрался?

    Reply
  56. evg61

    Для Nestern

    Файл был без расширения, поставил .cf, должно быть — .dt

    Далее разворачивается информационная база.

    Пользуясь случаем, спасибо автору!

    Reply
  57. kivas

    (57) на сколько я помню выкладывалось с расширением .dt

    на всякий случай еще поясню:

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

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

    пользуйтесь на здоровье

    Reply
  58. V_Maksim

    Автору большое спасибо, разбираюсь, вроде получается….

    Файлик точно без расширения, но ручное переименование в .dt решает эту проблему.

    на 8.2 переводить пока не пробовал, может у когото есть подобный опыт

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

    Reply
  59. DimDimych

    Очень удобная вещь спасибо автору

    Reply
  60. ctulhua

    гениальная вещь!!

    Reply
  61. spryn

    Очень классно реализована обработка. Пригодилась.

    Reply
  62. trustgros

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

    Reply
  63. jirafff

    простыми макетами такого не сделаешь

    Reply
  64. trustgros

    (65) jirafff, почему же не сделаешь.. работает ведь ))

    Reply
  65. oleg2010

    скачал файл, какой то очень странный размером 1 кб.

    Создал новую пустую базу, загрузил и ничего.

    Может что не так делаю ?

    Reply
  66. new1c

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

    Reply
  67. IgorArhangel

    Загрузил .dt и база не запускается… пишет несовместимая версия пробовал 8,3 и 8,2

    Reply
  68. IgorArhangel

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

    Reply

Leave a Comment

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