Решение типовой ошибки релиза 3.1.4.161 ЗУП при обновлении (дублирование строк в табличных частях НДФЛ)




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

11 Comments

  1. vspl

    То есть для исправления ошибки нужно запустить эти обработчики по-новой ? А как это сделать ?

    Reply
  2. Matador

    (1)

    заменить код процедур, указанных на скрине.

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

    для случаев когда архива нет. и база уже обновлена. данный вариант НЕ подойдет.

    Reply
  3. Program

    Anatoly Pugin. можете по подробней описать порядок действий. Не пойму, когда нужно заменить код процедуры и что значит повторно обновить базу?.

    Порядок действия с обновления 3.1.4.120 на 3.1.4.161.

    Спасибо.

    Reply
  4. Matador

    — взять не обновленный архив базы,

    — обновить , перед тем как применить изменения и запустить 1с в режиме Предприятия.

    заменить процедуры, т.к. в них содержиться ошибка,

    — после замены процедур, запустить 1с в режиме предприяти

    Reply
  5. e-tixom

    А если зайти в каждый документ и руками удалить эти строки? У нас документов не много. Объясните, пожалуйста: в чем смысл этой задумки разработчиков и почему они все это дописали в закрытых периодах, в закрытых документах? Если мы руками удалим, они не появятся снова?

    Reply
  6. Matador

    (5)

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

    если учет велся в 2017 году в ЗУП. то данная ошибка будет во ВСЕХ ! документах межрасчета и нач.зп т.е .это нереально вручную исправить.

    ошибка 1с в следующем:

    для строк исходных :

    №1 Иванов, Налог, КатегорияДохода

    №2 Петров Налог, КатегорияДохода

    №3 Смирнов Налог, КатегорияДохода

    нужно получить строки :

    №1 Иванов, Налог, ЗапКатДохода

    №2 Петров Налог, ЗапКатДохода

    №3 Смирнов Налог, ЗапКатДохода

    где ЗапКатДохода = заполненное поле категории дохода, новое в релизе 3.1.4.161

    а у 1с получились строки :

    ОШИБКА 1С. (!)

    №1 Иванов, Налог, КатегорияДохода

    №2 Петров Налог, КатегорияДохода

    №3 Смирнов Налог, КатегорияДохода

    №4 Смирнов Налог, ЗапКатДохода

    №5 Смирнов Налог, ЗапКатДохода

    №6 Смирнов Налог, ЗапКатДохода

    Reply
  7. e-tixom

    (6) Спасибо! Более менее понятно. У нас учет ведется с октября. Откатывать не хочется: не сразу ошибку заметили. Попробуем вручную исправить.

    Reply
  8. leobrn

    с такой ошибкой не сталкивались? процедуры на Ваши поставил, но видимо тут что-то другое

    Reply
  9. Matador

    (8) нет не сталкивался, но регистр ***Вторичный. это новый регистр релиза 161 .

    т.о. он заполняется в момент обновления.

    смотрите внимательно вычеты по данному сотруднику.

    либо ставьте отладку по ошибке тогда станет ясна причина.

    Reply
  10. Vladraven

    Столкнулся с похожей ситуацией, после обновления на 3.1.4 в ЗУП стали дублироваться НДФЛ при расчете зарплаты.

    Тоесть + и — на одну и ту же сумму. И архива не осталось.

    Попробовал на копии через «Загрузить конфигурацию из файла» файл cf последней версии 3.1.3.

    После чего запустил по новой обновление на 3.1.4.169.

    Почти все ошибки из 2017 года пропали.

    Это моя попытка, и не совсем правильная, полностью согласен что нельзя отказываться на 3.1.3,

    на как не имея другого выхода — мне помогло.

    Reply
  11. Vin_Tik

    Помогите Зарплата и управление персоналом, редакция 3.1 (3.1.6.6)

    Та-же проблема. Никаких архивов нет, устроился недавно и просят исправить.

    Вижу что в РН «Учет доходов для исчисления НДФЛ» и «Расчеты налогоплательщиков с бюджетом по НДФЛ» не заполнено измерение «КатегорияДохода». В документах по начислению в таб. части НДФЛ, тоже не заполнен «КатегорияДохода».

    Можно какую-то обработку написать для исправления этих строк?

    Подскажите, что сделать реально. Распровести все документы и как-то перезаполнить НДФЛ в начислениях. Потом нужно исправить в данные в ведомостях еще?

    Или подскажите как 2017 год корректировкой закрыть и 2018 только исправить.

    Reply

Leave a Comment

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