<?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='\
Спасибо за статью! Но мне кажется, значительно большие трудности не с написанием, а с отладкой данных обработок. Интересно было бы почитать про способы отладки!
(1) davdykin, благодарю за вопрос.
Раз тема актуальная, то опишу свой подход к решению этой задачи в ближайшее время
Спасибо, хорошая статья. Правда, совершенно не освещено заполнение разрешений. Для безопасного режима это очень актуально
Кто-то должен спросить…
Чем не устроила официальная документация по БСП на ИТС?
З.Ы. Про разрешения там тоже есть.
(4) а у всех туда доступ есть?
Только за одно оформление «+»
«применить данную технологию»
уж тогда механизм) технология это немножко другое
(4) nixel, ага, документация там по принципу «краткость — сестра таланта»
(4) nixel,https://its.1c.ru/db/bspdoc#content:427:1 Вы про это? При всем моем уважении, это не документация, это КрССТал.
Нормально посмотреть как это работает, конечно, можно в демо базе, но зачем тогда такая документация, если по любому вопросу проще лезть в пример. А доступ к демо базе может быть не всегда…
Да они в общем то этого не скрывают:
Подробнее см. дополнительную обработку Демо: Обработка заполнения в справочнике Дополнительные отчеты и обработки демонстрационной конфигурации.
(8) vadver, не заметил там краткости, особенно в разделе «Использование при разработке конфигурации»
Видимо, вкусовщина.
(4) nixel, я описал с точки зрения программиста, который начал использовать данный механизм, а не с точки зрения архитектора, который его разработал и описал документацию.
Архитектору, например, и так понятно, что СвязанныеОбъекты — появляются в меню «Создать на основании» в карточке документа. Но я потратил кучу времени, чтобы понять, на что влияет этот параметр. Или чем отличается Отчет от ДополнительныйОтчет? Из указанной вами справки этого не понять, о чем справедливо заметил (8) vadver, Или например, те же самые команды — все поля перечислены скопом, сидишь и думаешь, как их все заполнить, а заполнять то оказывается достаточно только три из них. И такие мелочи на каждом шагу. В итоге, разобравшись, мне было просто жалко, что эта информация забудется мною через некоторое время, поэтому я выложил свое знание в виде публикации
Мое мнение такое: публикация получилась неплохая, наглядная (за счет добавления таблиц и рисунков). Такой материал проще усваивается и запоминается. Кроме того чтение документации никто не отменял, и ее будет проще читать после этой обзорной статьи.
(3) vadver, я постарался осветить только основные моменты, не погружаясь в детали. На полноту изложения не претендую. Я пропустил не только этот аспект, но и еще дополнительные методы объектов, которые на мой взгляд тоже заслуживают внимания. Думаю, что такие детали уже можно разобрать по справке или на примерах из БСП, имея общее понимание механизма.
Спасибо
плюсанул за внятный удобочитаемый вид
Да, все это нужное и важное. Вот только разработчик БСП постепенно уходит от текущей модели подключаемых внешних обработок и переходит на расширения.
Забыли про внешние обработки, позволяющие добавлять свои способы расчета скидок
а под ОФ(ут10.3) тоже самое подходит? Не могу никак найти описание. видимо уже неактуально и ссылки ушли вниз
Подскажите, пожалуйста, если я вызываю внешний отчёт с формы элемента справочника, могу ли я использовать/получить данный элемент в модуле отчёта?
В моей версии конфигурации «УТ» также есть хороший комментарий в функции ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке.
Спасибо большое, ведь в новых конфах уже старый способ не канает. Пример УНФ 1.6 для Украины, не хотела форма показываться при подключении старым способом
в прочем, алгоритм то тот же, просто блокировка интерфейса стояла у меня на форме обработки)
Отличная статья! Всё максимально разжевано и разложено по полочкам, благодарю
В шаблонах обработки в процедуре ВыполнитьКоманду() параметр «ПараметрыВыполнения» по умолчанию равно «Неопределено».
А внутри процедуры нет проверки и сразу идет обращение через точку «ПараметрыВыполнения.РезультатВыполнения» ..
Здесь явно будет ошибка
(22) так и происходит
Ну и про «СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(»
у меня в этом модуле всего 3 функции — далеко не для этого…
Подскажите — как вызвать форму обработки для заполнения формы объекта?
(Хотелось бы без записи объекта).
Если вызывать заполнение формы — то оно почему-то вызывается с сервера и я не могу открыть другую форму.
Открытие формы — получает на входе только ссылки — то бишь мне остаётся только заполнять и записывать объекты, а не открытую форму.
(25) увы тоже с этим столкнулся. В таком случае придется переписывать логику, чтобы не записывать документ. И это будет велосипед, разработчики предполагили запись в базу, потом открытие.
(26) Для себя костыль нашел — через ЭтаФорма.Владелец.Объект достучался куда надо.
А пока ковырял пытался себя на место разрабов поставить и не понял:
1. Почему в параметры формы форму не передать — имя передают, а саму форму нет.
2. Почему форма заполнения открывается без РежимОткрытияОкнаФормы.БлокироватьОкноВладельца.
(27) потому что это работает, если делать на основании 1 документа, а если на основании нескольких? Тогда велосипед не поедет!
(28) Согласен — задачи бывают разные.
Как по мне — форма заполнения документА — один к одному должна быть ( с трудом представляю заполнение нескольких документов сразу, особенно разных типов).
Ну а если по какому-то алгоритму — то можно и объекты по ссылкам заполнить.
В общем — не панацея, но при 1:1 — решение есть.
(29) так вот тут и вопрос заключается, когда делается 2 документа сразу их приводить к 1 или 2 к 2. 1 к 1 это частный случай)
(30) более одного — это уже из формы списка открывается — или не ?
а из формы списка формы ж никак не получить.
Или есть метод вызвать одну команду сразу у 2+ открытых форм одной кнопкой ?
Почему не все обработки в один архив? Каждую отдельно качать шо ли. (
(32)
Для меня интересна статистика, какие виды обработок чаще используются.
Для тех, у кого нет возможности скачать нужный шаблон, могу порекомендовать два варианта:
1. Разобраться самостоятельно, также как это сделал я. Для этого достаточно скачать демо конфигурацию по БСП. Об этом указано в публикации
2. Написать что-нибудь ПОЛЕЗНОЕ и выложить на инфостарте. Тогда не будет возникать таких вопросов и не будет сложностей со скачиванием чужих разработок
(33) давайте по чесноку.
1) на статистику вам наплевать 100%
2) обязательно это сделаю и не буду требовать стартманей
От себя добавлю: обязательно смотрите на привязку процедуры ПриСозданииНаСервере к самой форме! У меня случилось следующее: в форме списка не выводилась кнопка Печать, хотя в форме документа была. В модуле формы списка прописаны все необходимые процедуры, но печать не работала, пока не обратил внимания на свойства формы! Разработчик скопировал стандартные процедуры из формы другого документа, а сделать привязку забыл. Пришлось потратить достаточно много времени на устранение простейшей ошибки.
(25) А как вообще организовать вызов процедуры ВыполнитьКоманду при типе команды ЗаполнениеФормы?
У меня в эту процедуру программа не заходит вообще, при этом не пишет никаких ошибок (вид обработки: ЗаполнениеОбъекта).
Возможно, я не там и/или не так эту процедуру (ВыполнитьКоманду) написал: пробовал и в модуле формы (и НаКлиенте и НаСервере) и в модуле обработки — ноль реакции системы…
(22) В моей текущей версии (не знаю как посмотреть) в Общем Модуле «ДополнительныеОтчетыИОбработки» идет проверка:
Показать
Спасибо за статью. Только начал изучать программирование, поэтому не все понял. Буду разбираться дальше.
Отличная статья!
Подскажите пожалуйста, в варианте ОткрытиеФормы — для — ЗаполненияОбъекта.
Вы указали, что в форму, передается дополнительный параметр «ОбъектыНазначения»
Однако я никак не могу понять, как этот параметр использовать, и где его можно отловить?
Добрый день, спасибо за описания. Плюсанул. Может подскажете как в внешней печатной форме указать макет который находится в самой внешней обработке, тотому как по логике макет можно указать только тот который есть в метаданных базы.
(40) Не понятен сценарий использования: на клиенте или на сервере
Если на клиенте, то почему нельзя так:
Показать
Ну а на сервере аналогично
Показать
(41)
Уже нашел, но все равно спасибо
(1) если это печать, то все просто. Создаем форму и эмулируем параметры. Затем вывод на форму в табличный документ.
Для остального обычно существует форма, если нет, то тоже самое, параметры подсмотреть перед вызовом и все быстро отлаживается в полном контексте и не нужно каких-то режимов разработчика или дополнительной обработки, которая будет работать через сохранение в файл и подмену.
Добрый день. Раз уже идет разговор про внешние обработки, то надеюсь на небольшую консультацию. Ситуация следующая, есть вполне рабочая внешняя обработка, подключенная к конфигурации. Выполняется по расписанию. Но при каждом обновлении из файла в справочнике
«ДополнительныеОтчетыИОбработки» (по кнопке «записать» или «записать и закрыть») она сразу начинает выполнять команды, заложенные в процедуре ВыполнитьКоманду(ИдентификаторКоманды).
Как этого избежать? Исполняется все корректно, но как-то не вовремя… Заранее, спасибо
(44) Если честно, то не углублялся в этот механизм с регламентными заданиями в БСП.
Но судя по описанной ситуации понятно что:
1. У вас стоит расписание регламентного задания с небольшой периодичностью (1 раз в день, 1 раз в час или что-то типа того).
2. В типовой БСП, видимо, при записи справочника внешних обработок регламентное задание перезаписывается. То есть если трассернуть метод запись элемента справочника внешних обработок, то будет примерно такой вот код
Если все так, то при записи регл. задания «сбрасываются» признаки его выполнения и получается, что в текущем интервале оно еще не выполнялось.
Что с этим делать:
https://t.me/ssl1c
Если у задания периодичность, например один раз в сутки начиная с 1 часа ночи, то можно назначить ему интервал, чтобы в то время, когда вы разрабатываете, оно не выполнялось.
Если хочется более гибкого решения — то можно
Вариант 1. Попробовать самому проанализировать код записи справочника внешних обработок и увидеть, есть ли какой-нибудь стандартный механизм обхода перезаписи задания.
Вариант 2. Записывать справочник внешних обработок в режиме ОбменДанными.Загрузка = Истина. Возможно в этом случае не выполняется перезапись задания. Делать это либо через доработанную форму элемента (например, в виде внешней обработки), либо в другой базе, если у вас несколько баз и между ними обмен и регламентное задание выполняется в одной из баз
Вариант 3. Задать вопрос разработчикам БСП на телеграмм-канале
Ну и последнее. Если разберетесь с этим вопросом и решение будет не очевидное, то напишите публикацию на ИС. Т.к. проблема типовая и возникает у многих.
(45)
Спасибо за гипотезы… Попробую воспользоваться советами.
Регламентное задание действительно выполняется раз в сутки и даже так — непонятна логика…. Если тебе задали явно время выполнения — будь добр в данное время и стартовать 🙂 Да и выполнение обработки при самой первой записи элемента справочника тоже непонятно. Я полагал, что упускаю что-то из теории и ответ очевиден для опытных разработчиков, а оказывается многие мучаются с подобными неудобствами…
(46) регламентное задание учитывает, что в заданное время старта сервер, например может лежать или стоит блокировка заданий. Тогда оно выполнится сразу же как только появляется возможность, если этот момент входит в заданный интервал регламентного задания.
Если оно выполняется раз в сутки, то задайте ему расписание : раз в сутки с 01:00 до 05:00, ну или что-нибудь в этом духе. У вас скорее всего стоит расписание : раз в сутки с 00:00 до 23:59. Поэтому и возникает проблема
(47) Да, причина (даже не причина, а вариант обхода… ) именно в этом. После установки допустимого временного диапазона выполнения — обработки перестали выполняться при записи (очевидно, что записывать их нужно за пределом этого диапазона 🙂 ).
Спасибо за подсказку!
(17) «Подскажите, пожалуйста, если я вызываю внешний отчёт с формы элемента справочника, могу ли я использовать/получить данный элемент в модуле отчёта?»
Присоединяюсь к вопросу.
Подскажите, пожалуйста, если я вызываю внешний отчёт с формы элемента справочника, могу ли я использовать/получить данный элемент в модуле отчёта?
(49) (50) не понятны детали вопроса. Если речь идет о внешнем отчете СКД с видом Отчет, то тогда что подразумевается под словом «Элемент»: объект или ссылка?
Если речь об «объекте», то во-первых, к нему из отчета обратиться не получится, во-вторых, если вам это нужно, значит есть проблема с архитектурой.
Если речь о «ссылке», то — да, ссылки передаются как параметр, но не в модуль объекта, в форму.
В общем слабо понятен контекст вопроса…
(51) Да, внешний отчет на СКД с видом Отчет (привязан к справочнику Номенклатура). Хочу получить (не важно) в форме или модуле внешнего отчета ссылку на номенклатуру. Возможно ли это?
(52) да, возможно.
(50) Не актуально наверняка, но может кому пригодится ответ
ВладелецФормы.Объект
Доброго дня. При разных типах обработки вызывается разные процедуры ( выполнить команду в модуле обработки, выполнть команду а модуле формы, открытие формы.
Как узнать какие переменные доступны на этих процедурах ?!)
(54)
Добрый день! Тут как-то вскользь упоминалось про вызов «ОбработкаОбъекта» из формы списка, никак не получается это осуществить. При регистрации обработки есть крыжики для вариантов выбора в форме объекта и/илив форме списка. В форме объекта появляется кнопка с вызовом, а вот в форме списка никак. Где что нужно дописать чтоб появился вызов из формы списка по кнопке или в контекстном меню?
В данной статье не упомянулось про тип команды «ЗагрузкаДанныхИзФайла». Считаю, что это одна из важнейших типов обработок, которая позволяет не выдумывать механизм загрузок в справочники, табличные части документа данных, а пользоваться стандартными средствами загрузки. Рекомендую дополнить вашу статью описанием данного типа обработки. В интернете очень мало информации про него
(37) Понимаю, что глупый вопрос — а где должна быть команда или сценарий. Есть примеры этого?