Оформление строк табличной части в 8.2




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

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

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

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

50 Comments

  1. Istur

    Стандартом в 1с является, когда все строки табличной части имеют одинаковый шрифт, цвет шрифта и цвет фона строки. Но иногда нужно, чтобы строки выделялись по некоторому признаку. Иногда нужно что-либо оформлять на уровне конфигуратора. В 8.1 это делалось через процедуры ПриВыводеСтроки и ПриПолученииДанных. В управляемом приложении 8.2 их нет, там сделано условное оформление. Привожу пример, как можно работать с условным оформлением программно, как форма оформляется кодом в 8.2.

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

    Перейти к публикации

    Reply
  2. Поручик

    (0) Такие сложности действительно необходимы или условное оформление в пофигураторе ужо не катит?

    Reply
  3. Diversus

    (2) Это же в режиме управляемого приложения, там нет ПриВыводеСтроки насколько я понимаю…

    Reply
  4. Поручик

    Ну да, в первом посте об этом и спрашивал, к чему такие сложности? Плюс поставил за другое.

    Reply
  5. nafa

    (4)

    [quote]Я бы уволил программиста который бы начал в справочник добавлять подобные реквизиты.[/quote]

    Что плохого в этом решении, например если надо конкретному складу назначить конкретный цвет? И иметь возможность отображать склад этим цветом везде (в т.ч. там где нет условного оформления).

    Я бы только цвет числом хранил а не хранилищем значений.

    (5)

    Ну это же пример. Условное оформление — это ограниченные возможности. В сложных случаях без кода все равно не обойтись.

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

    Reply
  6. Поручик

    (8) Считай, что в статье приведён пример программного управления оформлением формы, а добавление реквизитов — это абстракция.

    Reply
  7. nafa

    (8)

    [quote]что значит везде? Условное оформление есть ВЕЗДЕ. во всех формах[/quote]

    Везде — это везде, откуда может быть доступ к справочнику. В том числе и в запросе, подготоваливающем данные для выгрузки в стороннее приложение и при коннекте по ОЛЕ из стороннего приложения и при коннекте к соответствующей SQL таблице на сервере. Во всех указанных случаях условного оформления нет.

    [quote]А если еще что то надо будет разукрашивать. Например номенклатуру. по какому нибудь реквизиту? Это вообще будет жестко. [/quote]

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

    Reply
  8. Istur
    Reply
  9. Ish_2

    (13) Прокол в (2) не в том , что в 8.2 нет процедуры ПриВыводеСтроки()(она есть!), а в том , что её нет

    в режиме управляемого приложения.

    Reply
  10. Istur

    (14) Она есть только в режиме совместимости с 8.1. Но он по определению временный, рано или поздно он должен быть отключен и должны быть только управляемые формы. Собственно я и расписываю как работать, когда нет данных процедур. Можно еще вспомнить что есть и чего нет в 7.7, 7.5, 6.0. Я привожу пример как работать с условным оформлением на управляемых формах 8.2.

    Reply
  11. nafa

    (15)

    [quote]Она есть только в режиме совместимости с 8.1. Но он по определению временный[/quote]

    Вобще-то в 8.2 есть еще режим нормального приложения, безо всяких управляемых форм, в котором эта функция, слава Богу, есть. К тому же многих вполне устраивает этот «временный» режим совместимости, зачем его менять, если все работает.

    Reply
  12. Istur

    (16) Да, верно. Тут я погорячился немного)

    Reply
  13. Istur

    А вообще мне инфостарт напоминает консилиум врачей. Вот дали тебе больного, ты смотришь что с ним, и выписываешь ему рецепт. И выкладываешь сюда. После чего в комнатку набивается сотня других врачей и начинают со всех сторон и ракурсов рассматривать и самого больного, и сам рецепт, спорить между собой, спорить с тобой, предлагать что-то другое, соглашаться с тобой) Но это имеет офигенный плюс. Больной после этого стопроцентно будет жить)))))

    Reply
  14. cool.vlad4

    😀 (18)бородатый анекдот

    Доктор, — говорит ассистент, — пациент Ларю из второй палаты скверно

    себя чувствует.

    — Надо говорить: «Пациент Ларю думает, что скверно себя чувствует».

    Это новейший взгляд на сущность болезней.

    На следующий день ассистент подходит к доктору.

    — Доктор, пациент Ларю из второй палаты думает, что он умер.

    Reply
  15. Ish_2

    (18) Эй, врач, получай камень в свой огород.

    Чтобы врачи не набивались к тебе в кабинет нужно ЧЕТКО ,ЯВНО указывать в рецепте диагноз и кому он предназначен. Диагноз не должен содержать и намека на двойое толкование .

    Например. Указать явно в теме , что рассматривается пример для ТОЛЬКО УПРАВЛЯЕМОГО ПРИЛОЖЕНИЯ , в котором.. Объяснить ЯВНО в теме почему выбран именно такой вариант и в чем его преимущества.

    Этого сделано не было.

    Поэтому вздохи о тупости и непонимании порождают лишь ответные вежливые вздохи.

    Reply
  16. Diversus

    (20)

    Ish_2 пишет:

    (18) Эй, врач, получай камень в свой огород.

    Чтобы врачи не набивались к тебе в кабинет нужно ЧЕТКО ,ЯВНО указывать в рецепте диагноз и кому он предназначен. Диагноз не должен содержать и намека на двойое толкование .

    Например. Указать явно в теме , что рассматривается пример для ТОЛЬКО УПРАВЛЯЕМОГО ПРИЛОЖЕНИЯ , в котором.. Объяснить ЯВНО в теме почему выбран именно такой вариант и в чем его преимущества.

    Этого сделано не было.

    Поэтому вздохи о тупости и непонимании порождают лишь ответные вежливые вздохи.

    Так там же сриншоты управляемого приложения!

    Reply
  17. Ish_2

    (21) Однако , еще один. Еще раз для врачей.

    Людей много хороших и разных, по-разному всё понимающих.

    Поэтому :

    Первое. Область применения указанного примера должна быть указана ЯВНО (в тексте).

    Второе. Нужно явно привести (хотя бы простенький ) сравнительный анализ ( сравнить с возможными альтернативами) и показать преимущества на взгляд автора представленного решения.

    Это есть — взрослый подход.

    Reply
  18. Istur

    (22) Тут нет альтернатив..

    Reply
  19. Ish_2

    (23) Смело.

    Так укажи в теме , что ,дескать, так мол и так, представленное решение по выделению цветом складов альтернатив НЕ ИМЕЕТ. Глядишь, дискуссия примет новый поворот.

    Reply
  20. Istur

    (24) Это не решение по выделению цветом складов!! Я писал выше!! Это пример работы с условным оформлением программно!

    И вообще. Цель статьи в самой статье, а не в дискуссии после нее. У меня нет столько времени, чтобы расписывать всё и вся. Я выдал подход, кто надо — воспримет, кому не надо — тому не надо. За это время можно сделать много другого полезного. Судя по тому, что ты не знаешь об отсутсвии в управляемых формах процедуры ПриВыводеСтроки, данная статья не несет для тебя никакой нагрузки, так что я думаю эту дискуссию с тобой надо прекратить.

    Reply
  21. Ish_2

    (25) Ок.

    Reply
  22. Поручик

    (18) (24)

    >>>> Больной после этого стопроцентно будет жить

    Или стопроцентно двинет кони от таких врачей. Второй вариант более достоверен.

    Reply
  23. Diversus

    (25)(26) мужики Вы чего? Это всего лишь выделение цветом 😀

    Не стоит так болезненно реагировать на такой подход и такое описание.

    Ish_2 не криви душой, у самого было ведь когда что-то делал не так как по правилам, а так как проще?

    Ну скажем перебор, вместо запроса и т.д.

    Типовые решения и то такими вещами занимаются.

    Получилось такая статья и что? Хуже когда 1С-овцы вообще ничего не делают, а тупо качают раз в день 😉

    Указал в начале на то, что статья плохо оформлена и(или) есть альтернативное решение — человек понял и в следующий раз сделает лучше!

    Reply
  24. Istur

    (28)

    Получилось такая статья и что?

    спасибо на добром слове)))

    Reply
  25. Ish_2

    (29) Мне кажется , ты критику воспринял как озлобленность. И зря.

    Да стал бы я распинаться , если б не представлял с кем имею дело.

    А раз так то с тебя и спрос другой. Чего я церемониться буду ?

    Reply
  26. Ish_2

    (28) Делал, конечно . И неправильно , и как проще.

    Хм.. Хотел бы я посмотреть на человека , который делает сразу все правильно. Ау ..

    А про перебор вместо запроса — ты зря написал.

    Милости прошу в ту тему. Там я расскажу , что понимается под перебором.

    Reply
  27. Abadonna

    (7)

    Что плохого в этом решении, например если надо конкретному складу назначить конкретный цвет?

    Ведет к формированию дурного вкуса, а он, как говорят французы,ведет к преступлению 😉

    Примечание: дурной вкус — это всё. что не нравится мне 😀 😀

    Reply
  28. Yashazz

    Автор вообще в курсе, что есть хранилища настроек, в частности, заточенные именно для настроек СКД? И что всё можно сделать именно так?

    А программная работа с СКД — она в книжках описана, у Хрусталёвой, да на всяких ресурсах, какой смысл за это плюсы ставить?

    Reply
  29. nafa

    (33)

    [quote]хранилища настроек, в частности, заточенные именно для настроек СКД[/quote]

    Какие хранилища настроек??? Цвет в 1С — это обычное целое число. Можно его конечно превратить во что угодно, сделать xml файлик потом поместить в хранилище, и т.п. Только потом не надо удивляться, что пользователь на калькуляторе считает быстрее, чем в 1С…

    Reply
  30. Yashazz

    (34) Ага, а условное оформление в 1С — это условное оформление. И, если вы не в курсе, только цветом не исчерпывается. И входит оно в состав настроек СКД, каковая и лежит в основе динамических списков 8.2, и каковую собственно и следует использовать на всю катушку, а не изобретать кривые велосипеды и курочить справочники.

    Советую ознакомиться с тем, что такое хранилище настроек, и чем, собственно, 8.2 отличается от 8.1 в части управляемых интерфейсов.

    Reply
  31. iov

    воспитательная порка удалась на славу… 😀

    Reply
  32. Ish_2

    Чем тут закончилось ? — Тяжело без морали в конце .

    Я не понял кто кого выпорол. Так наши победили или нет ?

    Reply
  33. Поручик

    По моему, ничья. Каждый остался при своём мнении по принципу: сам мудак дурак такой.

    Тут ещё народ повоспитанней будет. Вот на другом сайте срачь спор растянули бы на десяток страниц с тысячью постов.

    Reply
  34. Alraune

    такие бои местного значения получились 🙂

    а в таких случаях, по-моему, обычно никто и не побеждает, все поспорят и разойдутся до следующего раза. Зато автору почту заспамили сообщениями о комментариях, наверно

    Reply
  35. Diversus

    С другой стороны конструктивная критика никогда не помешает 😀

    Reply
  36. artbear
    Alraune пишет:

    Зато автору почту заспамили сообщениями о комментариях, наверно

    И не только автору 🙂

    Reply
  37. Собеседник

    «подпишусь» на условное оформление 🙂

    Reply
  38. amalar

    Ёжики плакали, кололись — но продолжали насиловать кактус….

    Reply
  39. logarifm

    Ребят 8.2 в динамических списках позволяет по условиям сама все красить, зачем столько кода писать!?

    Reply
  40. nafa

    (44) Возможности 8.2 по раскрашиванию конечно впечатляют по сравнению с их отсутствием в предыдущих версиях, но это всего лишь ограниченный набор средств, который несравним с возможностями встроенного языка. Кроме того в ряде случаев удобнее видеть все, что делает программа, собранным в одном месте (модуле, процедуре) а не вспоминать, что это — в настройках оформления, это — в подписке на события, это — в модуле и т.п. Особенно когда над программой работаешь не один.

    Reply
  41. lcd-boost

    Круто не знал про встроенное оформление. будет полезно. А не подскажите как табличной части обновлять данные?

    Reply
  42. Seburtor

    К чему все эти красивости ?

    Чем строже и незатейливей — тем проще и у юзеров не возникает соблазнов …

    Reply
  43. RomanUzmov

    Отличный пример. Мне он очень помог в реализации подобной, но немного другой задачи. Автору (+)

    Reply
  44. w-divin

    все прикольно, но не допру как раскрасить сами склады в списке справочника по цвету, который в них выбран?

    Reply
  45. w-divin

    (47) дело не в соблазнах, а в удобстве и скорости работы…

    иногда намного проще увидеть 1 красную строчку из 100 в накладной, чем пол часа искать глазами…

    Reply
  46. unknown181538

    Программное оформление куда выгоднее при обновлениях.

    Reply
  47. loginfo

    Может быть вопрос не по теме, но спрошу. При обновлении динамического списка не обновляется оформление, только при повторном открытии формы. То есть есть процедура на сервере, осталось добавить на клиенте, только что?

    ОбновитьОтображениеДанных();

    Элементы.Список.Обновить();

    Оповестить(«ОбновитьСписок», , ЭтаФорма);

    не помогают.

    Reply
  48. KurganPX

    Спасибо автору за статью, однозначный «плюс».

    Формирую таблицу на управляемой форме программно, только так и можно задать условное оформление. Тут я ни только правого значения не знаю, так ещё и списка колонок, которые я оформляю..

    Reply
  49. sherbv

    какие то страсти написаны… напишу проще — при редактировании табличной части поставить что то типа:

    &НаКлиенте

    Процедура ЗаявкиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)

    ОформитьСтрокиНаСервере ();

    КонецПроцедуры

    &НаСервере

    Процедура ОформитьСтрокиНаСервере ()

    ЭтаФорма.УсловноеОформление.Элементы.Очистить();

    ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();

    ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();

    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(«Заявки»);

    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Объект.Заявки.Закрыть»);

    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

    ЭлементОтбора.ПравоеЗначение = Истина;

    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(«ЦветФона», WebЦвета.Киноварь);

    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Объект.Заявки.Утвердить»);

    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

    ЭлементОтбора.ПравоеЗначение = Истина;

    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(«ЦветФона», WebЦвета.ВесеннеЗеленый);

    КонецПроцедуры

    Если нужно наложить несколько условий — повторить ниж еще раз серверный модуль, но тока без первой строчки по поводу очистки [ЭтаФорма.УсловноеОформление.Элементы.Очистить()]

    Reply
  50. Гость

    День добрый, всем.

    Есть номенклатура с доп реквизитами.

    Может кто нить подскажет как разукрасить поле Номенклатура, в табличной части товары, по условию накладываемому на доп реквизиты выводимой номенклатуры?

    Reply

Leave a Comment

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