Конвертация данных + Контекстная подсказка 2.1.8.2+3.07 v2




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

65 Comments

  1. notka

    Тестировать еще только начала, но так как идея нужная +

    Reply
  2. andy-cj

    Зачет, попробуем.

    Reply
  3. artbear

    Хорошая мысль, сам много раз о подобном думал.

    Но немного напрягает способ объединения конфигураций, исходной КД и сабжа — неудобно 🙁

    ЗЫ Кстати, на ИС есть аналог для более ранней версии КД и КП

    Reply
  4. Totoro

    (3) Старался поменьше изменять конфигурацию КД (т.к. выложить уже объединенную конфигурацию я не смогу) и в то же время дать гибкость при хранении метаданных. Поэтому пришлось уйти от стандартных справочников КД. Жду новой версии КД — там поглядим…

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

    Reply
  5. artbear

    (4) Все, КД на 8.1 кончилась 🙂

    Смотрел новую версию, только для 8.2 ?

    Reply
  6. Totoro

    (5) Да, но управляемыми формами пока не пахнет. А имеющиеся изменения нетрудно самому в 8.1 внести. Т.ч. пока пациент скорее жив, чем мертв 😀 А жаль.

    Reply
  7. Totoro

    Обновил для ИР 2.03

    Reply
  8. artbear

    (7) Я сделал обновление сабжа на платформе 8.2 для последней КД 2.1.3.1 и ИР 2.06.

    Также есть дополнения по GComp для конфигураций 77.

    Если будет нужно, могу выложить файл конфигурации моей КД 🙂

    Reply
  9. Totoro

    (8) Я не против. Могу и сам сделать, но времени и потребности пока нет, а сильных изменений для подсказки в КД там не было. По дополнению с GComp для конфигураций 77 думаю ту тему переименовать, т.к. отладка обработчиков уже не так актуальна. Если хочешь, можешь там выложить. Или все в одной конфе.

    ЗЫ Только насчет полной конфигурации КД — я тут узнавал, нельзя :).

    Reply
  10. artbear
    Totoro пишет:

    (8) Я не против. Могу и сам сделать, но времени и потребности пока нет, а сильных изменений для подсказки в КД там не было. По дополнению с GComp для конфигураций 77 думаю ту тему переименовать, т.к. отладка обработчиков уже не так актуальна. Если хочешь, можешь там выложить. Или все в одной конфе.

    По отладке 77 и ЖКомп я лично фразу не понял.Пояснишь?

    Reply
  11. a4a

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

    Reply
  12. tehas

    очень полезно, спасибо

    Reply
  13. zqzq

    Объединил с КД 2.1.7.1 по инструкции — всё нормольно, одно но: в правилах ПКО и ПКС изменение размера поля не работает из-за добавленного поля «имя обработчика». Для исправления нужно заменить одну строчку в модуле кдРаботаСДиалогами в процедуре ИнициализироватьКонтекстнуюПодсказкуНаФорме

    ТекКоманднаяПанель.Верх   = ТекПолеТекстовогоДокумента.Высота — ТекКоманднаяПанель.Высота — 2;

    на строчку

    ТекКоманднаяПанель.Верх   = ТекПолеТекстовогоДокумента.Высота; // — ТекКоманднаяПанель.Высота — 2; // для учёта нового поля «имя обработчика»
    

    upd: всё равно иногда слетают привязки. Остановился на варианте вообще скрыть панель, вся функциональность через контекстное меню доступна:

    ТекКоманднаяПанель.Видимость = Ложь; 

    +закомментировать код по установке привязок и положения ТекКоманднаяПанель

    Reply
  14. DrAku1a

    Начал изучать правила обмена, КД и иже с ними… Взял конфу КД версии 2.1.8.1 с диска ИТС за октябрь, прикрутил к ней эту доработку вообще без проблем…

    Помимо описанного в инструкции, пришлось еще повозиться с формами, куда собственно панельки и встраиваются, а именно с привязками. Проблема видимо та-же, что и в (13). Я во всех формах принудительно привязал текстовое поле растягиваться по ширине и высоте и дополнительные поля также в зависимости от расположения жестко привязал к границам панели — это помогло.

    Мне в принципе КД нравится. Но визуального доступа к данным нет. Отладка слабенькая, ИМХО… Наверное не мешало бы видеть выгружаемые данные перед загрузкой и подробное описание всех действий при загрузке.

    Вопросы/предложения:

    1. А подсказка по функциям общих модулей доступна? И как список процедур подгрузить?

    2. Для общих модулей, да и для стандартных процедур надо бы еще подсказку по параметрам, чтобы в код не лезть постоянно. Этого не нашел даже в ИР (пробовал мобильные ИР, и там есть справка с выделением текущего параметра жирным шрифтом).

    Понятно, что тема старая… Автору, если забросил — подскажи в какую сторону смотреть — что перспективнее?

    Reply
  15. Totoro

    (14) Проблема с привязками старая и тянется в формах КД уже давно. Единственный способ — или подправить привязки руками (чтобы не вылезали за обычные границы) или отключать панель совсем.

    Чтобы загрузить список модулей нужно сначала его выгрузить. Сейчас такого функционала у меня нет.

    ЗЫ Вообще текущий вариант я развивать не буду. Есть пока не доделанная версия в которой используется немного упрощенный список метаданных из типовых справочников КД (что бы упростить использование и не возиться с полными дублями метаданных и не раздувать базу) и частичными дополнениями в отдельном справочнике некоторых метаданных. Т.к. как показала практика с опытом нужно в основном подсказки по небольшому списку метаданных и именам общих модулей.

    Альтернативы пока не встречал, т.ч. и посоветовать нечего.

    Reply
  16. DrAku1a

    (15)

    нужно сначала его выгрузить. Сейчас такого функционала у меня нет.

    Это можно сделать из конфигуратора (см. рисунок).

    Можно также использовать V8Unpack для сохраненной конфигурации.

    А ещё, можно подсмотреть, как это реализовано в подсистеме ИР — там подсказки по методам модулей есть.

    Могу сделать справочник типа «Функции и процедуры», куда размещать их описания (место определения, название, параметры) и загрузчик информации туда.

    А как сделать, чтобы в контекстной подсказке это учитывалось?

    Reply
  17. Totoro

    (16) Собственно как это сделать я знаю 🙂 Я еще в первых версиях подобное делал через V8Unpack, а тем более сейчас когда такой функционал есть в ИР. Только заниматся этим пока некогда.

    Reply
  18. DrAku1a

    (17) Давайте вмести уже довертим функционал? Я напишу загрузку в процедур, функций и переменных в справочник и скину результат Вам. Сделаете, чтобы функции и процедуры появлялись во всплывающей подсказке?

    Reply
  19. Totoro

    (18) Напомни в пятницу вечером. Если не буду на выходные занят и найду архив в котором делал, то можно попробовать доделать для текущей версии.

    Reply
  20. tormozit

    (14) Контекстная справка в ИР работает естественно только для предопределенных методов, т.к. для них есть описание в синтакс-помощнике. Для остальных не предусмотрено.

    Reply
  21. DrAku1a

    (20) Но Вам же удается получить список процедур общих модулей. Почему не сделать к ним список параметров этих процедур? Без параметров — это только половина дела…

    Reply
  22. tormozit

    (21) Удается получить через экспортную функцию из dll платформы. Этот код я заимствовал из Информатора, написанного chessman’ом http://www.1cpp.ru/forum/YaBB.pl?num=1313560540/90 . Там «рядом» можно получить только количество обязательных параметров, но их имена, типы и передачи по Ссылке/Значению, значения по умолчанию недоступны.

    Reply
  23. DrAku1a

    (22) ну для начала хотя бы количество) а вот для КД можно бы анализировать тексты модулей… пока что руки не доходят сделать их анализ — но думаю, там дел на один вечер…

    Reply
  24. _also

    Люди, на каком уровне живет эта разработка. Может кто выложит готовый cf для последней конвертации?

    Reply
  25. Totoro

    (24) Тут я выложить не могу готовый cf (правила запрещают), но если не получилось обновить на последний релиз КД, то могу в личку ссылку кинуть. ИР будет старая 2.03.

    Reply
  26. _also

    (25) написал Вам в личку

    Reply
  27. Bukaska

    (25) Что такое ИР?

    Reply
  28. Totoro
  29. Totoro

    — Обновил до ИР 3.04 и КД 2.1.8.1

    — добавил загрузку через COM-соединение общих модулей (кроме глобальных) и экспортных процедур/функций общих модулей и объектов. Теперь подсказка в коде работает и по ним. Отключить загрузку процедур/функций можн

    Reply
  30. _also

    (29) Вам спасибо. Был готов сам это с нуля делать!

    Reply
  31. tormozit

    (30) Хорошо, что удалось предотвратить это =)

    Reply
  32. artbear

    (29) Огромное спасибо!

    Reply
  33. demon_infernal

    Жаль, нельзя больше 1 плюса поставить) отрываю с руками. Нечеловеческое Спасибо!

    UPD:

    Для кого актуальны базы-источники и/или приемники на платформе 7.7:

    Обработка выгрузки правил КД 2.1.8.1 с поддержкой GCOMP

    Замените имеющуюся в конфигурации обработку на приложенную — получите все то же самое, но с поддержкой GCOMP. Все изменения помечены комментом //dem

    Сам GCOMP v.2.2.15

    Reply
  34. Totoro

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

    1) Сделать единую обработку загрузки через СОМ-содинение, чтобы не нужно было запускать две обработки. При этом будет два варианта загрузки:

    а) нажатием одной кнопки (или программно, по регл. заданию) — по последним настройкам списка метаданных, если загрузка уже производилась;

    б) загрузка с открытием текущего диалога настроек.

    2) Попробовать подключить подсказку к запросам в КД

    3) Сделать единую обработку перегрузки метаданных через файл. тогда добавится перегрузка глобальных процедур/функций и можно будет использовать для баз к которым нет доступа по сети.

    Что интересующиеся предпочтут?

    Reply
  35. _also

    (34) все три пункта очень нужны и важны, но мне актуальнее всего 1 а)

    Reply
  36. DoctorRoza

    Отмечусь, отличная вещь, нужно ознакомиться! 🙂

    Reply
  37. so-quest

    авансом плюсую

    Reply
  38. Totoro

    (35) Значит её и сделаем первой

    Reply
  39. demon_infernal

    По какой то непонятной мне причине не работает подсказка имен методов общих модулей.

    Все делаю по инструкции, при загрузке через COM-соединение галка «Экспортные процедурыфункции» установлена. Сами имена общих модулей подсказываются нормально, а вот их методы — нет. И то же самое с элементами перечислений. Я пишу, допустим

    А = Перечисления.СтавкиНДС<ставлю точку>

    , появляется список методов перечисления (Индекс(), Количество(), Получить() и т.д.), а значений перечисения в списке нет…

    То же самое у меня было еще на КД 2.1.5.1 с добавленным функционалом подсказки, тогда я думал, что как то неправильно произвел объединение… Вобщем, не понятно. Кто нибудь сталкивался? Или у всех все работает?

    Могу выложить свой cf, объясните, что я делаю не так.

    Большое спасибо.

    UPD Такое наблюдается, если ИБ-источник на платформе 8.1. У меня под рукой конвертация 8.1 — 8.2, на стороне источника методы общих модулей не подсказываются, на стороне приемника методы общих модулей подсказываются нормально, но значения перечислений не подсказываются нигде.

    Reply
  40. Totoro

    (39) Под 8.1 не проверял, т.к. уже давно забыл про неё. Проверю, но не думаю что твой cf-ник нужен будет.

    Reply
  41. Totoro

    (39) По поводу загрузки методов из 8.1 через COM-соединение — не работает. Во всяком случае возвращается пустая таблица. Работоспособность просто контекстной подсказки по методам в 8.1 проверить нельзя, т.к. в последней версии для 8.1 еще не использовалась эта возможность подсказки.

    По поводу перечислений — действительно ошибка. Исправлю в следующий версии. Сейчас можно исправить так:

    в модуле обработки «ирПлатформа» в строке 1540 заменить строку

    ИначеЕсли СтрокаОписанияВида.ИмяКоллекции = «Предопределенные»
    
    на строку
    
    ИначеЕсли (СтрокаОписанияВида.ИмяКоллекции = «Предопределенные» ИЛИ СтрокаОписанияВида.ИмяКоллекции = «ЗначенияПеречисления»)
    Reply
  42. demon_infernal

    (41) Огромное спасибо.

    реально ли сделать подсказку по параметрам методов общих модулей? Раньше в конфигуратор лазили, чтобы посмотреть методы общих модулей, теперь лазим только за параметрами.

    Если не реально — ок, и так уже очень даже хорошо. Просто спрашиваю.

    Reply
  43. Totoro

    (43) Сейчас нельзя. Подробнее в (22).

    Reply
  44. Totoro

    Обновил до КД 2.1.8.2 и ИР 3.07

    Reply
  45. Totoro

    Временное исправление (до появления новой версии ИР) ошибки загрузки методов в 8.3/8.2.

    На текущий момент не работает загрузка методов при разных версиях платформы (ИБ 8.2 -> КД 8.3, ИБ 8.3 -> КД 8.2). Нормально работает при аналогичной версии платформы (ИБ 8.2 -> КД 8.2, ИБ 8.3 -> КД 8.3).

    Reply
  46. Gotcha

    Граждане, прошу прощения, что оффтопик, но кто такие «Правила Корреспондента», добавленные в 2.1.8.2 — в хелпе ничего не вижу, в инернетах, навскидку-тоже. Какая польза от оных?

    Reply
  47. unichkin

    (46) так и не смог добиться контекстной подсказки. Все ВК зарегистрированы, xp sp3, КД 2.1.8.2, выставил свойство у конфигураций 8.2. Только через com не пробовал, сейчас буду пытаться.



    Блин) Нужно было просто право дать пользователю. Вы бы в статье указали этот момент.

    Reply
  48. unichkin

    Подскажите пожалуйста: открываю настройки в модуле ПКС, там есть возможность указать файл шаблонов текста. Указал свои шаблоны, которыми пользуюсь постоянно, но ни автоматически ни по ctrl+пробел не срабатывает, что нужно сделать?

    _

    Нашел shift + space

    Reply
  49. Rackhanot

    При открытии конвертации сообщение: «Не удалось зарегистрировать DynamicWrapperX. Возможно требуется запуск от имени администратора.»

    Сеанс перезапускается и все заново.

    Что я делаю не так?

    Reply
  50. tormozit

    (50) Попробуй запустить 1С от имени администратора.

    Reply
  51. Rackhanot

    (51) Разобрался. Версия платформы x64 8.3.10. Запустил под другой версией платформы.

    Reply
  52. neuronness

    Сделал всё в точности по инструкции, но в ПКО никакой контекстной подсказки не появилось ни по сочетанию crrl-space, ни через ПКМ.

    Reply
  53. tormozit

    (53) Где скриншот редактора ПКО?

    Reply
  54. neuronness

    (54)

    Reply
  55. Totoro

    (55) Если есть пользователи в КД, то нужно им назначить права с ИР и КД в конце названий.

    должна быть панелька в ПКО:

    Reply
  56. neuronness

    (56) Пользователей не было (да и зачем они в КД?). Добавил одного, назначив все возможные роли — то же самое, в ПКО контекстной подсказки нет и панельки нет.

    Reply
  57. Totoro

    (57) Скинул в личку ссылку на уже объединенную версию

    Reply
  58. neuronness

    (52) Добрый день. Подскажите пожалуйста, а под какой версией платформы запускаете? А то у меня тоже проблема с «Не удалось зарегистрировать DynamicWrapperX. Возможно требуется запуск от имени администратора.» Уже и вручную в Windows регистрировал компоненты, ничего не помогает.

    Reply
  59. tormozit

    (59) Как вариант, используй 32-разрядный клиент.

    Reply
  60. neuronness

    (60) Использую 32-разрядный клиент 8.3.11.3034 — та же фигня..

    Reply
  61. tormozit

    (61) Покажи скрин с окном «Административная регистрация COM компонент» в ИР. Ты же через него регистрировал эту компоненту?

    Reply
  62. Rackhanot

    (59) Я вообще под 8.2 запустил

    Reply
  63. Totoro

    (61) Вообще под всеми версии 32 разрядных клиентов работало. Сейчас проверил на файловой базе 8.3.12.1412 Win x64. Главное запустить сначала 1С под именем администратора. Можешь отдельно портативные ИР запустить — там как раз удобно регистрировать компоненты.

    Reply
  64. neuronness

    (62)

    Административная регистрация COM компонент

    Не нахожу в ИР объект «Административная регистрация COM компонент». Регистрацию вручную я проводил средствами Windows через команду regsrv32. Запускал 1С под администратором — все равно пишет «Не удалось зарегистрировать DynamicWrapperX. Возможно требуется запуск от имени администратора.» и уходит в перезагрузку базы и по новой.

    Разобрался. Открыл в чистой базе на платформе 8.3.11.3034 x32 ИР и там нашел обработку «Административная регистрация COM компонент». Зарегистрировал недостающий DynamicWrapperX. Спасибо за помощь!

    Reply
  65. kote

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

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

    Reply

Leave a Comment

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