Как не надо изменять конфигурацию или Как облегчить жизнь при обновлении




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

    7.7 уже неактуальна

    Reply
  2. vano-ekt

    в ларьках ПС может и неактуально менять, а на практике и счета добавляются, и аналитика меняется

    Reply
  3. RomanBor

    (2) vano-ekt,

    А кто мешает в пользовательском режиме добавить счета в ПС по крайней мере в бухгалтерии 3

    это реализованно

    Reply
  4. vano-ekt

    (3) НайтиПоКоду мешает

    Reply
  5. Bassgood

    (4) vano-ekt, Согласитесь лучше искать счет по коду, нежели потом мучаться с обновлением ПС (особенно если речь идет о субконто).

    Или же есть другие надежные варианты:

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

    2. После создания счета в пользовательском режиме — получить его идентификатор и использовать его в алгоритмах.

    Reply
  6. vano-ekt

    и получаем конфигурацию, зависимую от данных…

    подключаются к работе 5 новых разработчиков, у них доступ только к хранилищу,…

    и дико удивляются присутствию каких-то гуидов в коде 🙂

    Reply
  7. ekaruk

    На самом деле не вижу особых проблем в добавлении предопределенных данных. Это ничем не хуже, чем обращения к элементам по кодам или схемы хранения ссылок на элементы в регистрах.

    Reply
  8. peterxx

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

    Изменять функционал существующих документов, тоже да, стараюсь избегать. Добавить новый документ (не ПКО или РКО, конечно), считаю допустимым, особенно в специализированных плагинах.

    Reply
  9. TrinitronOTV

    спасибо за рекомендации

    Reply
  10. distorshion

    Открыл америку через форточку..

    Reply
  11. Armando

    Каша

    Reply
  12. Armando
    Но как я глянул на конфу, немного офигел. В ней аж 3 Приходника, 3 Расходника, и 3 Авансового, ну и так еще пару-тройку документов, а сделано это потому, что у конторы имеются 3 подразделения.

    Бывают еще особо умные бухгалтеры, которые настаивают на такой реализации. Во франчевую бытность встречал таких.

    Reply
  13. jobkostya1c8

    Может быть, автор имеет в виду что возможно появление в будущем таких же стандартных предопределенных элементов (счетов, субконто) и тут точно будут всем известные проблемы.

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

    если организация только оказывает услуги и работают там 3 калеки, зачем им брать УПП?

    ну есть у людей деньги им и продадут. А дальше опять юмор: продадут одни, внедряют другие, исправляют третьи.

    Reply
  14. sky.xn

    В 1С Предприятие: 8.3.6 будет возможность использования расширений, ИМХО вот их и нужно использовать в подобных случаях. Подробнее можно прочитать вот здесь — http://v8.1c.ru/o7/201410ext/index.htm [Заметки из зазеркалья]

    Reply
  15. RomanBor

    (14) sky.xn, блин а прикольно если конечно работать механизм будет нормально

    И Еще почему я до сих пор считаю что ПС предопределенный менять незя

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

    2. Сравнивать предопределенные планы счетов рабочую и поставку геморойно.

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

    Reply
  16. RomanBor

    (12) Armando, постараться доказать бухам что так делать не комильфо. Хотя это бывает сложнее чем ….

    Reply
  17. sky.xn

    (15) надеемся на лучшее, в одинэсине такого механизма с самого начала не хватало

    Reply
  18. lesv

    (13) kostyaomsk, Фактически вся работа программиста 1с — это изменение и доработка типовых конфигураций. В основном это не глобальные задания, а мелкие и связанные с управленческим учетом. Простые правила которые я усвоил для себя: а) создавать новые объекты и реквизиты с префиксом; б) можно не изменять модуль объекта, а использовать подписку на событие; в) создавать новые общие модули; г) и если приходиться менять формы документов — то лучше ее скопировать и назначить основной и вносить изменения в ней.

    Reply
  19. Aleksandtmt

    (1) PiccaHut001, Пока актуальна. Работают на ней (на 77) и особенно с сильно измененным функционалом.

    Reply
  20. 1cmax

    (2) vano-ekt, а вот и зря. план счетов лучше не менять, если и добавлять, то только забаланс. либо делать нечто на регистрах сведений.

    Reply
  21. fish249

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

    Reply
  22. iodine
    Так кодить можно:

    с = 0;

    Пока с < 1000 Цикл

    с = с + 1;

    КонецЦикла;

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

    Посмотрите типовые, там вы такого кода не найдёте.

    Вообще цикл «Пока» используется для какого-то хитрого инкремента (или условия), например, такого:

    Позиция = 0;
    Пока Позиция < 1000 Цикл
    Позиция = Позиция + 2;
    КонецЦикла;
    

    Для случая указанного в примере, конечно нужно использовать «Для». Например:

    Для Индекс = 0 По 999 Цикл
    
    ПонятноеНазваниеПеременной = Индекс;
    
    КонецЦикла;
    

    Reply
  23. avto1c

    Свести к минимуму обмены и не вести вместе бух. и упр. учет — несколько противоречивые требования.

    Однозначно не стоит вести отдельно упр. учет если основная база на УПП.

    Про «так кодить нельзя» вообще не понял, что написано.

    Reply
  24. flyDrag

    Когда на крупном предприятии план счетов раздут еще на 50-70 счетов и субсчетов, выгоднее их добавить через пользовательский режим, иначе каждый раз при обновлении плана счетов можно нарваться на неприятности

    Reply
  25. RomanBor

    (18) lesv, г) и если приходиться менять формы документов — то лучше ее скопировать и назначить основной и вносить изменения в ней.

    ИМХО но в данном случае есть подводный камень, если долго не обновляешь конфу и нужно обновить через нное кол-во релизов ио как правило основная форма может поменяться разительно, вот тогда со скопированной формой приходится мудрить 🙁

    Reply
  26. RomanBor

    (22) iodine, я имел ввиду просто разделители между операторами, переменными и функциями 🙂

    Reply
  27. mikhailovaew
    там еще участвуют «перегрузка событий»

    что это такое? подписка на события?

    Reply
  28. mikhailovaew
    с=0;

    пока с

    чего это кусок, где даже КонецЦикла не прописан? или это у меня так отображается?

    Reply
  29. RomanBor

    (21) fish249,

    ИМХО Предопределенные данные можно в узком случае, например справочники, так как их проверить проще, а вот в ПС потом сравнивать где что изменилось целая эпопея там же еще есть субконто и много др. параметров

    добавление документов можно когда они некоим боком не участвуют в стандартном механизме учета

    Reply
  30. RomanBor

    (28) mikhailovaew,

    это чет движок сайта глючит 🙁

    Reply
  31. RomanBor

    (27) mikhailovaew,

    да подписка на события… с C++ перемешались термины 🙂

    Reply
  32. Vo1C
    Reply
  33. AlexO

    (7) ekaruk,

    На самом деле не вижу особых проблем в добавлении предопределенных данных.

    Зря.

    1. Меняется конфа.

    2. Могут быть конфликты (особенно актуально при подобном изменении Плана счетов — счета-то мы все обзываем одинаково, а 1С возьми и тоже введи этот счет в предопределенные).

    схемы хранения ссылок на элементы в регистрах.

    Самый надежный и верный вариант — хранение ссылок на объекты в справочнике (своем или подходящем типовом). Вот там — делай предопределенные какие хочешь.

    Reply
  34. AlexO

    (8) peterxx,

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

    Предопределенных?

    Reply
  35. AlexO

    (14) sky.xn,

    8.3.6 будет возможность использования расширений

    Вот когда сделают, тогджа и посмотрим — насколько это будет работоспособно.

    А пока все эти заметки — отражение самих себя.

    Reply
  36. AlexO

    (18) lesv,

    можно не изменять модуль объекта, а использовать подписку на событие

    У вас есть подписки на каждое событие? Открытие формы, пожалуйста.

    (22) iodine,

    Вообще цикл «Пока» используется для какого-то хитрого инкремента (или условия), например, такого

    В ненормальной реализации 1С «Пока … Цикл» можно безбоязненно использовать только в одном случае:

    Пока Истина/Ложь Цикл



    КонецЦикла

    с проверкой внутри от зацикливания (внутри цикла размещаем счетчик итераций и принудительное прерывание, если более 1000…1 млн итераций).

    Reply
  37. gigagr

    Абсолютно согласна с lesv, практика именно это и подтверждает.

    Reply
  38. RomanBor

    (32) Vo1C,

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

    и еще очень им нужны Авизо а в проф их нет 🙁

    Reply
  39. DAnry

    Прочитал статью, а в голове фраза из анегдота: «А шо делать?» Работа наша такая: поправлять код типовых конфигураций, адаптировать их к конкретному пользователю (фирме). Конечно, если есть возможность зделать это при помощи внешних обработок/отчетов, характеристик, свойств, доп. реквизитов то безусловно надо использовать возможности «типовых». (При обновлениях позже не раз скажеш «Какой я молодец!») Но, к сожалению, чаще возможностей «типовых» недостаточно и приходится писать-дописывать-переделывать. И не всё так страшно. К счастью механизм обновления достаточно развит и советую пользоваться им в полную. Про максимальное использование коментариев поддерживаю на все 100 — затраченые лишних 5 мин позже сэкономит уйму времени.

    Reply
  40. jobkostya1c8

    (18) lesv, совершенно согласен с Вами насчет простых правил

    а) создавать новые объекты и реквизиты с префиксом; б) можно не изменять модуль объекта, а использовать подписку на событие; в) создавать новые общие модули; г) и если приходиться менять формы документов — то лучше ее скопировать и назначить основной и вносить изменения в ней

    Но это если нужно менять типовую конфу которую не трогали. А на деле, как правило, с криками «помогите» или с воплями «мне щас надо» конфигурация-франкенштейн. Ну учились люди. Пока сам пару-тройку не изгадишь в процессе «обучения» на программиста 1С не научишься.

    Главный плюс от метода «г» — берем и копируем стандартный документ со всеми формами-макетами (или уже накройняк форму) мы сохраняем весь функционал старого документа со всеми его обработчиками и точно не вредим конфигурации 1С. Ее проще обновлять. Потом только нужно добавить в журналы (можно и журнал скопировать), интерфейсы, если БП то в субконто, планы видов характеристик, отдельно придется в новых общих модулях прописать подписку на события и если нужно сделать вставки (увы) в регламентные процедуры и процедуры общих модулей. Например если это анализ взаиморасчетов. Вот тут и будут каждый раз проблемы и программист должен об этом знать и никому не говорить 🙂 а то без работы останется 🙂

    Reply
  41. Vo1C

    (38) Авизо придется «сдернуть» из Корпа. Со всеми вытекающими ссылками… А насчет регулярного обновления «нетиповых» конфигураций — это в «ИжТиСи»

    Reply
  42. RomanBor

    (40) kostyaomsk, Вот как раз на такого франкенштейна и нарвался 🙂

    (41) Vo1C, а мне денег на ИЖ некто не даст, я работаю на конечного работодателя не франч :(.

    и все таки мне кажется проще обновить проф на комп и доплатить там 10-15 тр за конфу, для конторы которая в штате имеет программиста не такие и большие денежки

    Reply
  43. AlexO

    (37) gigagr,

    Абсолютно согласна с lesv

    кто это? И с чем вы согласны?

    Reply
  44. AlexO

    (38)

    обрезать базу

    Надеюсь, вы понимаете, о чем говорите. Именно о термине «обрезать».

    (39) DAnry,

    К счастью механизм обновления достаточно развит

    Да что вы говорите? Хоть раз пробовали дважды измененные обновить? Или изменения на формах?

    (40) kostyaomsk,

    Главный плюс от метода «г»

    Впечатление, что никто тут особо не обновлял ничего.

    Давайте любой свой пункт.

    Есть масса и плюсов, и минусов, и у каждого момента и способа, но в общем и в целом — с обновлением/внесением изменений в 1С хреново.

    Reply
  45. AlexO

    (41) Vo1C,

    А насчет регулярного обновления «нетиповых» конфигураций — это в «ИжТиСи»

    Вы сами-то пользовались? Отличия представляете надстройки ИЖТС от типового обновления?

    (32) (38) (42) до вас никак не дойдет еще, что запрет вести обособленные подразделения (да и вообще — все программные запреты в типовых конфах 1С) сделаны не просто так? Что заремарить/подписать вы можете что угодно — но все остальные механизмы конфы ориентированы на определенный учет и конкретные данные?

    (32) Vo1C, как думаете, что будет — когда ожидается в переменной один объект, а «приплывет» — десяток? И ошибка с криками alarm случится — это еще в лучшем случае?

    Reply
  46. THXO

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

    истины далеко не все.

    Главное правило всех этих истин — не позволять открывать конфигуратор профану.

    Reply
  47. RomanBor

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

    Reply
  48. Vo1C

    (45) AlexO, не приплывает, люди пользуются. Вопрос топика не теоретический, а чисто прикладной — как сделать учет денег в обособленных подразделениях. Я рассказал. Работает. Проводки, формы, отчеты — все людей устраивает. Сделал так, как описал. Обновляю сравнением — снимаю галку у одной константы, и все. Не надо КОРП, не надо ИТС КОРП.

    По поводу ИжТиСи — сам не сталкивался, но их предложение, вебинары и методику изучил. В чем Ваши трудности — я не понял, а понты не интересны.

    Reply
  49. vx_gas

    тема не раскрыта…

    Reply

Leave a Comment

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