Редактор формы для 7.7 + Настройка привязок




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

71 Comments

  1. Арчибальд

    Слушай Ёпрста! (с) Че :)))

    Reply
  2. JohnyDeath

    Судя по описанию — круть!

    Reply
  3. Ёпрст

    (2) Пока не всё реализовано, что хотелось бы…

    🙁

    Reply
  4. CheBurator

    Зачет стопудово! (даже не знаю как наехать 😉

    Reply
  5. miandrew

    И всё тки весело с ним работать 🙂

    Держи плюса

    Reply
  6. toypaul

    прекольно!

    Reply
  7. Rusk51

    (4) А я знаю. Скачать не могу.Скачивается PhP.Опять ЧингисХан влез. Поэтому минус на словах(-)

    Reply
  8. Rusk51

    Короче — звезда в шоке

    Reply
  9. Душелов

    (7) Все нормально скачивается

    Reply
  10. MrDen

    Интересная вещь! однозначно +

    Reply
  11. Ёпрст

    Поправлена выгрузка текста привязки…

    Reply
  12. NDM

    да, платформа 7.7 живет своей жизнью! 😉

    Плюсану.

    Reply
  13. JohnyDeath

    (12) Родители её уже давно бросили, спасибо, что появились люди, которые её усыновили, отмыли, причесали и поставили на ноги 😉

    Reply
  14. sergeypv

    Обработка работает только под локальным админом, в домене п.6 ничего не делает. До конца не протестил. Ждем окончания проекта. В общем понравилось: + авансом.

    Reply
  15. Ёпрст

    (14) если все вк загружены — то работает нормально..и в домене.

    Reply
  16. janber

    Полезная штука. Когда есть простая возможность сделать экслюзивный вариант

    документа для каждого юзера — они просто млеют. В моем варианте еще

    настраивались видимость/доступность элементов диалога и значения по умолчанию.

    Reply
  17. Ёпрст

    (16) Ээ…. а можно поглядеть то, на ваш вариант?

    Reply
  18. Ёпрст

    +17 видимость/доступность атрибутов, равно как и индивидуальная форма для каждого юзверя — не проблема… Главное только — доделать выгрузку самой формы в файлик..остальное мелочи.

    Reply
  19. janber

    (18) Для хранения настроек я использовал справочники 1С. Поэтому чтобы все

    работало надо делать демо-версию конфы.

    Reply
  20. RailMen

    +

    !для дела пойдет!

    Reply
  21. fenix174rus

    Чет немогу запустить, ругается перед Сервис.ПерехватКлавиатуры(1), Поле агрегатного объекта на обнаружено.

    Reply
  22. Ёпрст

    (21) ВК все установлены, как п.3 написано ?

    Reply
  23. Scorpion23

    однозначно +, облегчает работу, в тоже время красиво и удобно

    Reply
  24. 1981ink

    ПРи попытке подключения пишет собственно это

    ПерехватчикСобытийГМ = СоздатьОбъект(«ПерехватчикГМ»);

    {C:РЕДАКТОР.ERT(217)}: Неудачная попытка создания объекта (ПерехватчикГМ)

    Reply
  25. Ёпрст

    (24) Значит не выполнил один из пунктов из описания..

    ВК подключены ? …

    На закладке 1с++ классы видны ?

    Reply
  26. 1981ink

    все 3 ВК добавил при загрузке, уточни пожалуста что за закладка. Наверно ты имееш в виду в конфигураторе, так там в окне конфигурации на закладке 1c++ кроме фанктеста больше ничего нет

    Reply
  27. Ёпрст

    (26) Нет. В режиме предприятия — Сервис-Параметры-Настройки 1с++ там смотри имена зарегестрированных классов.. Есть среди них указанный ПерехватчикГМ ?

    ЗЫ:Если установлен плагин Visual 1C++ для опенконфа, то можешь посмотреть в самом пофигураторе.. на закладке 1с++

    http://www.script-coding.info/Visual1cpp.html

    Reply
  28. Ёпрст

    +27 а всё… увидел, что вижуал стоит у тебя..

    🙂

    Ну если окромя фанктекста ничего нет.. чего ж ты хочешь тогда ?

    defcls.prm положи в каталог ИБ (или исправь свой, чтоб пути к моим классам были верные)… затем в пофиг

    Reply
  29. 1981ink

    Всё бальшое спасибо заработал прописал в рпм все плагины в Базе

    Reply
  30. tarroman

    А у меня чего-то тоже п.6 не срабатывает (классы вроде подключены и перехватчик ГМ тоже вроде значится). Может чего где-то накосячли — я в 1С++ новичок.

    Reply
  31. Ёпрст

    (30) Формекс и 1cpp каких версий загружены ?

    См. на вкладке о программе.

    Reply
  32. Ёпрст

    +31 Можешь еще вот что сделать :

    В ПриНачалеРаботыСистемы прописать это:

    Настройки=СоздатьОбъект(«УправлениеНастройками»);

    Настройки.Сбросить(«Проверка типов»);

    Настройки.Сбросить(«Отладка»);

    Настройк

    Reply
  33. tarroman

    (31) Формекс 2.0.5.93, 1cpp 2.5.0.7.

    (32) прописал.

    Все равно эффекта нету :((

    Может быть нужно еще какие-то классы или ВК подключать?

    Reply
  34. Ёпрст

    (33) Нет. нужно всего лишь взять 1сpp 3.0.1.23

    http://www.1cpp.ru/images/3/32/Icpp-latest.rar

    Reply
  35. Ёпрст

    +34 Не помню ужо, но вроде как в 2* небыло вообще перехватчика..

    Reply
  36. tarroman

    :(( с 1срр 3* я лопухнулся. Честно заменил dll. Теперь в запущенной 1С честно светится 3.0.1.23. Но на комбинацию клавиш КНТРЛ+Ф12 не реагирует. Может еще что-то, а может я что-то не так сделал.

    Плагин sciLexer 1.74 в конфигураторе видится.

    Кстати, а какой-нибудь визуальный эффект от операторов ЗагрузитьВнешнююКомпоненту(«1sci.dll»);

    должен быть?

    Reply
  37. Ёпрст

    (36) да… Даже на скрине видно …

    На вкладке «О программе» какие ВК светятся ? Каких версий ?

    Еще какие-нить классы грузишь?

    Reply
  38. Ёпрст

    И это, когда пункт 5. из описания делаешь, не ругается ?

    Reply
  39. Ёпрст

    Случаем нет нигде явного отключения перехвата клавиатуры через Сервис.ПерехватКлавиатуры(0) ?

    Reply
  40. tarroman

    О-оо ё, прошу простить великодушно — про пункт 5 я то и забыл. Теперь все почестному выполнил все 6 пунктеров и зарядился положительными эмоциями :))

    Но вот установка привязок не заработала. Выдает ошибку: sci=гФорма.СоздатьЭлементУправления(«Scintilla»,»МодульФормы»);

    {D:РОМАН_ТБАЗЫ_1С7_7ТОРГОВЛЯРЕДАКТОР.ERT(909)}: Недопустимое имя класса: ‘Scintilla’.

    Reply
  41. Ёпрст

    (40) Значит не загружена ВК «1sci.dll»;

    Reply
  42. Ёпрст

    +41 + SciLexer.dll должна быть там, как написано в описании…

    Reply
  43. tarroman

    (41) твоя правда. Усе заработало. Однозначно +. Все так и напоминает о 8-ке …

    А скажи пож. в режиме 1С, я увидел, что текст модуля парсится как в конфигураторе (колорером), а вот телепатических вещей кажись нету (ту же процедуру «ПриОткрытии» искать нужно будет рученьками?

    Reply
  44. Ёпрст

    (43) да..

    ЗЫ: я забросил этот проект.. ибо пока нет решения выгрузить форму из предприятия в текстовый файл..

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

    Reply
  45. tarroman

    (44) А в чем загвозд (я правда с турбоМД не работал еще, но походу и до него доберемся — с 8-ки пересесть на 7-ку — ну очень скучно будет, а тут нарыл 1С++ и началось … копание)?

    Reply
  46. Ёпрст

    (45) нет решения выгрузки открытой формы из предприятия в текстовый файл.

    Reply
  47. Ёпрст

    +46 и Альф и на Орефков обещались поглядеть и.. как-то не срослось.. нет времени.

    Reply
  48. tarroman

    (46&47) Понятно. Будем изучать ТурбоМД и скриптики по чуть-чуть, а там посмотрим.

    Reply
  49. sdfffsd

    Доргой автор!

    Мне с большим трудом удалось всё заставить работать — допёр по косвенным замечаниям в этих постах, что нужна TurboBL, чего ,вроде, не было написано в инструкции. Присобачи — всё заработало. Мне открылся новый мир. Спасибо!

    Reply
  50. Ёпрст

    (49) отдельно ставить turbobl.dll не нужно, она сто лет в обед интегрирована в саму 1срр.dll

    Reply
  51. Ёпрст

    +50 Просто, для правильной работы класса «Перехватчик» нужно включить TurboBL в настройках при старте системы и всё.

    Reply
  52. sdfffsd

    Вобщем, колдун из меня плоховатый, но сработало — и то слава Богу. А Вам — БЛАГОДАРНОСТЬ за Вашу работу. Владимир.

    Reply
  53. script

    А у меня все заработало сразу.

    НО

    Выбираю Меню файл — Редактор — Жму Подключить

    Но открываю форму на ней всего один реквизит ФИО.

    Жму CTRL + F12. Появляються новое меню

    Редактирую привязки:

    По горизонтали : Растягивать

    По вертикали : Вниз (хотя нужно вверх, но там такого пункта нет — только при сложной привязке, ну да ладно пусть будет вниз)

    Полученный код вставляю в нужные места модуля.

    Открываю форму и что. Реквизит просто исчез. Судя по отладчику ему присвоены координаты далеко влево за пределы формы (например ширина формы 800 а в УстановитьАтрибут(Лево = 1480,и т.д.,,,)) я так понимаю что реквизит просто уехал далеко влево.

    Reply
  54. Ёпрст

    (53) С текстом привязки — там ошибка…есть..просто никто не писал — я и не выкладывал исправленный вариант.

    Reply
  55. Ёпрст

    +54 Хотя нет.. посмотрел — всё должно работать…

    Полный Код привязки можешь привести?

    Reply
  56. script

    //====================================================

    //Этот текст следует поместить в модуль формы….

    //©Ёпрст

    //====================================================

    Перем гРФорма;

    Процедура ПриИзмененииРазмераОкна(ТипСобытия,Ширина,Высота)

    гРФорма.ПриИзмененииРазмераОкна(ТипСобытия,Ширина,Высота);

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

    Процедура ПриОткрытии()

    гРФорма=СоздатьОбъект(«Общие.Форма.Привязка»);

    гРФорма.УстановитьФорму(Форма);

    гРФорма.Привязка(«ФИО»,»T»,»Форма»,»W»,»Форма»);

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

    В свойствах формы птица изменять размер снята

    Все компоненты загружены в глМодуле-ПриНачалеРаботы

    Попытка

    ЗагрузитьВнешнююКомпоненту(«1CPP.dll»);

    Исключение

    Сообщить(«Ошибка при загрузке ВК 1CPP.dll»);

    КонецПопытки;

    Попытка

    ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);

    Сервис = СоздатьОбъект(«Сервис»);

    ФормаРасш = СоздатьОбъект(«РасширениеФормы»);

    Исключение

    Сообщить(«Ошибка при загрузке ВК FormEx.dll»);

    КонецПопытки;

    Попытка

    ЗагрузитьВнешнююКомпоненту(«SpreadSheet.dll»);

    Исключение

    Сообщить(«Ошибка при загрузке ВК SpreadSheet.dll»);

    КонецПопытки;

    Попытка

    ЗагрузитьВнешнююКомпоненту(«1sci.dll»);

    Исключение

    Сообщить(«Ошибка при загрузке ВК 1sci.dll»);

    КонецПопытки;

    Reply
  57. Ёпрст

    (56) Вот это еще вставь в модуль отчета:

    Процедура ПослеОткрытия()

    гРФорма.ПослеОткрытия();

    КонецПроцедуры // ПослеОткрытия

    Reply
  58. script

    Пардон.

    Я еще в модуле класса Привязка в процедуре ПривязкаАтрибута

    в конце текста модуля перед КонецПроцедуры вставил Флаг=0;

    Теперь часть реквизитов растягиваеться но за пределы формы часть исчезла.

    Если ни чего не менять то привязки не срабатывают.

    Смотрел в отладчик

    Проц класса ПриИзмененииРазмераОкна

    Перем Лево, Верх, Ширина, Высота;

    // СЮДА ПЕРЕДАЕТЬСЯ -1

    Если Флаг=-1 Тогда

    ШиринаПривязки=РасширениеФормы.Ширина;

    ВысотаПривязки=РасширениеФормы.Высота;

    Флаг=1;

    Возврат; //ЗДЕСТЬ ЗАКАНЧИВАЕТЬСЯ ВЫПОЛНЕНИЕ МОДУЛЯ

    КонецЕсли; // И НИЧЕГО НЕ ПРОИСХОДИТ

    Если Флаг<>0 Тогда

    Возврат;

    КонецЕсли;

    Reply
  59. Ёпрст

    (58)

    Лови сам класс и пример использования..

    http://webfile.ru/4052296

    Reply
  60. script

    По рекомендации Ёпрст вставил в модуль формы с привязками вот это

    Процедура ПослеОткрытия()

    гРФорма.ПослеОткрытия();

    КонецПроцедуры // ПослеОткрытия

    и все заработало

    😀

    Reply
  61. Ёпрст

    +59 Ты (57) сделал еще ?..

    ЗЫ: а в классе не реализована правильная сортировка привязок.. если привязки связаны между собой, т.е один атрибут зависит от другово…

    в (59) наглядный пример работы.

    ЗЫЫ: можешь

    Reply
  62. script

    Еще один пардон

    Горизонтальная привязка работает правильно а вот вертикальная нет

    Настроена сложная привязка

    Вертикальная: Форма.КВерхнейГранице.

    Делаю форму максимизированно и реквизит опускается на середину формы по вертикали.

    По горизонтали все ОК.

    Reply
  63. Ёпрст

    (62) Замени «T» на «H» — будет растягиваться..

    🙂

    А вообще — нажми в классе на описание — там есть полное описание, что означает T,W,H,L, LW,TH,BR…

    Reply
  64. script

    Вылечил только когда переделал привязку

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

    Reply
  65. Ёпрст

    (64) посмотри лучше пример(59) — там всё наглядно, кто за кем и когда едет…

    Reply
  66. script

    Аналогичным образом сделал и для нижнего реквизита — все ОК.

    Reply
  67. script

    Короче говоря все работает если:

    Переменную модуля гФорма, которую делает конструктор, переделать на гРФорма

    и в модуль добавить

    Процедура ПослеОткрытия()

    гРФорма.ПослеОткрытия();

    КонецПроцедуры // ПослеОткрытия

    или если процедура ПослеОткрытия() уже определена (как у меня)

    то в тело процедуры, в любое место (например, в начало) добавить

    гРФорма.ПослеОткрытия();

    НУЖНО ОТМЕТИТЬ:

    В процедуре ПриОткрытии перечисляються реквизиты для которых настраиваються привязки (НАПРИМЕР)

    гРФорма.Привязка(«тПоиск»,»T»,»Форма»,»»,»»);

    гРФорма.Привязка(«картПолеПоиска»,»T»,»Форма»,»»,»»);

    гРФорма.Привязка(«тПоиск1″,»T»,»Форма»,»»,»»);

    гРФорма.Привязка(«ПолеПоиска»,»T»,»Форма»,»»,»»);

    у меня эти реквизиты лежат на картинке картПолеПоиска

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

    ВСЕ.

    Reply
  68. nata11

    очень интересно

    Reply
  69. nll.jojo

    описание многообещающее

    Reply
  70. _qqq

    Где можно скачать класс Общие.Форма.Привязка? В (59) Ёпрст ссылка не рабочая.

    Reply
  71. _qqq

    Извините, вижу-вижу вторую ссылку на Общие.Форма.Привязка.rar

    Reply

Leave a Comment

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