Перенос остатков и документов за период из БП 3.0 в УТ 11.х




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

28 Comments

  1. IDija

    Ошибка при проверки подключения.

    Подскажите на каких релизах вы тестировали?

    Управление торговлей, редакция 11.2 (11.2.3.108)

    Бухгалтерия предприятия, редакция 3.0 (3.0.43.89)

    Reply
  2. kazann

    (1) IDija, от версий конфигураций не должно зависить. Попробуйте перерегистрировать компоненту COM -соединения и проверить путь к базе, пользователя и пароль. На платформе 1С:Предприятие 8.3 (8.3.7.1917) работало точно.

    Reply
  3. mort64ram

    «что исключает задвоения данных и корректность переноса».

    Исключает корректность переноса чтоль?)

    И есть подозрение что «задвоение»

    Reply
  4. Erne100

    Скачал, посмотрел.. переписываю

    Замеченные неточности в описании:

    1. КонецГода(Объект.ДатаОстатков) — это не «на заданную дату»!

    2. Искать только «по Уникальному Идентификатору» недостаточно,

    если при первом обмене выполнялось сопоставление одинаковых объектов.

    Например: Если УИД Организации в приёмнике другой — в документах будут «гробы»,

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

    3. Не указано, что взаиморасчеты будут «по договорам» даже если ваш бух хочет «по заказам»

    Чего мне не хватило:

    1. Взаиморасчеты с прочими «76» счет.

    2. Взаиморасчеты с подотчетниками

    Reply
  5. tradeupgroup

    Добрый день!

    Обработка не работает. При загрузке остатков и документов выдает соответствующие ошибки. Скрины ошибок в приложении.

    Reply
  6. kazann

    (5) Доброго времени суток!

    Перед запуском обработки важно проделать следующий пункт: Стандартными средствами переносятся только справочники и денежные документы.

    т.е. настроить типовой обмен данными между УТ и БП и выполнить обмен справочниками из УТ.

    Reply
  7. tradeupgroup

    Спасибо, но стандартная синхронизация была выполнена, справочники перенесены.

    Reply
  8. kazann

    (7) Еще раз посмотрел скрины с ошибкой и заметил что Дата остатков — 29.08.17. Обработка ставит дату на конец года Даты остатков. Это мой недочет в описании обработки.

    Вы можете открыть обработку в конфигураторе, зайти в модуль Формы обработки. И изменить строку 165:

    Граница = Соединение.NewObject(«Граница», КонецГода(Объект.ДатаОстатков), Соединение.ВидГраницы.Включая);

    на

    Граница = Соединение.NewObject(«Граница», КонецДня(Объект.ДатаОстатков), Соединение.ВидГраницы.Включая);

    Тогда остатки будут браться на конец выбранного дня.

    Reply
  9. tradeupgroup

    (8)Добрый день!

    Изменил строку, результат — те же ошибки. Сколько возьмете за то, чтобы Ваша обработка заработала конкретно на моей УТ?

    Reply
  10. baykovsky

    Добрый день!

    Обработка не работает.

    Ситуация аналогичная описанной Михаилом Б. Те же ошибки…

    Reply
  11. baykovsky

    (5)У меня то же самое… Не работает…..

    Reply
  12. andreysan

    ЕСЛИ У ВАС возникла проблема при переносе остатков, попробуйте этот рецепт

    Проблема возникает если в разрезе счетов по 41 счету в БП есть остатки без склада

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

    мое решение: добавил в форму реквизит СкладПоУмолч типа СправочникСсылка.Склады

    в форме соотв вывел этот реквизит

    При заполнении этой формы выбираю Склад по умолчанию, который будет подставляться , если идут есть остатки номенклатуры без склада

    и в функции Процедура ЗагрузитьНаСервере

    в стр ~ 182 заменил

           УИД = Соединение.String(Выборка.Склад.УникальныйИдентификатор());
    ТекСклад = Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
    ПроверитьОбъект(ТекСклад, Выборка.Склад.Наименование);
    

    на этот код:

     // проверим что что-то получили
    БОЛТ=Соединение.String(строка(Выборка.Склад));
    
    if БОЛТ=»» then
    ТекСклад =Объект.СкладПоУмолч;
    
    else
    УИД = Соединение.String(Выборка.Склад.УникальныйИдентификатор());
    ТекСклад = Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
    ПроверитьОбъект(ТекСклад, Выборка.Склад.Наименование);
    endif;

    Показать

    Reply
  13. kazann

    (12) andreysan, спасибо за ваш ответ.

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

    Reply
  14. chingis.quiz

    Привет! а как обработка будет работать с ут 11.4? или даже не стоит пробовать?

    Reply
  15. kazann

    (14) Привет! Теоретически должна работать. Возможно потребуется незначительные изменения, в случае изменения структуры данных в ут 11.4.

    Reply
  16. chingis.quiz

    Сегодня попробовал перенести остатки. Доработка выдала «поле объекта не обнаружено (хозрасчетный)»

    это если я использую перенос остатков. версия бп 3.0.55.16.

    а если пробую перенос документов:

    если выбрать переносить реализации, то ничего не происходит.

    если выбрать переносить поступления, то выдает ошибку «Поле объекта не обнаружено (ПоступлениеТоваровУслуг)»

    Reply
  17. kazann

    (16) Проверил на УТ 11.4.1.271 и БП 3.0.55.16, обмен остатками проходит. Если есть опыт работы с конфигуратором, попробуйте отследить на каком месте происходит сбой.

    Reply
  18. Konung

    (16) Вы, по всей видимости, запустили выгрузку в БП. Я так же ошибся сначала и у меня вышла такая же ошибка. Запускать надо в УТ.

    Ошибка в другом — при загрузке остатков ДС, если в кассе нет остатков, то в строке 487 ТекДок = «», соответственно ТекДок.Кассы вызывает ошибку.

    Reply
  19. Egor5130

    Alex z

    В обработке для работы в конфигурации Управление торговлей, редакция 11 (11.4.2.123)

    в стоке 1110 и 1113 нужно заменить

    ПоступлениеТоваровУслуг на ПриобретениеТоваровУслуг.

    Reply
  20. oldmike

    Добрый день! При переносе остается связь документов на основании или каждый документ переносится отдельно?

    Reply
  21. kazann

    (20) В документах переносимых обработкой, связи сохраняются.

    Reply
  22. AlbertBug

    Добрый день, при попытку выгрузить номенклатуру он выдает Значение не является значением обьектного типа (УникальныйИндификатор) и не дает загрузить, а документы выгрузил, но склад и найменование обьект не найден

    Reply
  23. kazann

    (22) Добрый день! Похоже что начальная синхронизация не была сделана или склады по ней не синхронизировались.

    Reply
  24. user1234203

    (23) Здравствуйте. Точно такая же ошибка с идентификатором. Начальная синхронизация сделана. Скачивал посл. строчку.

    Reply
  25. user1234203

    (23) изменил как советовали в (12), теперь получаю такую ошибку:

    {ВнешняяОбработка.ПереносОстатковИзБПвУТ.Форма.Форма.Форма(248)}: Деление на 0

    СтрокаТЧ.Цена = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;

    Reply
  26. kazann

    (25)

    Где-то вылазит нулевое кол-во. Попробуйте в отладчике поймать проблему.

    Или добавить заполнение цены в попытку

    Попытка
    СтрокаТЧ.Цена = СтрокаТЧ.Сумма / СтрокаТЧ.Количество;
    Исключение
    СтрокаТЧ.Цена = СтрокаТЧ.Сумма;
    КонецПопытки;
    
    Reply
  27. NMarkina

    Добрый день! При попытке перенести приход их БП 3.0.72.54 в УТ 11.4.8.92 ошибка «РегистрСведений.УчетнаяПолитикаОрганизаций.МодульМенеджера(151)}: Индекс находится за границами массива». Есть варианты её лечения?

    Reply
  28. kazann

    (27) Проверьте заполнена ли учетная политика организации в УТ.

    Reply

Leave a Comment

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