Автоматическое заполнение шаблонов из дополнительных реквизитов "1С:Документооборот 8".




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

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

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

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

33 Comments

  1. karapuzzzz

    А зачем так извращаться? Выбираете замену «На значение реквизита» и в дереве выбираете «ВладелецФайла — ДопРеквизиты — ВашРеквизит».

    Reply
  2. Stalker27

    (1) karapuzzzz,

    Документооборот 8 КОРП, редакция 1.3 (1.3.2.4). 1С:Предприятие 8.3 (8.3.4.437)

    У меня такого нет. И, как я понимаю, не только у меня этого нет. Откуда у Вас, даже не знаю =)

    Reply
  3. uri1978

    (2) Stalker27,

    На самом деле у всех такое есть. У меня тоже Корп 1.3.

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

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

    Статья я лично считаю интересной и полезной. Пишите еще.

    P.S. Без придирок, просто на всякий. Процедура ПолучитьЗначениеДопРеквизитаОбъекта видна из контектса обработки, т.е. название модуля АвтозаполнениеШаблоновФайловСервер можно не писать. Немного разгружает текст обработки, особенно если обработка большая.

    Reply
  4. Stalker27

    (3) uri1978,

    Действительно есть (нашёл-таки), только у меня не в «и в дереве выбираете «ВладелецФайла — ДопРеквизиты — ВашРеквизит»» а в ветке «ВладелецФайла — Ссылка — ДопРеквизиты». И ведь в строчке кода было понятно, что именно там находятся ДопРеквизиты…

    Проверил, действительно можно писать без указания названия общего модуля. Правда полезно, зачем много кода-то писать =) Полезное замечание =)

    Спасибо, приятно! Если найдутся интересные темы, обязательно напишу! А эту статейку стоит отредактировать…

    (1) karapuzzzz,

    Да, действительно, не заметил, что можно выцепить ДопРеквизит проще. Но, как уже написал uri1978: «А если нужно дополнительный реквизит обработать (например отсрочку платежа (число) написать прописью), то тогда конечно программно».

    Reply
  5. Stalker27

    (5) SvetLanaGil,

    Приятно, что что-то из статьи пригодилось =)

    Вам спасибо большое, подняли настроение!!! 😉

    Reply
  6. SvetLanaGil

    Действительно Доп.реквизиты «переехали в ссылку лишь с недавнего времени. После обновления при создании новых автозаполняемых шаблонов была неприятно удивлена отсутствием на привычном месте Доп. реквизитов… после непродолжительных изысканий нашла их в новом месте: ВладелецФайла.Ссылка.ДопРеквизиты.

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

    Reply
  7. sikvel2012

    у меня вообще с с ним одни проблемы

    поля из файлов odt он не заполняет хоть тресни, не находит их просто для выбора

    строки для docx тоже не заменяет, пишет что нет такой комбинации

    никто не сталкивался? как это побороть?

    Reply
  8. Stalker27

    (7) reznic, поля в odt не поддерживаются. Если «текст по умолчанию» в поле был указан, то поле просто преобразуется в этот текст. Если нет — то просто исчезает (превращается в пустое поле). Однако строки, по крайней мере у меня, он заменяет. Посмотрите внимательно файл, возможно там правда отсутствуют Ваши строки. Вот, например, у меня что выскакивает в случае отсутствия строк:

    {Справочник.ПравилаАвтозаполненияФайлов.Форма.ФормаЭлемента.Форма(262)}: Следующие строки отсутствуют в шаблоне:

    &Ответственныййй

    ВызватьИсключение ОписаниеОшибкиСтроки;

    То есть я ввёл, чтобы он заменял эту строку «&Ответственныййй» (у меня в документе есть строка «&Ответственный») на Ответственного, указанного в карточке документа. Однако такой строки у меня нет, ну он её не находит и пишет такую вот ошибку.

    А так заменяются строки и в odt и в docx. Можно использовать данный метод замены.

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

    Reply
  9. sikvel2012

    с опен офисом спасибо, не знал, и негде несказано

    а ворд на замену вот что выдает (см скриншот)

    Reply
  10. Stalker27

    (9) reznic,

    Это точно поле, а не простой текст?

    Если это поле, то файл точно сохранён? Надо смотреть, так точно не скажу даже 🙂

    На скрине правильное заполнение поля, ну примерное по крайней мере =)

    Reply
  11. sikvel2012

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

    Reply
  12. sikvel2012

    сейчас попробовал, в либро офисе поля заменяет

    Reply
  13. Stalker27

    (12) reznic,

    Ну в ворде какой-то глюк значит =)

    Reply
  14. sikvel2012

    именно он и глючил гад

    а в чем может быть проблема, не выводит {ВладелецФайла|УдалитьПредметПереписки|Ссылка} и не работает Объект = Файл.ВладелецФайла.УдалитьПредметПереписки;

    Reply
  15. sikvel2012

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

    Reply
  16. karapuzzzz

    (15) reznic, Без доработок не выведет. Там стоит проверка на тип вставляемых данных. И это должен быть только текст.

    Reply
  17. sikvel2012

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

    Reply
  18. karapuzzzz

    (17) reznic, только дорабатывать. Я уже точно не помню как. Нет доступа к тем разработкам. Но реализовывал вставку таблицы, картинки, содержимого из другого документа. Может, со временем смогу это сделать в виде статьи.

    Reply
  19. sikvel2012

    (8) Stalker27, кстати поля в одт поддерживают, на днях попробую себя в написании обзора

    Reply
  20. KRIHA

    Люди, извините что не в тему — помогите ответом на вопрос: можно ли в 1С:Документооборот в качестве исполнителя выбрать группу (или роль, или еще что) таким образом, что задача на исполнение приходит всем пользователям группы, но кто первый «схватил» и согласовал тот и собственно и завершает процесс согласования. Может быть я коряво написал — заранее приношу за это извинения.

    Reply
  21. uri1978

    (20) KRIHA,

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

    Reply
  22. Iscarimet

    Есть такой вопрос:

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

    Как заполнять в зависимости от типа значения этого допреквизита поле в шаблоне адресом указанного корреспондента или адресом подразделения (допустим этот адрес записан в комментарии к подразделению)?

    То есть в итоге поле должно заполняться адресом корреспондента, если в допреквизите выбран тип значения «Корреспондент», и наоборот, должно заполняться комментарием подразделения, если в допреквизите выбран тип значения «Подразделение».

    Конкретная проблема в обращении к типу допреквизита.

    Reply
  23. sikvel2012

    только через произвольный алгоритм на встроенном языке

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

    Reply
  24. placent

    Кто нить сталкивался с такой проблемой ?

    Релиз Документооборот 8 КОРП, редакция 2.0 (2.0.8.7).

    Пользователь создал Внутренний документ. Заполнил организацию и тд. Заполнил Wordовский файл шаблона. Сохранил внутренний документ.

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

    Для реализации создал Доп обработку. В котором запрос с отбором файла и команда

    ДанныеВыполнения = АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца(Истина, Выборка.Ссылка, Истина);

    Далее прикрепил эту доп обработку к Подпискам на бизнес событие. Изменение внутреннего документа.

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

    Теперь запускается фоновое задание «Обработка произошедших бизнес-событий». Которое пытается обработать «Произошедшие бизнес события» и ставит там число попыток обработки 3. А признак выполнен не ставит.

    По результату файл шаблона не обновлен.

    Reply
  25. clev

    (24) placent, Вам удалось решить эту проблему?

    Reply
  26. tat10

    Добрый день!

    Может кто-нибудь сталкивался с такими проблемами:

    1. Есть шаблон приказа. Там есть согласующие подписи. Как их вставить в ворд для автозаполнения? Никак не могу настроить правила автозаполнения шаблонов. Т.е. нужно вывести несколько строк согласующих подписей: должность и ФИО ..

    2. Как в правилах автозаполнения шаблонов выбрать адрес контрагента, телефон и другую информацию?

    Reply
  27. msotools

    Может кто делал заполнение шаблонов через docwebservice ? Насколько это удобно?

    Reply
  28. yoshitoshi

    (25)

    На дворе середина 2017 года, а эта проблема до сих пор имеет место быть.

    Сотрудники не понимают, что это такое и зачем это делать.

    Они же изменили значение в полях в форме документа.

    Почему еще нужно делать какие-то непонятные действия?

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

    Reply
  29. yoshitoshi

    ВАЖНОЕ ЗАМЕЧАНИЕ:

    У меня версия ДО КОРП 2.1.10.2 — и в ней уже нет описанного функционала «замена строки».

    Так же, в меню «Нормативно-справочная информация» нет пункта «Правила автозаполнения шаблонов файлов».

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

    Reply
  30. Coole

    как вы заполняете шаблоны ? у меня элементарное — ДатаДокумента не заполняется

    Reply
  31. soulner

    (30) Для пробы могу предложить Вам следующий алгоритм:

    1. добавить пустой файл MS Word во вкладку «Файлы» шаблона любого вида документа;

    2. нажать «Открыть» в настройках заполнения;

    3. выбрать галочками несколько реквизитов;

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

    5. можно посмотреть, что получилось путём нажатия на кнопку «Проверить настройки заполнения».

    Этот механизм хорошо работает в ДО версии 2 и выше, рекомендую добавлять поля в шаблон из настроек заполнения, а не руками. 1С знает какие поля добавлять. Появляются они слева вверху документа, но их можно переместить в текст куда надо.

    Reply
  32. TigerS74

    А как в Excel так же вставить хотя бы Регистрационный номер из 1C Документооборот?

    Reply
  33. sergathome

    (32) ДО не поддерживает шаблоны на основе Экселя.

    зы Публикация безнадёжно устарела.

    Reply

Leave a Comment

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