Универсальное закрытие счетов для 1С:Бухгалтерия предприятия 3.0




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

27 Comments

  1. vkt

    Показатель «Вид итогов» (Обороты, СальдоНач, СальдоКон) предполагает указание периода, за который берутся итоги.

    В этой обработке какой период берется? Где его можно указать.

    Попробовал закрыть, например, 26 счет на 90.02.1 (например). Суммы к закрытию берутся неизвестно какие. Не смог проконтролировать правильность закрытия по Оборотно-сальдовой ведомости.

    Какие есть особенности, которые нужно знать?

    Reply
  2. leha2403

    (1) Первый комментарий!!! Я уже думаю, что всех все устраивает)). Да, конечно, нужно сделать период за который обороты выбираются… В данной редакции имеем: начало периода — начало месяца даты, указанной в шапке, конец периода — конец месяца. Работаем, усовершенствуем далее — каждому с конкретным предложением — обновление в личку.

    Reply
  3. vkt

    (2) Да, спасибо. Что-то стало получаться. Думаю, как эту обработку можно использовать.

    1. Неудобно, что нельзя выбрать группу субсчетов (кор.счетов). Например, чтобы выбрать субсчета счета 10, приходится формировать отдельные настройки.

    Так же и для случая, если нужно выбрать несколько счетов.

    То есть нужен список.

    2. И это не очень страшно, конечно. Только при выполнении операции копирования настроек распределения (или порядка закрытия) создается новая запись (пустая, незаполненная), и приходится заново вбивать все значения, вместо того, чтобы незначительно откорректировать скопированные.

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

    3. В комментарий операции вставляются несколько раз лишние (по моему мнению слова) «Закрытие месяца», если в используются несколько этапов, и формируется одна операция. Комментарий в этом случае содержит несколько фраз «Закрытие месяца» и становится малоинформативным. (надеюсь, понятно изложил)

    Reply
  4. silver-747

    Спасибо, очень понравилось 🙂 даже с выше перечисленными недочетами полезная обработка облегчающая жизнь бухгалтера особенно если разрезов аналитики по затратным счетам очень много. Ждем доработок 🙂

    Reply
  5. silver-747

    А когда вы исправите что бы работало на Сервере? 🙂

    Reply
  6. klaus38

    Добрый день или вечер! На серверной будет работать?

    Reply
  7. leha2403

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

    Reply
  8. GPetr

    (7) Ждём обновы!

    Reply
  9. leha2403

    Новая версия! Много нового.

    Reply
  10. silver-747

    На версии 3.0.65.84 тестировали? А то на этом релизе перестали многие обработки и внешние печатные формы работатьформы

    Reply
  11. leha2403

    (10) Да, тестировалась, работает.

    Reply
  12. gerasimovaol@rambler.ru

    Добрый день! Нужно подкорректировать закрытие счета 23. Стандартная регламентная операция дает Дт 90.2 Кт 23, а надо отсторнировать стандартную Дт90.2 Кт 23, далее Дт 20 Кт 23 и Лт 90.2 Кт 20, при чем номенклатурная группа сч 23 должна распределяться пропорционально физ.объемов, которые каждый месяц разные. Можно пример настроек отчета по закрытию затрат? т.к. в ноль не закрывается.

    1С:Предприятие 8.3 (8.3.13.1513)

    Reply
  13. leha2403

    (12) Со сторнированием сложностей думаю не возникло? Пропорционально каким-то оборотам обработка пока не работает. Есть возможность вручную ежемесячно указывать коэффициенты закрытия, которые в сумме должны выходить на единицу. Если в связи с округлением остаются копейки, можно последний этап создавать отдельной операцией с коэффициентом 1, тогда закроются все оставшиеся суммы, после записи предыдущих этапов.

    Reply
  14. gerasimovaol@rambler.ru

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

    Reply
  15. maksim07

    Добрый день. Очень хорошая обработка. Что-то не работает загрузка настроек из файла, ругается «Каталог не обнаружен путь к файлу».

    И возможно ли получить обновленную версию с исправленными ошибками? У меня версия 2.4

    Возможно ли сворачивать документы, что то пробовал не получилось.

    Reply
  16. leha2403

    (15)

    Очень хорошая обработка.

    Спасибо.

    (15)

    Что-то не работает загрузка настроек из файла, ругается «Каталог не обнаружен путь к файлу»

    Похоже версия без исправления ошибки с сохранением настроек в клиент-серверном варианте.

    (15)

    Возможно ли сворачивать документы

    поподробнее — как это? может Обороты/Остатки по субконто «Документы», тогда конечно, для этого она и создана.

    (15)

    И возможно ли получить обновленную версию с исправленными ошибками?

    если «хорошая» обработка, то думаю можно еще раз скачать. Хотя в 2.4 версии уже исправлена ошибка сохранения настроек. Скрины можно в студию, и инфу о конфигурации и варианте работы

    Reply
  17. SAMNEW

    Кто проверял сохранение настроек на сервере? Данные изменения внесены в конце 2018 года, а в описании файла написано, что он создан 16.12.17.

    Reply
  18. bulas

    Для 41 счета отбор по номенклатуре работает? На картинке видно, что реквизит по складу заполнен, а Номенклатуры нет.

    Reply
  19. bulas

    Проверял работу на счете 41.01 — работоспособная обработка.

    Reply
  20. Evladar

    Добрый день!

    А возможно сделать, чтобы счёт закрывался не полностью, а по достаточному количеству.

    Пример:

    Есть искусственный счет учета 62.05, который планируется закрывать на 62.01.

    Если на 62.01 по Субконто счета 62.05 недостаточно ресурса, то закрывается только то, сколько хватает на 62.01, то есть min(Дт62.01,Кт62.05).

    На данный момент закрываются остатки полностью на счёт-приёмник.

    Можно сделать выбор: закрывать все остатки/закрывать остатки, достаточные на счёье-приёмнике.

    Спасибо.

    Reply
  21. leha2403

    (23) В теории, конечно возможно, но универсальность теряется — нужно будет учесть синхронизацию по субконто по счету источнику и приемнику, можно сделать разово для конкретной задачи.

    Reply
  22. Svetos

    Добрый день, а можно ли убрать например по счету 41 только суммы зависшие?

    Reply
  23. leha2403

    (25) Конечно, ставьте только суммовые обороты или остатки, количество или сумму

    Reply
  24. user1251874

    Здравствуйте! Я не понял, возможно ли процентное закрытие счёта. А еще лучше с пропорциональным распределением между номенклатурными группами счета, на который происходит закрытие?

    Reply
  25. buy_sale

    БП КОРП 3.0. 10.1 в 10.1 со сменой подразделения. Перенесла только количество, суммы нет.

    На 10.01 в КОРП нет суммового учета по последнему субконто Склады, по другим есть.

    Обработка это не учитывает

    Reply
  26. alexbur

    (28), А это вы себе допиливали конфу? В стандартной КОРП суммовой учёт по всем субконто счета 10.01.

    Reply
  27. yura-100

    Очень хорошая обработка. Поможет в разных ситуациях.

    В моем случае переходили в 1С БП 3.0 с ФИФО на Среднее. Надо было убрать с Субконто Партии на пустое Субконто по счету 41.1

    Нашел недочет в обработке:

    Если по счету сумма будет нулевая, а в разрезе субконто по одному сумма положительная, а по другому отрицательная, то в этом случае обработка пропускает такой остаток.

    Пример на картинке.

    В моем случае:

    Получилось, если в строке 841 Модуля объекта

    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    поменял на

    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,»Субконто2″);

    так как субконто2 разное

    Reply

Leave a Comment

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