Форматированный документ в 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

59 Comments

  1. Ish_2

    Не проверял , но написано хорошо !

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

    Уважаю популяризаторов 🙂

    Reply
  3. Red_Devil

    ИМХО плагиат …

    пересказ с видео курсов «Профессиональное программирование» ?)

    Reply
  4. Reaper_1C

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

    Reply
  5. DanilaDru

    Да….. а когда этого не было приходилось tinymce крутить. Надо будет попробовать. Спасибо.

    Reply
  6. Armando

    Сделали бы они человеческий макет с типа ФорматированныйДокумент…

    Reply
  7. tango

    1C бросает вызов MS WORD

    Reply
  8. SirYozha

    (4) Red_Devil, скажем так, о «форматированном документе» действительно узнал из курса «Профессиональное программирование в 1С 8.2» от двух замечательных авторов Евгения Гилева и Фарита Насипова. Но не вижу ничего страшного в том, чтобы поделиться знаниями с другими людьми.

    (5) Программная обработка форматированного документа реализована слабо, согласен…

    (8) Ну это врядли! 😉

    Reply
  9. detec

    А нельзя ли ссылки на картинки дать не с ЖЖ, а с самого инфостарта или более-менее благонадёжного сайта? У меня на работе порезан ЖЖ, в частности.

    Reply
  10. Robbi

    Спасибо. Полезная статья.

    Замечена некорректная работа с текстом, вставленным из Word — вот пример если его попробовать залить:

    Ошибка преобразования данных XDTO:… НачалоСвойства: fmtd Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType

    по причине: …

    Ошибка отображения типов:…

    Отображение типа ‘РасширенноеИмяXML’ в тип ‘{http://v8.1c.ru/8.1/data/ui}Color’

    Reply
  11. Robbi

    (11) И в web-клиенте использование проблематично… 🙁 а в толстом пока вообще не понял как сделать

    Reply
  12. coach

    (13) В чем проблемы? Управляемые формы в толстом клиенте доступны.

    Reply
  13. Robbi

    (14) Я понадеялся что и в обычную форму можно запихать. Нельзя — но это и не столь важно.

    Важнее то, что скопированный и вставленный текст невозможно корректно править! Это очень плохо, т.к. была цель сохранять некую информацию с документов word и просто с браузера копипастом. Сегодня ещё поэкспериментирую.

    Reply
  14. sound
    Прошу учесть, что это моя первая публикация.

    Побольше бы таких первых публикаций 🙂

    Reply
  15. RomDron

    На данный момент обьект работает не стабильно и ОЧЕНЬ медленно. Попробуйте вставить туда 5 фото и проверить время открытия в тонком клиенте. При большом количесте инфы часть ее теряется при сохранении. Форматирование тоже иногда слетает. Сам пользуюсь, но только от того, что не хочу использовать внешние компоненты.

    Reply
  16. pau74

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

    Спасибо за публикацию

    Reply
  17. pau74

    Вопрос:

    Поддерживает ли форматированный документ многомерные списки?

    В процессе редактирования не получилось.

    Увеличение уровня отступа выполняется, а дальнейшее уменьшение уровня отступа начинает нумерацию сначала.

    Reply
  18. e.kogan

    Я вот одного не понимаю: а что, в 8.1 с полем HTML документа никто не работал? По описанию — практически ничем не отличается. Разве что картинку можно теперь вставить без геморроя.

    Reply
  19. DanilaDru

    Докрутил форматированный документ у себя. http://danila.org.ua/?p=619

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

    Получаю html документ с сайта, выбираю нужный кусок. В html-коде присутствует следующее:

    «font-size: 10pt; color: black; line-height: 150%; font-family: Arial» Патент №

    «font-size: 10pt; color: black; line-height: 150%; font-family: Arial» Дата регистрации

    После выполнения у форматированного документа УстановитьHTML()

    «line-height: 150%» заменяется на «line-height: 150» (съедается процент) и следовательно очень большие интервалы у меня между строк

    Так что лучше использовать «line-height: 1.5».

    Reply
  20. TbSasha

    А у меня почему то «Командная панель» не активная и не получается форматировать текст? «Источник команд» реквизита формы «ТекстДоговора» с типом ФорматированныйДокумент я указал.

    Да и текст введенный в «ТекстДоговора» не сохраняется. Процедуры в модуль формы добавил. Что может быть не так?

    Reply
  21. adapter

    Если использовать ПолеформатированногоДокумента в управляемой форме, запущенной в обычном режиме, то картинки не отображаются. Сохраняешь стр на диск как html, а они там есть.

    Reply
  22. rodygin

    Ок. Ну допустим, сделали в форматированном документе шаблон, например, договора. А как его на печать вывести?

    Reply
  23. alexvbard

    И есть ли возможность подставлять значения в форматированный документ?

    Reply
  24. adapter

    Начиная с 15 релиза платформы форматированный документ в тексте HTML теперь еще содержит и определение стилей CSS по умолчанию, причем с ошибками — убирает полосы прокрутки. Пожелание по исправлению 1С приняли, возможно даже сделают содержании таблицы стилей отдельным реквизитом. Пока следует таблицу править программно при открытии.

    Reply
  25. PiccaHut001

    есть ошибки, пока пользоваться нет смысла

    Reply
  26. Requiem

    А картинки я как понимаю тоже в том же реквизите с типом «ХранилищеЗначения» хранятся?

    Reply
  27. Ctrl P

    Публикации 2 года, а где же обещанные:

    «В следующий раз попробую рассказать про использование шаблонов для вставки параметров в текст форматированного документа, например, вместо %Контрагент% вставлять наименование контрагента.»

    идея сначала понравилась, но за 2 года так этот объект и не получил развития…

    Reply
  28. sergbsv

    (25) adapter, Как можно вставлять (использовать) таблицы ?

    Reply
  29. adapter

    таблицу стилей CSS?

    //на сервере
    ФормДок.ПолучитьHTML(HTML, Структура);
    
    //на клиенте
    ТекстПоиска = »
    |<style type=»»text/css»»>
    |body{margin:0px;padding:8px;overflow:hidden;width:100%;height:100%;}
    |p{line-height:1.15;margin:0px;}
    |ol,ul{margin-top:0px;margin-bottom:0px;}
    |img{border: none;}
    |</style>»;
    HTML = СтрЗаменить(HTML,ТекстПоиска,»»);
    
    ЭтаФорма.текст_хтмл = HTML;
    
    

    Показать

    Вместо «» можете вставить свое определение стилей

    Reply
  30. oks-nt

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

    Оказалось, что после вставки из Word символы переноса строк в HTML превращались в тэг </br>. При открытии этот тэг удалялся. Очевидно, как закрывающий тэг без открывающего считался ошибочным.

    Вылечивается например ПередЗаписью примерно так:

    ТекстОригинал.ПолучитьHTML(ТекущийОбъект.ТекстОригинал, мСтруктураОригинал);

    ТекущийОбъект.ТекстОригинал = СтрЗаменить(ТекущийОбъект.ТекстОригинал, «</br>», «
    «);

    Reply
  31. dimetra2008

    В толстом клиенте не получается такое настроить…

    Reply
  32. Arvend

    Спасибо

    Reply
  33. axxell

    (30) adapter,

    Тут даже не нужна своя таблица стилей и достаточно добавить 1 строку, например, при открытии формы с объектом html

    ТекстHTML = СтрЗаменить(ТекстHTML, «overflow:hidden», «overflow:auto»);
    Reply
  34. PiccaHut001

    (34) axxell, сколько извращений, спасибо 1С

    Reply
  35. zak555

    Как ФорматированныйДокумент сохранить, как excel файл или в pdf?

    Reply
  36. izabella_romanova

    спасибо большое за публикацию. оказалось полезной)

    Reply
  37. Rik30

    А можно пример получить? Не получается сделать

    Reply
  38. pyrkin_vanya

    От души спасибо.

    Reply
  39. mc2

    (31) oks-nt,

    Большое спасибо! Долго не мог понять в чем дело. Кстати, эту ошибку метода ПолучитьHTML исправили в 8.3.5.1068

    В младших релизах вместо вызова

    ФорматДок.ПолучитьHTML(Текст, Картинки);

    надо использовать функцию:

    Функция ПолучитьHTML(ФорматДок, Текст, Картинки) Экспорт
    ФорматДок.ПолучитьHTML(Текст, Картинки);
    Возврат СтрЗаменить(Текст, «</br>», «»);
    КонецФункции
    
    Reply
  40. Shaka13

    Спасибо, хороший материал, как раз в тему!

    Попробовал на 8.3.6 все работает, жду обещанных продолжений по этой теме 🙂

    Reply
  41. Shaka13

    но вот тут http://v8.1c.ru/overview/Term_000000785.htm

    написано:

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

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

    Reply
  42. Shaka13

    и еще вопрос, а как сделать в печатную форму, данный объект не выводится в нее?

    Reply
  43. greystone

    таблицы не вставляются, например в конце договора надо вставить реквизиты

    Reply
  44. Nicholas

    (22) adapter, столкнулся с подобной ситуацией.

    Но дело оказалось немного в другом.

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

    Например, вот так не работает:

    &НаКлиенте
    Процедура СписокПриАктивацииСтроки(Элемент)
    ФорматированныеДокумент = Элемент.ТекущаяСтрока.ДетальноеОписание.Получить();
    КонецПроцедуры

    И даже так не работает:

    &НаСервере
    Функция ПолучитьДетальноеОписаниеНаСервере(Код)
    Возврат Справочники.Справочник.НайтиПоКоду(Код).ДетальноеОписание.Получить();
    КонецФункции
    
    &НаКлиенте
    Процедура СписокПриАктивацииСтроки(Элемент)
    ФорматированныеДокумент = ПолучитьДетальноеОписаниеНаСервере(Элемент.ТекущиеДанные.Код);
    КонецПроцедуры

    Показать

    Работает только так:

    &НаСервере
    Процедура ПолучитьДетальноеОписаниеНаСервере(Код)
    ФорматированныеДокумент = Справочники.Справочник.НайтиПоКоду(Код).ДетальноеОписание.Получить();
    КонецПроцедуры
    
    &НаКлиенте
    Процедура СписокПриАктивацииСтроки(Элемент)
    ПолучитьДетальноеОписаниеНаСервере(Элемент.ТекущиеДанные.Код);
    КонецПроцедуры

    Показать

    Reply
  45. jaroslav.h

    А цвет фона, текста сохраняет у вас? У меня не сохраняет, все остальные выравнивание, наклонность шрифтов и т.д., сохраняет

    Reply
  46. Foxtrot1388

    Если вставить картинку в тонком клиенте, то в веб клиенте она не отобразится, и наоборот. Проблема возникает не во всех форматированных документах, лишь в некоторых формах. Картинка ссылается на несуществующую url в e1cib. Видимо это как то связано с параметром formUUID. Кто нибудь решал подобную проблему?

    Reply
  47. OFF

    Вовремя попалось

    Как можно было забыть ФорматированныйДокумент, а тут еще на УФ!

    Reply
  48. o.shapoval

    Добрый день!

    Поделитесь опытом, как в ФорматированныйДокумент вставить таблицу, например реквизиты контрагента.

    Когда в макете вручную прописываю теги таблицы, то в просмотре отображается все отлично — http://prntscr.com/hmippf

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

    На формах вычитал, что 1С работает по стандарту html 1.0 который и обрезает теги таблицы. Может можно как-то его изменить?

    Reply
  49. azhilichev

    Коллеги, ФорматированныйДокумент даже в релизе 8.3.11.3034 полная хрень. Если задумали использовать его для масштабных задач, одумайтесь. Придумайте альтернативу. Иначе наживете себе проблему, решать которую будет сложно.

    Reply
  50. VZhulanov

    (21) Несколько часов потратил на поиск решения подобной проблемы — поле форматированного документа было доступно только на просмотр. Эта же конфигурация на другом компьютере работала нормально.

    Нашел — было отключено выполнение активных сриптов в настройках безопасности Internet Explorer

    Но при включении скриптов в другой форме с HTML документом начинают выскакивать ошибки выполнения сценариев

    А показывать HTML страницы в форматированном документе не получается по нормальному — вообще корявит всю страницу до жути.

    Т.е. 1Ска опять жутко косячит.

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

    Reply
  51. newvideo

    Подскажите пожалуйста, может кто сталкивался: 1С:Предприятие 8.3, учебная версия (8.3.8.1933)

    На управляемой форме 3 поля: ФорматированныйДокумент и два ПолеВвода. Если активировать ПервоеПолеВвода (установить на нем курсор), и программно сменить фокус Этаформа.ТекущийЭлемент = Элементы.ВтороеПолеВвода;

    то фокус меняется, обратно также со второго поля на первое, а вот если курсор в Документе то смена фокуса не происходит.

    Это глюк элемента ФорматированныйДокумент или у меня что-то может блокировать смену фокуса?

    Например, есть 2 ситуации:

    1. Если фокус в полях, вызываем диалоговое окно, закрываем его, тыкаем мышкой в документ, — вылетает ошибка сценария ИЕ, если отключить сценарии в ИЕ то документ вообще не работает на ввод и чтение (кнопки тусклые). Поэтому настройки ИЕ не трогаю, ошибку как-то умудрился обойти путем переключения фокуса ввода программно после закрытия диалогового окна.

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

    Фокус не меняется независимо от того есть диалог или нет.

    Пока не могу понять как сценарии могут влиять на фокус элемента формы 1С. Сможете протестировать как у вас дела с фокусом?))

    Reply
  52. acanta

    В такси нет функции драг-энд-дроп. Можно как обещали на презенации 1с 8? Сделать одно окно список сотрудников, другое карточку текущего сотрудника а третью — сам форматированный документ. И перетаскивать мышкой поля из карточки сотрудника в договор ( и из связанных с ним регистров сведений — адрес, данные паспорта) ? Или надо копипастить? А как скопипастить адрес из нескольких полей 1с в одну строку? Это на каждую ячейку надо нажимать?

    И доп.реквизиты-сведения тоже нужны.

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

    Или все это уже есть в 1С Документооборот? А мне в БП 3 надо..

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

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

    А изменить текст в колонтитуле всего страниц на «Листов: 3» вместо 3 (это не по ГОСТ).

    Reply
  53. acanta

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

    Почему его нельзя вызвать из меню создать новый?

    Почему в PDF оно сохраняет без картинок и в word не сохраняет совсем.

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

    Куда-то колонтитулы пропадают при изменении режимов страниц и масштаба.

    И пока все.

    Огромное спасибо автору за статью.

    Reply
  54. acanta

    + как сохранить это во внешний файл и открыть из файла. Тот же pdf, Html или собственный формат.

    Reply
  55. Yashazz

    Что-то мне подсказывает, что в пдф сохранять придётся через COM ворда или какой-нибудь PDFCreator. А насчёт вставки ссылок — да, недоделано явно. Вставка скудная, отлова события клика нет ваще, действительно печалька.

    Reply
  56. Yashazz

    (54) На тему вставки гиперссылки набросал вариант решения: https://infostart.ru/public/1071558/

    Reply
  57. bercut0077

    Спасибо, пригодилось

    Reply
  58. its_valera

    (4) (9) Подскажите хотя бы в каком разделе курса? Оч. нужны подробности, на вскидку по содержанию не нашел, а видосов там просто вагон. Спасибо!

    Reply

Leave a Comment

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