Групповое редактирование реквизитов табличной части и движений документов LITE (управляемая форма)




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

62 Comments

  1. TODD22

    Работает в типовых? Или в любых?

    Reply
  2. karpik666

    (1) TODD22, работает в любых, протестировал на 3 конфигурациях, если нужно ее подключать Как внешку, то сегодня добавлю функционал бсп для подключения

    Reply
  3. karpik666

    Обновлено:

    Добавил функционал для подключения как внешнюю обработку к конфигурациям на основе БСП.

    Reply
  4. karpik666

    Кто скачал, отписывайтесь, устраивает или нет. Может чего нужно добавить или обработка идеальная=)

    Reply
  5. pvb2003

    Вид — «Контрагенты» — увы не найдено … БП 3.0

    Reply
  6. karpik666

    (5) pvb2003, а можно скрин ошибки?

    Reply
  7. balance

    При нажатии на кнопку отобрать в конфигурации 3.0 Бухгалтерия появляется сообщение

    {Форма.Форма.Форма(1127)}: Ошибка при вызове метода контекста (ЗначениеВДанныеФормы): Недопустимое значение параметра (параметр номер ‘2’)

    Reply
  8. karpik666

    (7) balance, ошибка связана с настройками функциональных опций, завтра выложу исправленную версию обработки.

    Reply
  9. karpik666

    Обновлено 12.08.2015

    Исправил ошибку с функциональными опциями, теперь если реквизит не доступен по функциональным опциям, то он не будет отображаться и в редакторе.

    Reply
  10. Sergant

    Добрый день!

    При нажатии Отобрать

    ОтобратьСервер()



    ЗначениеВДанныеФормы(лРезультатОтбора,ЭтаФорма.РезультатОтбора);

    Сообщение об ошибке:

    {Форма.Форма.Форма(1133)}: Ошибка при вызове метода контекста (ЗначениеВДанныеФормы): Недопустимое значение параметра (параметр номер ‘2’)

    Прошу исправить.

    БП 3.0 Последний релиз, БД MSSQL SERVER 2012

    Reply
  11. karpik666

    (10) Sergant, здравствуйте, подскажите включены ли функциональные опции, какой точно релиз конфигурации?

    Reply
  12. karpik666

    Обновлено 18.10.2015

    Исправил ошибку, приводящую в невозможности использования данной обработки для некоторыйх документов (Ошибка при вызове метода контекста (ЗначениеВДанныеФормы))

    Reply
  13. dimabenyash

    (12)

    Добрый день Управление торговлей, редакция 11.1 (11.1.9.56)

    {Форма.Форма.Форма(1146)}: Ошибка при вызове метода контекста (ЗначениеВДанныеФормы): Недопустимое значение параметра (параметр номер ‘2’)

    Обработку скачал сегодня.

    При выборе ссылки на документ (реализация товаров и услуг), нижняя табличная часть не заполняется!

    Reply
  14. karpik666

    (13) dimabenyash, странно думал эту проблему решил, у вас конфигурация с доработками?

    Reply
  15. karpik666

    (13) dimabenyash, Исправил, маленький недочет пропустил.

    Reply
  16. Светлый ум

    Интересный механизм: +1

    Reply
  17. FlexL

    спасибо за обработку … маленький совет … добавьте кнопку «выбрать все документы» , т.к. по одному документу в список добавлять документы трудоемко, а через запрос , консоль запросов добавление не удается

    Reply
  18. karpik666

    (17) FlexL, постараюсь вскоре выложить новую версию обработки, которая будет поддерживать множественный выбор, подскажите, а что не получается с консолью?

    Reply
  19. FlexL

    Не передаются данные запроса из консоли запроса в обработку. Т.е. после нажатие кнопки «добавить запросом», подключаю консоль запросов, пишу запрос, нажимаю «выбрать результат» и выдает ошибку. Правда я использовал консоль запросов http://infostart.ru/public/190493/, другой под рукой не было.

    Reply
  20. karpik666

    (19) FlexL, данная консоль для обычных форм, и она в принципе не работает на управляемых. Попробуйте консоль просто открыть в программе, скорее всего откроется пустая форма.

    Reply
  21. OlegBog1971

    Добрый день.

    Пытаюсь использовать вашу обработку в ЗУП 3.0

    Групповое изменение движений документа «Перенос данных» регистр «ВзаиморасчетыССотрудниками»

    На закладке «Список объектов» нажимаю кнопку «Добавить» — появляется список документов …

    А как выбрать конкретный документ?

    Кнопки выбора нет.

    Подключил консоль запросов, написал запрос — но почему то результаты запроса не переносятся

    Reply
  22. karpik666

    (21) OlegBog1971, когда нажимаете кнопку добавить, откроется форма выбора документов, 2 раза щелкаете мышкой на нужном вам документе, тогда он добавится в список объектов, чтобы работать с одним документов в обработке, просто в «списке объектов» должен быть один документ.

    Reply
  23. OlegBog1971

    (22) при двойном щелчке по нужному документу открывается сам документ, в список объектов ничего не попадает.

    Использую типовую ЗУП 3.0.25.64

    Reply
  24. karpik666

    (23) OlegBog1971, хм, а в левом верхнем углу нет кнопки выбрать? можете прислать скрин формы, когда выбираете?

    Reply
  25. OlegBog1971

    (24) вот скрин результата нажатия на кнопку Добавить — появляется список документов

    Reply
  26. OlegBog1971

    (24) вот скрин результата двойного клика при выборе конкретного документа — открывается сам документ

    Reply
  27. karpik666

    (26) OlegBog1971, вы не туда добавили скрины, нужно нажимать не на кнопку «Выберите файл», а ниже под полем для комментария «Прикрепить файл»

    Reply
  28. OlegBog1971

    пардон …

    как видите кнопки выбора нет

    Reply
  29. karpik666

    (28) OlegBog1971, хорошо сегодня протестирую для зуп 3.0, возможно это ошибка 8.3.7, напишите в личном сообщении свой e-mail и я как сделаю вышлю вам исправленную версию.

    Reply
  30. OlegBog1971

    (29) отправил в личку

    Reply
  31. Ироида

    Добрый день! 1С:Предприятие 8.3 (8.3.7.1873)

    Бухгалтерия государственного учреждения, редакция 2.0 (2.0.42.25)

    {Форма.Форма.Форма(1100)}: Ошибка при вызове метода контекста (ЗначениеВДанныеФормы): Недопустимое значение параметра (параметр номер ‘2’)

    Вид :Корректировка регистров

    Обработку скачала сегодня.

    Reply
  32. karpik666

    (31) Ироида, Добрый день, подскажите, при каких обстоятльствах проявляется ошибка, и в каком документе?

    Reply
  33. karpik666

    (31) Ироида, обновил, просьба перескачать обработку.

    Reply
  34. Dimok2010

    Как удалить лишние движения данной обработкой? Например у документ в регистре накопления 4 строки, нужно оставить две.

    Reply
  35. karpik666

    (34) Здравствуйте, данная обработка не обладает таким функционалом.

    Reply
  36. gull22
  37. Dimok2010

    (36) интересует обработка в управляемых формах

    Reply
  38. anreko

    У меня при использовании обработки возникла маленькая проблемка:

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

    После долгого анализа самойрешение проблемы оказалось до банальности простым:

    &НаСервере
    Функция КонтрольСсылокДляВыбораЗапросом(Адрес)
    

    вместо

    &НаКлиенте
    Функция КонтрольСсылокДляВыбораЗапросом(Адрес)

    И все заработало.

    Reply
  39. karpik666

    (38) давно в нее не заглядывал, спасибо за комментарий

    Reply
  40. anreko

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

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

    Reply
  41. karpik666

    (40) здравствуйте, потому-что версия лайт, у меня лежит про версия, все не могу выложить. Это сделано так как не у всех мощные компьютеры, а любой такой отбор вызывает серверный вызов, да и выбирать можно несколько документов, и отбор накладывать дополнительный, смысл получать то, что не факт, что тебе необходимо.

    Reply
  42. anreko

    Так выложи ПРО-версию, может там еще какие фичи интересные есть?

    Reply
  43. aderkatch

    Добрый день!

    При попытке изменить движения регистра бухгалтерии ЕПСБУ в бухгалтерской операции, на закладке что изменить не дает выбрать субконто. Выбирает только его тип. Это косяк!!!

    Reply
  44. karpik666

    (43) Здравствуйте, а после того как выбрали тип нельзя продолжить выбор субконто?

    Reply
  45. Yran

    В настройках при выборе консоли запросов выдает ошибку:

    {ВнешняяОбработка.РедактированиеРеквизитовТЧУпрФорма.Форма.Настройки.Форма(68)}: В обработчике ОбработкаЗапросаПутьНачалоВыбора используется вызов контекстного серверного метода формы

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

    Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.52.36) (http://v8.1c.ru/buhv8/)

    Copyright (С) ООО «1C-Софт», 2009 — 2017. Все права защищены

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

    Расширение конфигурации: Расширение У

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

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

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

    Вариант интерфейса: Такси

    Ошибки:

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

    29.09.2017 15:25:59

    {ВнешняяОбработка.РедактированиеРеквизитовТЧУпрФорма.Форма.Настройки.Форма(68)}: В обработчике ОбработкаЗапросаПутьНачалоВыбора используется вызов контекстного серверного метода формы

    Reply
  46. karpik666

    (45) ошибку зафиксировал, спасибо

    Reply
  47. 1996oks

    (44) Здравствуйте! действительно, после выбора типа не выпадает список выбора субконто.

    Например ДоговорКонтрагента выбирает просто Договор из типа, а после изменения очищает реквизит в операции совсем, не заполняя его вообще ничем.

    Reply
  48. 1996oks

    (47)

    (44)

    Простите, а для нас есть вариант решения проблемы?

    Reply
  49. leonidt84

    Все хорошо, но вот КонтрольСсылокДляВыбораЗапросом(Адрес) поправьте уже. Перенесите её на сервер, с результатом запроса нельзя на клиенте работать.

    Или это такой интеллектуальный ценз на использование конструктора запросов?

    Reply
  50. Garstag

    Проблему с выбором субконто так и не решили с июля месяца?

    Reply
  51. qwersh

    ваша обработка подойдет для документа «Перенос данных» в ЗУП 3,1?

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

    Reply
  52. karpik666

    (52) да, конечно, выбираете, что нужно редактировать движения.

    Reply
  53. nikavilk

    Добрый день Андрей!

    Скачала вашу обработку для документа «Перенос данных» в ЗУП 3,1(спасибо за неё!), столкнулась с неясностью:

    может ли быть так, что в вашей обработке отображаются не все регистры, закрепленные для документа «Перенос данных» ?

    Выбрала вид: «Перенос данных», галка «Редактировать движения» стоит, а в списке движений отсутствует нужный регистр накопления: «Учет доходов для исчисления страховых взносов», в доке «Перенос данных» он есть, подскажите как его выбрать в обработку?

    скриншоты во вложении

    Reply
  54. karpik666

    (54) таблица отображает регистры, так как они выглядят в конфигураторе, скорее всего ваш регистр в конфигураторе называется немного иначе

    Reply
  55. nikavilk

    Да спасибо, разобралась,

    (55)

    Reply
  56. denisvilny

    Отличная обработка, меня пока всё устраивает, благодарю!

    Reply
  57. anreko

    Нашел еще ошибку: процедура ЗаполнитьНастройки, строка 958, насчет строки не уверен:

    Было:

    лНайденноеЗначение = мСписокРеквизитов.НайтиПоЗначению(лЗначение.Значение);

    Должно быть:

    лНайденноеЗначение = мСписокРеквизитов.НайтиПоЗначению(лЗначение);

    Иначе вместо нужных недоступных строк, удаляются просто все подряд и табличные части затем отображаются некорректно.

    Reply
  58. karpik666

    (58) Здравствуйте. спасибо за замечание, проверю в ближайшее время.

    Reply
  59. anreko

    Нашел еще одну ошибку:

    В случае если в ТЗ, есть тип уникальный идентификатор или неопредено, то в запросе такую ТЗ выбрать нельзя.

    Как решение, пришлось удалять такие строки из ТЗ для обработки:
    
    Для Каждого КолонкаТЗ из РезультатОтбора.Колонки Цикл
    Если КолонкаТЗ.ТипЗначения.СодержитТип(Тип(«УникальныйИдентификатор»)) или КолонкаТЗ.ТипЗначения.СодержитТип(Тип(«Неопределено»)) Тогда
    РезультатОтбора.Колонки.Удалить(КолонкаТЗ);
    КонецЕсли;
    КонецЦикла;  

    Это вставка в функцию Функция ЗаписатьНаСервере(пПараметры) после инициализации переменной РезультатОтбора.

    Reply
  60. FrickA

    Здравствуйте! Подойдет Ваша обработка для редактирование проводок документа «Начисление зарплаты» 1С Бухгалтерия 8.3.

    Reply
  61. karpik666

    (61) Здравствуйте, да, если хотите подменить одно значение на другое.

    Reply
  62. FrickA

    т.е. я могу менять счета бухгалтерского учета? т.к. 1с заблокировала эту функцию

    Reply

Leave a Comment

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