Универсальный реестр документов




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

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

73 Comments

  1. VitaliySm

    первые 5 пользователей, скачавших обработку, скачайте поновой, в той версии была ошибка

    Reply
  2. Шёпот теней

    Спасибо! мне всё понравилось! и даже покритиковать не за, что…. Удачи!

    Reply
  3. php5

    В нетиповой конфигурации при открытии выдает ошибку:

    {Форма.Форма(209,113)}: Переменная не определена (глТекущийПользователь)

    МакетПостроителя.Область(«R»+ Строка(ОбластьПодвала.Верх) + «C2»).Текст = «отчет сформирован пользователем » + <<?>>глТекущийПользователь;

    {Форма.Форма(364,15)}: Процедура или функция с указанным именем не определена (ЕстьТабЧастьДокумента)

    ЕстьТовары=<<?>>ЕстьТабЧастьДокумента(«Товары», НовыйДок.Метаданные());

    {Форма.Форма(365,15)}: Процедура или функция с указанным именем не определена (ЕстьТабЧастьДокумента)

    ЕстьУслуги=<<?>>ЕстьТабЧастьДокумента(«Услуги», НовыйДок.Метаданные());

    Reply
  4. Abadonna

    (3) Кстати, на заметку всем, кто ссылается на функции ГМ стандартных конфигураций:

    надо их копировать с обработку и ни у кого тогда проблем не возникнет

    Reply
  5. VitaliySm

    по совету Abadonna внес сделал обработку полностью универсальной + добавил версию на 8.1 для особо ленивых 🙂

    Reply
  6. VitaliySm

    по совету Abadonna сделал обработку полностью универсальной + добавил версию на 8.1 для особо ленивых 🙂

    Reply
  7. imsoftware

    Все супер! +1

    Reply
  8. polyusgold

    все отлично, удобно и легко

    Reply
  9. Андроид

    Все класно. Но есть определенные неудобства.

    1. При выборе отбора даты надо учитывать время.

    Reply
  10. Одинец

    Классный отче, но было бы СУПЕР, если бы выводил Суммы и СуммыНДС и соответственно итоги в подвале…

    Reply
  11. KOVRUS

    Отличная обработка

    Reply
  12. Turubanov

    Good!

    Reply
  13. Signal

    Автор, может быть добавите возможность сохранения настроек?

    Reply
  14. likoily

    Автор — просто умничка!

    Reply
  15. Asdam

    Добавить бы колонку «Номер по порядку» и опцию «Расчитывать ширину колонки по содержимому», а то, например, колонка «валюта», слишком широкая получается.

    Reply
  16. Winston

    СПАСИБО. Очень понравился. Вещь стоящая, сильно спасла. Сохранение настроек бы

    Reply
  17. debuger

    СПАСИБО! Сохранение настроек не хватает.

    Reply
  18. mashinist

    может я чего-то не понял… а как выбирать диапазон дат? или это только за сегодя?

    Reply
  19. mashinist

    тупанул. все понятно

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

    Reply
  20. sergecontact

    Спасибо!

    Reply
  21. mashinist

    К сожалению без сохранения настроек практически невозможно пользоваться.

    Очень жаль… Все так удобно…

    Автор! Может можно сделать сохранение настроек?

    А то 15 мин настраиваешь отчет как нужно… Явно этого каждый раз делать не будешь…

    Reply
  22. KvazaR

    Спасиб… отличная обработка. большой +!!!

    Reply
  23. VitaliySm

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

    Reply
  24. luns

    УТ 10.3.6.8

    Как печатная форма не подключилась к поступлению, на других доках не смотрел.

    Просто как отчет тоже не открывается:

    Код
    {Форма.Форма(220)}: Поле объекта не обнаружено (СохраненнаяНастройка)
          СтруктураСНастройками = Результат.СохраненнаяНастройка;
    
    

    Показать полностью

    Reply
  25. VitaliySm

    (24) Спасибо. Исправил. Обработку нужно открывать просто, не подключая к документам

    Reply
  26. VitaliySm

    Первые 6 пользователей, качавших версию 2, обновите свою версию, там были ошибки

    Reply
  27. Ex

    Ошибка при установке галочек: Только товары, Только Услуги.

    УТ 10.3.6.8

    Ошибка выдается только в версии 2.

    Значение не является значением объектного типа (Объект)

    ВидДокумента = ИскомыйОбъект.Объект.Имя;

    Reply
  28. VitaliySm

    Ex — спасибо, исправил ошибку.

    Reply
  29. Кадош

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

    Reply
  30. VitaliySm

    Кадош — смотри изменения в версии 2.02. И спасибо за идею 🙂

    Reply
  31. Nikola178

    Доброго времени всем.

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

    А в остальном просто отлично все….Большое СПАСИБО автору!!!!

    Reply
  32. Nikola178

    Доброго времени всем.

    Да , я еще потестил. Может имеет смысл еще сделать чтоб выборка происходила не только по отдельности (товары или услуги), но и вместе И товары И услуги.

    На мой взгляд это было б более удобно и гибко:)

    Reply
  33. schthaxe

    Добрый день. А я вот как то сразу напоролся на ошибку.

    в УТ есть такой документ — ЧекККМ. У этого документа есть *реквизит* ЧекККМ. При попытке вывести реестр чеков из-за этого оно ругается. — неоднозначный ЧекККМ.Номер у него.

    поправил я это добавив алиас для документа.

    ТекстЗапроса=ТекстЗапроса + Символы.ПС + «ИЗ » + ВидДокумента + » КАК Д_» + ИмяДокумента;

    этого оказалось достаточно для возвращения работоспособности.

    Reply
  34. BrdUA

    УТП для Украины — бухгалтер счастлив, спасибо.

    Reply
  35. boy13

    Заюзал. Понравилось. +1

    Reply
  36. AvalonE2008

    Обработка супер!!!Если автору несложно пусть скинет «рассказ» о том как он делал эту обработку, покрайней мере про компоновщик данных!Буду безмерно благодарен!

    Reply
  37. VitaliySm

    to AvalonE2008 — спасибо за оценку. Насчет рассказа я подумаю. Только во всех текущих версиях обработки используется построитель отчета а не СКД. Сейчас пишу новую версию реестра, на базе СКД, с возможностью распечатывать реестр документов разного типа, и ещё некоторыми «вкусностями». Но это «внеклассная» работа, поэтому сроки не озвучиваю.

    Reply
  38. AvalonE2008

    to VitaliySm, немогли бы вы подсказаать, возможно ли изменение этого отчета таким образом чтоб можно было обрабатывать несколько документов а не один как сейчас? Если возможно, то скажите где копать я постараюсь поправить.

    Reply
  39. VitaliySm

    to AvalonE2008 — сейчас как раз этим и занимаюсь. В новой версии будет возможность создать реестр из документов разных типов. Причем можно будет их вывести общим списком (но только с одинаковым набором полей) либо каждый документ отдельной таблицей. В принципе пилотная версия будет построена пока на базе этой версии, но потом планирую попробовать на СКД это дело переписать.

    Reply
  40. cheri

    Обработка понравилась! Всё отлично работает! Спасибо! +

    Reply
  41. khokhlov_av

    Было бы здорово, если добавить возможность отбора по свойствам и категориям…

    Reply
  42. dergnata

    Добавьте пожалуйста вывод итогов по нескольким колонкам очень надо)

    Reply
  43. AlexKazmin

    Круто спасибо очень нужная вещь

    Reply
  44. platinum

    Хоть кто-нибудь бы сделал реестр с итогами по документам, где нет поля СуммаДокумента.Отчет был бы на порядок ценнее. Народ и делайте доступ для всех, а не только пользователей, а то скачаешь один, а там хрень какая-то и все жди следующего дня.

    Reply
  45. AVARY
    Народ и делайте доступ для всех, а не только пользователей, а то скачаешь один, а там хрень какая-то и все жди следующего дня.

    400р и весь ИС к Вашим услугам! 😎

    Reply
  46. platinum

    Все-таки скачал отчет. Это лучшее по реестрам для 1с8, что есть на сайте.

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

    И странно у меня как-то работает сортировка, например, по документу «перемещение товаров» «склад получателя», большинство строк нормально сортирует,но есть и расхождения, например:

    ШуяТехСервис(Завиновский)

    ШуяТехСервис(Завиновский)

    Управление (Рябоева)

    Управление (Рябоева)

    ШуяТехСервис (Амосов)

    ШуяТехСервис (Амосов)

    ШуяТехСервис (Амосов)

    и в конце вообще выбивается:

    ШуяТехСервис(Салиев)

    Терминал

    Терминал

    Порос

    Хотя Терминал и Порос должны были идти до буквы «Ш»

    Reply
  47. platinum

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

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

    Reply
  48. VitaliySm

    (47) к сожалению пока ничего не могу сказать по планам. В наше нелегкое время вопрос зарабатывания стоит острее, на доработку реестра к сожалению не хватает времени. вот найду клиента, который за это заплатит, и доработаю 🙂

    Reply
  49. platinum

    Одно радует. что автор отчет жив,т.е. заглядывает на сайт, и это самое главное)) Желаю удачи в поисках платежеспособных клиентов)

    Reply
  50. VitaliySm

    Обновилась версия обработки. Изменение только одно пока: есть возможность в реестре выводить числовые показатели из табличных частей документа. Т.е. например, вместе с номером и датой документа можно вывести итоговую сумму по таб.части «товары» и т.д.

    Reply
  51. alexasha

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

    Reply
  52. VitaliySm

    Всем скачавшим версию 2.03 рекомендую обновить её, т.к. была обнаружена ошибка при обработке таб. частей документов. Если реквизит таб. части имел кроме типа «Число» ещё какие-то типы, то при попытке сформировать реестр выдавалась ошибка.

    Reply
  53. bogatiyr

    +1

    Reply
  54. SotNick

    Отличный отчет!

    Reply
  55. margosha-80

    Супер отчет! Последняя доработка просто то что требовалось

    Reply
  56. maraty

    Отличный отчет, спасибо!

    У меня выдавало пару ошибок,

    первая с составным типом в табличной части

    Если РеквизитТЧ.Тип.СодержитТип(Тип(«Число»)) Тогда

    Заменил на

    Если (РеквизитТЧ.Тип.Типы().Количество() = 1) И (РеквизитТЧ.Тип.СодержитТип(Тип(«Число»))) Тогда

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

    В «ИТОГИ ПО» ко всем полям Дата добавил ИмяДокумента+».»

    типа «НАЧАЛОПЕРИОДА(«+ИмяДокумента + «.Дата, ДЕНЬ) КАК День,»

    и исправил далее строки

    ТекстЗапроса=ТекстЗапроса + Символы.ПС + «,»+ИмяДокумента+».Контрагент»;

    тестировал на УТ 10.3.12 и БП 2.0.19

    Reply
  57. leexey

    Видел выше замечание о сохранении и восстановлении настроек, у меня в версии 2.03 они вообще неактивны.. или это только у меня?

    Бухгалтерия для Молдовы ред. 1.1

    Reply
  58. VitaliySm
    leexey пишет:

    Видел выше замечание о сохранении и восстановлении настроек, у меня в версии 2.03 они вообще неактивны.. или это только у меня?

    Бухгалтерия для Молдовы ред. 1.1

    Механизм сохранения настроек работает только в тех конфигурациях, в которых есть определенные метаданные, связанные с этим механизмом.

    Reply
  59. vera-kn

    Всё отлично!

    Reply
  60. divalis

    Спасибо, помогло!

    Reply
  61. ivsi2

    Все-таки скачал отчет. Это лучшее по реестрам для 1с8, что есть на сайте.

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

    И странно у меня как-то работает сортировка, например, по документу «перемещение товаров» «склад получателя», большинство строк нормально сортирует,но есть и расхождения, например:

    ШуяТехСервис(Завиновский)

    ШуяТехСервис(Завиновский)

    Управление (Рябоева)

    Управление (Рябоева)

    ШуяТехСервис (Амосов)

    ШуяТехСервис (Амосов)

    ШуяТехСервис (Амосов)

    и в конце вообще выбивается:

    ШуяТехСервис(Салиев)

    Терминал

    Терминал

    Порос

    Хотя Терминал и Порос должны были идти до буквы «Ш»

    Reply
  62. e_kazakova

    Обработка супер. То что надо. Огромное спасибо. Опробовала в БП 8.2

    Reply
  63. trustgros

    отличная обработка как раз пригодилась для задания от главбуха

    Reply
  64. Sonrisa

    При выборе документа Реализация товаров услуг в БП 2.0 (2.0.30.8), платформа 8.2.14.533 сразу выдает ошибку:

    {Форма.Форма.Форма(113)}: Ошибка при установке значения атрибута контекста (Текст)

    Построитель.Текст=ТекстЗапроса;

    по причине:

    по причине:

    {(107, 3)}: Неоднозначное поле «Контрагент»

    ,<<?>>Контрагент

    Reply
  65. luckardo

    Если глВводНовогоДокумента<<?>>(Документ)=0 Тогда

    {C:*.ERT(1621)}: Функция не обнаружена (глВводНовогоДокумента)

    после исправления работает хорошо

    Reply
  66. Sonrisa

    дополнение к (64) Sonrisa

    получилось. Если в таблчасти Агентских услуг поставить название реквизита вместо Контрагент Контрагент1. тогда все хорошо. Плюс похожее идет и в акте сверки. В нем на дату ругается:

    {Форма.Форма.Форма(113)}: Ошибка при установке значения атрибута контекста (Текст)

    Построитель.Текст=ТекстЗапроса;

    по причине:

    по причине:

    {(57, 97)}: Неоднозначное поле «Дата»

    СУММА(АктСверкиВзаиморасчетовПоДаннымКонтрагентаКредит) ПО Общие {ИТОГИ ПО Дата, НАЧАЛОПЕРИОДА(<<?>>Дата, ДЕНЬ) КАК День, НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ) КАК Неделя, НАЧАЛОПЕРИОДА(Дата, ДЕКАДА) КАК Декада, НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) КАК Месяц, НАЧАЛОПЕРИОДА(Дата, Квартал) КАК Квартал, НАЧАЛОПЕРИОДА(Дата, ГОД) КАК Год

    Reply
  67. timmi

    Огромнейшее спасибо ! Очень и очень полезная штука. Юзаю обработку на работе, не нужно лезть v конфигуратор, vо многих случаях достаточно и этого. Куда можно написать пожелания и будет ли дорабатыvаться ????

    Обработка построена на базе построителя отчета. Изначально делалась для изучения принципов работы в построителем отчета. Однако оказалась востребована. Надеюсь и тут кому-то приглянется и поможет.

    Reply
  68. VitaliySm

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

    Reply
  69. Гость

    Обработка супер. Спасибо автору. Ничего лучшего нет, да и не надо…

    Reply
  70. DrAku1a
    Reply
  71. DrAku1a

    (70) Нашел! Причина в том, что в табличных частях тоже есть поле дата. Значит нужно сделать в итогах однозначное указание на поле «Дата» — в виде ИмяДокумента+».Дата», т.е. меняем

    ТекстЗапроса=ТекстЗапроса + » {ИТОГИ ПО Дата, НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) КАК День, НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ) КАК Неделя, НАЧАЛОПЕРИОДА(Дата, ДЕКАДА) КАК Декада, НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) КАК Месяц, НАЧАЛОПЕРИОДА(Дата, Квартал) КАК Квартал, НАЧАЛОПЕРИОДА(Дата, ГОД) КАК Год «;

    на

    ТекстЗапроса=ТекстЗапроса + СтрЗаменить(» {ИТОГИ ПО Дата, НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) КАК День, НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ) КАК Неделя, НАЧАЛОПЕРИОДА(Дата, ДЕКАДА) КАК Декада, НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) КАК Месяц, НАЧАЛОПЕРИОДА(Дата, Квартал) КАК Квартал, НАЧАЛОПЕРИОДА(Дата, ГОД) КАК Год «, «Дата», ИмяДокумента+».Дата»);

    и аналогично для остальных итоговых полей

    Reply
  72. agilov_a

    Отличная обработка! Но, нашел ситуацию, при которой выводятся неверные данные: Если сформировать реестр по документам с несколькими заполненными табличными частями, при условии что количество строк в них разное. Например документ «Поступление товаров и услуг», и нам надо посмотреть итоги по колонкам «Сумма» и «СуммаНДС» по табличным частям «товары» и «услуги». В моем случае было 8 строк товаров и одна строка услуги, данные по услугам выводились увеличенные в 8 раз (на величину строк товаров). Ошибка в логике, при формировании запроса для построителя, просто конструкции «ЛЕВОЕ СОЕДИНЕНИЕ» там недостаточно. Но все равно спасибо, изменить логику запроса оказалось быстрее чем делать все с нуля.

    Reply
  73. Tolpinski

    УПП, реализация товаров и услуг.

    {Форма.Форма.Форма(113)}: Ошибка при установке значения атрибута контекста (Текст)

    Построитель.Текст=ТекстЗапроса;

    по причине:

    {(52, 7)}: Неверные параметры «СУММА»

    СУММА(<<?>>РеализацияТоваровУслугТовары.ЗначениеУсловияАвтоматическойСкидки) КАК РеализацияТоваровУслугТоварыЗначениеУсловияАвтоматическойСки­дки,

    Reply

Leave a Comment

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