<?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='\
чем отличается отhttp://v8.1c.ru/o7/201408str/index.htm ?
Так это и так понятно. Платформу как раз и обновляют чтобы использовать новые функции…
Что мешает использовать СистемнаяИнформация.ВерсияПриложения?
(2) Xershi, Только не всегда в организациях следят за обновлением платформы.
Когда пишешь для «чужих» тогда нужно либо обязать их перейти на новую платформу, либо использовать старые механизмы работы.
(3) AlexanderKai,
Когда пишете на «своих» конфигурациях, тогда можно делать что душе угодно, но когда разработка идет в «чужую» конфигурацию — стоит задуматься каким путем пойти:
1) Использовать новые функции и обязать заказчика перейти на свежую платформу
2) Сделать проверку текущей версии платформы и использовать новые функции и старые механизмы работы
3) Использовать только старые механизмы работы
По первому пункту — как повезет, не всегда заказчик будет гореть желанием перейти на новую платформу по своим причинам и отговоркам коих найдется не один десяток.
По второму — идеальный вариант, но не каждый разработчик будет перед каждым вызовом новой функции строить городульки чтобы узнать версию платформы. Хотя данный вариант имеет право на жизнь.
И по третьему — самый оптимальный (мое субъективное мнение) гораздо проще второго варианта, но уступает первому в том что не помогает продвижению новых платформ в массы
Так много старания это всё написать и так мало пользы.
Выскажите свое мнение каким образом лучше поступить при работе со строками во время разработки.
Я правильно понял смысл публикации — рассказать всему миру, что функции, появившиеся в новом релизе, не будут работать в старом релизе, потому что есть только в новом релизе?
Познавательная статья — теперь я знаю, что Капитана Очевидность зовут Денис.
Не забываем ставить плюсики… =)
Нам со стороны разрабатывали подсистему приема бюджетных обязательств по отыгранным тендерам и запросам котировок цен для БГУ 1.0 и нарукожопили с использованием новых функций.
(3) AlexanderKai, этот вариант не работает. Ругается на то что данной функции вообще нет.(7)
denis_aka_wolf, статью поправь, второй вариант не рабочий.
Самые интересные — СтрРазделить(), СтрСоединить()
(10) mitya-paramonov,
Если добавишь строчку
СистемнаяИнформация = Новый СистемнаяИнформация;
то заработает.
(13) AlexanderKai,
Такой код все равно работать не будет!
(11) slazzy, Спасибо, добавлю в статью сегодня вечером.
(10) mitya-paramonov, Спасибо, поправлю.
а где описания про другие новые функции? пример: ПолучитьИсполняемуюСхемуКомпоновкиДанных() и т.д.)))))
(16) seermak, Это метод а не функция
(16)исправлено: …..другие методы и функции……
(17) это и то и другое. Сбоите, кэп.
(7) все очень просто — создаете глобальную функцию с такими же названиями и используете ее, если у человека новая платформа — то ему достаточно заккоментить эту функцию. Как бы проблем нет.
Небольшое уточнение:
«Сообщить(СтрСравнить(«Первая строка», «Вторая строка»)); //вернет Истина»
вернет не «Истина», а «1»
(21) eech, Исправил, спасибо.
О чем статья?
удалено
Кто-нибудь еще заметил, как работают табличные части с несколькими «этажами» (несколько реквизитов в группе) в 8.3.6 — полный косяк !!! Как живут с этим многомилионные пользователи 1С ?
(14) а если использовать Вычислить(), то все заработает
(0) Вообще статью можно было бы свести к одной фразе — при разработке чего-либо (конфигурации, подсистемы, отчета, обработки) для неопределенного заказчика/клиента/покупателя необходимо учитывать возможные варианты использования у них различных версий платформы, режимов совместимости с версиями и интерфейсом, использования модальности и синхронных вызовов. И это будет более полно, чем вся публикация.
глупая статья. все это написано в релизе 1С
и нужно быть совсем недалеким, чтобы это не осознавать
Проверил вчера на релизе 8.3.6.2041.
Эти новые функции есть в Синтакс-помощнике, но при попытке их использовать выдается ошибка «Процедура или функция с указанным именем не определена …».
ошибка пропадет, если снять режим совместимости
(0)
СтрРазделить
Показать
СтрСоединить
P.S.: новые функции конечно гораздо удобнее. Спасибо за обзор — ведь сюда «лазишь» чаще чем в Зазеркалье 😉
(31) Nuuq, ваша СтрСоединить выдаст лишнюю запятую в конце.
— сравнение производительности функции СтрШаблон по сравнению с СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку
В циклах лучше не использовать. Подозреваю, что остальные функции такие же быстрые 🙁
(33) Zahary, по вашему замеру получается, что собрать строку простым сложением прямо на месте втрое дольше, чем вызвать функцию модуля с десятью параметрами и собрать в ней ту же самую строку (код функции я не смотрел, но он, очевидно, посложнее простой конкатенации строк).
Не верю.
В замере производительности есть флажок «Включать для функций время выполнения» — вы его ставили?
(11) slazzy, аналога СтрНайти нет
(20) DitriX, Всё так кроме : СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)
Системное перечисление НаправлениеПоиска в режиме совместимости отсутствует.
Не являюсь программистом в 1С, занимаюсь в основном обеспечением работоспособности существующих систем, но временами приходится залезать в код клиентских конфигураций. И буквально на днях возникла необходимость добавить разбор массива, поступающего в web-сервис. Первая мысль — найти аналог explode (php)… в справке нашёл, но на клиентской конфигурации оно не работает (как я понял, из-за режима совместимости). Спасибо (31) — направил на решение. В итоге в обработке появилась функция:
Показать
Вроде работает. Поправьте, если где накосячил.
(36) Erne100, А может быть встречал кто функцию с такими же возможностями, как эта новая СтрНайти() ? Ведь порой надо искать именно с конца, и удобно было бы использовать в режимах совместимости аналогичную функцию, хотя бы с первыми тремя параметрами… Народ бы сказал за такую функцию Спасибо!
Я тут на скорую руку накидал. Вроде все работает, но особо не тестил. Все параметры такие же как и в СтрНайти. Единственное, надо глобально заменить НаправлениеПоиска.СКонца НаправлениеПоиска.СНачала на «СКонца» и «СНачала» соответственно.
Показать
(39) Константин, большое спасибо!
Да уж, платформа 8.3.9.1818, а бяда та же.
Почему эти функции не работают? Платформа 8.3.9.2170, режим совместимости «Версия 8.3.6».
Вроде ж должно работать?
(42)Разобрался. Чистка кэша помогла.
Предлагаю свой вариант более компактный, Для СтрНайти
Показать
(13) это не поможет — дело, все-таки, в режиме совместимости. А его версией не определишь.
(37) на всякий случай, если кому лениво про соединить
Показать
(26) а нахиба цэ трэба?
Не сразу сообразил, что у меня не работает из-за режима совместимости 🙁 Прочитал — понял. Автору спасибо!!!
В 2015 году адепты обновлений платформы начали кидаться каками в автора за полезную инфу.
На дворе 2018 год. В УПП режим совместимости с 8.2.13 не снять ибо не работает она в режиме совместимости 8.3. Ни с того ни с его вылезла указанная ошибка. Платформа 8.3.7.1873
Пришлось править конфу на «устаревшие решения»
Чистка кеша не помогла
Пока столкнулся с этими функциями, решил затолкать их в общий модуль:
Показать
В синтакс-помощнике нет ни слова о режиме совместимости для этой функции. По факту в 8.3.9.2233 она не работает
Самое хреновое в этом всем, что даже в 8.3.11 расширенный (!) синтаксический контроль не ругается на СтрНайти и СтрСоединить, если стоит режим совместимости, который еще не позволяет пользоваться ими. На все остальные типа СтрНачинаетсяС контроль ругается и это нормально показывает разработчику, что их нельзя использовать.
Народ как решить эту проблему если не переходить на новую платформу. Просто в общий модуль дописать эти функции? Кто как выходил из ситуации. Та же самая проблема. Обновил конфигурацию, долго не обновлялись при запуске ругается на эти функции. Режим совместимости Версия 8.2.13 обычные формы.
Код функции ПолучитьКодировкуИзЗаголовков() страшно перемудренный
Первый цикл можно переписать понятнее.
Далее вместо СтрНачинаетсяС() и СтрЗаканчиваетсяНа() используется Сред()
Куда слать pull request?
(53)
Да, создается глобальный модуль с заменой этих функций, чтобы обращаться к ним как в платформенным. При снятии режима совместимости модуль нужно удалить.
Спасибо за статью. Как раз содержит то, что искал. Нужно было узнать с какой версии работают новые функции.
Платформа 8.3.11
Режим совместимости конфигурации 8.3.10
Должны ли работать методы СтрНачинаетсяС(), СтрЗаканчиваетсяНа() ?
(46) А таки где удаление последнего, «лишнего», разделителя?
(54)
Очень помогло для ЗУП 2.5