Поиск и удаление неопределенных регистраторов ("Объект не найден") в регистрах




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

59 Comments

  1. Unstoppable

    {Форма.Форма(15,9)}: Процедура или функция с указанным именем уже определена (ОписаниеПериода)

    Функция <<?>>ОписаниеПериода()

    {Форма.Форма(41,20)}: Недостаточно фактических параметров (ОписаниеПериода)

    ОписаниеПериода = <<?>>ОписаниеПериода();

    Выдает при старте в УПП 1.2.3.1

    Reply
  2. IronDemon

    Поменял имя функции на ПолучитьОписаниеПериода()

    Reply
  3. Unstoppable

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

    Reply
  4. IronDemon

    Везет вам, а я в месяц 5-20 случаев таких имею.

    Reply
  5. tormozit

    Скриншоты были бы полезны.

    У нас РИБ с миграцией наборов записей регистров, подчиненных регистраторам, без миграции самих регистраторов. Так что не всегда нужно удалять такие записи.

    Reply
  6. MRAK

    У меня пишет «ничего не нашли», хотя биты ссылок куча, открывая регистр их вижу…

    Reply
  7. IronDemon

    Так может битые справочники?

    Reply
  8. MRAK

    (7) нет, именно регистраторы… косяк был из-за того, что я дату окончания в обработке не задал… теперь показывает…

    Reply
  9. savageRrr

    {Форма.Форма(186)}: Ошибка при вызове метода контекста (Выполнить): {(6244, 63)}: Синтаксическая ошибка «)»

    РПриходПерсоналаПоИсточникам.Период МЕЖДУ &НачДата И &КонДата<<?>>)

    Результат=Запрос.Выполнить();

    по причине:

    {(6244, 63)}: Синтаксическая ошибка «)»

    РПриходПерсоналаПоИсточникам.Период МЕЖДУ &НачДата И &КонДата<<?>>)

    1C УСО 1.2.19.3

    Reply
  10. vika64

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

    Reply
  11. WWWolfy

    Процедура КоманднаяПанель2ДействиеСнятьФлажки(Кнопка)

    СписокРегистров.ЗаполнитьПометки(Ложь);

    КонецПроцедуры

    строка (100)

    Если ТекстИЗ=»» Тогда

    Сообщить(«У регистра <«+Регистр+»> пустой список регистраторов. Пропускаем.»);

    Продолжить;

    КонецЕсли;

    Reply
  12. tylerkiss

    Для какой версии платформы написана?

    Reply
  13. IronDemon

    Для 8.0, но работает и на 8.1

    Reply
  14. itt

    в 8.1 надо сделать переконвертацию обработки, затем подправить

    ….Если ТипЗнч(Выборка.Регистратор) = Тип(«ДокументСсылка.КорректировкаЗаписейРегистровНакопления») Тогда…..

    на

    ….Если ТипЗнч(Выборка.Регистратор) = Тип(«ДокументСсылка.КорректировкаЗаписейРегистров») Тогда…..

    очень помогла!

    Reply
  15. AlexKoso

    Офигеть условие : «Если НЕ (НеЗаполнятьНастройкиПриОткрытии = Истина) Тогда» мозг сломаешь…

    слабо было написать «НеЗаполнятьНастройкиПриОткрытии = Ложь» или просто

    «НЕ НеЗаполнятьНастройкиПриОткрытии»?

    А еще лучше переменную изначально назвать «ЗаполнятьНастройкиПриОткрытии»

    Reply
  16. Собеседник

    (15) а в чем проблема? Нормальное условие.

    Условие «Если НЕ <ВозможноБулево> Тогда…»

    вызовет исключение при несоответствии типа

    Условие «Если НЕ <ВозможноБулево> = Истина Тогда…»

    будет работать при любых типах «ВозможноБулево»

    У меня тоже так сложилось — использую только «=» и условия на истину.

    Все остальное в иначе.

    Как по мне — так «читать» легче 🙂

    Reply
  17. Alav

    Не хватает поиск по РБ и поиск по измерениям и субконтам

    Reply
  18. I am

    Не смог при запуске выбрать «Регистр сведений: Расчет списания расходов будущих периодов» — нет в списке регистров.

    Reply
  19. Поручик

    И мне пригодилось спустя пять лет..

    Reply
  20. revril

    спасибо))

    мега крутая обработка)))

    ооочень помогла)))

    Reply
  21. temp2003

    Классная штука! У нас распределенная база данных и соответствующий обмен… Косяки всегда есть… А это обработка здорово все подчищает… Нам помогает ))))

    Reply
  22. tristarr1

    Полезная вещь. разобрал как работает кое-что для себя понял.

    Reply
  23. Svetlana_K

    Спасибо! Внедрение системы. Приходится перезаливать данные . Здорово помогает, подчищает разные косяки.

    Reply
  24. vitekryazan

    спасибо, очень помогло

    Reply
  25. Foximus

    Спасибо… очень полезная штука )

    Reply
  26. yzk-almaz

    Подскажите как ее запустить чтоб она сделала обработку, ни как не могу понять.

    Reply
  27. IronDemon

    (26) yzk-almaz, В чем именно проблема?

    Reply
  28. Jenya78

    При снятии пометок ошибка

    {Форма.Форма.Форма(275)}: Поле объекта не обнаружено (Значение)

    СписокРегистров.Значение.ЗаполнитьПометки(Ложь);

    Reply
  29. Stepan_1c

    спасибо за сэкономленное время =)

    Reply
  30. Sairys

    Интересная штука нужно попробовать поискать в своей базе

    Reply
  31. Sairys

    Обработчик прерывания было бы неплохо поставить

    Reply
  32. s1koka

    Хватай + за труд. всё работает. Спасибо

    Reply
  33. vaniiok

    Всё работает! Красивый запрос.. спасибо

    Reply
  34. Psylocibine

    Проверю. Похоже, то что нужно, ибо объекты восстанавливать на надо, а движения болтаются)

    Reply
  35. Holly-khv

    Спасибо! Вовремя нашлась эта обработка! Сэкономило кучу времени!

    Reply
  36. mr.Kot

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

    Reply
  37. xacan1

    (36) mr.Kot, Ругается так же на тип документа «КорректировкаЗаписейРегистровНакопления» (или сведений) в типовой УТ 10.3. Просто раньше такие документы были, а теперь один единый — «КорректировкаЗаписейРегистров». Просто исправить надо имя регистратора в тексте и никаких попыток.

    Reply
  38. ssa

    Спасибо, пригодилась!

    Reply
  39. ssa

    Отдельное спасибо за бесплатность )

    Reply
  40. warrior1985

    В регистрах, в регистрах.. Скачал, но регистров БУХГАЛТЕРИИ там и в помине нет. А жаль. Нужно писать конретнее дабы люди не тратили время впустую и стартмани.

    Reply
  41. ufedor

    Спасибо, обработка пригодилась.

    Автору: будете ли обновлять обработку?

    В наличии минимум 2 проблемы:

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

    — необходимо добавить проверку на наличие документа КорректировкаРегистров. Например так:

    ИсключитьТип = Неопределено;
    Если Метаданные.Документы.Найти(«КорректировкаЗаписейРегистров»)<>Неопределено Тогда
    ИсключитьТип = Новый Тип(«ДокументСсылка.КорректировкаЗаписейРегистров»);
    ИначеЕсли Метаданные.Документы.Найти(«КорректировкаЗаписейРегистровНакопления»)<>Неопределено Тогда
    ИсключитьТип = Новый Тип(«ДокументСсылка.КорректировкаЗаписейРегистровНакопления»);
    КонецЕсли;
    //далее проверять на исключитьтип

    И одно пожелание

    — добавить в обработку регистры бухгалтерии и регистры расчетов

    Reply
  42. GH0STexe

    Качественно

    Reply
  43. alexey_kurdyukov

    А как насчет записей у которых регистратор не «Объект не найден», а вообще пусто?

    Reply
  44. elena777

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

    Reply
  45. TeMochkiN

    (43) alexnecro, такое возможно? Если регистр подчинен регистратору, то такого по-идее не должно быть.

    А вообще у меня вопрос, ТиИ базы разве не дает тот же эффект с правильно выбранными настройками? Или в 2009 году платформа такого не умела? =/

    Reply
  46. baby

    Спасибо огромное. Очень помогло.

    Reply
  47. Grey Fox

    Спасибо!

    Reply
  48. kidwell

    а на 8,2 такое есть?

    Reply
  49. tormozit

    В подсистеме «Инструменты разработчика»

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

    2. Есть инструмент «Поиск битых ссылок», позволяющий найти все битые ссылки нужных типов во всех таблицах, а затем передать для обработки строки выбранной таблицы с битыми ссылками в инструмент «Подбор и обработка объектов».

    Reply
  50. Den_D

    Слишком сложный итоговый запрос, если сделать поиск по всем регистрам. СУБД не может выполнить такой запрос.

    Reply
  51. tormozit

    (50) Да, многие забивают на эту проблему, но не (49). Там работает без проблем на огромных конфигурациях.

    Reply
  52. Ленский

    Добрый день! Подскажите обработка не работает на конфигурации 1С Розница ?!

    Reply
  53. Fox-trot
  54. SuhoffGV

    Хозяйке на заметку: В ЗУП2 не сработало удаление записей из РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций так как срабатывает какая-то подписка на событие и валится в ошибку.

    Имеет смысл добавить конструкцию «НаборЗаписей.ОбменДанными.Загрузка=Истина;» или возможность включать её с формы.

    На свой страх и риск. Тогда подписки не срабатывают и запись удаляется.

    Reply
  55. swi76

    Выдает ошибку

    «Тип не определен (ДокументСылка.КорректировкаЗаписейРегистровНакопления)»

    Reply
  56. swi76

    Как исправить

    Reply
  57. Veika

    При попытке запустить обработку выдается сообщение «Нарушена целостность структуры конфигурации». Сделала ТиИ и проверила chdbfl.exe ошибок нет, а запустить обработку не могу… А очень надо почистить один регистр…

    Reply
  58. pererva98

    (57)

    ытке запустить обработку выдается сообщение «Нарушена целостность структуры конфигурации». Сделала ТиИ и проверила chdbfl.exe ошибок

    Аналогичная проблема. Как исправить?

    Reply
  59. Vyacheslide

    Спасибо!!! Выручила очень. Немного поправил для Розницы и взлетела ))).

    Reply

Leave a Comment

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