Возвращение к старому или развитие по спирали! (платформа 8.2.14, общий реквизит)




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

    Не так давно перед нами поставилм задачу: для каждого документа в конфигурации «бухгалтерия предприятия 2.0» необходимо добавить некий реквизит «Х». C первого взгляда задача не очень сложна, но изменять каждый документ конфигурации как то не сильно хотелось по следующим причинам:

    Перейти к публикации

    Reply
  2. alexk-is
    Дело в том, что на данный момент сообщество 1С (по крайней мере некоторая его часть) с нетерпением ожидает выхода новой редакции платформы 1С предприятие 8.2.14…

    Хм. Очень интересно. Вообще-то вышло уже 3 официальных сборки версии 8.2.14.х (519, 528, 533).

    Reply
  3. Поручик

    (1) Статья написана 17-06-2011 17:09, автор только сейчас решил сюда запостить. Видно захотелось что-то скачать, а писать тупые комменты нет желания.

    Reply
  4. boffart

    Статья писалась в середине лета ), актуализировал, спасибо!

    Reply
  5. Арчибальд

    Скоро в восьмерке тоже будет все, как в семерке :))

    Reply
  6. cerg110

    очень удобно))

    Reply
  7. fishca
    (подробнее можно ознакомиться в документации, доступной на сайте http://v8.1c.ru/buhv8/«.

    может надо подправить так:

    (подробнее можно ознакомиться в документации, доступной на сайте http://v8.1c.ru/overview/release_8_2_14/ ?

    Reply
  8. artbear

    (0) 1 .Автору хорошо бы все-таки привести официальные комментарии Нуралиева по поводу использования общих реквизитов — типа не рекомендуется их юзать как раз для решения общей задачи.

    2. Привел бы пример использования подобных общих реквизитов в запросах и/или объектной модели.

    Reply
  9. i132

    С общим реквизитом можно делать более интересные вещи -если использовать его для разделения данных,

    например можно создавать два разных элемента справочника с разными общими реквизитами разделения, но одинаковыми UUID, ввобще можно работать будо в в одном 1CD две базы, с полностью совпадающими конфигурациями

    Правда в ошибках последнего релиза сказанно:

    10085888 Разделитель ссылочного типа

    Проблема:

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

    Из текущего сеанса недопустимо использовать указанные значения разделителей

    если значение разделителя не задано (принимает значение по умолчанию).

    Дата публикации: 2011-09-01

    Reply
  10. cdb

    Лично мне идея с использованием «установка заголовка формы» понравилась. Большое спасибо за идею.

    Reply
  11. mtv:)

    Поставил плюс за подсказку на счет использования функции «УстановитьЗаголовокФормыДокумента» общего модуля «РаботаСДиалогами». Хорошая идея. Пригодится…

    Reply
  12. Abadonna

    (10) Во-во! Как раз думал как с наименьшими трудозатратами на форму впихнуть общий реквизит, а оно тут как тут 😉

    Тоже плюс

    Reply
  13. ildarovich

    Попытаюсь развить мысль (7): разработчики предполагали использование общего реквизита совсем для других целей и поэтому не рекомендовали его использовать так, как описано в статье. Для чего же тогда нужен общий реквизит? Вот для чего:

    Если просмотреть содержимое баз у десятков тысяч разных пользователей, мы увидим колоссальное дублирование информации: дублируются метаданные, регламентированная отчетность, справочники и регистры сведений валют, адресные классификаторы, классификаторы единиц измерения, профессий, да и много еще чего, даже справочники номенклатуры и контрагентов при желании можно записать в этот ряд. Думаю, во многих случаях, собственные данные пользователя занимают небольшой процент от всего размера базы. На подходе «облака» и появляется возможность сэкономить, устранить дублирование, загрузив данные разных пользователей в одну базу и дав им возможность использовать общие таблицы и метаданные. Как же адресовать данные конкретного пользователя в этой базе? — Тут и будет использоваться общий реквизит.

    То есть общие реквизиты дают платформе возможности «Multi-tenancy», которых ей не хватало для облаков. В БП3 это будет использоваться именно так!

    Ну а забивать гвозди логарифмической линейкой? — На здоровье! — Но я бы использовал свойства.

    Reply
  14. Angeros

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

    Но и 13ая по стабильности уступает 8.1.15.

    Reply
  15. irishka77

    Согласна. Последняя бухия вышла «только по 13 релизом». Но новые возможности беру на заметку. Автору спасибо.

    Reply
  16. ildarovich

    (12) Минус поставил, выступив в роли персонажа из «Джентльмены удачи»: — «Ты туда не ходи! — Сюда ходи! — А то снег башка попадет — совсем мертвый будешь!».

    Однако последующие плюсы еще раз показывают, что у нас единственный запрещающий знак — это большой бетонный блок посреди дороги (.

    Reply
  17. Abadonna

    (12)

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

    А если так: надо поставить признак «не переносить» в любом доке для перегрузки в другую базу. Не нравится

    бухам (хоть убейся!) работать с псевдожурналом, который потом прописывает свойство в соотв. регистр.

    «ХАЧУ СРАЗУ крыжик ставить!!!!».

    И как тут обойтись без общего реквизита, программно вставленного в форму документа?

    Reply
  18. a1ex.5k

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

    1. по максимуму все изменения добавляем при открытии формы

    2. лучше использовать стандартную процедуру «ИзменитьПредставлениеКнопкиВыбораСвойств». Она вызывается почти из всех форм справочников и документов.

    3. для стандартных отчетов (например в бухгалтерии) можно задействовать процедуру «ЗаполнитьТаблицуЭлементов». Вызывается при открытии стандартных отчетов.

    4. В общих процедурах («ИзменитьПредставлениеКнопкиВыбораСвойств» и «ЗаполнитьТаблицуЭлементов») вставляем одну строку, ссылку на свою процедуру (МойОбщийМодуль.ДействияПриОткрытииОтчетов и МойОбщийМодуль.ДействияПриОткрытииОбъектов) в добавленном общем модуле.

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

    ЗЫ: возможно для кого-то будет удобнее использовать другие процедуры, например процедура вставки пункта меню в объекте по редактированию номера/кода

    ЗЫЫ: идея использовать общие процедуры появилось у меня давно, когда появились подписки на события, но в них не оказалось подписки ПриОткрытииОбъекта

    Reply
  19. jacksonp

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

    Reply
  20. a1ex.5k

    (18) Не всегда удобно пользоваться дополнительными реквизитами. Зависит от конкретной задачи.

    Reply
  21. Соня

    Очень удобно. Так же чудесные горизонты открываются при установлении в бухгалтерии(БАЗОВОЙ) дополнительного реквизита, потом делаешь внешнюю печатную форму, на неё из регистра выводишь нужные значения. Красота. И конфигурация не меняется, и править можно.

    Reply
  22. dkprim

    полезная статья — кратко и по делу. хотя, к сожалению, не возникало потребности применить механизм общих реквизитов в своей практике 🙁

    Reply
  23. Seregalink

    Спасибо, очень полезная статья.

    Reply
  24. Abadonna

    (18)

    В бухгалтерии 2.0 есть у каждого документа Дополнительные реквизиты

    Ну и фигли? А в КА есть дополнительные свойства, а вот в Подрядчик строительства 1.6 — нет ни того, ни другого.

    Reply
  25. i132

    Еще отличе общих реквизитов от 7.7: У общих реквизитов есть большой недостаток -их нельзя указать в качестве графы журнала документа, нельзя использовать как критерий отбора.

    Reply

Leave a Comment

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