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




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

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