Обработка для 1С 8.1 "Бухгалтерия" 1.6 и 1С 8.2 "Бухгалтерия" 2.0 — автосоздание документов "Поступления" по документам "Реализации"…




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

30 Comments

  1. gutentag

    + за идею

    Reply
  2. Mazaloff

    страшное дело!!! хочется плакать!!! 😥

    когда же наш учет перестанет быть криворуким и наша бухгалтерия будет работать не только что бы жопу прикрыть в налоговой, но и давать отчетность для прочих заинтересованных лиц (руководители, менеджеры, инвесторы, банкиры) как во всех развитых страннах, а пока мы только занимаемся ананизмом… вот используя такие обработки и такие методики учета!

    Reply
  3. script

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

    Объясняю для нервных.

    Есть главная фирма которая закупает товары и продает по безналу. А есть СПД (собственные сотрудники) которые продают тотже товар с того же склада но за нал.

    Отдельного склада у СПД нет товара нет. Как продать ?

    Между прочим Торговля и Склад, Комплекснаяна 77 Управление торговым предприятием, торговля и УПП на 8 ке. Методически решают именно такую задачу.

    Им только таких обработок и не хватает.

    Я делал для 8.1. СПД продает товар отражая накладкую только по упр учету. Потом запускаеться обработка и она формирует расход с главной фирмы и приход на СПД с определенной наценкой (5% ну что бы не в 0 продавать). Потом расходные по СПД перепроводяться по всем видам учета.

    Reply
  4. script

    Так что зачет 😉

    Reply
  5. MAP5

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

    Reply
  6. Serg O.

    Рад что эта обработка нашла столько откликов 🙂

    Reply
  7. marina-daniel

    День добрый. Не получается посмотреть обработку. Пишет «Поле объекта не обнаружено (Артикул). Хотя у Вас в скринах никакого артикула нет в табличной части. 🙁

    Reply
  8. света1969

    У меня тоже самое! А хотелось бы попользоваться вашей обработкой…

    Reply
  9. tili

    Спасибо Очень нужная обработка Большой ПЛЮС

    Reply
  10. marina-daniel

    (6)Serg O. Может ответите бедным бухгалтерам 😥 . Хочется уже посмотреть в работе обработку…..

    Reply
  11. Serg O.

    ВНИМАНИЕ!

    извиняюсь за ошибку в работе моей обработки…

    («Не найдено поле — Артикул»)

    теперь все работает правильно — можете скачивать измененную обработку

    ВводПоступленийПоРеализациям2.epf

    Спасибо за замечания от marina-daniel…

    странно, что никто до этого не высказывал претензий

    Reply
  12. Topol

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

    Только при попытке открыть обработку сообщение

    {Форма.Форма(399,15)}: Переменная не определена (БухгалтерскийУчет)

    СчетаУчета = <<?>>БухгалтерскийУчет.ПолучитьСчетаУчетаНоменклатуры(Организация, СтрДок.Номенклатура, Склад);

    У меня версия правда старая. Может в этом дело 🙁

    Reply
  13. Serg O.

    для — Topol

    в принципе эти строки не так важны…

    они сделаны для Проведения поступления сразу,

    можете их закомментарить в Модуле Формы…

    //СчетаУчета = БухгалтерскийУчет.ПолучитьСчетаУчетаНоменклатуры(Организация, СтрДок.Номенклатура, Склад);

    //СтрДок.СчетУчетаБУ = СчетаУчета.СчетУчетаБУ;

    //СтрДок.СчетУчетаНУ = СчетаУчета.СчетУчетаНУ;

    Reply
  14. СветаОнила

    Обработка нужная, спасибо Вам.

    Единственно, что ставки НДС берутся не из справочника номенклатуры, а везде ставится 18%. Правда может я в настройках 8-ки галку где-то не там поставила. 😀

    Reply
  15. marina-daniel

    Serg O. — зачет Вам. Спасибки, что выручаете скромных бухгалтеров 😉

    +++++

    Reply
  16. M-Mark-76

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

    Reply
  17. den_vladimir

    полезно! +

    Reply
  18. programada

    весьма нужная вещь

    Reply
  19. albert

    Для доработки: Если учет по складам на счетах 10, 41 не ведется — то обработка не заполняет табличку товаров.

    Reply
  20. vadgor

    Подскажите плиз, поставил обработку, товар находит, а при формировании поступления выдает ошибку: В поле объекта не найдено (НДСВключенВСтоимость)….. че делать? ❓

    Reply
  21. vadgor

    и у меня, к примеру, Расход(Товар1(05.05.2010))=-5, Приход(Товар1(05.05.2010))=3… то по логике обработка должна найти минусовый остаток, т.е. Товар1(05.05.2010)=-2…. галочка стоит «Анализ только отрицательных товаров», он в сообщении пишет, что найден 1 товар, а в таблице не появляется… что делать????

    Reply
  22. Serg O.

    (23) обработка предназначена для создания поступлений при «+» расходе (реализациях)

    и кстати в вашем приере если расход -5 а еще приход 3, то остаток +8

    расход должен быть больше 0, иначе это возват от покупателя!

    Reply
  23. Serg O.

    (22) изменен процесс заполнения реквизитов документа поступления…

    обновленная версия v2.3 обработки корректно «ругается», но дает создать документ Поступления…

    Reply
  24. Zakharov

    Есть парочка замечаний:

    1) Хорошо бы сделать возможность выбора документа списания товара из списка, им может быть и ОтчетОРозничных продажах, и Требование-Накладная и т.д.

    Или ручками придется менять в запросе вот тут:

    Запрос1.Текст = «ВЫБРАТЬ РАЗЛИЧНЫЕ

    | Номенклатура,

    | СУММА(Количество) КАК КоличествоОборот,

    // | СУММА(КоличествоМест) КАК КоличествоКонечныйОстаток,

    | СУММА(Сумма) КАК СуммаОборот,

    | СУММА(СуммаНДС) КАК СуммаОборотНДС

    |ИЗ

    | Документ.ОтчетОРозничныхПродажах.Товары КАК РеализацияТоваровУслугТовары

    |ГДЕ

    | РеализацияТоваровУслугТовары.Ссылка.Дата >= &ДатаНач

    | И РеализацияТоваровУслугТовары.Ссылка.Дата <= &ДатаКон

    | И РеализацияТоваровУслугТовары.Ссылка.Проведен = Истина

    | И РеализацияТоваровУслугТовары.СчетУчетаБУ В ИЕРАРХИИ (&Счет)

    |»;

    2) В приходную накладную попадают также услуги из реализации, надо поставить анализ на флажок услуги

    Reply
  25. Serg O.

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

    а на 2-ое замечание — в Док-те Реализация в таб.части Товары — услуг быть не может! это контролитуется типовой конфигурацией

    Reply
  26. buka-777

    Хорошая вещь, только ГТД не подтягиваются, да и цена мне нужна самая маленькая.

    И почему то не хочет формировать таблицу с галкой «только отрицательные».

    Reply
  27. baida

    Полезнейшая вещь! Автор, еще бы и с/ф! Спасибо!

    Reply
  28. Быдло замкадное

    в описании указано что 1.6 под 8.1 обработка, а она под 8.2 и запустить под 8.1 нет возможности….

    Лучше бы выложил под 8.1 а кому надо 8.2 сами конвертнули бы за 2 секунды

    Reply
  29. Гость

    Полезнейшая вещь! Автор, еще бы и с/ф! Спасибо!

    Reply
  30. child1983

    Хорошо бы данную обработку уже для Бухгалтерии 3.0.

    Reply

Leave a Comment

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