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




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

65 Comments

  1. СергейКа

    Чтой-то видно данная тема никому неинтересна… Значит нет смысла дорабатывать на справочники и документы нескольких типов…

    Reply ↓
  2. ЛюблюТебя

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

    Reply ↓
  3. СергейКа

    Это если не внешнюю форму выбирать?

    Reply ↓
  4. СергейКа

    +3 для внешних форм не предусмотрена сразу печать. Только с выводом на экран. А надо ли это делать?

    Reply ↓
  5. Erne100

    Стандартная типовая итак печатает любую форму по-умолчанию даже внешнюю

    Reply ↓
  6. СергейКа

    (5) Какая именно печатает внешние?

    Reply ↓
  7. akat65

    У сотрудников ЕСТЬ вн.печ.форма (ИСТОРИЯ) в обработке не видно….

    Можно отбор по спр. и докам сделать по алфавиту…

    Reply ↓
  8. СергейКа

    (7) См ограничение — по справочникам не подключает внешние формы.

    А делать — не делать — говорят что уже есть (5). Смысл тогда «велосипед» дорабатывать?

    Reply ↓
  9. akat65

    Стандартная типовая итак печатает любую форму по-умолчанию (только ДОКИ…)?

    А спр.тоже хочется…

    Reply ↓
  10. СергейКа

    Обработка доработана. Реализован весь функционал.

    Reply ↓
  11. gutentag

    🙂

    Reply ↓
  12. gutentag

    Или надо написать, что обработка только для ЗУП-8.1, т.к. обработка выдает ошибки в Бухгалтерии 1.6 (1.6.15.5): не работает печать документов(предварит.просмотр и прямая) + ошибку при печати внешних форм:

    {Форма.ФормаВыбораВнешнейФормы(17)}: Поле объекта не обнаружено (ПиктограммаФайла_MXL)

    ЭлементыФормы.ДеревоФормы.Колонки.ПредставлениеОбъекта.КартинкиСтрок = БиблиотекаКартинок[«ПиктограммаФайла_MXL»];

    ————

    Пожелание(не обязательное): Было бы еще удобнее, если Обработка была бы с произвольным выбором печатной формы документа(в том числе и «внутренних форм).

    Reply ↓
  13. СергейКа

    (12) Изменил описание.

    Reply ↓
  14. akat65

    Справочники вн.печ.формы обрабатывает ….?

    Reply ↓
  15. СергейКа

    (14) Должон.

    Reply ↓
  16. akat65

    Подключил вн.обработку,

    «История сотрудника (как в ЗиК`е) для ЗУП 2.5 © Armando»

    не видет …

    Reply ↓
  17. СергейКа

    (16) Теперь печатает однозначно, проверил.

    Reply ↓
  18. akat65

    Есть проблемка с обычной печатью доков и справочников…

    Reply ↓
  19. akat65

    +18 извиняюсь только справочники…,

    сотрудники-трудовой договор…

    Reply ↓
  20. СергейКа

    (19) Какая проблемка? Печатает нормально, тоже проверено.

    Reply ↓
  21. akat65

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

    мероприятия орг-ции завел , но не вывел…

    Reply ↓
  22. СергейКа

    (21) Наверное, Вам стоит попытаться яснее выразить свои мысли, так как всё равно непонятно 🙂

    Reply ↓
  23. akat65

    +21 есть в ЗУПе спр. «Мероприятия предприятия»,есть там печ.форма…

    обработка не выводит на печать ….

    Reply ↓
  24. akat65

    +21 можно в отборе выбирать элементы спр.группы…

    Если установить у справочников флажок «обрабатывать ТЧ»,

    то отбор не работает…

    Reply ↓
  25. СергейКа

    (23) Посмотрю как буду на работе.

    (24) НИЧЕГО в типовой обработке не менялось. Были внесены только добавления. Но думаю, что при обработке ТЧ группы справочников не должны отбираться, если у нет ТЧ.

    Reply ↓
  26. akat65

    +24 В типовой обработке ошибки нет ,

    если установлен у справочников флажок «обрабатывать ТЧ»…

    то отбор проходит… ,

    а в обработке выходит ошибка…

    В типовой нельзя выбрать эл.спр.группу в отборе,а иногда

    Reply ↓
  27. kai123

    А внутренние печатные формы (по умолчанию) печатает?

    Reply ↓
  28. kai123

    Все нашел, печатает, Спасибо 🙂

    Reply ↓
  29. СергейКа

    (24) Ошибка исправлена.

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

    Reply ↓
  30. akat65

    Отбор с флажком «обрабатывать ТЧ» теперь ОК,

    только, если есть список отобранных элементов с этим флажком…

    вн.печатные формы пусты,а обычная печать не работает.

    И есть проблемка в типовой обработке и у ВАС с изменение родителя у справочников,

    (группа(родитель) для изменения не выбирается)

    Reply ↓
  31. fomenkom

    В 1С8.1 Бух. не печатает внешние формы, только встроенные. 🙁 Как исправить?

    Reply ↓
  32. СергейКа

    (31) Читаем описание «Гарантированно работает в конфигурации ЗУП 2.5.13. В других конфигурациях работа возможна, но не гарантируется. Возможна доработка «под конфигурацию» по требованию.»

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

    Reply ↓
  33. fomenkom

    Конфигурация:Бухгалтерия предприятия, редакция 1.6 (1.6.20.6). Есть внешняя печатная форма: «Акты за поставщиков» в документе «Поступление товаров и услуг». Она хорошо печатается из самого документа. А из групповой обработки нет. Я подключила вашу обработку, выбираю «печать внешних печатных форм», когда хочу сделать выбор из «списка внешних печатных форм» мне выдается ошибка: {Форма.ФормаВыбораВнешнейФормы(17)}: Поле объекта не обнаружено (ПиктограммаФайла_MXL)

    ЭлементыФормы.ДеревоФормы.Колонки.ПредставлениеОбъекта.КартинкиСтрок = БиблиотекаКартинок[«ПиктограммаФайла_MXL»];

    А если без этого выбора нажимаю на «выполнить», то она выполняется, но печатную форму не выдаёт:Выполняемое действие: Печать документов

    Режим: Печать внешних печатных форм

    ————————————————————

    ————————————————————

    Выполнение обработки завершено

    Reply ↓
  34. СергейКа

    (33) Данная ошибка возникала в конфигурациях не имеющих определенной картинки (см. описание сверху).

    Исправил, проверил в указанной конфигурации. Теперь работает нормально.

    Reply ↓
  35. fomenkom

    Спасибо большое! Теперь всё печатает, единственно не хватает печати внешних форм без предварительного просмотра, при больших объёмах это очень удобно.

    Reply ↓
  36. СергейКа

    (35) Никогда не пользовался. Но добавить не сложно.

    Reply ↓
  37. СергейКа

    (35) Добавил. Только что бы было видно что с просмотром, что без — лучше форму на полный экран разворачивать.

    Reply ↓
  38. fomenkom

    Ура! Всё получилось!!! Безмерно признательна!!! 🙂

    Reply ↓
  39. sasylka

    В УПП редакция 1.3 внутренние формы печатает прекрасно…

    а вот с внешними проблемма 🙁

    Список внешних печатных форм — пустой…

    Reply ↓
  40. СергейКа

    (39) Одно из двух:

    — либо что то не правильно поняли в действии обработки

    — либо нет доступных внешних печатных форм.

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

    Reply ↓
  41. sasylka

    печатные формы есть..аж целых две….

    только их не отбирает именно в форму выбора внешних печаных форм

    Reply ↓
  42. СергейКа

    (41) Они зарегистрированы в справочнике внешних печатных форм?

    Они зарегистрированы именно к тому объекту, по которому хотите распечатать?

    У вас есть права на использование этого справочника?

    При открытии формы выбора форм она пустая или всё выбирается но не печатает?

    Reply ↓
  43. sasylka

    да зарегестрированы в справочнике

    именно к справочнику Сотрудники

    Права Полные

    при окрытии форма пустая

    то есть сами печаные формы корректные и прописано все верно (я попробовала в справочнике внешних печатных форм одной из обработок заменть «Умолчательную» все прекрасно распечаталось)…

    вот уж и сама не знаю где загвоздка…весь код пролезла… или я где-то что-то не так делаю или одно из двух 🙂

    Reply ↓
  44. СергейКа

    (43) Можете приложить любую из этих внешних форм?

    Reply ↓
  45. sasylka

    Извиняюсь за задержку

    приложила внешнюю печатную форму

    Reply ↓
  46. СергейКа

    (45) Очень интересно…

    1. Приложенная печатная форма в формате 8.2. Где нибудь обещано что на 8.2 будет работать? 🙂

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

    2. Сконвертировал свою обработку, прицепил вашу форму в справочник внешних печатных форм с авторегистрацией.

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

    Выбрал действие «Печать документов» и параметр «Печать внешних форм (см просмотром)».

    Выбрал саму печатную форму (установил галку в форме выбора).

    Нажал на кнопку «Выполнить» и…

    О чудо! Напечатались договора по всем выбранным сотрудникам.

    Посмотрите порядок действий. Где я что не правильно сделал? 😀

    Reply ↓
  47. sasylka

    Простите может туплю….

    Делаю все как вы описали… еще раз проверила правильно ли стоит автрегистрация в обработке и переподключила…. все адекватно..1с сообщает что обработка содержит параметры авторегистрации и подключает ее к сотрудникам верно…

    но в ваша обработка в форме выбора печатных форм…показывает Пусто… 🙁

    может у меня прав нет?

    или атроегистрация не верна или некорректно цепляется?

    Reply ↓
  48. СергейКа

    (47) Авторегистрация вроде правильная.

    Может быть действительно проблема с правами.

    Какие права сейчас у вас в базе? (все)

    Reply ↓
  49. sasylka

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

    Reply ↓
  50. СергейКа

    (49)

    В общем, Вы меня заинтриговали 😀 Пришлось устанавливать УПП 1.3, поскольку во всех остальных конфигурациях что у меня стоят — обработка работает.

    И… Действительно, именно в этой конфигурации внешние печатные формы отличаются от других типовых.

    Я склонен считать, что разработчики допустили ошибку. Хотя может быть они хотели поменять логику да не доделали?

    В общем приладываю обработку специально для этой редакции. Всё работает. Пользуйтесь.

    В целом универсальную обработку сделаю для 8.2 попозже, ибо с понедельника в отпуске 😉

    Reply ↓
  51. sasylka

    Спасибо ПРЕогромное!!!

    сбылась моя мечта 🙂

    Reply ↓
  52. Hector

    Здравствуйте! Скажите пожалуйста, обрабатывает ли она табличные части документа Операция(бухгалтерский и налоговый учет)? Мне нужно поменять СчетКт. Спасибо.

    Reply ↓
  53. СергейКа

    (52)В плане изменений объектов — полностью типовой функционал. Мной была изменена только печать.

    Табличные части обрабатываются в ней точно.

    Reply ↓
  54. Hector

    Спасибо, что ответили, типовая не обрабатывает Операции (я имею ввиду табличную часть).

    Reply ↓
  55. СергейКа

    (54) Типовая табличные части обрабатывает.

    Какая именно конфигурация?

    Скорее всего, вы подходите не с того края:

    Обычно у этого документа нет собственной табличной части. На форме документа отображаются проводки введенные данным документом.

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

    Reply ↓
  56. Hector

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

    Reply ↓
  57. Hector

    Конфигурация УПП . 1С 8.2

    Reply ↓
  58. СергейКа

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

    Можете попробовать использовать вот эту обработку http://infostart.ru/public/21123/ , если нужно именно готовое решение.

    Reply ↓
  59. Hector

    СергейКа, огромное спасибо, буду смотреть 🙂

    Reply ↓
  60. AndreyBuka

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

    Reply ↓
  61. Tur_gad

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

    Reply ↓
  62. PAAG

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

    Reply ↓
  63. СергейКа

    (62). Если у этих справочников включена поддержка типового механизма, тогда да.

    Reply ↓
  64. b-dm

    Подскажите, как отправить печатную форму сразу на принтер, у меня почему то все время она открывается для просмотра…

    Reply ↓
  65. СергейКа

    (64) Если из внешней печатной формы, то в данной обработке никак. Это просто не предусматривалось сразу.

    Прошу прощения за долгий ответ. Почему то оповещение по почте не приходило.

    Reply ↓

Leave a Comment

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