Некоторые особенности БП 3.0




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

11 Comments

  1. krein

    Вместо использования обработки из БСП еще как вариант можно просто в конфигураторе в «Сервис — Параметры»

    на закладке «Запуск 1с:Предприятия» «Параметр запуска» установить = ЗапуститьОбновлениеИнформационнойБазы

    и запустить отладку

    Или сделать ярлык либо в командной строке запустить 1с с праметром /с ЗапуститьОбновлениеИнформационнойБазы

    (тут надо обратить внимание, что в «/c» с- это английская буква, т.к. если скопировать из описания 1с — она почему-то оказывается русской и не очень очевидно в чем проблема при запуске)

    Способы не новые и все их можно найти в интернете,

    т.к. проблема частая и проявляется в том числе при добавлении многих объектов метаданных — например нового документа…

    Reply
  2. scape

    С начала этого года пытались с клиентом перейти на 3.0, обновив 2.0. Исходная конфигурация содержит много доработок. При помощи бубна удалось обновить конфигурацию. Но, что характерно, 1с обошла несовместимость алгоритмов проведения, просто установив флажок ручной корректировки проводок в некоторых документах. Эксперимент показал, что если снять флажок и перепровести документ, получим не тот результат который был до проведения. Клиента такой вариант не устроил, со следующего года переходит на 3.0 через остатки. Другие клиенты высказали такое же мнение.

    Reply
  3. Трофимов_Николай

    В начале года пытались также перейти С БП 2.0 на БП 3.0. через обновление конфигурации.Столкнулись с низкой производительностью конфигурации+несовместимость некоторых алгоритмов по ЗП.Решено с 2015 переходить с перенесением остатков в чистую конфигурацию.

    Reply
  4. Puk2

    Обновили 3 базы, одна из них была с «криводоработками», к которым бухи привыкли. Обновились с 2.0 до 3.0 среди года. 2 конфы почти типовые, их бухгалтеры вроде как вообще довольны. Встречаются документы с ручной корректировкой, но проанализировав не увидел ничего страшного, перепроведение, как правило, даёт тот же результат после переноса кода из старой версии. Да и так бухгалтерскую операцию и корректировку проводок часто используют, за что руки готов побить тому, кто их к этому приучил, поэтому сравнил ОСВ в двух базах и вперёд, т.к. расхождений не было.

    Reply
  5. Puk2

    кстати, теперь финансисты подключаются к базам филиалам напрямую, без всяких РИБов, которые меня задолбали совсем не радовали. Скорость отличная через тонкого клиента!

    Reply
  6. Puk2
    Ставите БСП, сохраняете обработку, как внешнюю и запускаете.

    Не знаю как раньше, но выпуски этого года хранят внешние обработки в папках шаблонов конфигураций по адресу %AppData%1C1cv8 mplts1cSSL2_2_3_41ExtFilesИнструмент­ы разработчика

    Reply
  7. hazd

    тоже предстоит перевод с БП 2.0 на БП 3.0((, возьму на заметку

    Reply
  8. Stim213

    мда.. описание в целом полезное, но часть информации из серии «не знаю зачем, но нажимайте эту желтую кнопку»

    «Оказывается, в БП 3.0.24.9 есть справочник «Идентификатор объектов метаданных», в котором присутствует описание метаданных конфигрурации. В ряде ситуаций конфигурация требует, чтобы новые объекты присутствовали в этом справочнике. Зачем? Вопрос опять же риторический. А потому что!»

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

    В профиле должны указываться роли(в табличной части элемента). Но так как сами роли как метаданные не представлены в пользовательском режиме и вообще недоступны как ссылки на объекты — сделали такой справочник, в котором хранят идентификаторы объектов МД. Справочник чисто служебный, недоступный для ручного изменения.

    Обновление или спец обработку запускать не обязательно, достаточно выполнить экспортную функцию:

    Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(ИСТИНА,ЛОЖЬ,ЛОЖЬ);//ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка

    Если вы добавили новую роль, то помимо обновления вышеуказанного справочника необходимо еще и обновить значение константы ПараметрыРаботыПользователей. Константа содержит в себе структуру связей ролей и профилей. Через неё работает обратная связь, когда вы в реж Предприятия назначаете пользователю профиль групп пользователя, а пользователю ИБ назначаются роли этого профиля.

    Обновить значения константы можно так:

    Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();

    И когда назначаете профили пользователям — создаются элементы спр ГруппыДоступа, в которых и хранятся связки пользователь-профиль

    про программную работу с доступом и правами можно почитать в http://infostart.ru/public/300363/

    Оформление потом допилю)

    Reply
  9. Душечка

    Огромное спасибо за статью. Очень приятно, когда люди делятся своим опытом. Я не программист, поэтому рада любой помощи, любому совету. Моя розовая мечта, создать с нуля внешнюю печатную форму, а не качать с инфостарта. Буду пытаться с Вашей помощью осуществить свою мечту.

    Reply
  10. kosmonavtka

    Огромное спасибо за статью! Очень актуально сейчас.

    Reply
  11. prestige

    Спасибо

    Reply

Leave a Comment

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