Закрытие регистров накопления [управляемые формы] УТ 11, ЗУП 3.0 + Бухгалтерия предприятия 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='\

19 Comments

  1. amigo667

    Если выбрать способ закрытия регистра приход, то вылетает с ошибкой

    Платформа: 1С:Предприятие 8.3 (8.3.6.2152)

    Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.42.33) (http://v8.1c.ru/buhv8/)

    Copyright (С) ООО «1C», 2009 — 2015. Все права защищены

    (http://www.1c.ru)

    Режим: Серверный (сжатие: усиленное)

    Приложение: Тонкий клиент

    Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)

    Вариант интерфейса: Такси

    Ошибки:

    ———————————————————————————

    21.10.2015 12:11:47

    Ошибка создания источника доступных настроек компоновки данных

    Reply
  2. MikZ

    (1) amigo667, Исправлено

    Reply
  3. Doomer

    В обработке косяк. Выбираю регистр накопления. Указываю отбор. Нажимаю получить остатки. Нажимаю «Ввести корректировку записей регистров». Открывается документ в котором регистр закрывается полностью без учета наложенного фильтра.

    Reply
  4. Doomer

    Фильтр по огранизации то же не накладывается. Конфигурация БП 3.0 (Почти)

    Reply
  5. MikZ

    (3) Doomer, спасибо за замечание. Ошибка исправлена. Отборы работают.

    Reply
  6. Aleksandtmt

    Спасибо за обработку, очень пригодилась.

    Использовал обработку для закрытия регистров накопления в конфигурации ЗУП 3.0 (3.0.25.69). При формировании документа для некоторых регистров, например «Взаиморасчеты с сотрудниками» выдается ошибка: «Поле объекта не обнаружено (Статья финансирования)». Добавил проверку и документ сформировался.

    Reply
  7. kalaratra

    Не работает на ЗУП 3.0. «Переменная не определена (Бухгалтерский учет переопределяемый)». Зря потратила 2 стартмани. Уберите из описания, что поддерживается ЗУП 3.0

    Reply
  8. chea06

    (7) kalaratra, даже если закомментировать эту строку, то все равно не работает в ЗУП для тех регистров, использование измерений которых завязано на функциональных опциях. Например, если попытаться закрыть регистр ВзаиморасчетыССотрудниками, у которого использование измерения СтатьяФинансирования выключено через ФО, то при попытке создать документ вываливается ошибка

    {Форма.ФормаУпр.Форма(372)}: Поле объекта не обнаружено (СтатьяФинансирования)

    НоваяЗапись[Измерение.Имя] = СтрокаТаблицы[Измерение.Имя];

    подозреваю что эта ошибка актуальная не только для ЗУП

    Reply
  9. kalaratra

    (8) chea06,

    Первая строка с ошибкой при получении организации, заменила

    БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию(«ОсновнаяОрганизация»); 

    на

    РегламентированнаяОтчетность.ПолучитьЗначениеПоУмолчанию(«ОсновнаяОрганизация»); 

    А статью финансирования решила так:

    Для каждого Измерение Из РегистрНакопления.Измерения Цикл
    Если НЕ Измерение.Имя = «СтатьяФинансирования» И НЕ Измерение.Имя = «СтатьяРасходов» Тогда
    НоваяЗапись[Измерение.Имя] = СтрокаТаблицы[Измерение.Имя];
    КонецЕсли;
    КонецЦикла;

    Знаю, что костыль, но мне надо было быстро решить)

    Reply
  10. svegl

    Спасибо! Обработка супер!

    Reply
  11. alexbur

    Слушайте, ну это ж вообще ужас. Если вы не знаете, как в запросе задавать период, чтобы получить правильные остатки на конец периода при использовании таблицы .Остатки, то выкладывать такие обработки просто безответственно.

    Reply
  12. alexbur

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

    Исправить (в 3х местах):

     ПараметрПериод.Значение  = КонецДня(Объект.ДатаКонца);

    На

     ПараметрПериод.Значение  = КонецДня(Объект.ДатаКонца) + 1;

    И

     Запрос.УстановитьПараметр(«Период»,КонецДня(Объект.ДатаКонца));

    На

     Запрос.УстановитьПараметр(«Период»,КонецДня(Объект.ДатаКонца)+1);
    Reply
  13. Evangelina

    (9)

    Для каждого Измерение Из РегистрНакопления.Измерения Цикл

    Если НЕ Измерение.Имя = «СтатьяФинансирования» И НЕ Измерение.Имя = «СтатьяРасходов» Тогда

    НоваяЗапись[Измерение.Имя] = СтрокаТаблицы[Измерение.Имя];

    КонецЕсли;

    КонецЦикла;

    А куда это вставить в код? А то у меня выходит такая запись:

    {ВнешняяОбработка.ЗакрытиеРегистровНакопления.Форма.ФормаУпр.Форма(301,17)}: Переменная не определена (НоваяЗапись)

    <<?>>НоваяЗапись[Измерение.Имя] = СтрокаТаблицы[Измерение.Имя]; (Проверка: Сервер)

    {ВнешняяОбработка.ЗакрытиеРегистровНакопления.Форма.ФормаУпр.Форма(301,46)}: Переменная не определена (СтрокаТаблицы)

    НоваяЗапись[Измерение.Имя] = <<?>>СтрокаТаблицы[Измерение.Имя]; (Проверка: Сервер)

    Помогите, а то там таких делов по остаткам в ЗУП 3.0 наворотили, за три предыдущих года НДФЛ не отражали на удержание, не уволили сотрудников, а по уволенным вообще суммы к оплате вылазят.

    Reply
  14. alexbur

    (13)

    Это нужно вставлять в процедуру ЗаполнитьНовыйДокументКорректировки для конфигураций отличных от Бух3.0 (ниже текста «Иначе //Если НЕ БП 3.0»)

    Reply
  15. Vladisa

    в ERP кто-нибудь тестировал?

    Reply
  16. user698722_nikolayl

    УТ 11.1

    необходимо было закрыть регистр Товары к оформлению излишков и недостач

    Выходит следующая ошибка:

    {ВнешняяОбработка.ЗакрытиеРегистровНакопления.Форма.ФормаУпр.Форма(372)}: Поле объекта не обнаружено (Характеристика)

    НоваяЗапись[Измерение.Имя] = СтрокаТаблицы[Измерение.Имя];

    Пожалуйста посоветуйте как исправить, очень нужно до понедельника.

    Reply
  17. gull22

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

    Платформа 1С:Предприятие 8.3 (8.3.12.1469)

    При попытке закрыть РН Прочие расчеты, сообщение об ошибке, что значение поля Организация не может быть пустым.

    Reply
  18. svetkana

    Добрый день, на ЗУП3.1 не работает. Можно исправить ошибку?

    Reply
  19. Losevdv

    ЗУП 3.1 не работает.

    Reply

Leave a Comment

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