<?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='\
Для такой задачи имхо лучше использовать обработку заполнения табличных частей вместо внешней печатной формы.http://infostart.ru/blogs/345/
(1) С удовольствием бы использовал, но в счете-фактуре нет кнопочки заполнить (Изменить) в которые и встраивается обработка таб. части. Там даже панелек то нет. Потому то и пришлось извращаться.
Кстати вопрс с получением списка открытых форм так и не решен…
Никто не знает как это можно сделать? Без ВК.
фор=СсылкаНаОбъект.ПолучитьФорму(«ФормаДокумента»);
докоб=фор.ДокументОбъект;
докоб.Прочитать();
//здесь какие-то действия с докоб
Если фор.Открыта() Тогда
фор.Активизировать();
фор.Обновить();
фор.Заголовок=»дырдырдыр»; //чтоб убедиться, что действует
КонецЕсли;
(3) Не работает такой код. Да, imho, и не должен.
фор=СсылкаНаОбъект.ПолучитьФорму(«ФормаДокумента») даст нам новый экземпляр формы, а не тот что открыт в момент вызова обработки. Вся трудность то в том и состоит, чтобы получить ту форму, из которой была вызвана обработка.
Самое интересное, что он работает… Во всяком случае, на типовых базах ЗУП и Бух — точно.
Вся фишка именно в том, чтобы работать с объектом ЭТОЙ ФОРМЫ.
(5, 6) ну я прежде чем писать (4) проверил…
Попробуй сам.
Создай внешнюю печатную форму, воткни свой код.
Подключи ее…
дырдырдыр в заголовке не замечено 🙁
(7) …а что мешает сделать обработку типа «печатная форма накладная + счет-фактура», вызываемая при печати из «документов на основании которых создаются сч-ф» или вызываемая как «обработка табличной части».
И именно эта(эти) обработки создадут «правильный документ»
—
Я еще не проверял, этот факт(…баланс/отчеты сейчас составляю), но выскажу предположение что еще можно проверить:
Данные платежного документа в счете-фактуре должны быть идентичными с данными в регламентных документов по учету НДС (смотри «Помощник по учету НДС»), где уже есть заложен механизм определяющий/распределяющий платежи в счетах-фактурах. И есть смысл совместить заполнение соответствующих регламентных документов по НДС с заполнением счета-фактуры.
(7) Специально сейчас выложу похожую по функционалу вещь, которая работает, и кину ссылку. Если для счёт-фактуры не работает, значит, у неё какие-то особенности в форме и/или при её открытии/обновлении. Обычно работает нормально.
(10) спасибо за пример… Действительно работает…. переделал код и получилось!
Выложил обновленную обработку.
Спасибо, интересная обработка.
Только у меня выходят авансы и после даты реализации, а если в параметре ДатаРеализации добавить Дату, то все ОК (СсылкаНаОбъект.ДокументОснование.Дата).
Еще у нас часто пользуются документом ПлатежныйОрдерПоступлениеДенежныхСредств, добавил себе его в запрос, и тоже работает 🙂
(12) Действительно… чего то протупил по поводу даты 🙂 Исправлено.
Выложил обновленную.
Приношу свои извенения. Но опять обновил… Просто проверял на списке, и не проверил тот случай, когда только одна платежка. В этом случае в форма счет-фактуры номер и дата сразу не проставлялись. Щас работатет и в том и в другом случае.
(11) Пожалуйста 😉
(14) Еще интересный момент: Если форма сч.фактуры открыта одна, то все ОК, отображение формы работает, а если открыть Реализацию а потом из нее открыть сч.фактуру, то не работает. Или у меня что-то не так?
(16) Вот о таких вещах я и говорила, что могут быть тонкости. Со «свободноживущими» документами таких глюков нет.
(16) Хм…. такой вариант не проверял… гляну вечерком.
Автор все работает в типовой, вы просто не умеете их готовить.
Большая часть фирм ведет взаиморасчеты в БП по договору в целом. В этом случае для «разнесения оплат» используется документ Регистрация оплат от покупателя.
Причем тут это? А при том что на момент после проведения реализации, но до выписки счет-фактуры нужно сформировать этот документ, и тогда программа (о чудо), увидит нашу предоплату по этой реализации и сформирует номер и дату платежного поручения
P.S. Не спрашивайте у меня «почему 1С так сделал», или «ведь это не удобно». Это просто уточнение первого предложения автора
«При вводе счет-фактуры на основе реализации в БП 1.6 почему то не проставляется номер и дата платежно-расчетного документа(ов)»
(19) А вот с этого момента поподробнее… Речь точно идет про БП? Потому как специально поглядел, и не обнаружил документа «Регистрация оплат от покупателя». Есть документ «Регистрация оплаты от покупателей для НДС», но он несколько для другого предназначен… да и вводится раз в квартал.
Смотрел на релизе 1.6.11.7
(20) Про него и говорю. Просто по памяти название писал.
(21) ясно… но тогда точно не вариант…
Если в обработке убрать условие — //Если СсылкаНаОбъект.ВидСчетаФактуры = Перечисления.НДСВидСчетаФактуры.НаРеализацию Тогда
то замечательно работает в УТ. Проверено на релизе 10.3.14.3.
Спасибо! Избавили от излишней траты времени!
Плюсую. Облегчил жизнь бухам! Спасибо, все работает!
(23) AlexStar,
Давно искала такую обработку для своих менеджеров. Дабы не искать им номера и даты платежек. Спасибо за совет, как применить данную обработку для УТ.
Автору отдельное спасибо. Дождусь, когда накапает на счет и обязательно скачаю данную обработку.