Текстовые экспандеры — в помощь программисту 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='\

41 Comments

  1. tomvlad

    Каждый человек старается по возможности облегчить себе труд. Программисты не исключение. Каждый день мы сталкиваемся с необходимостью писать однотипные фрагменты программного кода. Для автоматизации этого процесса система 1С:Предприятие позволяет использовать шаблоны текста (как стандартные, так и созданные пользователем). Казалось бы, что еще нужно разработчику? Однако, в некоторых случаях, стандартных средств разработки все-таки бывает недостаточно. Например, разрабатывая правила обмена в конфигурации 1С:Конвертация данных, приходится писать довольно большие тексты, не имея при этом возможности воспользоваться ни автоподстановкой, ни шаблонами. Либо, приходя к очередному клиенту, Вы обнаруживаете, что нужно написать, допустим, самую обычную печатную форму, которую Вы писали тысячу раз, но процесс ее создания может занять продолжительное время. Как раз в этом случае и могут помочь программы для вставки часто используемых выражений – текстовые экспандеры.

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

    Reply
  2. director04

    Маладец, Владислав!

    Reply
  3. artbear

    ПолуОФФ. Для КД, кстати, уже довольно давно сделана контекстная подсказка на базе подсказки от tormozit.

    Лежит на этом сайте.

    Reply
  4. tomvlad

    (2) Но не все же рискнут встраивать стороннюю подсистему в рабочую базу. Речь в публикации все же идет об универсальных шаблонах, которые можно применять где угодно — от текстового редактора до тонкого клиента 1С:Предприятие 8.2.

    Reply
  5. artbear

    (0) 1. Для удобства использования статьи вставь линки на сайты программ в описание программ, а не только в верхний абзац.

    2. PhraseExpress работает только по щелчку на кнопке программы? или можно выбрать какой-то общий хоткей на обработку выделенного слова в любой другой программе?

    Reply
  6. tomvlad

    (4) 1. Ссылки добавил

    2. Горячие клавиши можно задавать и на отдельные шаблоны и на группы шаблонов. Для текста можно настроить метод вставки.

    У меня, например так:

    Reply
  7. artbear

    (5) Эти программы при одновременной установке не конфликтуют случайно? например, связка Пунто + PhraseExpress ?

    Пунто нужен 100% для переключения раскладки.

    Reply
  8. tomvlad

    (6) У меня стоят все три, конфликтов пока нет.

    Reply
  9. stilet

    У меня PhraseExpress popup не открывает.. Не могу понять где настроить..

    Reply
  10. tomvlad

    (8) Tools-Settings-Popups

    Reply
  11. anig99

    Хотя можно было бы подзаголовок «Как облегчить труд «негров»

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

    Молчаливый плюс…

    Reply
  13. tomvlad

    (11) Плюс от Арчибальда особенно ценен 🙂

    Reply
  14. luns

    в конфигураторе же не работает ))

    Reply
  15. tomvlad

    (13) Все три программы работают при вводе текста в любой программе. Естественно, это не контекстная подсказка.

    Reply
  16. artbear

    (14) А есть возможность указания работы в определенной программе или окне?

    Например, мне нужна работа PhraseExpress в 1С, но не нужна в других программах, например, в Word и т.п.

    Особенно получается прикольно работать в терминале в отдельном сеансе 🙂

    Reply
  17. tomvlad

    (15) Во всех трех программах можно настроить исключения:

    PhraseExpress: Tools — Text Prediction — Advansed — Make text suggestions in following applications only (Do not make text suggestions in following applications)

    Type Pilot: Параметры — Черный список

    Pinto Switcher: Настройки — Программы исключения

    Reply
  18. luns

    (14) автозамена то понятно.

    Reply
  19. srvrv

    А можно как настроить PhraseExpress, чтоб он заменял

    &НаСервере

    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    //Вставить содержимое обработчика

    КонецПроцедуры

    на

    //Процедура — обработчик события «ПриСозданииНаСервере» формы

    //

    &НаСервере

    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    //Вставить содержимое обработчика

    КонецПроцедуры

    Reply
  20. artbear

    (0) Каким хоткеем пользуешься для вызова PhraseExpert ?

    Интересно с точки зрения удобства использования.

    Reply
  21. tomvlad

    (19) В данный момент на группу «Программирование в 1С» назначена комбинация Alt+Пробел.

    Reply
  22. khaoos

    Phrase Express наиболее интересной показалась. Буду осваивать. Спасибо за экскурс и отдельное за шаблоны

    Reply
  23. Tur_gad

    Замечательная разработка, мне пригодилась СПС)!!!

    Reply
  24. chev

    Спасибо за идею. Обязательно попробую. Однозначно +(плюс).

    Reply
  25. sumv1

    Идея хорошая, но только если работаешь исключительно в модулях 1С. Иначе при наборе текста в любых других редакторах — всплывающие не по делу шаблоны надоедают

    Reply
  26. tomvlad

    (25) Конечно проще, если наизусть помнить какую-нибудь часто используемую процедуру или функцию строк на 200.

    Reply
  27. acsent

    может какую функцию строк на 200 и стоит шаблонировать (хотя есть ли такие функции), но сообщить или конецесли руками не набрать ….

    Reply
  28. tomvlad

    (27) Вот например, я иногда пользуюсь блоком процедур:

    ///////////////////////////////////////////////////////////////////////////////
    // УНИВЕРСАЛЬНЫЕ ФУНКЦИИ РАБОТЫ С ФЛАЖКАМИ
    
    Процедура УстановкаФлажков(ТекущаяСтрока,Значение)
    
    Для каждого Стр Из ТекущаяСтрока.Строки Цикл
    Стр.Пометка = Значение;
    УстановкаФлажков(Стр, Стр.Пометка);
    КонецЦикла;
    
    КонецПроцедуры // УстановкаФлажков
    
    Функция УстановленоДляВсех(Строка)
    
    Для каждого Стр Из Строка.Родитель.Строки Цикл
    
    Если Стр.Пометка <> Строка.Пометка Тогда
    Возврат Ложь;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Истина;
    
    КонецФункции // УстановленоДляВсех
    
    Процедура УстановитьПометкуУРодителя(ТекущаяСтрока)
    
    Пока ТекущаяСтрока.Родитель <> Неопределено Цикл
    ТекущаяСтрока.Родитель.Пометка = ?(УстановленоДляВсех(ТекущаяСтрока), ТекущаяСтрока.Пометка, 2);
    ТекущаяСтрока = ТекущаяСтрока.Родитель;
    КонецЦикла;
    
    КонецПроцедуры // УстановитьПометкуУРодителя
    
    Процедура ИзменитьПометкуУПодчиненных(Узел, Пометка)
    
    Узел.Пометка = Пометка;
    
    Для каждого СтрокаДерева ИЗ Узел.Строки Цикл
    ИзменитьПометкуУПодчиненных(СтрокаДерева, Пометка);
    КонецЦикла;
    
    КонецПроцедуры // ИзменитьПометкуУПодчиненных 

    Показать

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

    Reply
  29. acsent

    и ты это делаешь не через копипэйст, а макрос вызываешь?

    Reply
  30. scorp_23

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

    Reply
  31. AlexO

    (28)

    это вот самое ценное.

    ибо в 1с нет никакой логики, все запоминать только ))

    а уж как получить код — дело десятое..

    я вообщде без всяких программ — в текстовых файлах храню.

    Кстати, не думаете своими поделиться процедурами? )

    Reply
  32. tomvlad

    (30) scorp_23, и где же этого списка нет?

    Reply
  33. tomvlad

    (31) AlexO. Вообще-то в прикрепленных файлах есть примеры моих шаблонов. Правда они довольно старые.

    Reply
  34. LexSeIch

    Мир этому дому!

    Полезная статья. Из мелочей складывается процесс. А из экономии времени на мелочах — большая экономия времени. Единственного не восстанавливаемого ресурса.

    Reply
  35. Abadonna

    хм… Еще с 7.7 благополучно использую родные шаблоны от 1С.

    Например, набрал Опер= , оно превратилось в страницу кода.

    Как говорит один мой коллега: — зачем плодить лишние сущности?

    Reply
  36. Myskyl

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

    Reply
  37. SANILLA

    (28) а в управляемой приложении будет работать?

    Reply
  38. unichkin

    Огромнейшее спасибо за такую наводку, PhraseExpress просто мечта 🙂

    Reply
  39. unichkin

    Не так все лучезарно 🙁 Давно хотел программу, которая станет заменой шаблонам 1С (поскольку нужна порой подсказка в режиме предприятия, или на форумах). Phrase express не «дружит» с 1С в плане установки курсора, и также я не смог настроить вставку сниппета таким образом, чтобы корректно вставлялись отступы в текстовых редакторах (в 1С отступы рассчитываются автоматически, но это сбивает установку курсора).

    Пример: настраиваю сниппет для простого условия.

    Хочу после набора «Если» получить:

    При сниппете, заданном как

    Если {cursor} Тогда

    <Табуляция>

    КонецЕсли;

    Получаю в 1С:

    Получаю в блокноте:

    И я понимаю в общем-то что происходит: 1С автоматически рассчитывает отступ, когда phrase express добавляет сниппет. Причем происходит это так:

    1) Вставляется снипетт

    2) Выполняется макрос

    3) 1С рассчитывает отступ

    Думаю, что 1С не стала -бы выполнять расчет отступов, если бы их корректно проставила PhraseExpress. Только макросов там куча, а толку мало: обработки событий — нет, понять что вставлен сниппет, и как-то его обработать тоже нельзя. В приложенных шаблонах эта проблема решается диалоговыми вставками, т.е. после набора «Если» выплывает диалог для вставки переменных (а-ля 1С), и как-бы курсор туда вставлять уже не надо.

    Но мне больше по нраву первоначальный вариант 🙂

    Для себя конструкцию «Если» задал сниппетом «Если {cursor} Тогда КонецЕсли;» (в одну строку), но как быть с (например) «Попытка / Исключение»?

    С другой стороны, что я хотел «на халяву» 🙂

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

    Reply
  40. unichkin

    + Если на эту проблему глаза закрыть — все равно штука хорошая, редактор шаблонов + текстовый мультибуфер. Но вот такая «ложка дегтя» портит весь кайф, и мешает окончательно отказаться от шаблонов 1С.

    Reply
  41. skyman2

    С курсором — да затыка. Но

    Если Тогда

    КонецЕсли;{#ENTER}

    Решает многие проблемы с неправильным форматированем

    Reply

Leave a Comment

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