Групповая обработка справочников и документов (Управляемые формы) 1С:Предприятие 8.3 (8.3.13.1513)




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

21 Comments

  1. murin

    При открытии на файловой базе выдает ошибку: Переменная не определена (ОбработкаТабличныхЧастеКлинтСервер)

    Reply
  2. o.kovalev

    (1) проверяю

    Reply
  3. o.kovalev

    (1)

    ОбработкаТабличныхЧастеКлинтСервер

    Можете уточнить конфигурацию и версию конфигурации ? Типовая ли она ?

    не увидел ошибки при открытии на файловой базе

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

    такой ( не совсем правда точно такой) текст встречается в модуле формы

    кроме того!

    если у вас типовая конфигурация то тут есть ошибка

    Я сейчас поправлю файл в раздаче, но Вы можете поправить самостоятельно

    начиная стр 2668 заменить две строки для типовой конфигурации

    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуТабЧасти(НужнаяСтрока);

    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуНДСТабЧасти(НужнаяСтрока, ОбрабатываемыйОбъект.Ссылка.СуммаВключаетНДС);

    Спасибо за обращение!

    Reply
  4. murin

    Добрый день, помогла замена:

    ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуВСтрокеТЧ(НужнаяСтрока);

    ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуСНДСВСтрокеТЧ(НужнаяСтрока, ОбрабатываемыйОбъект.Ссылка.СуммаВключаетНДС);

    Проверял на 1С ERP 2

    Reply
  5. kermzyxer

    Добрый день. Как бы добавить в видимость колонок при обработке табличных частей реквизиты документа (ссылки)?

    Reply
  6. o.kovalev

    (5)

    По кнопке видимость колонок, включаем необходимые флажки

    Reply
  7. o.kovalev

    (5) чуть ниже прокрутить там будут реквизиты

    Reply
  8. kermzyxer

    Добрый день. Нет ниже ничего к сожалению. Рисунок прикрепил.

    Reply
  9. o.kovalev

    (8)

    А что выбрано на первой закладке ?

    какая конфигурация

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

    Reply
  10. kermzyxer

    Попробовал. При одной тч видны реквизиты ссылки. При двух нет. А мне как раз нужна реализация (бухгалтерия 3.0), но обязательно и с услугами и с товарами. Может подскажите где посмотреть, может удастся поправить. Если бы были не видны реквизиты второй тч, еще понятно, а почему реквизиты ссылки исчезают? Проблема в том, что бухгалтера используют такие отборы не для замены реквизитов, а как отчет, где нужны колонки из тч документа (номеклатура, цена, количество, сумма), потом выводят список отсортировав его промежуточно еще по грузоотправителю и договору (контрагенту, дате и т.д). Увы, отчет продажи в бухгалтерии слабоват, а такие отчеты идут еще из базы торговли 10 и руководители к ним привыкли. Писать все с нуля муторно (нужна куча отборов и настроек), СКД отчеты пока принимают в штыки. В 2.0 именно так выкручивались, а теперь надо перейти на 3.0 и все в голос вопят, что нет ничего похожего, да и цены почти нигде нет, а очень хочется.

    Reply
  11. o.kovalev

    (10)

    Я понял в чем проблема, нужна будет доработка, в ближайшее время сделаю.

    Reply
  12. kermzyxer

    Огромное спасибо. Жду.

    Reply
  13. o.kovalev

    (12) Доработал, проверяйте если что пишите

    Reply
  14. kermzyxer

    Добрый день. Да сейчас работает, спасибо. Только как-то нехорошо получается, два дня назад скачал, заплатил. А сейчас не она поправлена, а другая версия лежит. Опять заплатил. Это конечно мелочь, но все же не все и не всегда готовы заново платить. Да и исправление по-моему не повод сменить версию. Извините, ворчу. По обработке мелкое пожелание. В списке видимости колонок колонки в хаотичном порядке, достаточно сложно найти нужную. Вначале количество и номенклатура из табличных частей, потом реквизиты ссылки, кажется по алфавиту, но нет договор после организации выдавшей доверенность, в конце реквизиты ТЧ, тоже не по порядку. Картинку приложил (но как новую версию не возьму). Кстати, а как Вы поступили с удвоившимися колонками из разных ТЧ? Если свернули, то пожалуйста, сразу отсортируйте остаток. Ну и немного удивило, что в Вывести список видны только отобранные и служебные колонки. Это даже удобнее, но сразу не сообразил, подумал, что опять не все в наличии.

    Reply
  15. o.kovalev

    (14)

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

    Спасибо за обратную связь.

    Reply
  16. kermzyxer

    Спасибо. Это уже не смертельно, но отсортированное будет приятно. Мой адрес Kermzyxer@mail.ru

    Reply
  17. fdrpaid

    Добрый день!

    В стандартной УТ 11.4. При изменении в реализациях реквизита (Перевозчик) обработкой были изменены номера документов.

    Reply
  18. o.kovalev

    (17) Обработка не может менять номера при изменении других реквизитов, это не предусмотрено нигде в коде, может дату(год) документа тоже меняли ? Пр ручном изменении

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

    Reply
  19. o.kovalev

    (17) Кстати еще попробуйте проверить в копии с включенным флажком «Выполнять в режиме загрузки», режим загрузки отключает стандартные проверки и обработки — команда

    Обмен данными. Загрузка = истина.

    Reply
  20. user1025918

    Здравствуйте, подскажите в ней есть возможность скопировать полученный результат в Excel?

    Reply
  21. o.kovalev

    (20) Да, в окне результат отбора — нажать правую клавишу мыши — выбираем «вывести список»

    выводим в табличный документ и затем через файл-сохранить как — выбираем внизу окна формат Excel и сохраняем уже в Эксель

    PS

    Не забываем про кнопку Видимость колонок, она позволяет показать недостающие (скрытые колонки)

    Reply

Leave a Comment

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