6 новых функций, которые не следует использовать в режиме совместимости




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

59 Comments

  1. Alexey_

    чем отличается от http://v8.1c.ru/o7/201408str/index.htm ?

    Reply
  2. Xershi

    Так это и так понятно. Платформу как раз и обновляют чтобы использовать новые функции…

    Reply
  3. AlexanderKai

    Что мешает использовать СистемнаяИнформация.ВерсияПриложения?

    Reply
  4. denis_aka_wolf

    (2) Xershi, Только не всегда в организациях следят за обновлением платформы.

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

    Reply
  5. denis_aka_wolf

    (3) AlexanderKai,

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

    1) Использовать новые функции и обязать заказчика перейти на свежую платформу

    2) Сделать проверку текущей версии платформы и использовать новые функции и старые механизмы работы

    3) Использовать только старые механизмы работы

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

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

    И по третьему — самый оптимальный (мое субъективное мнение) гораздо проще второго варианта, но уступает первому в том что не помогает продвижению новых платформ в массы

    Reply
  6. dgolovanov

    Так много старания это всё написать и так мало пользы.

    Reply
  7. denis_aka_wolf

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

    Reply
  8. vasyak319

    Я правильно понял смысл публикации — рассказать всему миру, что функции, появившиеся в новом релизе, не будут работать в старом релизе, потому что есть только в новом релизе?

    Познавательная статья — теперь я знаю, что Капитана Очевидность зовут Денис.

    Reply
  9. insurgut

    Не забываем ставить плюсики… =)

    Reply
  10. mitya-paramonov

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

    (3) AlexanderKai, этот вариант не работает. Ругается на то что данной функции вообще нет.(7)

    denis_aka_wolf, статью поправь, второй вариант не рабочий.

    Reply
  11. It-developer

    Самые интересные — СтрРазделить(), СтрСоединить()

    Reply
  12. AlexanderKai

    (10) mitya-paramonov,

    Если добавишь строчку

    СистемнаяИнформация = Новый СистемнаяИнформация;

    то заработает.

    Reply
  13. denis_aka_wolf

    (13) AlexanderKai,

    СистемнаяИнформация = Новый СистемнаяИнформация;
    Если СистемнаяИнформация.ВерсияПриложения = «8.3.6.1977» тогда
    Сообщить(СтрНайти(«2212″,»1»)); //вернет 3
    Иначе
    Сообщить(СтроковыеФункцииКлиентСервер.НайтиСимволСКонца(«2212″,»1»));
    КонецЕсли;
    

    Такой код все равно работать не будет!

    Reply
  14. denis_aka_wolf

    (11) slazzy, Спасибо, добавлю в статью сегодня вечером.

    (10) mitya-paramonov, Спасибо, поправлю.

    Reply
  15. seermak

    а где описания про другие новые функции? пример: ПолучитьИсполняемуюСхемуКомпоновкиДанных() и т.д.)))))

    Reply
  16. denis_aka_wolf

    (16) seermak, Это метод а не функция

    Reply
  17. seermak

    (16)исправлено: …..другие методы и функции……

    Reply
  18. vasyak319

    (17) это и то и другое. Сбоите, кэп.

    Reply
  19. DitriX

    (7) все очень просто — создаете глобальную функцию с такими же названиями и используете ее, если у человека новая платформа — то ему достаточно заккоментить эту функцию. Как бы проблем нет.

    Reply
  20. eech

    Небольшое уточнение:

    «Сообщить(СтрСравнить(«Первая строка», «Вторая строка»)); //вернет Истина»

    вернет не «Истина», а «1»

    Reply
  21. denis_aka_wolf

    (21) eech, Исправил, спасибо.

    Reply
  22. c1nil

    О чем статья?

    Reply
  23. nixel

    удалено

    Reply
  24. mister_tula

    Кто-нибудь еще заметил, как работают табличные части с несколькими «этажами» (несколько реквизитов в группе) в 8.3.6 — полный косяк !!! Как живут с этим многомилионные пользователи 1С ?

    Reply
  25. Bassgood

    (14) а если использовать Вычислить(), то все заработает

    Reply
  26. Bassgood

    (0) Вообще статью можно было бы свести к одной фразе — при разработке чего-либо (конфигурации, подсистемы, отчета, обработки) для неопределенного заказчика/клиента/покупателя необходимо учитывать возможные варианты использования у них различных версий платформы, режимов совместимости с версиями и интерфейсом, использования модальности и синхронных вызовов. И это будет более полно, чем вся публикация.

    Reply
  27. androgin

    глупая статья. все это написано в релизе 1С

    и нужно быть совсем недалеким, чтобы это не осознавать

    Reply
  28. vad013

    Проверил вчера на релизе 8.3.6.2041.

    Эти новые функции есть в Синтакс-помощнике, но при попытке их использовать выдается ошибка «Процедура или функция с указанным именем не определена …».

    Reply
  29. vad013

    ошибка пропадет, если снять режим совместимости

    Reply
  30. Nuuq

    (0)

    СтрРазделить

    Массив = Новый Массив();
    Строка = «1,2,3,4,5,6,7,8,9,,10»;
    Разделитель = «,»;
    Символ = Найти(Строка, Разделитель);
    Пока Символ > 0 Цикл
    Если СтрДлина(Лев(Строка, Символ — 1)) > 0 Тогда
    МассивЗначений.Добавить(Лев(Строка, Символ — 1));
    КонецЕсли;
    Строка = Прав(Строка, СтрДлина(Строка) — Символ);
    Символ = Найти(Строка, Разделитель);
    КонецЦикла;
    Если СтрДлина(Строка) > 0 Тогда
    МассивЗначений.Добавить(Строка);
    КонецЕсли;

    Показать

    СтрСоединить

    Строка = «»;
    Для каждого Элемент Из Массив Цикл
    Строка = Строка + СокрЛП(Элемент) + «,»;
    КонецЦикла;

    P.S.: новые функции конечно гораздо удобнее. Спасибо за обзор — ведь сюда «лазишь» чаще чем в Зазеркалье 😉

    Reply
  31. vasyak319

    (31) Nuuq, ваша СтрСоединить выдаст лишнюю запятую в конце.

    Reply
  32. Zahary

    — сравнение производительности функции СтрШаблон по сравнению с СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку

    В циклах лучше не использовать. Подозреваю, что остальные функции такие же быстрые 🙁

    Reply
  33. vasyak319

    (33) Zahary, по вашему замеру получается, что собрать строку простым сложением прямо на месте втрое дольше, чем вызвать функцию модуля с десятью параметрами и собрать в ней ту же самую строку (код функции я не смотрел, но он, очевидно, посложнее простой конкатенации строк).

    Не верю.

    В замере производительности есть флажок «Включать для функций время выполнения» — вы его ставили?

    Reply
  34. vec435

    (11) slazzy, аналога СтрНайти нет

    Reply
  35. Erne100

    (20) DitriX, Всё так кроме : СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)

    Системное перечисление НаправлениеПоиска в режиме совместимости отсутствует.

    Reply
  36. bubnov-pi

    Не являюсь программистом в 1С, занимаюсь в основном обеспечением работоспособности существующих систем, но временами приходится залезать в код клиентских конфигураций. И буквально на днях возникла необходимость добавить разбор массива, поступающего в web-сервис. Первая мысль — найти аналог explode (php)… в справке нашёл, но на клиентской конфигурации оно не работает (как я понял, из-за режима совместимости). Спасибо (31) — направил на решение. В итоге в обработке появилась функция:

    Функция СтрРазделить(Строка, Разделитель, ВключатьПустые = Ложь)
    МассивЗначений = Новый Массив();
    Символ = Найти(Строка, Разделитель);
    Пока Символ > 0 Цикл
    Если ВключатьПустые или (СтрДлина(Лев(Строка, Символ — 1)) > 0) Тогда
    МассивЗначений.Добавить(Лев(Строка, Символ — 1));
    КонецЕсли;
    Строка = Прав(Строка, СтрДлина(Строка) — Символ);
    Символ = Найти(Строка, Разделитель);
    КонецЦикла;
    Если (ВключатьПустые или СтрДлина(Строка) > 0) Тогда
    МассивЗначений.Добавить(Строка);
    КонецЕсли;
    Возврат МассивЗначений;
    КонецФункции
    

    Показать

    Вроде работает. Поправьте, если где накосячил.

    Reply
  37. susorov

    (36) Erne100, А может быть встречал кто функцию с такими же возможностями, как эта новая СтрНайти() ? Ведь порой надо искать именно с конца, и удобно было бы использовать в режимах совместимости аналогичную функцию, хотя бы с первыми тремя параметрами… Народ бы сказал за такую функцию Спасибо!

    Reply
  38. constantinevio

    Я тут на скорую руку накидал. Вроде все работает, но особо не тестил. Все параметры такие же как и в СтрНайти. Единственное, надо глобально заменить НаправлениеПоиска.СКонца НаправлениеПоиска.СНачала на «СКонца» и «СНачала» соответственно.

    Функция СтрНайти82 (ИсходнаяСтрока, ИскомаяСтрока, НаправлениеПоиска = «СНачала», НачальнаяПозиция = Неопределено, НомерВхождения = 1) Экспорт
    Если СтрДлина(ИскомаяСтрока)>СтрДлина(ИсходнаяСтрока) ИЛИ СтрДлина(ИсходнаяСтрока) = 0 Тогда
    Возврат 0;
    КонецЕсли;
    Если НаправлениеПоиска = «СНачала» ИЛИ НаправлениеПоиска = Неопределено Тогда
    Если НачальнаяПозиция = Неопределено Тогда
    НачальнаяПозиция = 1;
    ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) Тогда
    ВызватьИсключение («Неправильный параметр: Начальная позиция»);
    КонецЕсли;
    //Выполнить Поиск
    Результат = 0;
    ВременнаяСтрока = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока)-(НачальнаяПозиция-1));
    Для Индекс = 1 По НомерВхождения Цикл
    ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
    Если ВременныйРезультат Тогда
    Результат = Результат  + ВременныйРезультат ;
    ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) — ВременныйРезультат — (СтрДлина(ИскомаяСтрока)-1)));
    //Сообщить («Вхождение » + Индекс + «: » + (Результат));
    Иначе
    //Сообщить(«Требуемое вхождение не найдено»);
    Возврат 0;
    КонецЕсли;
    Если Индекс < НомерВхождения Тогда
    Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
    КонецЕсли;
    КонецЦикла;
    Возврат Результат+НачальнаяПозиция-1;
    ИначеЕсли НаправлениеПоиска = «СКонца» Тогда //Ищем с конца
    Если НачальнаяПозиция = Неопределено Тогда
    НачальнаяПозиция = СтрДлина(ИсходнаяСтрока);
    ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) ИЛИ НачальнаяПозиция < 1 Тогда
    ВызватьИсключение(«Неправильный параметр: НачальнаяПозиция»);
    КонецЕсли;
    //ВыполнитьПоиск
    Результат = 0;
    ВременнаяСтрока =  Лев(ИсходнаяСтрока, НачальнаяПозиция +1);
    Вхождения = Новый Массив;
    Пока Истина Цикл
    ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
    Если ВременныйРезультат Тогда
    Результат = Результат  + ВременныйРезультат;
    Вхождения.Добавить(Результат);
    ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) — ВременныйРезультат — (СтрДлина(ИскомаяСтрока)-1)));
    //Сообщить («Вхождение » + Индекс + «: » + (Результат));
    Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
    Иначе
    //Сообщить(«Требуемое вхождение не найдено»);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если Вхождения.Количество()<НомерВхождения Тогда
    //Вхождение не найдено
    Возврат 0;
    Иначе
    Возврат Вхождения[(Вхождения.Количество()-НомерВхождения)]
    КонецЕсли;
    Иначе
    ВызватьИсключение(«Неправильный параметр: НаправлениеПоиска. Опции: «»СНачала»», «»СКонца»»»);
    КонецЕсли;
    КонецФункции

    Показать

    Reply
  39. susorov

    (39) Константин, большое спасибо!

    Reply
  40. ьуеьшд

    Да уж, платформа 8.3.9.1818, а бяда та же.

    Reply
  41. Spacer

    Почему эти функции не работают? Платформа 8.3.9.2170, режим совместимости «Версия 8.3.6».

    Вроде ж должно работать?

    Reply
  42. Spacer

    (42)Разобрался. Чистка кэша помогла.

    Reply
  43. dino99rus

    Предлагаю свой вариант более компактный, Для СтрНайти

    Функция СтрНайти82(Знач Строка,Знач ПодстрокаПоиска,Знач НаправлениеПоискаСКонца = Ложь, Знач НачальнаяПозиция = Неопределено,Знач НомерВхождения = 1)
    
    ТекущаяПозиция = 0;
    ЗнакНаправленияДвижения = 0;
    ДлинаСтрПоиска = СтрДлина(ПодстрокаПоиска);
    
    Попытка
    Если НЕ НачальнаяПозиция = Неопределено Тогда
    НачальнаяПозиция = Число(НачальнаяПозиция);
    Если НачальнаяПозиция <= 0 ИЛИ НачальнаяПозиция > СтрДлина(Строка) Тогда
    ВызватьИсключение («»);
    КонецЕсли;
    КонецЕсли;
    Исключение
    ВызватьИсключение(«Недопустимое значение параметра (параметр номер ‘4’)»);
    КонецПопытки;
    
    Если НаправлениеПоискаСКонца Тогда
    НачальнаяПозиция = ?(НЕ НачальнаяПозиция = Неопределено, НачальнаяПозиция,СтрДлина(Строка));
    ЗнакНаправленияДвижения = -1;
    Иначе
    НачальнаяПозиция = ?(НЕ НачальнаяПозиция = Неопределено, НачальнаяПозиция,1);
    ЗнакНаправленияДвижения = 1;
    КонецЕсли;
    
    Пока Истина
    И НЕ НомерВхождения = 0
    И ((НЕ НаправлениеПоискаСКонца И НачальнаяПозиция <= СтрДлина(Строка))
    ИЛИ (НаправлениеПоискаСКонца И НачальнаяПозиция >= 0)) Цикл
    
    Позиция = Найти(Сред(Строка,НачальнаяПозиция, ДлинаСтрПоиска),ПодстрокаПоиска);
    
    Если Позиция Тогда
    ТекущаяПозиция = НачальнаяПозиция;
    НачальнаяПозиция = ТекущаяПозиция + ДлинаСтрПоиска * ЗнакНаправленияДвижения;
    НомерВхождения = НомерВхождения — 1;
    Иначе
    НачальнаяПозиция = НачальнаяПозиция + 1 * ЗнакНаправленияДвижения;
    КонецЕсли;
    
    КонецЦикла;
    
    Если НомерВхождения Тогда
    ТекущаяПозиция  = 0;
    КонецЕсли;
    
    Возврат ТекущаяПозиция;
    
    КонецФункции
    

    Показать

    Reply
  44. AlexO

    (13) это не поможет — дело, все-таки, в режиме совместимости. А его версией не определишь.

    Reply
  45. gortol

    (37) на всякий случай, если кому лениво про соединить

    Функция СтрСоединить(Массив, Разделитель=»»)
    Строка = «»;
    Для каждого Элемент Из Массив Цикл
    Строка = Строка + СокрЛП(Элемент) + Разделитель;
    КонецЦикла;
    
    Возврат Строка;
    КонецФункции
    

    Показать

    Reply
  46. Linx-p

    (26) а нахиба цэ трэба?

    Reply
  47. Tavisdm

    Не сразу сообразил, что у меня не работает из-за режима совместимости 🙁 Прочитал — понял. Автору спасибо!!!

    Reply
  48. Alex1c

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

    На дворе 2018 год. В УПП режим совместимости с 8.2.13 не снять ибо не работает она в режиме совместимости 8.3. Ни с того ни с его вылезла указанная ошибка. Платформа 8.3.7.1873

    Пришлось править конфу на «устаревшие решения»

    Чистка кеша не помогла

    Reply
  49. Kesak

    Пока столкнулся с этими функциями, решил затолкать их в общий модуль:

    Функция СтрСоединить(пМассивСтрок, пРазделитель = «,») Экспорт
    лРезультат = «»;
    
    Для Каждого ЭлМассива Из пМассивСтрок Цикл
    лРезультат = лРезультат + СокрЛП(ЭлМассива) + пРазделитель;
    КонецЦикла;
    
    лДлинаРезультата = СтрДлина(лРезультат) — СтрДлина(пРазделитель);
    
    Если лДлинаРезультата > 0 Тогда
    лРезультат = Лев(лРезультат, лДлинаРезультата);
    КонецЕсли;
    
    Возврат лРезультат;
    КонецФункции
    
    Функция СтрРазделить(пСтрока = «», пРазделитель = «,», пВключатьПустые = Ложь) Экспорт
    лМассивЗначений = Новый Массив();
    
    лНайденныйРазделитель = Найти(пСтрока, пРазделитель);
    
    Пока лНайденныйРазделитель > 0 Цикл
    Если пВключатьПустые ИЛИ (СтрДлина(Лев(пСтрока, лНайденныйРазделитель — 1)) > 0) Тогда
    лМассивЗначений.Добавить(Лев(пСтрока, лНайденныйРазделитель — 1));
    КонецЕсли;
    
    пСтрока = Прав(пСтрока, СтрДлина(пСтрока) — лНайденныйРазделитель);
    лНайденныйРазделитель = Найти(пСтрока, пРазделитель);
    КонецЦикла;
    
    Если (пВключатьПустые ИЛИ СтрДлина(пСтрока) > 0) Тогда
    лМассивЗначений.Добавить(пСтрока);
    КонецЕсли;
    
    Возврат лМассивЗначений;
    КонецФункции
    
    Функция СтрНачинаетсяС(пСтрока, пСтрокаПоиска) Экспорт
    Возврат Лев(пСтрока, СтрДлина(пСтрокаПоиска))= пСтрокаПоиска;
    КонецФункции
    
    Функция СтрЗаканчиваетсяНа(пСтрока, пСтрокаПоиска) Экспорт
    Возврат Прав(пСтрока, СтрДлина(пСтрокаПоиска))= пСтрокаПоиска;
    КонецФункции
    

    Показать

    Reply
  50. It-developer

    В синтакс-помощнике нет ни слова о режиме совместимости для этой функции. По факту в 8.3.9.2233 она не работает

    Reply
  51. HystriX

    Самое хреновое в этом всем, что даже в 8.3.11 расширенный (!) синтаксический контроль не ругается на СтрНайти и СтрСоединить, если стоит режим совместимости, который еще не позволяет пользоваться ими. На все остальные типа СтрНачинаетсяС контроль ругается и это нормально показывает разработчику, что их нельзя использовать.

    Reply
  52. Alex_CheST

    Народ как решить эту проблему если не переходить на новую платформу. Просто в общий модуль дописать эти функции? Кто как выходил из ситуации. Та же самая проблема. Обновил конфигурацию, долго не обновлялись при запуске ругается на эти функции. Режим совместимости Версия 8.2.13 обычные формы.

    Reply
  53. leemuar
    Reply
  54. leemuar

    Код функции ПолучитьКодировкуИзЗаголовков() страшно перемудренный

    Первый цикл можно переписать понятнее.

    Далее вместо СтрНачинаетсяС() и СтрЗаканчиваетсяНа() используется Сред()

    Куда слать pull request?

    Reply
  55. HystriX

    (53)

    конфигурацию

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

    Reply
  56. mailrum2004

    Спасибо за статью. Как раз содержит то, что искал. Нужно было узнать с какой версии работают новые функции.

    Reply
  57. METAL

    Платформа 8.3.11

    Режим совместимости конфигурации 8.3.10

    Должны ли работать методы СтрНачинаетсяС(), СтрЗаканчиваетсяНа() ?

    Reply
  58. ComradV

    (46) А таки где удаление последнего, «лишнего», разделителя?

    Reply
  59. Светлый ум

    (54)

    Очень помогло для ЗУП 2.5

    Reply

Leave a Comment

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