Чтение группировок табличного документа




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

22 Comments

  1. json

    Есть замечания к оформлению кода:

    1. Процедуры и функции более верхнего уровня обычно располагаются выше, а используемые в них — под ними. Это логично и проще воспринимается. В вашем случае экспортная функция является методом более верхнего уровня и должна быть первой, а все неэкспортные под ней. (см. рекомендации по оформлению кода «Чистый код» Р.Мартин, либо можно открыть практически любой модуль в типовой конфигурации, и увидеть, что сначала идет секция ПрограммныйИнтерфейс, потом СлужебныйПрограммныйИнтерфейс и лишь в конце СлужебныеПроцедурыИФункции)

    2. Также полезно было бы ознакомиться с рекомендациями образования имен переменных на диске ИТС (http://its.1c.ru/db/v8std#content:2149184103:hdoc). См. пункт 2 Пример некорректных имен переменных

    3. Неужели так трудно давать переменным имена без сокращений? (Например в публикации на текущий момент вижу такие имена: мстро, рВетка, стро, знч) Я бы не хотел оказаться на месте разработчиков, которым придется поддерживать такое в продакшене!

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

    Reply
  2. Yashazz

    (1) yurii_host, вы далеко не первый, кто мне это говорит)))

    1. Расскажите это разработчикам типовых конфигураций)

    2. Имена промежуточных и вспомогательных переменных не обязательно должны быть говорящими. Классический код на общепринятых языках программирования спокойно рассматривает «i» «j» «k» в качестве итераторов. Так что не довод) Опять же, сравните стандарты 1С и реальный код 1С, посмеётесь. И, думаете, я, автор тиражных решений, не знаю эти стандарты?))

    3. См.п2, понять и так можно, и это несложно.

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

    По делу есть замечания?

    Reply
  3. json

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

    2. Если вам часто это говорили, то может быть стоит к ним прислушаться? Ведь наверное не новички вам такое говорили? А вы сами пытались задуматься, почему требования именно такие? Может быть в них действительно есть разумное зерно?

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

    «Весь хороший код одинаков, кривой код — крив по-своему.»

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

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

    4. Понять — да можно. Доработать в продуктиве такой код — скорее всего нет.

    5. Неужели вы считаете так часто ваш код кто-то копирайтит?

    6. Выкладываете код — значит отвечаете за него. Это по делу. Если он нечитаемый — какие-то ошибки в нем визуально найти очень сложно. Приведите сначала в читаемый вид, а потом будут вам замечания «по делу»

    Reply
  4. Yashazz

    1. УТ 11.2 нескольких первых поколений. Многие места в БСП от лета прошлого года (релиз не помню).

    2. Может быть)

    3. Найдёте кривизну кода — приму с удовольствием и постараюсь исправить. Если это решение не интересное и не простое — обоснуйте. Если этот алгоритм некрасив — укажите, в чём)

    4. Не согласен.

    5. Были прецеденты, в т.ч. на ИС, были))

    6. Если такой код лично для Вас нечитаемый — радуйтесь, что не работали на Паскале или PL, а уж тем паче на Фортране) Ну и что не работаете на Java, например. Переменная «е» привела бы Вас в негодование)))

    Reply
  5. Yashazz

    Я уж молчу про гнуснейшую манеру называть переменные зарезервированными именами и ключевыми словами, которая, имхо, гораздо более вредна и опасна. Но нет, написать БлокировкаДанных=Новый БлокировкаДанных — это нормально. А назвать рБлокировка, чтобы не огрести щастья в некоторых релизах (как, например, 8.3.7) — это низя, это нихарашё. Ну, кому эстетика, а кому прагматика.

    Reply
  6. vikad

    http://infostart.ru/public/182115/ здесь упоминалось

    Reply
  7. Yashazz

    (6) vikad, ага, проблема упоминалась. Решение — нет. Я не уверен, что фиксин, при всех его понтах навроде «был найден хитрый трюк», делал именно так. Я предложенный вариант хитрым трюком бы не назвал бы))

    Reply
  8. Dementor

    Код как я вижу имеет смысл для MXL полученного со стороны, в котором сделали группировки не отступами, а с помощью НачатьГруппуСтрок(). Очевидно, что для своего MXL, который делается на коленке намного проще самостоятельно оставить «хлебные крошки», что бы потом героически не парсить результат.

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

    Reply
  9. Dementor

    (3) yurii_host, ваши слова — прямо танец по моим больным мозолям. В последнюю неделю помогал навести порядок в конфигурации, где в реализацию к типовым Количество и Количество мест добавили реквизиты — Колво, Колмест, Кмест (и еще парочку сокращений, которые не имели отношения к количествам). Прежде чем вообще начинать что-либо делать нужно было пройти квест «угадай что это и зачем его сюда влепили» с беганьем по интерфейсу формы и анализом доработок в проведении документа. А что бы работа была не скучной, предыдущий разработчик удалил конфигурацию поставщика и затер в свойствах версию конфигурации — видимо это элемент фирменного стиля 🙂

    Reply
  10. json
    Reply
  11. shard

    (1) yurii_host, не скажу за Корума, но поясню свое мнение:

    1) ссылки на закрытые форумы и статьи выглядят неуважительно по отношению к не имеющим подписку ИТС.

    2) требование размещать функции по порядку напомнило одного «специалиста» одной весьма крупной структуры, связанной с оказанием услуг в финансовой сфере, который высказывал весьма громкое «фи» касательно отсутствия пробелов в коде (при этом согласно рекомендациям пробелы отсутствовали только между // и текстом комментария), но незнакомого с иерархией элементов справочника.

    Reply
  12. json

    (11) shard, Ваша претензия по поводу ссылок на ИТС — абсолютно справедлива. Я этот нюанс выпустил из вида.

    Но к сожалению, 1С не выкладывает их в общий доступ, а копировать полный текст и выкладывать на общем ресурсе — нарушение авторских прав.

    Лично у меня не всегда есть доступ к сайту 1С. Поэтому основные разделы я себе скопировал и обращаюсь к ним периодически, независимо от наличия доступа. При этом разумеется, что на общедоступных ресурсах я это не выкладываю.

    По моему скромному мнению, рекомендации формулируют требования, продиктованные здравым смыслом. В них другими словами перечислены основные моменты, которые описаны и в других книгах по написанию кода. Для тех, у кого нет доступа на ИТС, я бы рекомендовал прочитать книгу, упомянутую в первом посте. По моему мнению (и не только по моему) в ней собраны самые основные правила по построению читаемого кода, при этом автор приводит вполне убедительные аргументы. Эта книжка — меняет программистов, я наблюдал это примере своих коллег. При этом рекомендации, описанные в ней согласуются с рекомендациями, описанными в «Системе стандартов и методик…»

    По поводу порядка процедур, рекомендация тоже взята тоже из книги «Чистый код». И как я привел пример, подтверждается построением кода в типовых, хотя на ИТС явно такое требование не описано. Такое расположение процедур удобно, т.к. человек привык читать код сверху вниз. Поэтому он ожидает сначала увидеть общую картину, а затем детали этой картины (при необходимости) т.е. по принципу декомпозиции. Поэтому логичнее сначала располагать процедуры более верхнего уровня, а под ними вложенные в них. Но Ваше право не соглашаться с таким подходом.

    В любом случае благодарю за конструктивную обратную связь!

    Reply
  13. Yashazz

    (9) За такие имена реквизитов действительно надо убивать, согласен. Но, повторюсь, вспомогательные служебные переменные совершенно не требуют нотации в духе ЭлементМассиваИзСтруктурыСоответствийГдеХранятсяДанныеДляОбр­аботки. Ну вот совсем это лишнее. Меру знать надо. Давеча тоже копался в конфе с реквизитами вроде «СпВопОтнос».

    Комментарии — вещь строго обязательная, каковые и делаю)

    А любителям говорить об уважении к, могу посоветовать посмотреть на БП 3.0 — я не знаю, как надо соблюдать чистоту разработки и испытывать уважение к тем, кто будет потом иметь с ней дело, если даже реквизиты в документах по алфавиту не отсортированы. Ломайте глаза, господа. Так? Никто не хочет пару баллонов на Фогеля накатить?

    Reply
  14. Vasja-k
    Reply
  15. WKBAPKA

    Автору респект. Для одной своей задачи сушил голову, как… спасибо

    Reply
  16. WKBAPKA

    Реально выручил… спасибо)

    Reply
  17. ABIZYAEV

    Спасибо!

    Reply
  18. andryandry

    (14) Вот это годный код! А комментаторам «по поводу именования переменных» не так как им нравится — для вас в аду отдельный котел ?

    Reply
  19. BenGunn

    (1) Меня все чаще и чаще стал удивлять подход я-ля критиков к чужой работе: вместо того, чтобы оценить новизну решения задачи, они пытаются искать субъективные причины, чтобы занизить профессиональные качества кодера. А, собственно, зачем это надо и кому? Не нравится стиль написания кода — перепиши под себя. Все просто, как мычание коровы

    Reply
  20. PLAstic

    (11) (12) Позволю себе в корне не согласиться. Если человек называет себя программистом, то он обязан иметь доступ к ИТС.

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

    Да и невозможно поддерживать свой уровень без доступа к документации.

    Reply
  21. shard

    (20) про фри Вы благополучно забыли. Из Вашего утверждения можно сделать вывод что программисты — это либо фра, либо фикс; остальные — унтерменши.

    К тоже же сильно бросаются в глаза штампы «надо поддерживать используемые продукты 1С», «обязан иметь доступ к ИТС» (по сути — «обязан платить налог 1с»), штамп «стоит…не так дорого» (по сути — «ну купите, что вам стоит, или совсем нищеброды?»). Отвечу: если доступ к документации «не так дорог», тогда может это 1с его открыть надо?

    Про невозможность поддерживать уровень без доступа к документации — истина, но как много Вы можете назвать контор не ИТ-профиля, которые могут выделить время программиста/сисадмина на повышение квалификации? Не знаю ни одной, в лучшем случае — «можешь взять отгул без сохранения», но обычно: «лучше иди квартал Мариванне закрой, или Танечке поступления вбей. Кстати ты уже сделал систему прогнозирования курса доллара, которую мы тебя уже с начала года просим?».

    Reply
  22. PLAstic

    (21) Фри я не забыл, это не программист по моей терминологии. 🙂 Далее в своём посте вы соглашаетесь, что уровень поддерживать нельзя без доступа к свежим обновлениям, к БСП и метод.материалам. Значит, это простой любитель.

    Про ИТС можно сколько угодно спорить и взывать кому что надо сделать, но «собака лает, караван идёт» — вы ничего не измените. И я тоже когда-то называл ИТС налогом 1С. Если говорить беспристрастно, у вас должна быть подписка ИТС, если вы считает себя программистом.

    Всё, что выкладывается на ресурсах, включая ИС — это добрая воля авторов, поэтому притязать на «неуважительно по отношению к не имеющим подписку ИТС» — ну, это сродни «вы должны мне всё выложить здесь и сейчас, т.к. я не хочу/не могу купить подписку ИТС». Вам никто ничего не должен. Есть регламентированный фирмой 1С информационный ресурс и ссылки на него, наоборот, должны приветствоваться для желающих пруфов или расширения представленных в статьях со ссылками знаний.

    Про обучение — это ваш личный выбор. Не пускают на работе даже за свой счёт? Зачем вам такая работа? Я каждые 5 лет хожу за свой счёт на пачку курсов просто чтобы быть в теме, что появилось нового.

    Reply

Leave a Comment

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