<?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='\
Работа с дополнительными реквизитами очень сильно разнится в зависимости от версии БСП. Например в последних имя реквизита на форме можно указать (просмотреть) в пользовательском виде. Об этом тоже стоило упомянуть.
(1)можно задать значение реквизита «Имя» в Плане видов характеристик «Дополнительные реквизиты». И соответственно этот параметр я и передаю в приведенные процедуры. Но чтобы задавать имена на формах — не видел/не слышал. Если приведете пример — буду рад
Спасибо! Только вчера сидел разбирался с этими непонятными абракадабрами на форме 🙂 А тут очень кстати ваша статья!
(2) Может имеется ввиду вот это. Честно говоря пока не понятно как это можно использовать.
(4) Как непонятно, все же понятно. В этом поле задается значение реквизита «Имя» для доп свойства. Подразумевается, что оно уникальное в пределах базы данных, система следит за этим. Поиск свойства и обращение к нему удобно вести по этому имени. Можно даже задать его, но только при первоначальном создании доп, потом уже редактировать не дает. Во встроенных функциях также можно использовать обращение по этому имени.
(5) Редактировать можно, в группе «Еще» есть команда «Разрешить редактирование реквизитов».
(4) Использую частенько, особенно в запросах как параметр, не надо тогда следить за принадлежностью к конкретному набору и городить конструкции с «Где» и коротким заголовком
Когда внедряли ERP по первой «развлекались» с этими доп.реквизитами, чтобы конфигурацию не кочеряжить. Потом началось. То им отчеты нужны, то печатные формы где используются эти реквизиты. Потом они хотят больше бантиков. Потом они должны участвовать в планах обменов… И все в таком духе. Это кошмар.
Если организация решила сэкономить на программисте 1С, то этот вариант ей подойдет до момента пока им не понадобится этот дополнительный реквизит использовать где-то еще.
(8)Доп реквизиты полезная штука. Положим у нас есть 100 тыс. элементов справочника номенклатуры. в 1000 элементов характерезует какое-то свойство. А всем остальным элементов это свойство не нужно и всегда будет пустым. Вот в этолм случае очень хорошо помогают дополнительные реквизиты. А в отчетах на СКД их использовать очень просто. И в обменах не сложнее чем обычные элементы.
(8) самое страшное будет когда будет меняться бизнес логика документов в зависимости от реквизитов.
еще сложнее когда начнутся зависимости друг от друга. например в примере автора можно водителя закреплять за определенным авто в определенные дни, и поступит требование чтобы водителя можно было выбрать в зависимости от этой связки.
кстати вроде есть функционал упаковок в программе. зачем было городить доп реквизиты Количество мест и тип упаковки?
(10)Собственно, статья не про полезность и необходимость использования доп реквизитов, а про то как решать указанные в топике задачи, если уж вступили на «скользкую дорожку» использования доп реквизитов.
Сама по себе тема необходимости и оптимальности использования дополнительных реквизитов заслуживает целой серии статей и сотен сломанных копий )). Я тут — пас
Коротко: автор рассказал, что есть такая штука как БСП и какие методы есть в подсистеме доп свойств/реквизитов.
Эта статья для самых ленивых, не способных воспользоваться отладчиком любого справочника с доп. реквизитом.
(12) БСП не упоминал, ни прямо, ни косвенно)))
Спасибо! Когда «дело дошло до тела», потребовалось разместить доп. реквизиты на форме в нужном порядке и в нужных местах, вспомнил об этой статье. Помогло сберечь уйму времени)))
Наверно что-то недопонимаю, но Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) исполняется на сервере, а форма туда не передается «Отсутствует отображение для типа ‘УправляемаяФорма'»
(15) На сервере, да. Форма вполне себе передается.
Вот рабочий код с формы с вызовом серверных модулей из статьи
Показать
(16) Разобрался. Очень, очень помогла Ваша публикация.
Статья очень помогла. Спасибо))
Вот как раз сижу разбираюсь.
УТ(11.3.4.47)
Мне надо, чтобы поле доп. реквизита имело вид «ПолеНадписи»
В расширении в процедуре формы
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Вызываю:
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект,,Истина); \Параметр ПоляНадписей = Истина
Но поле все равно имеет вид «ПолеВвода», да еще в список значений попадают лишние значения.
Что то делаю не так или это ошибка в конфигурации?
PS: Попытался в УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме
Исправить
Если ПоляНадписей Тогда
Элемент.Вид = ВидПоляФормы.ПолеВвода;
На
Если ПоляНадписей Тогда
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Заработало ….
(16) Помогите разобраться — что делаю не так?
Показать
Взял на вооружение +1
Спасибо! Статья сразу помогла решить мою сегодняшнюю проблему! Очень своевременно!
Спасибо за статью! Информативно.
Спасибо,
помогло, только для нужной конфигурации (ЭДО вер. 2.1.12.2) пришлось изменить в функции
ПолучитьПолеДополнительногоРеквизитаНаФорме
строку
у Вас :
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«Имя», ИмяРеквизита);
заработало
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
(24)
А не могли бы вы полностью привести пример работающей функции для 1С ДО ?
И как к ней обращаться, какие параметры в неё передать, чтобы получить значение интересующего доп. реквизита?
(25) На ДО не тестировал, вообще не в курсе, будет ли там работать или нет.
(26) Отлично работает именно в том виде, как вы и предложили
(27) Ну и хорошо. Только это mikleRo про ДО предложил.
Посмотрел — в ДО у реквизита «Имя » ПВХ ДополнительныеРеквизитыИСведения не выставлен признак индексирования, в отличие от ЕРП образных. Для универсальности нужно запросом получать
Воспользовался готовыми функциями в ERP 2.4.8.
ПолучитьЗначениеДополнительногоРеквизитаНаФорме
УстановитьЗначениеДополнительногоРеквизитаНаФорме
Все работает! разбираться с БСП гораздо дольше.
(29)
Алексей, появились готовые функции? Ооо, здорово! А в каком модуле?
(30) в Этой статье появились, которые я перенес в свой модуль.
Автору респект!
Низкий поклон автору!
Очень-очень полезно тем, кто допиливает 1С:Документооборот v2.1
Может оффтоп, но подскажите, а реально ли сделать множественный выбор «дополнительных значений» в «дополнительный реквизит»?
(33) это реквизит и он содержит тип данных. Среди них нет списка значений. Поэтому нельзя. Можно только сделать несколько реквизитов и туда их пихать.
Вам нужна таблица, а тут реквизит. Логика вашей задачи другая.