Справка ИНВ-17




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

49 Comments

  1. witch

    Я не могу понять почему я подключаю к своей бухгалтерии обработка не работает. А если все делаю в демо версии то все отлично.

    Reply
  2. pbabincev
    Я не могу понять почему я подключаю к своей бухгалтерии обработка не работает. А если все делаю в демо версии то все отлично.

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

    Reply
  3. dreamland
    p_tj

    подскажи пожалуйста, как ее добавить чтоб выглядело, как на втором изображении. Как-то добавлял внешние Регламентированны отчеты через «Операции -> Справочники», но здесь нет Инвентаризации, что делать …? плиз

    Reply
  4. Elvina

    (3) dreamland,

    Сервис -> Дополнительные отчеты и обработки -> Дополнительные внешние печатные формы. Создаем новую, загружаем в неё этот файл, далее в табличной форме «Принадлежность печатной форме» выбираем документ «Инвентаризация рассчетов с контрагентами», в колонке «Представление кнопки» пишем название кнопки, нажимаем ОК, всё.

    Reply
  5. dreamland

    (4) Elvina, огромное спасибо, ваша справка выручила.

    Reply
  6. mayak15

    Справка формируется верно.

    Reply
  7. dreamland
    mayak15 пишет:

    Справка формируется верно.

    практически, за исключением: сформировав справку в колонке «Документ, подтверждающий задолженность» номер и дата берутся из базы, т.е. системные номера и даты сформированные при создании документов в базе 1С, а положено указывать «Входящий номер», и «Входящая дата» реального документа (распечатанного и завизированного бумажно в канцелярии).

    P.S. (2) эти реквизиты находятся в документе «Поступление товаров и услуг» на вкладке «Дополнительно». Думаю, что предложенный вариант был бы к стати 🙂

    Reply
  8. bald

    Спасибо. работает замечательно. И самое главное — побыстрее многих себе подобных.

    Reply
  9. leon111

    Отлично работает! Спасибо! Очень выручила, странно почему нет в типовых конфигурациях?

    Reply
  10. ulas

    Очень интересно. Как раз то что нужно. Сейчас скачаю и попробую

    Reply
  11. ulas

    Огромное спасибо. Очень выручили!! Все работает.

    Reply
  12. sound

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

    Reply
  13. AlekseiLeit

    спасибо, очень пригодилась

    Reply
  14. lapostino

    Всё работает! успешно пользуемся, спасибо! немного подправили табличную форму.

    Reply
  15. pbabincev
    lapostino пишет:

    Всё работает! успешно пользуемся, спасибо! немного подправили табличную форму.

    Всегда пожалуйста, я рад за Вас 🙂

    Reply
  16. Death_eye

    Справка, конечно, работает. Но табличный документ заполняется не по правилам. В документ у вас попадает договор.

    Reply
  17. renne

    хм… а у нас не попадает договор, только документ, подтверждающий задолженность…

    Reply
  18. DimanYa

    Скажи, а на ред 2.0 она будет работать?

    Reply
  19. dreamland

    Да, работает. У меня установлена 1с БП 2.0.30.8, и все прекрасно работает без проблем, за исключением

    dreamland пишет:

    Цитата

    [IS-QUOTE]

    mayak15 пишет: Справка формируется верно.

    практически, за исключением: сформировав справку в колонке «Документ, подтверждающий задолженность» номер и дата берутся из базы, т.е. системные номера и даты сформированные при создании документов в базе 1С, а положено указывать «Входящий номер», и «Входящая дата» реального документа (распечатанного и завизированного бумажно в канцелярии).[/IS-QUOTE]

    P.S.: см. мой коментарий от 08.10.11 7:38

    Reply
  20. DimanYa

    Возник ещё один вопрос, когда показал форму бухгалтерам. По нумерации.

    Они нумеруют по контрагентам, а в вашей форме нумерация идёт по документам. И слегка непонятно как правильно. В консультанте по этому поводу ни слова. На что вы ориентировались при нумерациии почему?

    Reply
  21. pbabincev

    Внимание! Отвечаю на все вопросы.

    Печатная форма написана под требования одной организации, для них она подходит по всем параметрам.

    Как выяснилось, однозначные требования сформировать сложно.

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

    Форма бесплатная, выложена исключительно для того чтобы «поделиться», а не для накручивания рейтинга и очков.

    Если появятся какие-то конкретные требования по стандартам (а я их пока не увидел в обсуждении), то попробую реализовать, если найду время.

    И еще: печатная форма написана под БП ред. 1.6 (под платформу 8.1.15.14). Для 2.0 сам ни разу не запускал и не тестировал, поэтому никакой информации по этому вопросу дать не могу.

    С Уважением, Павел.

    Reply
  22. leon111

    Спасибо за ответы

    Reply
  23. pdimas

    Отличная обработка всё работает, единственное иногда не выводится название контрагента, но исправляется легко, там где присваивается значение имя контрагента, надо это значение сделать в СокрЛП и всё.

    Reply
  24. Гость

    Подскажите, пожалуйста, в данной печатной форме учитываются акты сверки? т.е в форму справки выводится что задолженность подтверждена актом сверки если такой акт сверки по данному контрагенту присутствует в базе? Заранее спасибо.

    Reply
  25. YuliaYVS

    Я подключила справку, в кнопку печать форма попадает. При попытке распечать выдается ошибка:

    Не удалось сформировать внешнюю печатную форму!

    Значение не является значением объектного типа (Выгрузить)

    Я что-то неверно сделала??

    спасибо!

    Reply
  26. YuliaYVS

    Печатная форма не формируется в редакции 1.6.,и 2.0.

    Reply
  27. hmv59

    Как тогда разрешить данную ситуацию?

    Reply
  28. YuliaYVS

    на платформе 8.1 пишет не помжет быть прочитана текущей версией программы.

    Что-то я не то делаю?

    Reply
  29. pbabincev

    (26) YuliaYVS,

    так не должно быть… могу посоветовать пройти отладчиком, надеюсь это Вам поможет

    Reply
  30. pbabincev

    (29) YuliaYVS,

    сейчас перепроверил: платформа 8.1.15.14, все открывается и формируется…

    может быть, у Вас есть какие-то изменения в конфигурации?

    Reply
  31. pbabincev

    (28) hmv59,

    какую ситуацию?

    у Вас та же проблема, что и у Юлии? Попробуйте описать подробнее, пожалуйста

    Reply
  32. YuliaYVS

    Конфигурация сильно переписана под нашу организацию. Возможно в этом проблема. Попробую отладчиком. Спасибо за совет.

    Reply
  33. YuliaYVS

    В режиме отладчика не получается выяснить причину. На точке останова он не останавливается… Дополнительные сообщения, введенные до проверки выдает до строки кода «МассивСчетов = ДокДанные.СчетаРасчетов.Выгрузить();». Возможно неправильно делаю трассировку…

    Reply
  34. YuliaYVS

    Я изменила в реквизите СсылкаНаОбъект тип Строка на ДокументСсылка.ИнвентаризацияРасчетовСконтрагентами печатная форма открывается. Теперь в редакции 1.6 в колонках документ заполняются данные за что, а в редакции 8.2 данные о поступлении… Осталось добить, чтобы за что было на своем месте и вместо данных о поступлении была счет-фактура…

    Reply
  35. pbabincev

    (34) YuliaYVS,

    Таким образом отладить не получится, потому что исполняемый код находится во временном файле, а не в экземпляре, который Вы открываете конфигуратором, а сама обработка хранится в БД.

    Можно схитрить, например, таким образом:

    Создаем внешнюю обработку, копируем в нее макет, реквизиты и код модуля из объекта печатной формы, затем создаем основную форму, добавляем поле ввода, указываем для него Данные: реквизит «СсылкаНаОбъект», далее добавляем кнопочку, и при нажатии кнопочки вызываем функцию печать(), результат функции выводим в табличный документ на экран.

    Запускаем отладку, устанавливаем точку останова, далее в режиме Предприятие открываем Вашу внешнюю обработку, выбираем документ в поле ввода, нажимаем кнопочку, ищем ошибку.

    Reply
  36. YuliaYVS

    Спасибо, идея хорошая пригодится и в будущем тоже. Пока устраивает изменение типа Строка на ДокументСсылка.ИнвентаризацияРасчетовСконтрагентами. Надо только доделать чтобы «За что» и «дата начала» заполнялась. Там еще и счет-фактуру бы видеть хотелось.

    Reply
  37. Лен75

    если подключить к 1 с бухглтерии 8.2 будт работать?

    Reply
  38. pbabincev

    (38) Лен75,

    читаем из (22):

    печатная форма написана под БП ред. 1.6 (под платформу 8.1.15.14). Для 2.0 сам ни разу не запускал и не тестировал, поэтому никакой информации по этому вопросу дать не могу.

    С Уважением, Павел.

    Reply
  39. Лен75

    Для 1 с бух 8.2 не подошел:

    {Справочник.ВнешниеОбработки.Форма.ФормаЭлемента(189)}: Ошибка при вызове метода контекста (Создать): Ошибка подключения внешних метаданных: Ошибка загрузки документа.

    Внешняя обработка не может быть прочитана текущей версией программы.

    Напишите, пожалуйста, такую справку инв-17 для 1 с бухгалтерии 8.2…..

    Reply
  40. pbabincev

    (40) Лен75,

    Описание ошибки указывает на то, что Вы не конвертировали печатную форму под 8.2.

    Делается как обычно для всех внешних обработок:

    Запускаем конфигуратор, отрываем в конфигураторе скачанную печатную форму, отвечаем «Да», затем уже проводим действия по регистрации печатной формы в БД.

    От себя еще добавлю, что после конвертации надо будет как-то внимательно проверить корректность выводимых данных.

    И да, сделайте для начала резервную копию печатной формы, чтобы не ришлось в случае чего по новой скачивать с инфостарта.

    С Уважением, Павел.

    Reply
  41. buy_sale

    Плюсую, но есть пожелание

    1. автовысота строки наименования контрагента

    2. Ввод даты начала сбора данных запросом (по умолчанию — пусть начало года от даты документа) — иначе на больших базах ООООЧЕНЬ долго считает.

    Reply
  42. Лен75

    затем уже проводим действия по регистрации печатной формы в БД….С этого момента можно поподробнее, если нетрудно пошаговую инструкцию…..я бухгалтер, а не программист…..как провести регистрацию печатной формы….

    Reply
  43. Лен75

    Все получилось….нажала объединить….а потом в программе:

    Сервис -> Дополнительные отчеты и обработки -> Дополнительные внешние печатные формы. Создаем новую, загружаем в неё этот файл, далее в табличной форме «Принадлежность печатной форме» выбираем документ «Инвентаризация рассчетов с контрагентами», в колонке «Представление кнопки» пишем название кнопки, нажимаем ОК

    Спасибо большое!!!

    Reply
  44. Fish'ka

    на УПП не работает, но все равно спасибо, пригодилась как макет который можно доработать

    Reply
  45. pbabincev

    (44) Лен75,

    (45) Fish’ka,

    был рад чем-то помочь 🙂

    Reply
  46. AlekseiLeit

    вопрос на засыпку 🙂

    в печатной форме в колонках сумма задолженности данные должны браться откуда, из колонки «Подтверждено» документа или «Подтверждено» + «Не подтверждено».

    Спасибо заранее за ответ.

    Reply
  47. gosizo

    очень надеюсь что будет работать под 8.2 после конвертации

    Reply
  48. luchyk007

    Как понимаю данный отчёт не работает в УПП, сделан только под бухгалтерию, можно его более универсальным сделать.

    Reply
  49. mamay

    (49) luchyk007, для УПП есть такой отчет, если еще не нашли то вот ссылка http://infostart.ru/public/93330/

    Reply

Leave a Comment

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