<?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='\
Автору +
(0) Спасибо за хорошую идею и за качественное оформление публикации.
Однозначно плюс.
Эээ, извините. А внешнюю обработку ТЧ никак не замутить, а вместо параметра сеанса БуферОбменаТаблицаЗначений приспособить ОбщиеЗначения? Или я чего-то не понял в этой жизни?
(3) Поручик, действительно, в статье не написано, что можно использовать стандартный механизм регистрации обработчиков табличных частей. Создать обработку заполнения табличных частей, зарегистрировать ее для всех документов и использовать. Огромный плюс метода — вообще нет изменения конфигурации. Минус — кнопки будут «скрыты» в подменю «Заполнить».
Данная статья писалась не только как руководство к конкретному действию, но и как образец того, как можно программно изменять формы большого количества документов не изменяя конфигурацию тотально.
По поводу параметра сеанса «Общие значения». Наверняка можно использовать и его, спасибо за идею. Если использовать стандартный механизм изменения таб.частей — самое оно
(3) Поручик, если сделать через «Внешнюю обработку заполнения табличных частей», то у документов в закрытом периоде становятся недоступны пункты меню «Заполнить». Правда я сильно не копал в этом направлении, может и можно поправить этот «косяк»/фичу. Если найти, как обойти это, то действительно, через «Внешнюю обработку заполнения табличных частей» будет менее затратно реализовать предложенный функционал. Я уже подумал об этом — надо покопать…
Молодец автор! Идея очень хорошая. Очень часто возникает необходимость в таком инструменте. Очень многим поможет с экономить массу времени. Однозначно плюсую!
В описание добавлено альтернативное решение, использующее только стандартный функционал. В файлы добавлены 2 обработки (одна для Копирования, другая для Вставки), реализующие это решение.
(7) Вопрос: А в альтернативном варианте решен ли вопрос с документами в закрытом периоде? Смотри замечание в (5).
У меня в документах, которые находятся в закрытом периоде, пункты меню «Копировать» и «Вставить» неактивны, на них невозможно нажать.
Нет, Вопрос не решен. Если документ в закрытом периоде — форма открывается только на просмотр. Не вижу вариантов, как это можно обойти.
Автор проделал огромную работу, особенно в написании документации, спасибо!!!
Хорошая идея, подробное описание, многим будет полезным как в реальной работе, так и как пример интеграции. Не хватает только функции сохранения/восстановления буфера обмена. 🙂
(9) Задача была решена очень-очень давно.
У меня под рукой очень старая версия УТ, но обратите внимание:
1. При открытии любой формы только на просмотр блокируются только элементы с установленным свойством ИзменяетДанные
2. В универсальных механизмах есть такая функция ПолучитьДеревоКнопокЗаполненияТабличныхЧастей и кусок кода заполнения «дерева кнопок»:
ДобавитьСтрокуВДеревоКнопок(СтрокаПодменю, «ЗаполнениеТЧ»+НомерКнопки, ТипКнопкиКоманднойПанели.Действие, ВыборкаДействий.Наименование, Действие , ВыборкаДействий.Ссылка, , , , , Истина)
Последний параметр — это свойство ИзменяетДанные будущей кнопки. Нехитрыми манипуляциями решаем задачу.
В любом случае нужно внести изменения в конфигурацию!!! Но минимальные
Вот самое простое решение
ДобавитьСтрокуВДеревоКнопок(СтрокаПодменю, «ЗаполнениеТЧ»+НомерКнопки, ТипКнопкиКоманднойПанели.Действие, ВыборкаДействий.Наименование, Действие , ВыборкаДействий.Ссылка, , , , , (ВыборкаДействий.Ссылка.Комментарий = «НеИзменяетДанные»))
— Не самый лучший вариант. Для примера. Это позволит просто вписать в комментарий обработки НеИзменяетДанные и кнопка будет доступна 24/7 и при любой погоде.
Надеюсь комментарий окажется Вам полезным.
(11) По поводу копирования/вставки/сохранения/восстановления.
Посмотрите немного в сторону — есть же старые добрые «встроенные» возможности:
СохранитьЗначение и ВосстановитьЗначение которые работают как в текущем сеансе пользователя, так и во всех последующих.
Спасибо автору. Очень пригодилась — как раз искал что-то подобное. Немного доделал — и теперь доволен 🙂
Соглашусь с Поручиком, что подобный функционал можно было бы развернуть на внешних обработках табличных частей. Причем, даже если добавлять кнопочки в формы документов, то рано или поздно после какого-нибудь обновления они могут слететь, если разработчик форму поправит. Ну если кого-то не смущает потом кнопку снова вставлять и к процедурам привязывать, то я не спорю. Но все равно +, за старание
оТЛИЧНО ВСЕ РАБОТАЕТ.. большое спасибо автору. очень пригодилась. подошло даже на управление производственным предприятием. и управление торговлей
В некоторых случаях (когда пользователь первый раз открывает документ) нажатие на кнопку вызывает:
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(342)}: Значение не является значением объектного типа (Расшифровка)
Расшифровка = СтрокаКнопки.Расшифровка;
Как поправить?
(18) Одинец, Какая конфигурация? Какой документ. Очень любопытно.
(16) apostal86, Если разработчик хоть вообще удалит форму и добавить новую — функционал будет работать. Суть методики в том, что форма документа НЕ МОДИФИЦИРУЕТСЯ. Добавление кнопок происходит программно в общих модулях.
Готовлю обновление. Количество изменений в конфигурацию сократится до:
-добавить обработку «БуферОбменаТаблицаЗначений»
-внести изменения в модуль «УниверсальныеМеханизмы»
-внести изменения в модуль «МеханизмНумерацииОбъектов»
-изменить роль «Пользователь» для доступа к обработке
Расширение функционала:
-буфер обмена можно сохранить в файл/восстановить из файла
Оптимизировано:
-«свои» процедуры перенесены в обработку.
-картинки кнопок перенесены в обработку
-используется существующий параметр сеанса «ОбщиеЗначения» — не нужно добавлять новый
Код обработчиков теперь не нужно копировать из описания методики — все уже будет в одной обработке. Картинки и прочую шелуху вставлять тоже не нужно.
Спасибо большое
(20) тогда ясно)) плюсик
(19) вписал настройку в конфигурацию «Управление торговлей», в документе «Поступление товаров и Услуг», закладка Товары.
В конфигурации «Бухгалтерия Предприятия» нет процедуры «СформироватьПодменюЗаполненияТЧ» : это функция, поэтому надо изменить поведение «БуферОбмена_ДополнитьПодменюЗаполненияТЧ(ДеревоКнопок,СоответствиеТЧ)»
а в целом конфертировал Вашу настройку в Бухгалтерию предприятия». Спасибо!
Автор молодец, я думаю программно создавать кнопку в форме объекта делали все только автор пошел дальше. Молодец
Интересная статья, спасибо. Очень полезно. Будем ждать обновления, для еще меньшего изменения конфигураций =)
(21) Лучше создать отдельную роль для доступа к обработке, чтобы не курочить штатную. Я всегда так делаю.
(3) Поручик, Вы знаете точно как используют штатные механизмы ПараметрСеанса «ОбщиеЗначения»? Если его использовать не случиться ли так, что система «затрет» наш буфер своим значением. Или наоборот, мы какое-нибудь важное значение «убьем» своим буфером. насколько я понял стандартно система использует ПараметрСеанса «ОбщиеЗначения» для кеширования данных.
(27) Поручик, Зачем плодить сущности? Чтобы не было геммороя при обновлении?
спасибо, интересно
Интересная статья, спасибо. Очень полезно. Будем ждать обновления, для еще меньшего изменения конфигураций =)
Спасибо большое за такую разработку!
Очень нужный функционал, обязан сказать! Вообще, в конфигурациях «Восемь» нет некоторых очень привычных (полезных — самое главное) возможностей, которые имеются в «Семь»… И это — надо править!
*восполнять!
интересно, нужно попробывать
Полезная информация Автору плюс однозначно.
Такое бы на УТ 11…
Спасибо большое! Попробую
жесть! клевая идея.
Идея актуальна там, где например обновления выходят три раза в неделю (ЗУП) а вам нужно вести свои механизмы, прикрученные к ней 20 конфигураций назад.
Отличная идея и её воплащение. Обожаю механизмы, которые не требуют внесения изминений в
конфигурацию.
Недавно скачал альтернативное решение и сразу вылезла ошибка при повторной попытке авторегистрации при нажатии кнопки регистрации. Ошибка наблюдается в обработке «Копирования» и «Вставки».
Ошибка вылезла в строке
Исправил ошибку в участке кода
Было:
Стало:
Согласен. Есть ошибка. Исправил.
(38) serovmsk, спасибо за информацию-идею! Надо по-скорее проверить в работе.
Спасибо за идею! Порадую своих пользователей )
Респект автору!
Авторй плюс. Идея интересная и нужная. Пользователям очень пригодится. Спасибо.
Интересная идея, Спасибо
Интересная идея и заманчивое описание реализации. Надо внедрить и протестировать в работе. Автору респект и плюс.
Очень изящное решение вариант «Альтернативная обработка» для ЗУП,
т.к ЗУП — та конфигурация, которую никак нельзя снимать с поддержки из-за ПОСТОЯННОГО внесения изменений в законодательство! Большое спасибо!
И еще как просьба-пожелание:
— возможность выгрузить буфер в Excel, для правки сумм (или еще каких-нибудь примитивных типов), а потом опять загрузить в буфер для дальнейшей вставки. Вот это был бы класс! Например, постоянно изменяемые оклады или надбавки, которые проще и лучше рассчитать в Excel для ежемесячного документа «Ввод плановых начислений».
Это точка зрения пользователя-главбуха.
в упп у меня возникла проблема — документ поступление товаров и услуг, тч товары
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(587)}: Значение не является значением объектного типа (Расшифровка)
Расшифровка = СтрокаКнопки.Расшифровка;
Хотя все сделала по инструкции и на три раза
Подскажите, куда копнуть?:(
(53) разобралась
незнаю, что это было — запустила в новой чистой конфе, все встало
Большое спасибо!!! Очень пригодилось.
Отличная… идея как раз собирался писать нечто похожее в обозримом будущем… хорошо что не придется изобретать велосипед.
На БП 8.3 кто нибудь юзал? Выглядит заманчиво. Но не придется ли допиливать? Просто времени разбираться нет, т.к. свою юзаю. Но эта смотрится симпатичнее, хочу её )))
На БСП не полетит, конечно же. Там все механизмы переколбашены
мда я ее переработал под себя
http://infostart.ru/public/460032/
сейчас размышляю как дальше ее использовать
КнопкаКопировать.Подсказка = «Скопировать таблицу»;
Автору отдельное спасибо за вот эту обработку ВнешнийОбработчикБуфераОбмена_Вставить.epf