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




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

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