Инструкция по оформлению папок 1С




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

28 Comments

  1. Armando
    нужно восстановить архив а вы опять же не знаете где они хранятся

    Для это специалист должен заполнять сервисный лист, где указывается куда сохранены резервные копии. Хотя статья не об этом.

    По теме статьи могу сказать, что я бы не стал в названии папок вперемешку использовать латиницу и кириллицу. И опять же одна папка называется «1S_Base7» (слово «база» переведено а английский, хотя стоило бы использовать множественную форму «bases»), а другая папка называется «1S_Обновления», тут уже по русски.

    Данный «стандарт» определенно рекомендован к доработке. Я бы не стал его использовать в данном виде.

    Наименование архивов рекомендуется задавать следующие:

    — 1Cv8_251012_БГУ – сперва стандартное заполнение 1С, далее пишем дату архива и в конце наименование конфигурации.

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

    Reply
  2. rasdag

    По поводу нескольких бэкапов, то никто не мешает в конце, после названия архива, добавить «_1» и «_2» и т.д. А по остальным притензиям — с таким же успехом можно и к фиговому листу придраться! Тем более это всего лишь рекомендация, главная идея у которого состоит в том, что компаниям нужно унифицировать поход к этому вопросу. А уж конкретные формы и методы реализации пусть разрабатывают сами, если не нравится моя реализация!

    Reply
  3. Cujoko

    Разделять базы на 7.7 и 8 не имеет смысла, если в имени каталога базы используется префикс, обозначающий конфигурацию: «Бух» — бухгалтерия 7.7, «БП_2.0» — бухгалтерия предприятия 8, ред. 2.0 и т. п.

    Имена архивов вида «1Cv8_251012_БГУ» чудовищно неудобны. Даты в именах файлов следует задавать в виде «YY-MM-DD». Пример — «УТ_10.3 Вектор 13-10-27»: при сортировке по имени файлы естественным образом сортируются ещё и по дням. Если необходимо, в конце также можно добавлять время — «УТ_10.3 Вектор 13-10-31 14-01», — и прочие суффиксы.

    Reply
  4. echo77

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

    Оформив публикацию в таком виде вам не дадут $m за то что она есть

    Reply
  5. TrashMaster

    «1S_Архив» это фатально;

    за «1S_Шаблоны» при коллективной разработке можно просто огрести;

    на скриншоте все и так находится в папке 1C, к чему повсюду 1S_ 1Cv8_, понимаю, что кто как хочет так и фигачит, но с чем можно перепутать?

    Reply
  6. Vextel

    Мда… а я думал только я этим заморачиваюсь)))

    У меня так же идёт разделение по папкам, только названия все по английски: 1CBase, 1CTemplate, 1CBackup.

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

    Reply
  7. h00k

    (0) Ну у вас и каша в структуре хранения.

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

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

    Вот пример организации для разработчика:

    D:Базы данных\r
    
    D:Базы данныхДемо базы\r
    D:Базы данныхДемо базыAccounting_3.0_Demo\r
    D:Базы данныхДемо базыHRM_3.0_Demo
    D:Базы данныхДемо базыRetail_2.0_Demo\r
    D:Базы данныхДемо базыTrade_11.1_Demo\r
    
    D:Базы данныхРазработкаОрганизация 1\r
    D:Базы данныхРазработкаОрганизация 1Accounting\r
    D:Базы данныхРазработкаОрганизация 1Trade\r
    D:Базы данныхРазработкаОрганизация 1Выгрузки\r
    D:Базы данныхРазработкаОрганизация 1Поставки\r
    D:Базы данныхРазработкаОрганизация 1Хранилище\r
    
    D:Базы данныхРазработкаОрганизация 2\r
    D:Базы данныхРазработкаОрганизация 2Accounting\r
    D:Базы данныхРазработкаОрганизация 2Trade\r
    D:Базы данныхРазработкаОрганизация 2Retail\r
    D:Базы данныхРазработкаОрганизация 2Выгрузки\r
    D:Базы данныхРазработкаОрганизация 2Обмен\r
    D:Базы данныхРазработкаОрганизация 2Поставки\r
    D:Базы данныхРазработкаОрганизация 2Хранилище\r
    
    D:Базы данныхШаблоны\r
    D:Базы данныхШаблоны1С\r
    D:Базы данныхШаблоныRarus\r
    D:Базы данныхШаблоныBiT\r
    

    Показать

    Демонстрационные базы с оригинальными конфигурациями актуальных релизов рекомендую устанавливать всегда.

    Ну с папкой шаблоны и так все понятно.

    В каком бы режиме ваши клиенты не работали с 1С: Предприятие — архивные копии должны хранится на другом сервере/компьютере.

    Дату в именах архивных копий лучше задавать в общепринятом формате ГГГГ.ММ.ДД или ГГ.ММ.ДД, например я использую такой формат:

    ГГГГ.ММ.ДД-Организация-Конфигурация

    Reply
  8. mikmike

    Тема нужная, но статья сырая — надо было получше все продумать.

    Например: не заводить в корне диска D: кучу каталогов 1S_… а создать один — 1S и уже все остальное складывать туда, тогда идея легко адаптируется к компьютерам у которых диска D: нет вообще.

    Еще один минус в разноязычии названия каталогов — если будете настраивать резервное копирование с помощью bat файлов нужно следить за кодировкой русских букв. Желательно избегать названий в которых кодировка не понятна: 1С -английская и 1C — русская.

    Reply
  9. mikmike

    (9) h00k, про subst в принципе знаю, но никогда не пользовался — потому рекомендовать не могу.

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

    И вообще чем проще — тем лучше. Хотя «проще» у меня и у рядового юзера часто различаются. Например: самое простое для пользователя — все валить на рабочий стол.

    Reply
  10. h00k

    (10) раньше была мега полезная команда, когда всякие банк-клиенты требовали дискеты с ключами.

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

    Например, для создания виртуального диска Д из папки Мои документы пользователя Администратор ключи команды будут выглядеть так:

    Subst D: «C:Documents and SettingsАдминистраторМои документы»
    
    Reply
  11. mr.Kot

    Дату архива пишут обычно не так «1Cv8_251012_БГУ», а цифры пишут наоборот: сначала год, потом месяц, потом день: 121025

    Таким образом сортировка будет правильная и видно хронологию

    Reply
  12. OBEH

    (12) mr.Kot, «Таким образом сортировка будет правильная и видно хронологию»

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

    Reply
  13. Fenicss

    Вопрос а не проще ли поделить папки

    d

    1c_bases

    7.7

    work

    ТИС

    Бух

    arhive

    test

    8.X

    work

    УТ

    Розница

    arhive

    test

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

    Reply
  14. ALev

    Что-то так и тянет программистов ещё с DOS-времён задействовать латинский алфавит в наименованиях папок.

    Windows уже давно позволяет создавать русские имена, но знаки подчёркивания, отсутствие пробелов, латиница — всё ещё в ходу. Есть предложение осваивать русское именование папок/файлов с наиболее логичным их обозначением.

    Reply
  15. Gadzi

    Меня одного напрягла надпись «1С» как «1S» ???

    Reply
  16. Garstag

    (16) Gadzi, я тоже привык писать «1C».

    🙂

    Reply
  17. DAnry

    М-да, сыровато…

    Reply
  18. f0min

    (15) ALev,

    Вполне возможна ситуация что ОС упадет и нужные файлы придется копировать с помощью командной строки или загрузившись с дискеты

    Reply
  19. ALev

    Я использую всегда только русские имена. Латиницу задействую в основном только для DOS-программ/утилит, и ОС не падает…

    Reply
  20. rus128

    (19) загружаться с дискеты? загрузочные флешки уже отменили? 🙂

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

    Reply
  21. h00k

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

    Если есть CD/DVD привод, то загрузится можно с какого нибудь дистрибутива LiveCD, например CentOS или Ubuntu, кому что нравится.

    На моем новом сервере dvd вообще нет, зато есть usb-флэшка на все случаи жизни (инсталятор Windows 2012 R2 + инсталятор CentOS 6.4 + набор для восстановления системы).

    Reply
  22. h00k

    (21) Вы внимательно читали сообщения?! Или так, лишь бы написать?

    Что делает данная команда я прекрасно знаю.

    Я написал простое решение для рабочих станций у которых диска «D:» нет, а установка еще одного физического диска, или логического, по каким либо причинам не возможна.

    В случае повреждения файловой системы отдельного диска «D:» он тоже будет не читабельным.

    Правда дополнительный диск можно в ReFS отформатировать, эта файловая система надежней чем NTFS, но такая возможность есть только у пользователей новых версий Windows…

    Reply
  23. rus128

    (23) «Я написал простое решение для рабочих станций у которых диска «D:» нет, а установка еще одного физического диска, или логического, по каким либо причинам не возможна. »

    1) по каким причинам может быть невозможно создание логического диска?

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

    Reply
  24. h00k

    (24)

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

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

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

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

    Reply
  25. f0min

    (21) rus128,

    Еще Live CD бывают. Речь была о загрузке MS DOS.

    ReFS еще не видел ни у одного клиента.

    Reply
  26. rus128

    (26) на моей загрузочной флешке есть несколько образов загрузочных записей, в том числе — ДОС с Нортоном и Викторией. При желании можно даже Линукс на нее положить 🙂

    Reply
  27. h00k

    (26)ReFS появилась начиная с Виндовз Сервер 2012.

    Большинство предпочитает ставить «проверенные» 2008R2.

    И еще пара моментов:

    1. Системный раздел не может быть отформатирован в ReFS.

    2. Файл подкачки нельзя разместить на разделе отформатированном в ReFS.

    Reply
  28. dock

    Классная такая статья… для совсем уж новичков…

    Reply

Leave a Comment

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