Конвертация данных + Контекстная подсказка 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 // Полная загрузка сервисных книжек, создан 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='\

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 не будет опубликован. Обязательные поля помечены *