Обработка для 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 // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *