<?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='\
> а почему разработчики этого не исправляют
Потому, что если после даты свертки есть документы зачета авансов, оплаты долгов, списания партий, где в качестве субконто в их движениях те самые помеченные на удаление документы, то после правки как в статье операций ввода остатков все «съедет».
(1)
Потому, что если после даты свертки есть документы зачета авансов, оплаты долгов, списания партий, где в качестве субконто в их движениях те самые помеченные на удаление документы, то после правки как в статье операций ввода остатков все «съедет».
Чуть подробнее можно? Не понял Вашу мысль? Что там «съедет»?
(2) например: в середине 2016 года мы решаем свернуть базу на 31.12.2014.
Пусть на дату свертки есть остаток аванса по Поступление на расчетный счет # 1. А в 2015 году есть Реализация, зачитывающая этот аванс. Если в операции ввода остатков Поступление на расчетный счет # 1 будет заменено на документ ручного учета расчетов, то в проводках зачета аванса все равно останется Поступление на расчетный счет # 1 и будет ошибка по оборотам.
Вариант замены подходит только если свертка делается на текущий конец года. Свернули и начали работу в новом году в свернутой базе.
(3) понял, что вы хотите сказать. Спасибо большое. Какой смысле в свертки тогда?
(4) да ну смысл тот же — убрать прошлый ненужный период. Просто та аналитика, на которой есть остатки — приходится её оставлять.
У меня другое общее замечание — в типовой свертке 1С не обрабатываются оборотные регистры НДС покупки/Продажи. Соответственно все регистраторы — поступления и реализации и т.д. остаются…
(5) Давайте зарезюмируем. Значит получается судя по описанию, что свертка предназначена для:
Или как Вы написали
, что в принципе одно и то же.
Но в случае, когда, например, документ поступление товаров (он же партия), будет употребляться в качестве партии в документах с датой после даты свертки и будет заменен в документе операция, то возникнет ситуация когда остатки будут висеть на одной партии, а позже они же будут списываться по другой партии. Что касается движений, то, в принципе, достаточно перепровести документы в последовательности, или перезакрыть месяца (что после свертки и так будешь делать). Но тут встает вопрос с движениями откорректированными вручную. Соответственно, удалив документы из базы, мы получим не совсем корректную картинку по счетам (и не только по счетам). Следовательно, моя обработка будет полезна только если ты делаешь свертку на дату, после которой нет документов или эти документы можно беспрепятственно перепровести, сформировав при этом новые движения.
В таком случае мой вопрос остается открытым: «Зачем тогда нужна типовая свертка, если она не выполняет свое предназначение?» И еще один вопрос: «Как тогда правильно выполнить подобную работу?»
(6) Поддерживаю. Свернули базу, работать в ней неудобно из за кучи помеченных на удаление документов…
Тоже интересно как сделать без сильных доработок.
(7) Ну я, в принципе, ответил в предыдущем посте. 🙂 Можно моей обработкой.
(8) ) Вопрос шире. Есть документы которые используются как аналитика (Заказ покупателя), по ним расчеты и остатки еще не закрыты их не заменять не удалять ненужно.
Как тогда быть ? ) Ваша обработка их заменит на документы по партиям ?
(Конфигурация КА)
Обработку писал для БП 3.0. Для КА, не знаю как она себя поведет. Ну в ваших силах проверить и отписаться. На тестовой разумеется.
После вашей обработки найти связку между старыми документами и новыми бухгалтеру будет очень сложно . У вас нигде не записывается ни представление документа ни его тип.
При ОСНО остатки по авансам полученным по счету 62.02 завязаны на счета-фактуры на аванс на счете 76.АВ, если раздельный учет НДС, то остатки ТМЦ кроме партий завязаны на счета-фактуры полученные, для возможного восстановления НДС, в общем не всё так просто, как Вам показалось)))))
(11)
Не вижу смысла искать взаимосвязь. Их вообще удалить нужно. Для этого все это.
(13)
— это печально, но потом бухи выяснят, что 1С не работает((((( Свертка не для того делается, чтобы документы прошлых периодов заменить на документы расчетов с контрагентами, а для того, чтобы:
— сократить размер базы (аналитика документами далеко не самый большой объем в этом деле);
— при необходимости, исправить остатки на дату свертки, без необходимости исправлять весь учёт за несколько лет ….
Но, никак целью свёртки базы, не является замена реальных документов периода до свёртки на документы, предназначенные в программе для ввода начальных остатков, как бы ни странно, для Вас, это не звучало))))
(13) В одной дате у одного контрагента могут документы с разными номерами и с разными видами документа (Реализация и возврат например). А в вашей обработке сопоставление тупо дата, организация, контрагент и договор
(7) Обработайте эту кучу таким образом:
1. Отмените пометку на удаление (реально мешает удалять то, что удалить необходимо);
2. Установите для них реквизиты РучнаяКорректировка и Проведен в Истина (движений не будет, удалять мешать они не будут, но в случае, например необходимости провести корректировку реализации, это будет легко сделать).
скачал обработку, но при запуске выдается следующее сообщение
{ВнешняяОбработка.ПостобработкаДокументовПослеСверткиБП30.Форма.Форма.Форма(50)}: Ошибка при вызове метода контекста (Записать)
КоллекцияДвижений_Хозрасчетный.Записать();
по причине:
Попытка вставки неуникального значения в уникальный индекс:
Microsoft SQL Server Native Client 11.0: Cannot insert duplicate key row in object ‘dbo._AccRgAT2604’ with unique index ‘_AccRgAT2604_ByPeriod’. The duplicate key value is (0, 0xadea9f9f9c69aa84453481c2d6b676cc, 4016-12-01 00:00:00, 0xaad150465d9ef2d011e431cb4b733978, 0x08, 0x00000033, 0x9f4a50465d9ef2d011e45dac3faea7b9, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, 0).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2601, line=1
Что-то мне подсказывает не тот инструмент выбрали. Судя по описанию надо было делать через ввод остатков, а не свертку. Это совершенно разные вещи и по смыслу, и по содержанию.