Технология ввода и сохранения нетиповых реквизитов печатных форм документов




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

22 Comments

  1. ufo58

    За идею и реализацию — однозначно плюс

    Один недостаток — избыточность сохраняемой информации

    Если говорить (например) о ТТН, «нестандартных» реквизитов для редактирования … более 15.

    Большуя часть можно заполнить по-умолчанию (или взять из документа).

    Если устраивает по-умолчанию или «подредактировали», все-равно сохраняем?

    У сотни документов в неделю — это какого же размера будет регистр сведений через год?

    Reply
  2. maxx

    (1) размер базы эта другая тема, никто не мешает чистить свойства старых документов.

    Reply
  3. ufo58

    т.е. немного подумать об оптимизации — «в лом»?

    а придется, рано или поздно

    если учесть, что в регистре «Значение свойств» хранятся значения и для номенулатуры, и для конирагентов, и для пользователей (настройки) …. да мало ли чего там нет …

    идея хороша …. оптимизируй

    Reply
  4. NazarovV

    Красивое решение!) Автору плюс за идею!)

    Reply
  5. Totoro

    Те свойства, которые единые для всех документов лучше хранить не в доп свойствах каждого документа, а в регистре/справочнике «СохраненныеНастройки» (есть почти во всех типовых для обычных формы). Этот же вариант подходит и для данных в табличных частях.

    Единственный минус — контроль ссылочной целостности.

    Reply
  6. maxx

    (5)

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

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

    Reply
  7. Totoro

    (6) В макетах менял нельзя, в справочнике можно. Понятно, что не лучше?

    Reply
  8. maxx

    (7)

    В макетах менял нельзя, в справочнике можно.

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

    Reply
  9. Totoro

    (8) Я рад 🙂 Значит все таки не лучше чем «А лучше вообще прописывать жестким текстом в макеты и не сохранять ничего»?

    Reply
  10. maxx

    (9)Оптимизация хранения свойств, я считаю другая тема.

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

    Reply
  11. Totoro

    (10) Можно и там хранить, только нужно чтобы гарантированно элемент не был удален или его свойства сам пользователь случайно не изменил. Сам же сказал, что общие реквизиты в организации хранишь. Это все таки лучше, чем в каждом документе.

    А вот типовой справочник/регистр «СохраненныеНастройки» позволяет сохранять все это не мешая пользователю, без возможности изменения пользователем и гарантированно при любых условиях заполнения. За исключением минуса ссылочной целостности. У тебя может быть минус — неодобство использования свойств пользователем по прямому назначению или если нужно для строк ТЧ данные хранить.

    И причем здесь «А лучше вообще прописывать жестким текстом в макеты и не сохранять ничего.» я так и не понял …

    Reply
  12. maxx

    (11)И причем здесь

    «А лучше вообще прописывать жестким текстом в макеты и не сохранять ничего.» я так и не понял …

    а до этого ты писал «

    Те свойства, которые единые для всех документов лучше хранить не в доп свойствах каждого документа»

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

    Reply
  13. Totoro

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

    Reply
  14. _qqq

    У нас тоже часто используются дополнительные сведения документов и справочников. Бывает надо сохранить номер ТТН для каких-то РТиУ, например.

    Но открывать и даже создавать дополнительные свойства при использовании печатных форм — , по-моему, лишнее.

    Reply
  15. ufo58

    лишнее … жестко прописанное …

    пример:

    Реализация (Торг12, ТТН), СчФ, Перемещение (ТТН, Торг 13) … список можно продолжать

    У покупателей «извращения». Одному хочется в строке Основание (в СчФ напр.) видеть договор, другому платежный документ, третьему заказ. А кому-то вообще сочетание …. порою, трудно предсказуемое.

    Наложить сюда Организации, разных подписантов, разных грузополучателей и даже пользователей

    Причем вариант грузополучателя у одного контрагента меняется (в случае Корпоративного клиента, например, когда платит один а получают …. несколько других) …. да еще на разные адреса доставки.

    Опять-же список можно продолжать …

    Основные реквизиты заполняются в документе. Это к вопросу «жесткого прописания».

    Пересечение реквизитов документов (и прошу заметить «переходящие связи» реквизитов в них (в документах)) ….

    Не повторяющиеся, даже индивидуальные данные в разных документах ….

    И …. список получается, мало того, что внушительный, так еще и «динамический».

    Учесть заполнение «по-умолчанию», для организации, для контрагента, для подразделения или филиала в конце-концов …. это относится к «жесткому прописанию». В регистрах, константах или справочниках — не суть.

    «Групповые» («связанные»), индивидуальные настройки документов … записать в свойствах документа — милое дело. Вот тут самое место этого метода.

    А прописывать в каждом типе документов ВСЕ вариации …. брр. Мне лично хватило прописать реквизиты ТТН в Реализации и Перемещении. А их около десятка. Причем, от документа к документу заполняются не все.

    Ладно себя, базу жалко.

    Reply
  16. Сисой

    Мне кажется, что проще добавить пару справочников/РС, возможно добавивив новый тип в ПВХ свойств.

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

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

    Почему не нравится вариант автора. Свойства и характеристики документа могут быть нужны пользователям не только для печатных форм, но и для отборов, они отображаются в отчетах на СКД и заполнять их, и продираться потом через многочисленные 02_Затребовал_ТребованиеНакладная будет тяжко.

    К тому же хранить данные комиссий в настолько ненормализованном виде не по феншую как-то.

    Reply
  17. maxx

    (16)

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

    А как говорить бухгалтерам базовых версий, да у меня есть печатная форма но перейдите на ПРОФ (+ 7000 рублей) и подпишитесь на ИТС для обновлений (от 12 т.р. в год), в общем печатная форма в тысяч 20. А ещё мне нужно к вам приехать или подключиться (а это тоже бывает проблема), чтобы это печатная форма заработала, т.к. сами вы не обновите. Но потом обновляться будете, звоните мне, а то снесёте всё и работать уже не будет. КЛАССНО. Когда у вас на обслуживание будет хотя бы 10 таких предприятий, то вопрос сам по себе отпадёт.

    ПРАВИЛЬНЕЕ И НАДЕЖНЕЕ — вообще не понял, где написано добавить реквизиты в документ что это правильно и это надежнее.

    Свойства и характеристики документа могут быть нужны пользователям не только для печатных форм, но и для отборов, они отображаются в отчетах на СКД и заполнять их, и продираться потом через многочисленные 02_Затребовал_ТребованиеНакладная будет тяжко.

    Присвойте названиям свойства букву «я» в начале типа «я_02_Затребовал_ТребованиеНакладная» и в СКД они будут всегда в конце не мешать.

    Reply
  18. maxx

    (15) Что же вам так базу жалко !

    Кинуть обработку по очистке свойств документа за любой период (старые документы), даже с выбором наборов свойств к удалению (начинающие на «_»)?

    Reply
  19. Сисой

    (17) Для базовых соглашусь, Вы правы. Хотя на мой взгляд, ориентироваться на клиентов, купивших базовую, себе дороже. Франч отказать в поддержке не может, а вот фри вместо 10 базовых найдет одно небазовое и поимеет с этого больше (в т.ч. и с обновлений :-)).

    Reply
  20. Сисой

    (17) >> ПРАВИЛЬНЕЕ И НАДЕЖНЕЕ — вообще не понял, где написано добавить реквизиты в документ что это правильно и это надежнее.

    Ни в коем случае не реквизиты! Только отдельные таблицы или РС со ссылками на документы.

    А вот почему так лучше делать — да потому что таким образом можно добавлять доп. реквизиты даже в табличную часть документа. Через свойства этого не сделаешь.

    Reply
  21. maxx

    (20) Думаю универсальных решений нет, нужно выбирать то, что подходит в ситуации.

    Помню сдавал экзамен Специалист по конфигурирование зарплаты 8. Надо было сделать расчет льготных обедов для сотрудников. Всё сделал, всё считалось, создал новый документ «Расчет льготных обедов» вся логика была в модуле это документа. Когда препод увидел, у него волосы дыбом встали и говорит: «Вы зачем тут всё переписали, надо было в общим модуле всё сделать». Я ему говорю, что мол ведь всё работает и обновлять можно простым объединением и сравнением… вообщем поставил он мне два, через месяц приехал и сделал как просили «влез в типовую» и обновлять теперь геморой.

    Думаю всё ситуации зависит.

    Reply
  22. Dens11

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

    Reply

Leave a Comment

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