Текстовые экспандеры — в помощь программисту 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *