<?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='\
Показатель «Вид итогов» (Обороты, СальдоНач, СальдоКон) предполагает указание периода, за который берутся итоги.
В этой обработке какой период берется? Где его можно указать.
Попробовал закрыть, например, 26 счет на 90.02.1 (например). Суммы к закрытию берутся неизвестно какие. Не смог проконтролировать правильность закрытия по Оборотно-сальдовой ведомости.
Какие есть особенности, которые нужно знать?
(1) Первый комментарий!!! Я уже думаю, что всех все устраивает)). Да, конечно, нужно сделать период за который обороты выбираются… В данной редакции имеем: начало периода — начало месяца даты, указанной в шапке, конец периода — конец месяца. Работаем, усовершенствуем далее — каждому с конкретным предложением — обновление в личку.
(2) Да, спасибо. Что-то стало получаться. Думаю, как эту обработку можно использовать.
1. Неудобно, что нельзя выбрать группу субсчетов (кор.счетов). Например, чтобы выбрать субсчета счета 10, приходится формировать отдельные настройки.
Так же и для случая, если нужно выбрать несколько счетов.
То есть нужен список.
2. И это не очень страшно, конечно. Только при выполнении операции копирования настроек распределения (или порядка закрытия) создается новая запись (пустая, незаполненная), и приходится заново вбивать все значения, вместо того, чтобы незначительно откорректировать скопированные.
(первое, что вызвало легкое неудобство при работе с обработкой)
3. В комментарий операции вставляются несколько раз лишние (по моему мнению слова) «Закрытие месяца», если в используются несколько этапов, и формируется одна операция. Комментарий в этом случае содержит несколько фраз «Закрытие месяца» и становится малоинформативным. (надеюсь, понятно изложил)
Спасибо, очень понравилось 🙂 даже с выше перечисленными недочетами полезная обработка облегчающая жизнь бухгалтера особенно если разрезов аналитики по затратным счетам очень много. Ждем доработок 🙂
А когда вы исправите что бы работало на Сервере? 🙂
Добрый день или вечер! На серверной будет работать?
Работает, только настройки не сохраняет, готовится к выходу новая версия с многими исправлениями и дополнениями.
(7) Ждём обновы!
Новая версия! Много нового.
На версии 3.0.65.84 тестировали? А то на этом релизе перестали многие обработки и внешние печатные формы работатьформы
(10) Да, тестировалась, работает.
Добрый день! Нужно подкорректировать закрытие счета 23. Стандартная регламентная операция дает Дт 90.2 Кт 23, а надо отсторнировать стандартную Дт90.2 Кт 23, далее Дт 20 Кт 23 и Лт 90.2 Кт 20, при чем номенклатурная группа сч 23 должна распределяться пропорционально физ.объемов, которые каждый месяц разные. Можно пример настроек отчета по закрытию затрат? т.к. в ноль не закрывается.
1С:Предприятие 8.3 (8.3.13.1513)
(12) Со сторнированием сложностей думаю не возникло? Пропорционально каким-то оборотам обработка пока не работает. Есть возможность вручную ежемесячно указывать коэффициенты закрытия, которые в сумме должны выходить на единицу. Если в связи с округлением остаются копейки, можно последний этап создавать отдельной операцией с коэффициентом 1, тогда закроются все оставшиеся суммы, после записи предыдущих этапов.
Добрый день! Подскажите пример настроек для закрытия счета 26 на сч 20, сторнирование счета 20 по определенной номенклатурной группе?
Добрый день. Очень хорошая обработка. Что-то не работает загрузка настроек из файла, ругается «Каталог не обнаружен путь к файлу».
И возможно ли получить обновленную версию с исправленными ошибками? У меня версия 2.4
Возможно ли сворачивать документы, что то пробовал не получилось.
(15)
Спасибо.
(15)
Похоже версия без исправления ошибки с сохранением настроек в клиент-серверном варианте.
(15)
поподробнее — как это? может Обороты/Остатки по субконто «Документы», тогда конечно, для этого она и создана.
(15)
если «хорошая» обработка, то думаю можно еще раз скачать. Хотя в 2.4 версии уже исправлена ошибка сохранения настроек. Скрины можно в студию, и инфу о конфигурации и варианте работы
Кто проверял сохранение настроек на сервере? Данные изменения внесены в конце 2018 года, а в описании файла написано, что он создан 16.12.17.
Для 41 счета отбор по номенклатуре работает? На картинке видно, что реквизит по складу заполнен, а Номенклатуры нет.
Проверял работу на счете 41.01 — работоспособная обработка.
Добрый день!
А возможно сделать, чтобы счёт закрывался не полностью, а по достаточному количеству.
Пример:
Есть искусственный счет учета 62.05, который планируется закрывать на 62.01.
Если на 62.01 по Субконто счета 62.05 недостаточно ресурса, то закрывается только то, сколько хватает на 62.01, то есть min(Дт62.01,Кт62.05).
На данный момент закрываются остатки полностью на счёт-приёмник.
Можно сделать выбор: закрывать все остатки/закрывать остатки, достаточные на счёье-приёмнике.
Спасибо.
(23) В теории, конечно возможно, но универсальность теряется — нужно будет учесть синхронизацию по субконто по счету источнику и приемнику, можно сделать разово для конкретной задачи.
Добрый день, а можно ли убрать например по счету 41 только суммы зависшие?
(25) Конечно, ставьте только суммовые обороты или остатки, количество или сумму
Здравствуйте! Я не понял, возможно ли процентное закрытие счёта. А еще лучше с пропорциональным распределением между номенклатурными группами счета, на который происходит закрытие?
БП КОРП 3.0. 10.1 в 10.1 со сменой подразделения. Перенесла только количество, суммы нет.
На 10.01 в КОРП нет суммового учета по последнему субконто Склады, по другим есть.
Обработка это не учитывает
(28), А это вы себе допиливали конфу? В стандартной КОРП суммовой учёт по всем субконто счета 10.01.
Очень хорошая обработка. Поможет в разных ситуациях.
В моем случае переходили в 1С БП 3.0 с ФИФО на Среднее. Надо было убрать с Субконто Партии на пустое Субконто по счету 41.1
Нашел недочет в обработке:
Если по счету сумма будет нулевая, а в разрезе субконто по одному сумма положительная, а по другому отрицательная, то в этом случае обработка пропускает такой остаток.
Пример на картинке.
В моем случае:
Получилось, если в строке 841 Модуля объекта
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
поменял на
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,»Субконто2″);
так как субконто2 разное