Групповая обработка справочников и документов (Управляемая форма) v 3.3




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

99 Comments

  1. kompas-dm

    (0) Посмотрите эту работу от Поручика

    Reply
  2. kser87

    (1) kompas-dm, такая тоже есть. Но простые пользователи ее не воспринимают обычно.

    Reply
  3. Поручик

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

    Reply
  4. Поручик

    (2) Отбор по дополнительным свойствам и реквизитам в СКД происходит через ссылку на объект.

    Reply
  5. petrov_al

    Простите, не подскажете где можно взять обработку «Изменение выделенных объектов».

    Reply
  6. Поручик

    (5) Нигде. Это принадлежность конфигураций на БСП (Управление торговлей 11, Розница 2, УНФ). Копай типовые

    Reply
  7. kser87

    (5) petrov_al, Обработка называется «ГрупповоеИзменениеОбъектов». У нее есть один большой недостаток: для того, чтобы добавить ее к нужному объекту, нужно менять конфигурацию.

    Reply
  8. kser87

    (4) Поручик, Насколько я знаю, это происходит в том случае, если у объекта в Конфигураторе указана таблица характеристик. Вкладка «данные»- кнопка «Характеристики». Иначе их приходится указывать на вкладке «характеристики» в конструкторе запроса СКД.

    Reply
  9. chum

    Спасибо за работу! Давно искал.

    А как настроить отбор, чтобы туда не попали группы, а только входящие в их состав элементы?

    Reply
  10. kser87

    (9) chum, поставить отбор по полю родитель. Или поставить отбор по полю «ссылка», вид сравнения = «В группе»

    Reply
  11. chum

    (10) не получилось. В номенклатуре группы, подгруппы и т.п.

    «Или поставить отбор по полю «ссылка», вид сравнения = «В группе» «, так в отбор попадают не только элементы, но и группы в которые они входят.

    В номенклатуре глубокая иерархия и хочется обработать все элементы входящие в состав глобальной группы.

    Reply
  12. kser87

    (11) chum, тогда ставьте еще условие ЭтоГруппа = Ложь;

    Reply
  13. chum

    (12) получилось.

    Большое человеческое спасибо!

    Мало того что сделал, так ещё и пользоваться научил…

    Reply
  14. kser87

    (13) chum, Не за что, обращайтесь

    Reply
  15. s_uu

    А существует ли групповая обработка регистров сведений??

    Reply
  16. kser87

    (15) s_uu, для обычного приложения разработано много обработок.

    Reply
  17. internetname

    Нужная вещь.

    Reply
  18. DimanYa

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

    Подскажите какая обработка лучше ваша или Поручика? а то ограничен в средствах для скачивания.

    Reply
  19. kser87

    (18) DimanYa, Если вы специалист по 1С, то качайте конечно у Поручика. Она сложнее для понимания, но функций у нее значительно больше.

    Reply
  20. wunderland

    (2)такое простым пользователям вообще давать нельзя. мало того что «с шашкой на голо…» та к еще и шашка тротиловая 🙂

    Reply
  21. kser87

    (20) wunderland, но для спеца вещь незаменимая

    Reply
  22. Йожкин Кот

    Плюсую. Но не хватает в выборе типа объекта ПВХ, Планов видов расчета. Доделайте, если не трудно.

    PS. Да и Планы счетов, Бизнес-процессы и Задачи до кучи можно добавить.

    Reply
  23. Re:аниматор

    Не хватает обработки табличных частей документа, а так все хорошо!

    Reply
  24. kser87

    (22) Йожкин Кот, сейчас в отпуске) выйду, добавлю ПВХ и План видов расчета. Бизнес-процессы и задачи потом тоже можно сделать. На счет Плана Счетов: сомневаюсь в необходимости. Что вы хотите там менять групповой обработкой?

    Reply
  25. kser87

    (24) Это уже реализовано

    Reply
  26. s_uu

    Обработка помогла, спасибо!

    Reply
  27. Йожкин Кот

    (24) я ж написал «до кучи» 🙂

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

    Reply
  28. KliMich

    Спасибо! Пригодиться.

    Reply
  29. Йожкин Кот

    спс за ПВХ и ПВР!

    Reply
  30. kser87

    (29) Йожкин Кот, будьте аккуратнее с ними.

    Reply
  31. Alex_E

    Вещь нужная! Добавьте птичку «Отключить контроль записи».

    Reply
  32. kser87

    (31) Alex_E, Что вы имеете в виду?

    Reply
  33. Alex_E

    (32) Иногда надо например сделать групповое изменения в договорах контрагентов (после переноса из 7.7 итп), но изменить их не дает контроль. Если установить при обработке ОбменДанными = Истина — то изменения пройдут, но лучше это сделать отключаемой опцией, потому и написал

    Добавьте птичку «Отключить контроль записи».

    .

    Reply
  34. kser87

    (33) Alex_E, Сделаю, спасибо за совет. Сам бы никогда не додумался до этого.

    Reply
  35. Shrek2015

    хорошая штука. спасибо автору!

    Reply
  36. Samojlov_Denis

    в 11.1.2.10 не работает — что то там с правами доступа намудрили

    Reply
  37. kser87

    (36) anado, расскажите подробнее: что такое «11.1.2.10». Если выдает ошибку, то копируйте текст ошибки.

    Reply
  38. Samojlov_Denis

    (37) это конфигурация «Управление торговли» 11.1.2.10

    Платформа: 1С:Предприятие 8.2 (8.2.18.109)

    Конфигурация: Управление торговлей, редакция 11.1 (11.1.2.10) (http://v8.1c.ru/trade/)

    Copyright © ООО «1C», 2003-2013. Все права защищены

    (http://www.1c.ru)

    Режим: Файловый (без сжатия)

    Приложение: Тонкий клиент

    Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)

    Ошибки:

    ———————————————————————————

    08.08.2013 23:02:52

    {Форма.Форма.Форма(907)}: Ошибка при вызове метода контекста (ОтменитьТранзакцию)

    ОтменитьТранзакцию();

    по причине:

    Транзакция не активна

    Показать

    {Форма.Форма.Форма(901)}: Ошибка при вызове метода контекста (Записать): Нарушение прав доступа!
    Reply
  39. kser87

    (38) anado, ошибка с неактивной транзакцией моя скорее всего, а

    вот про это ничего подсказать не смогу, к сожалению:

    {Форма.Форма.Форма(901)}: Ошибка при вызове метода контекста (Записать): Нарушение прав доступа!

    на всякий случай:

    При двойной щелчке мыши по этому сообщению откроется объект, запись которого не удалась

    Reply
  40. Samojlov_Denis

    (39) неактивная транзакция это следствие, ошибки нарушения прав доступа — а эта ошибка присуще всем внешним обработкам, которые изменяют данные (не только вашей) в УТ 11.1.2.10 видимо что-то с правами намутили. Ни одна обработка, которая адекватно работала с документами в УТ 11.1.2.9, теперь не пашет.

    Reply
  41. dyak84

    Автор а с табличними полями твоя обработка работает, по скриншотам не видно добав еще скринов.З труд спасибо так держать. Заслуженое 5+++++

    Reply
  42. kser87

    (40) anado, объясняю ситуацию:

    1) Обработка должна изменить 10 объектов в единой транзакции.

    2) 7 успешно изменяются, а запись 8-го вызывает ошибку.

    3) При этом вызывается метод «ОтменитьТранзакцию()», транзакция становится неактивной.

    4) Но обработка продолжала пытаться изменить оставшиеся 2 объекта. Это и являлось ошибкой.

    5) Запись 9-го объекта вызвала ошибку. Снова вызывается метод «ОтменитьТранзакцию()», но транзакция уже была неактивна после п.3. именно это и вызвало ошибку:

    {Форма.Форма.Форма(907)}: Ошибка при вызове метода контекста (ОтменитьТранзакцию)

    ОтменитьТранзакцию();

    по причине:

    Транзакция не активна

    Я внес такую доработку: при выполнении обработки в единой транзакции, при появлении ошибки, обработка прерывается, а потом вызывается метод «ОтменитьТранзакцию()».

    P.S. К сожалению, про косяки с правами ничего сказать не могу, т.к. с УТ не работаю.

    Reply
  43. kser87

    (41) dyak84, Спасибо! Учту ваше замечание

    Reply
  44. skyp

    Спасибо за обработку! Как раз то, что нужно!

    Reply
  45. Samojlov_Denis

    (42) потестил 1.5 в УТ 11.1.2.10 при добавлении обработки штатными способами — вываливаются тежи ошибки, но если запускать обработку Файлоткрыть… то всё работает — непонятно, глюк какой то.

    З.Ы. Да ещё нюанс при проведении документов надо включать сортировку по дате, по умолчанию стоит по виду документа. Я бы посоветовал исправить, что бы визуальная сортировка не влияла на последовательность проведения документов.

    Reply
  46. kser87

    (45) anado, с первым попробую воспроизвести, может получиться разобраться.

    второе доделаю, отличная идея. Вообще в последней версии есть сортировка, можете пока ей воспользоваться.

    Reply
  47. Samojlov_Denis

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

    Reply
  48. kser87

    (47) anado, ну для перепроведения документов лучше воспользоваться обработкой «Проведение документов» с ИТС

    Reply
  49. Samojlov_Denis

    Для этого надо заходить под толстым клиентом в обычном приложении — что не всегда удобно, ещё как вариант есть типовое проведение в самой конфигурации. Но если уже отобраны документы по нужным параметрам и есть возможность с ними работать — то запускать какие то ещё обработки и их настраивать — как то не охота.

    Reply
  50. JIexa_74

    Не открывается почему то: файл—открыть—-и тишинааа…

    1с 8.2 (8.2.18) УТ10.3 !

    В чем может быть проблема.

    В конфиге открывал там все норм….

    Reply
  51. Поручик

    (50) Ржачно. УТ 10.3 работает в управляемом режиме? Ваша проблема в незнании матчасти. Пользуйтесь обычной обработкой из комплекта УТ 10.3

    Reply
  52. clab

    Спасибо за обработку !!! очень нужная вещь,

    Пофиксили падение на реквизите с типом значения «ХранилищеЗначений» (Форма строки 760-766)

            Массив = Новый Массив;
    Массив.Добавить(Тип(«ХранилищеЗначения»));
    ОписаниеТиповХранилище = Новый ОписаниеТипов(Массив);
    Для Каждого ЭлементРеквизита Из ТаблицаКопия Цикл
    Если ЭлементРеквизита.ОписаниеТипов = ОписаниеТиповХранилище тогда
    Продолжить;
    КонецЕсли;

    (и 781-783)

                Если ЭлементРеквизита.ОписаниеТипов = ОписаниеТиповХранилище тогда
    Продолжить;
    КонецЕсли;
    Reply
  53. serega3914

    Штука нужная в арсенале. +

    Reply
  54. mixagor

    Спасибо, все работает. Вещь нужная!

    Reply
  55. Поручик

    (0) Почему бы сразу не добавлять отбор и сортировку по всем полям объекта, только по умолчанию с отключенным использованием? Посмотри, как у меня по ссылке в первом посте сделано. Если лень скачивать, то я сделал заполнение отбора, сортировки при первом выборе объекта метаданных. Так удобнее.

    Reply
  56. Aspirant

    хорошая штука, потестим!

    Reply
  57. Logarifm_Andre11111111111111

    Замечательная обработка.

    Спасибо автору.

    Reply
  58. SAS99

    Добавить бы еще возможность сохранения нескольких вариантов настроек.

    Reply
  59. kit

    Работает, плюсанул.

    Reply
  60. Поручик

    (0) Добавьте фикс из поста (52) . Иначе ошибка.

    Reply
  61. kser87

    (60) Поручик, есть такой! поправлю в ближайшее время

    Reply
  62. kser87

    (55) Поручик, Потому, что полей может быть очень много и искать нужный элемент будет неудобно.

    Reply
  63. Alister

    Спасибо за обработку, очень помогла. Только не понравилось, что при снятии флажка у одного из видов документов полностью очистились элементы отбора, пришлось их заполнять заново, ИМХО это не очень удобно.

    Еще было бы не плохо сделать обработку ошибок проведения, чтобы пропускать документы с ошибками.

    Reply
  64. kser87

    (63) Alister, действительно. Что-нибудь придумаю

    Reply
  65. Alister

    Еще одни косяк: выбираю вид «Документы», выбираю кнопкой «все», галки проставляются у всех видов документов, но при отборе пишет сообщение, что надо выбрать хотя бы один объект метаданных, вручную снимаюставлю галку — начинает работать.

    Reply
  66. kser87

    (65) Alister, поправлю

    Reply
  67. kser87

    (65)(63) внес поправки в код обработки.

    По поводу отбора: сохраняются только доступные всем выбранным объектам поля отбора.

    Reply
  68. Alister
    По поводу отбора: сохраняются только доступные всем выбранным объектам поля отбора.

    Я имел в виду не поля отбора, а отбор в таблицу документов, т.е. я через кнопку установил галки для всех видов документов (надо было всем существующим в базе документам установить пометку удаления), а потом кнопкой «Отобрать» хотел заполнить нижнюю таблицу.

    п.с. можно уже скачивать ?

    Reply
  69. kser87

    (68) Alister, был ответ на сообщение(63). Можно качать

    Reply
  70. Alister

    (69) спасибо — все получилось.

    Reply
  71. mikeA

    Обработка объектов производится на клиенте или на сервере?

    Reply
  72. kser87

    (72) mikeA, конечно на сервере.

    Reply
  73. mikeA

    (73)

    ну да, понятно что на сервере, не так выразился )))

    у тебя каждая ссылка передаётся на сервер, все ссылки сразу или частями, чтобы периодически обновлять индикатор выполнения?

    и вообще, с точки зрения производительности имеет смысл передавать на сервер сразу все ссылки или можно и по одной?

    Reply
  74. kser87

    (74) mikeA, все сразу передается на сервер, индикатора нет. С точки зрения производительности передавать по одной вообще не имеет смысла

    Reply
  75. mikeA

    (75) спасибо, тогда качаю. что-то подобное и искал.

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

    можно объединить с количеством элементов в транзакции. а то когда ссылок тысяч десять и оно ушло с ними на сервер, хз умерло оно там уже или ещё шевелится. по 500 элементов в транзакции например это 20 лишних серверных вызовов, думаю при проведении тех же реализаций в типовых будет незаметно.

    Reply
  76. kser87

    (76) mikeA, попробую

    Reply
  77. rokhin

    Спасибо за обработку. Добавлял возможность корректировки в режиме обмена.

    Не из-за увеличения скорости, а чтоб обойти запрет при проверке.

    Однако не сразу заметил «уход» на функционал типовой конфигурации, попотел ))))

    Reply
  78. kser87

    (78) rokhin, честно говоря, не очень понял фразу. Вы сами добавляли возможность обработки в режиме «ОбменДанными.Загрузка = Истина»?

    Reply
  79. rokhin

    да. Вы точно сформулировали.

    Reply
  80. oleg212

    Спасибо за старую-добрую обработку теперь для управляемых форм.

    Reply
  81. ejka

    Спасибо, пригодилось. 🙂 Странно, что в типовой такую нужную вещь убрали.

    Reply
  82. kser87

    (82) ejka, пожалуйста! В типовой есть альтернатива: «Групповое изменение объектов». Она не слишком удачная)

    Reply
  83. Поручик

    А в типовых на БСП хоть что-то удачное есть? Универсальный обмен XML и тот сделан фактически на отъеппитесь.

    Reply
  84. kser87

    (84) Поручик, не будьте так жестоки. Есть и удачные вещи. Мне очень пригодилась подсистема «Варианты отчетов». «Дополнительные свойства» интересно сделаны.

    Reply
  85. feel063

    Спасибо!Искал для управляемых форм

    Reply
  86. Хегга

    Безумно нужная вещь, и сделана с тщанием. Один косяк — не работает.

    Точнее, работает, но в Бухгалтерия предприятия, редакция 3.0 (3.0.28.7) в поле «Тип объекта» пишет только Справочник, а переключателя типов — нет.

    Проверил на древней 3.0.23.9 — там все в порядке.

    Автор, поправь пожалуйста, а то страсть как Документы поправить хочется.

    Reply
  87. Поручик

    Если речь идёт об 1С:Предприятии 8.3 (8.3.4.389), то работает.

    Reply
  88. kser87

    (87) Хегга, если это в «Такси», то нужно просто кликнуть левой кнопкой мыши по полю с выбором типа. Тогда вывалится список

    Reply
  89. kser87

    (87) Хегга, добавил в 8.3 привычную кнопку списка в поле выбора типа. Попробуйте

    Reply
  90. Хегга

    Проверил. Версия 2.3 работает на «отлично». Большое спасибо за молниеносную оперативность.

    Reply
  91. kser87

    (91) Хегга, не за что. Спасибо за активную пользовательскую позицию)

    Reply
  92. vbuots

    В Вашей обработке явно!!! не хватает отбора и установки общих реквизитов.

    Reply
  93. BodunOff

    А изменение реквизитов объектов в ней предусмотрено? Задача, все товары из выбранного документа «Установка Цен Номенклатуры» перекинуть в другую ценовую группу.

    Reply
  94. kser87

    (93) vbuots, постараюсь сделать

    Reply
  95. kser87

    (94) BodunOff, изменение реквизитов — это основное назначение обработки.

    Ценовая группа — это что? Реквизит товара?

    Reply
  96. BodunOff

    (95) Да, это реквизит номенклатуры.

    Reply
  97. kser87

    (97) BodunOff, понял, что вы хотите сделать. К сожалению, моя обработка вам не поможет. Если вы владеете встроенным языком 1С, то воспользуйтесь этим: (1)

    Reply
  98. BodunOff

    (98) Смотрел её, к сожалению мозга недостаточно чтобы реализовать произвольный запрос. Стандартом там также до этого реквизита не добраться((( Спасибо, Ваша обработка всё равно легла в коллекцию «Must have»!

    Reply
  99. Поручик

    (99) Триста рублей и напишу вам код для произвольного алгоритма для изменения реквизита реквизита.

    Reply

Leave a Comment

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