Универсальный ввод на основании (заполнение) документов




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

84 Comments

  1. e.kogan

    Автозаполнение соответствий есть?

    Reply
  2. nika.1007

    to e.kogan

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

    потом можно переназначить, но только из тех которые подходят по типу.

    Reply
  3. e.kogan

    + к 1: Как ВПФ подключается?

    (2) Чтобы указать, на какой комментарий вы отвечаете — ставьте его номер в скобках

    Reply
  4. nika.1007

    (3) его можно вкинуть в ВПФ,

    но из меню в документах вызвать пока нельзя,

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

    Reply
  5. MRAK

    Вроде красиво. Авансом +, попозже потестю.

    Reply
  6. MRAK

    Вот и ошибка. Если выбираешь «Приемник», а «Источник» не заполнен:

    {Форма.Форма(12)}: Значение не является значением объектного типа (Имя)

    МассивТипов.Добавить(Тип(«ДокументСсылка.»+Источник.Имя));

    Reply
  7. nika.1007

    (6) Ошибку исправил. Через минуту выложу исправленный вариант.

    Reply
  8. marku

    Необходимо сделать «Поступление товаров и услуг» на основании «Расходный кассовый ордер».

    1 . Как правильно сопоставить Контрагента + Договор

    2. Как по выражению заполнить «Сделка»

    Reply
  9. nika.1007

    (8) — если типы не совпадают, — тогда через выражение

    в выражении надо написать «Результат = ОбъектИсточник.Контрагент;»

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

    Reply
  10. e.kogan

    (6) В Форме, стр.22 то же. Что поправили — непонятно, если вообще поправили.

    Reply
  11. nika.1007

    (10)Теперь точно поправил. В прошлый раз файл на сайте почему-то не обновился.

    Сейчас проверил — тот что надо. Спасибо.

    Reply
  12. Multik

    Как раз искала что-нибудь подобное, ошибок пока не нашла, так что +

    Reply
  13. valkovaolga

    (11) Подскажите, а в Бухгалтерия предприятия, редакция 1.6 (1.6.24.3) будет работать ?

    Reply
  14. nika.1007

    (13) не уверен в сохранении настроек , но обработка работать будет

    Reply
  15. sin-s

    Не знаю как в остальных конфах, но в УТ 10.3 есть замечательнаю кнопочка в любом из документов «Изменить». При нажатии кнопки на основании любого табличного документа можно создать любой другой. Например, на основании «Приходной» накладной сделать «Расходную». При этом все поддается корректировкам.

    Reply
  16. nika.1007

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

    Reply
  17. sin-s

    Что имеется ввиду под груповым вводом? Это не оно: к примеру, есть несколько расходных документов и на их основании нужно сделать один приходный?

    Если имелось ввиду что-то подобное — то оно через «Измненить» также элементарно делается. Если что-то другое, прошу — подскажите.

    Reply
  18. nika.1007

    под групповым вводом имеется ввиду возможность ввода НОВЫХ документов группой, то есть несколько документов одного вида заполняются на основании другого вида. Заполняются все один к одному, по правилам , которые надо перед тем настроить. Кнопка «Изменить» в таб части ничего подобного не делает, это совсем другой функционал, по кнопке «изменить» можно изменить таб часть уже СУЩЕСТВУЮЩЕГО документа, добавить строки из другого документа, изменить цены и т.д.

    Reply
  19. RomikMf

    Я бы как минимум заменил в процедуре АнализМетаданныхДокумента()

    Если СокрЛП(Приемник.Реквизиты[РеквизитПриемник].Тип) = СокрЛП(РеквизитИсточник.Тип) Тогда

    хотя бы на это

    Если Приемник.Реквизиты[РеквизитПриемник].Тип.СодержитТип(ТипЗнч(РеквизитИсточник.Тип.ПривестиЗначение())) Тогда

    А то чтобы счет на основании реализации выписать приходится выражение для поля Контрагент вбивать.

    Reply
  20. nika.1007

    (19) — спасибо, заменил 😀 (всего сразу не предвидишь)

    Reply
  21. dim0n_la

    Плохо, что не видно реквизитов источника.

    Для написания формулы не удобно.

    А так хорошо очень. +

    Reply
  22. husky

    Подскажите пожалуйста (Бухгалтерия 2.0), как на основании

    документа «Поступление на расчетный счет»

    ввести документ «Реализация товаров и услуг»

    не получается заполнить табличную часть Закладки «Услуги», помогите пожалуйста какие алгоритмы вставить в ячейки Таблицы «Услуги»…очень нужно,

    заранее спасибо.

    Reply
  23. cool.vlad4

    Посмотри ОбработкаЗаполнения — там лиюо запросом, либо каждый реквизит в отдельности.

    Reply
  24. husky

    (23) Можете привести промер кода, который можно поместить в ячейку например для графы табличной части «Номенклатура»

    Reply
  25. cool.vlad4

    (24) НоваяСтрока = Товары.Добавить();

    НоваяСтрока.Номенклатура = Объект.Номенклатура;

    Если же через обработку заполнения добавление всей номенклатуры из основания

    Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл

    НоваяСтрока = Товары.Добавить();

    НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;

    КонецЦикла;

    Можно через внешнюю обработку заполнения таб частей — принцип тот же(где-то на ис механизм описан, либо итс).

    Единственно откуда ты номенклатуру собираешься брать из Поступление на расчетный счет, на основании документа расчетов?

    Reply
  26. husky

    А если нужно добавить определенный элемент из справочника «Номенклатура»? (если вводить на основании Поступления денег на расчетный счет — документ Реализация товаров и услуг, то в поступлении денег нет этих всех реквизитов, их надо самостоятельно подставить)

    Reply
  27. cool.vlad4

    (26) какую хочешь такую и подставляешь — хоть даже таким дурацким методом

    НоваяСтрока = Товары.Добавить();

    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(«здесь код номенклатуры»);

    Просто я логику того, как у тебя должно работать не знаю, поэтому на вопрос какую номенклатуру подставлять я ответить не смогу, а ведь проблема только в этом.

    Reply
  28. husky

    Не получается, кто работал с этой обработкой, чего в ячейках указать чтобы табличная часть «Услуги» документа Реализация товаров и услуг» заполнилась…(((

    Reply
  29. husky

    (27) Мне нужно подставить номенклатуру предопределенную из справочника (она не будет браться естественно из Поступления денег на расчетный счет) из него надо подставить только сумму, а все остальные реквизиты нужно что бы подставились определенные (Определенная позиция номенклатуры, количество, сумма, счет, субконто)?

    Reply
  30. Alexey55

    Спасибо! Очень удобная вещь!

    Reply
  31. madamonika

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

    Reply
  32. ВРедная

    Спасибо, очень полезно!

    Reply
  33. zhleonid8

    спасибо

    полезно, особенно бухам

    Reply
  34. fetlen

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

    Reply
  35. Likusia

    спасибо! отдали бухам)

    Reply
  36. zhleonid8

    табличная часть «Услуги» документа Реализация товаров и услуг» как заполнить?

    Reply
  37. nika.1007

    (36) — это смотря на основании какого документа заполнять,

    в обработке надо проставить соответствие полей,

    для полей с одинаковым именем и типом — это сделается автоматически

    Reply
  38. itit

    вот спасибо

    Reply
  39. tk82

    Отлично! Спасибо огромное! Экономия времени огромная!

    Reply
  40. opiumdx

    Спасибо, очень удобная вещь, интересный подход к реализации, экономит кучу времени.

    Reply
  41. almas

    Спасибо, но ТЧ есть еще в справчниках.

    Reply
  42. nika.1007

    (41) есть , но на основании справочников очень редко вводятся другие справочники или документы

    Reply
  43. gutentag

    Попробовал в типовой Бух-2.0 = кажется работает(после конвертации через конфигуратор)!

    Спасибо!

    Reply
  44. Snowin

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

    Reply
  45. taste

    а синхронизация товара только по коду?

    Reply
  46. taste

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

    Reply
  47. nagieva.d

    очень пригодилось бы.но жаль нет возможости протестировать в работе ((( нет «денЮжек»

    Reply
  48. nika.1007

    (47)напишите мне в личку ваш емейл

    Reply
  49. saratov27

    а синхронизация товара идет только по коду?

    Reply
  50. nika.1007

    (49) по внутреннему идентификатору :), нету здесь синхронизации,

    обработка работает в одной ИБ ,

    все значения присваиваются или вычисляются в результате выражений.

    Reply
  51. nadimag

    А из документа ручного ввода в документ начальных остатков можно данные перенести?

    Reply
  52. Sergei4_RUS86

    Проверил данную обработку в действии. После создания документа «Оприходование товара» и ввода на основании «Установка цен номенклатуры» выдает сообщение:

    — Документ Установка цен номенклатуры был записан некорректно! Информация о ценах очищена.

    Добавление типа цен «Розничная» в документ ничего не меняет, т.к. при нажатии кнопки «выполнить», создается новый документ. А когда ставишь «галочку» — «копировать номер», обработка не может изменить табличную часть документа и ругается просто, что номер документа «не уникальный»

    Может кому еще актуально при создании новой базы…

    Решил проблему следующим образом:

    1. Создал документ «Оприходование товара» с розничной ценой

    2. Создал пустой документ «Поступление» — кн. «изменить» — «добавить из документа» — выбрал «оприходование товара» — провел документ

    3. Создал пустой документ «Установка цен номенклатуры» — «Заполнить по поступлению» — выбираем документ поступления» — ставим тип цены (кому какая нужна, а мне «Розничная»)

    4. Удалил документ «Поступление» (чтоб не делать никаких доп. документов, типа корректировки)

    5. Проверил в интерфейсе «Кассира» — все работает, цены есть, остатки товара тоже, что и требовалось для начала )))

    Reply
  53. nika.1007

    (52) дело в том , что документ Установка цен номенклатуры «хитрый».

    У него на самом деле есть 2 табличные части, которые связываются между собой.

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

    НО таких «хитрых» документов очень мало, поэтому пользуйтесь на здоровье.

    Reply
  54. Sergei4_RUS86

    (53) Спасибо и вам за данную обработку, будем пробовать.

    Reply
  55. qwerty45

    БП 2.0. Необходимо создать ПКО (вид операции: «Оплата от покупателя») на основании документов Реализация товаров и услуг. Обработка при создании приходников не заполняет поле «сумма взаиморасчетов». Помогите сопоставить поля. фактически сумма взаиморасчетов = сумма документа

    Reply
  56. nadimag

    Повторюсь: На основании док.ручного учета можно создать документ ввода начальных остатков в бух8?

    Например после свертки базы.

    Reply
  57. alcoholic

    спабо, уже пользуемся

    Reply
  58. Tanis

    Эта обработка позволяет делать массовый ввод на основании нескольких документов? Или только один док — на основании одного?

    Reply
  59. Tanis

    Как в обработке формулу писать?

    Можете пример привести, по поиску номенклатуры из справочника.

    Формула не срабатывает.

    Reply
  60. bounti77

    Добрый день, а как сделать так что-бы в счет-фактуре полученной автоматически заполнялось основание

    Reply
  61. Tanis

    написать запрос с нужными параметрами отбора.

    Reply
  62. bounti77

    (61) Tanis, а что нужно написать в форме ввода формулы ???

    Reply
  63. Tanis

    Вводишь же на основании. Пишешь в нужной графе результат = Источник.Ссылка;

    Reply
  64. makas

    Добавьте пожалуйста к документам ПТиУ и РТиУ таб.чась «Агентские услуги»

    Спасибо!

    Reply
  65. Hellgga

    Добрый день.

    Сделала «СЧФ полученный» из «Поступления товаров, услуг», всё получилось, кроме Кода Вида Операций. Нужно, чтобы он в СЧФ был 04, а он упорно ставит 01

    Подскажите, пожалуйста,какую надо написать формулу для Код Вида Операций?

    Очень-очень надо 🙁

    С уважением,

    Ольга

    Reply
  66. Kpat

    (58) Tanis, На основании нескольких документов, создается так же несколько документов

    Reply
  67. Kpat

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

    Reply
  68. Ele1234567

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

    Reply
  69. Светлый ум

    Обрабатывает группу документов (с отборами). +

    Reply
  70. Snegir

    Мне нужно сделать Отчет о розничных продажах на основании Отчета о производстве за смену на конкретную дату.. а в обработке выбираются все документы за весь период.. Как выбрать конкретный документ?

    Reply
  71. spontan

    Спасибо большое автору, теперь можно платежки скопом делать !!!

    Reply
  72. mixasma

    А такую обработку, можно скачать, не бесплатно конечно — уважайте труд )

    ПКО на основании РН Скопом

    Программа работает в УТ11, у клиентов если заведены договора, то в них желательно условия оплаты выбрать как «договоры не используются, порядок расчетов по накладным». Используете так: вводите период, если надо, выбираете организацию и клиента нажимаете заполнить за период, далее в таблице убираете галки против накладных, которым не надо делать ввод на основании приходного кассового ордера и корректируете суммы «ФактОплата», затем ставите дату оплаты — на которую будут созданы ПКО и нажимаете «Выполнить ввод»

    Reply
  73. Prelude

    Надо бы такую для УФ. Есть умельцы?

    Reply
  74. Airlord

    Скачал, посмотрел в конфигураторе — вещь! А вот в толстом клиенте на БП 3.0 не работает — вообще нет блока «Универсальные механизмы» в общих модулях. Печалька! Бум ждать под УФ или как-нибудь допилю на досуге.

    Reply
  75. scc

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

    Reply
  76. Nevermore

    Добрый день

    Подскажите, пожалуйста, а где хранятся настройки этой обработки (чтобы можно было сохранить в файл)

    В Сохранённых настройках их нет 🙁

    Reply
  77. Nevermore

    Ответьте же,

    хоть кто-нибудь…

    Reply
  78. nika.1007

    в регистре сведений «сохраненные настройки»

    Reply
  79. Nevermore

    Спасибо!!!

    Reply
  80. Nevermore

    да, но в файл-то оттуда как сохранить?!?

    Помогите, пожалуйста ;(

    Reply
  81. nika.1007

    штатными средствами 1с вы не сможете перебросить настройки.

    Если базы одинаковые (структура и данные) — то можно запись из регистра перенести в другую базу обработками,

    если разные -то сложно.

    Reply
  82. Nevermore

    Да уж….

    Всё равно — СПАСИБО за обработку. Сохраню настройки в картинках :), бо добрый человек прописал там формулы, а для простого юзера — повторить это на память — что-то из области фантастики.

    Reply
  83. mma@cbi-info.ru

    для БП 3.0 не планируете сделать аналогичную обработку?

    Reply
  84. alis63

    добрый день! Помогите,пожалуйста, заполнить соответствие при создании документа комплектация из документа инвентаризации, если можно

    .Спасибо

    Reply

Leave a Comment

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