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




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

    + за идею

    Reply
  2. SerG_121

    😀 Дерзай дальше

    Reply
  3. Malaya1971

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

    Reply
  4. света1969

    в бух не идет и прочее нет

    Reply
  5. Alex Y

    To света1969

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

    Поймите принцип и создайте на его основе свою форму.

    Reply
  6. DarkAn

    У нас в 7,7 для этих целей есть отдельный справочник, где в одном реквизите сотрудник, в другом (текстовом, периодическом) информация о доверенности. При печати документа, в частности счетов фактур и накладных дважды происходит выбор за кого и кто расписывается. Первый за гл. Бух, второй за Генерального 🙂

    Итого корректировки в базе…

    — 1 новый справочник

    — По одной новой секции в каждый документ в который надо выводить печать с запросом на подпись

    — ну и собственно в процедуре Печать() Запрос на выбор пользователей 🙂

    Reply
  7. Yashazz

    Ну и в идеале — хранение картинок с факсимильными подписями для каждого выбираемого сотрудника, и их вставка в бланки…

    Reply
  8. Marks007

    А как при таком подходе узнать кто подписывал документ, например, в том случае если часть документов надо напечатать заново?

    Reply
  9. Alex Y

    To Marks007

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

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

    Если подписанный оригинал есть, то и копию сделать не составит труда.

    Ну а когда речь о том, «кто мог подписать этот документ пол-года назад?», то либо всё печатаем через Уполномоченного (только один Зам в заданный период), либо кроим оригинальную конфу, добавляя в каждый документ подписантов. Как вариант-отдельный справочник с ФИО, должностью, местом подписи (Руководитель, Гл.бух …) и ссылкой на документ и печатную форму .

    Reply
  10. Ish_2

    (9) Вопрос о правильном подходе к созданию ВПФ уже обсуждался. И все -таки, повторюсь.

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

    Отладка работы ВПФ осуществляется при независимом запуске (кнопка Открыть) и выбором нужного документа в реквизите формы СсылкаНаОбъект .

    По окончании отладки обработка регистрируется как внешняя печатная форма.

    Reply
  11. Ish_2

    (9)

    Ну а когда речь о том, «кто мог подписать этот документ пол-года назад?»

    Может выручить частное решение.Простое , не очень корректное , но при нестрогом учете и разреженном во времени вводе документов — допустимое.

    Хранить во внешнем файле таблицу значений с двумя полями :

    СсылкаНаУполномеченноеЛицо и СсылкаНаДокумент.

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

    При печати записываем таблицу при помощи команды ЗначениеВФайл().

    Reply
  12. Alex Y

    To Ish_2

    Есть замечательная универсальная обработка для отладки в конфигураторе внешних печатных форм с возможностью задания документа/справочника и параметров: http://www.infostart.ru/public/14686/

    «Грузить» простенькую форму отладочным модулем не имеет смысла, когда есть такой инструмент.

    Reply
  13. Ish_2

    (12) К сожалению , считаю , подход продемонстрированный по указанной

    ссылке (poppy), как раз методологически неверным.

    Ненужной придумкой .

    И самым точным комментарием к теме считаю следующий (German) :

    Развил тему на пустом месте, что мешает сделать внешнюю печатную фому с диалогом?

    Тоесть запустить диалог и отлаживай сколько хочешь, из диалога так же вызывать Функцию модуля печать.

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

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

    Reply
  14. poppy

    (13) Там есть и другой комментарий от не менее уважаемого специалиста:

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

    Напомню, для отладки обычной обработки, в отличии от ВПФ, не требуется добавлять в нее что-то ненужное.

    Каждому — свое. Самая короткая дорога — та, которую знаешь.

    Reply
  15. poppy

    (0)

    Для указания доверенности использовал поле «Комментарий» (Вкладка «Прочее» поле «Дополнительная информация») в справочнике «Физические лица». При этом комментарий должен иметь вначале ключевое слово «ДОВЕРЕННОСТЬ:». По нему определяется, что это не произвольный комментарий, а именно доверенность.

    Для этого можно использовать механизм свойств объектов http://infostart.ru/public/57375/

    Свойства также можно использовать и для хранения того, кто подписал (8).

    (11) Это к вопросу полезно ли знать механизмы типовых конфигураций http://infostart.ru/public/60216/

    Reply
  16. Ish_2

    (14) Спасибо, poppy.

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

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

    Ан нет. По нику автора этого поста NewNick попадаю к себе в профиль. Poppy , это не я. Это support’у вопрос.

    Но «уважаемого специалиста» в свете приведенной цитаты я оценил.

    Reply
  17. poppy

    (16) Ты о чем?

    Не поняла тебя в контексте применения слов «хихикать», «уважаемый специалист», «выдающееся» и «оценил специалиста в свете цитаты». Что ты имел в виду?

    Кстати, профиль NewNick: http://infostart.ru/profile/9158/

    Reply
  18. Ish_2

    Я о том :

    1. Что приведенное в указанной цитате предложение мне кажется нелепым.

    2. Что клик на нике NewNick ( как автора этого комментария в Вашей теме) приводит в профиль Ish_2 . Отсюда для наблюдателя возможен вывод , что я и есть автор такого комментария.

    3. Я попытался откреститься от такого авторства. И не захотел быть «уважаемым специалистом».

    Reply
  19. poppy

    (18)

    п.1 Приведенная в (13) цитата не менее нелепа. Но это не делает Германа неуважаемым специалистом.

    п.2 Тот клик приводит не в профиль Ish_2, но в профиль того, что кликает. Поэтому, для наблюдателя возможен вывод, что это он автор такого комментария, но не ты.

    п.3 Открещивался зря… 😀

    Reply
  20. Ish_2

    (19) Спасибо, Poppy.

    Reply
  21. shaman.nk

    Спасибо Автору!!! Наего примере усе с первого разо вышло!!!

    Reply
  22. galagala

    Платформа 8.2. Проведена конвертация файла в Конфигуратеоре.

    Ошибка:

    {ВнешняяОбработка.Акт_с_любой_подписью.МодульОбъекта(516)}: Метод объекта не обнаружен (ПолучитьЧастьЗапросаДляВыбораСодержания)

    СтрокаВыборкиПоляСодержания = ОбработкаТабличныхЧастей.ПолучитьЧастьЗапросаДляВыбораСодержания(«АктОбОказанииПроизводственныхУслуг»);

    Что делать?

    Reply
  23. Alex Y

    (22) Извините, давно не смотрел комментарии.

    При изменении конфигураций функции общих модулей «дрейфуют» в другие модули или меняют имена.

    Да и сами исходные печатные формы меняют содержание.

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

    Тогда у вас будет всегда актуальная внешняя печатная форма.

    Аналогично следует поступать и с макетом, если он сильно изменился.

    Для НЕ ПРОГРАММИСТОВ! Хотите свою печатную форму, а программировать не хотите? Нет ничего невозможного. Пишите. Договоримся.

    Reply
  24. Vovanich

    Взял за основу приведенный код. Попытался прикрутить к акту выполненных работ(реализация товаров и услуг) в БП-2.0.19.12, выбор отв лица работает и проставляет произвольное лицо, но не могу вытащить доверенность из комментария…значение все время пустое оказывается что может быть?как мне вытянуть из поля доп.Информация номер доверенности или может куда то еще можно прилепить этот номер доверенности?

    Поможите пожалуйста. Мне еще по такому типу надо Счет сделать и СчетФактуру. А тупо статичным текстом в макете не очень хотелось бы вбивать.

    Reply
  25. Sas001

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

    Reply
  26. Sas001

    да и вообще все данные о подписях в документе хранить в регистре сведений, это просто замечательная вещь в 8-ке!!!

    Reply
  27. kouch

    Статья архиважная и архинужная. Огромная находка для чайников. Спасибо. )))

    Reply
  28. Alexey55

    Огромное спасибо!

    статья очень помогла мне)

    Reply
  29. CratosX

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

    Reply
  30. oleg_ss

    Хорошая статья буду использовать метод.

    Сейчас актуальна, т.к. пишу внешнюю печатку на реализацию

    Reply

Leave a Comment

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