Заполнение табличных частей документов (управляемое и обычное приложение)




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

25 Comments

  1. nata_87

    Как подключить обработку к нетиповому документу?

    Reply
  2. Farsis

    (1) nata_87, Без программирования никак. В форме нетипового документа, необходимо добавить строчку, подключающую механизм дополнительных обработок.

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    …
    
    // ДополнительныеОтчетыИОбработки
    ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере(ЭтаФорма);
    // Конец ДополнительныеОтчетыИОбработки
    …
    
    КонецПроцедуры

    Показать

    Reply
  3. nata_87

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

    Reply
  4. Farsis

    (3) nata_87, В конфигураторе, в ветке «Общие команды», найдите команду «ЗаполнениеОбъекта» и в её свойстве «ТипПараметраКоманды» добавьте нетиповой документ.

    Reply
  5. nata_87

    (4) да получилось так, а нельзя как то обходом, что б не трогая типовую команду? Ведь после каждого обновления получается надо устанавливать Тип в этой команде.

    Reply
  6. Farsis

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

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

    Reply
  7. nata_87

    (6) понятно все, спасибо

    Reply
  8. Farsis

    (7) nata_87, Я написал обработку. Попробуйте с помощью неё назначить обработку нетиповому документ, без добавления типа в общую команду.

    Reply
  9. nata_87

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

    Reply
  10. Spektr

    Думал, что это обработка по заполнению ТЧ, а это по изменению значений в ТЧ. Название не соответствует функционалу.

    Reply
  11. Farsis

    (10) Spektr, Я прошу прощения, за то что название обработки, придуманное мной и достаточно подробное (на мой взгляд) описание функционала, все-таки ввели вас в заблуждение и вы скачали не то что искали. Я могу ошибаться, но в моем понимании заполнение значений реквизитов ТЧ — это и есть заполнение ТЧ 🙂

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

    Reply
  12. AKV77

    Уважаемый автор. При интеграции и использовании в УТ 11.1 пишет ошибку: {Форма.ФормаУправляемая.Форма(87)}: Поле объекта не обнаружено (НастройкиЗаполненияГруппаКолонокОтбор)

    Элементы.НастройкиЗаполнения.ПодчиненныеЭлементы.НастройкиЗаполненияГруппаКолонокОтбор.ПодчиненныеЭлементы.НастройкиЗаполненияГруппаКолонокОсновныеЭле

    Reply
  13. Farsis

    (12) AKV77, Добрый день. Тестирую обработку на версии УТ ред. 11.1.10.145 — ошибок не возникает. Возможно дело в структуре самого документа.

    Я прошу Вас:

    — Напишите мне версию платформу, версию УТ и документ в котором у вас возникает ошибка.

    — Попробуйте заполнить ещё какой-нибудь типовой документ, например Авансовый отчет. Ошибка воспроизводится или нет?

    — Напишите мне вам адрес электронной почты (в личку), чтобы я мог выслать вам исправленную версию обработки, потому что я верю в то, что мы что-нибудь придумаем 🙂

    Reply
  14. gull22

    Предлагаю изменить наименование 2Заполнить документ» на «Заполнить табличную часть». А то пользователи или пугаются, что весь документ перепишется, или приходится разъяснять, что это касается табличной части.

    Reply
  15. NeeDiGeo

    УНФ 1.5.4.34 появляется сообщение выполняется команда. Форма заполнения не открывается.

    Reply
  16. margo2007

    (15) Табличная часть у Вас пустая, поэтому не открывается.

    Все зарегистрировалось и работает.

    Можно использовать как базовую под свои задачи.

    Отличная вещь !

    Reply
  17. ssn5810

    НЕ Проще выбрать необходимое в табличной части ?…..

    Reply
  18. MiKe80

    ERP 2.2.4.154 не пошла

    «Невозможно подключить дополнительную обработку из файла.

    Возможно, она не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)»

    Reply
  19. MiKe80

    Прошу прощения, сам ошибся!!!!!!

    Reply
  20. MiKe80

    Заказ покупателя и РеализацияТоваровиУслуг ERP 2.2.4.154 заполняет ставку НДС на 18%, сумму ндс не пересчитывает, хотя ПТУ нормально все пересчитывает

    Reply
  21. Farsis

    (20) Михаил, добрый вечер. Вызов событий при заполнении полей реализован только для обычных форм. По идее для ПТиУ сумму НДС обработка тоже не должна пересчитывать.

    Reply
  22. MiKe80

    (21) Добрый вечер. Печалька 🙁 Ставлю цену закупочная в Документах ПТиУ делает, ставлю цену в РТиУ закупочная — меняет как надо ставку НДС и пересчитывает сумму НДС, из 10 строчек Н-ры 2 Закупочные остальные продажные, закуп пересчитывает, продажные нет, прикольно )))))

    Reply
  23. mrdc

    В «Управление торговлей для Казахстана, редакция 3, локализация для Казахстана: «1С-Рейтинг» (3.4.4.15)» не работает.

    Хочу заполнить ТЧ документа «Заказ клиента» из ТЧ документа «Заказ поставщику».

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

    Наверное, зря потраченные стартмани 🙁

    Reply
  24. Farsis

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

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

    Если вам всё-таки необходим функционал моей обработки, то я могу поискать конфигурацию «Управление торговлей для Казахстана, редакция 3» и посмотреть, в чем может быть причина того, что не появляется окно для заполнения.

    Reply
  25. mrdc

    (24)

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

    Понятно. Теперь разобрался.

    Взял вот эту — https://infostart.ru/public/678230/

    Заполнил по ней ТЧ, а вашей изменил вид цены по всем строкам сразу.

    Работает. Думаю, что пригодится все-таки. Благодарю.

    Но. Советую тогда сменить название, хотя бы на что-то типа «Изменение реквизитов табличной части» или добавьте скриншот, где видна форма выбора реквизитов и установки их значений, так как именно это и делает ваша обработка. Кстати, очень даже удобно и не надо работать с такими мощными «комбайнами» как https://infostart.ru/public/122215/ , когда надо сделать быстро одну простую операцию.

    Был стакан пустой — налили в него воды из кружки или ведра — заполнили его.

    Стакан заполнен простой водой — добавили туда ложку сахара — вода стала сладкой — изменили воду в стакане.

    Reply

Leave a Comment

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