Пользовательские поля в отчетах СКД




Принцип обмена данными из 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='\

69 Comments

  1. Константин С.

    Дополнение готовых отчетов своими колонками.

    В отчета сделанных с помощью «Схемы компоновки данных» из пользовательского режима можно добавлять свои Поля, которые будет выводиться при формировании.

    В данных полях позволительно применять арифметические действа.

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

    Reply
  2. Boroda

    Спасибо! Такие небольшие статьи (своего рода «маленькие хитрости») очень даже как нужны, особенно при начальном освоении 8-ки.

    Reply
  3. extrim-style

    Совсем не русский? Беда… Использовал гугл-переводчик? Я плакал над текстом. О, ужас!

    Reply
  4. extrim-style

    Тема < NULL

    Reply
  5. extrim-style

    Хотя нет, лучше бы гугл-переводчик юзал. Он по-крайней мере не делает грамматических ошибок…

    Reply
  6. Константин С.

    (4) extrim-style, сограшусь орфография и стилистика изложения не мой конек. Статья направлена не 1С:специалисту, а пользователю пытающему упростить себе жизнь. По этому изложение на «бытовом» уровне, минимальнотехничесвом языке.

    Reply
  7. bar_s

    иногда пользовательские поля, ой как выручают.

    Reply
  8. sh_max

    Раз публикация называется «Пользовательские поля в отчетах СКД» то вы и про поле выбора упомяните, тоже вещь полезная, может пригодиться. А если-бы добавили ещё и список функций которые можно использовать в полях выражения, то вообще супер была-бы публикация.

    Reply
  9. JER_MARK

    Спасибо автору. Действительно, этот момент нигде не описан (ну или по крайней мере, мне прежде не встречалось). Мне пригодится, часто работаю с СКД.

    Reply
  10. sserazm

    А какие функции можно использовать в пользовательских полях ?

    А то арифметических действий не хватает.

    Reply
  11. Yashazz

    Не осознал ценности данной статьи.

    У Хрусталёвой гораздо грамотнее написано. Вот если б где найти полное описание синтаксиса и допустимых функций для этого «языка СКД»… Так надоело искать аналоги и в угадайку играть.

    Хотя вот есть http://infostart.ru/public/97199/

    Reply
  12. sh_max

    (10) ИТС. Статья «Язык выражений системы компоновки данных».

    Reply
  13. Константин С.

    (10) Yashazz, публикация расчитана на пользователя который не открывает конфигуратор, т.е. не программиста. Для бухгатера которому надо чуть добавить информации в готовый отчет, в ней изложенно достаточно. А если он/она захочет большего, тогда в помощь книги, синтакс-помошник, итс и прочее…

    Reply
  14. sm0123

    последний пример можно упростить

    ВЫБОР

    КОГДА УСЛОВИЕ_1

    ТОГДА ВАРИАНТ_1

    КОГДА УСЛОВИЕ_2

    ТОГДА ВАРИАНТ_2



    ИНАЧЕ

    ВАРИАНТ_ИНАЧЕ

    КОНЕЦ

    Reply
  15. kit

    Спасибо автору. Я только начинаю осваивать СКД.

    Reply
  16. artbear

    Если уж описывать пользовательские поля, можно было бы упомянуть о возможности использования этих полей не только как ресурсов, но и как измерений для группировок по ним

    Для этого не нужно заполнять итоговое поле, можно оставить его пустым.

    В результате у поля будет не зеленый значок, обозначающий ресурс, а обычный.

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

    Reply
  17. 1801

    Что ни говорите, а статья полезна своим содержанием! Делает из пользователя-обезьяны продвинутого пользователя, учит его шевелить мозгами, повышает самооценку и удовлетворение от работы. Лично я угробил полдня на разборы работы пользовательских полей и дальше арифметических действий так и не ушел. Спасибо автору.

    Однако, действительно жалко, что русские люди не знают русского языка.

    Reply
  18. Константин С.
    1801 пишет:

    Однако, действительно жалко, что русские люди не знают русского языка.

    вы так уверены, в моей национальности?

    не возникало вопроса, что отсутствует способность к таким знаниям (кому что дано)?

    Reply
  19. Helena_83

    Очень полезная публикация. Спасибо автору.

    Reply
  20. 1801

    (17) Если задел Вас этим, то прошу у Вас прощения!

    Reply
  21. sh_max

    На заметку. Может кому пригодиться:

    ВЫБОР КОГДА Поле = NULL ТОГДА 0 ИНАЧЕ 1 КОНЕЦ

    будет всегда возвращать 1, а вот этот работает корректно

    ВЫБОР КОГДА Поле Есть Null ТОГДА 0 ИНАЧЕ 1 КОНЕЦ
    Reply
  22. SoulPower

    отличная статья, спасибо.

    Reply
  23. lsp71

    Хорощая статья для юзеров.

    А программерам очень рекомендую книгу Хрусталевой Е.Ю. «Разработка сложных отчетов в 1С Предприятии 8. Система компоновки данных». Не ленитесь, там таких «откровений» полкниги, а вторые полкниги — как это все реализуется программно.

    Reply
  24. ImPenguin

    Спасибо, отличная статья, с помощью нее смог создать несколько пользовательских полей, которые очень помогают в работе! Автор молодец!

    Reply
  25. Zixi

    Очень помогло! Спасибо автору!

    Reply
  26. fnv

    Интересно, я с пользовательскими работала, но только примитивно, сложение-вычитание, не знала, что можно делать сложные практически запросы именно из пользовательского режима…

    Reply
  27. Йожкин Кот

    Цена продажи для итоговых полей неправильно написана. Должно быть так

    Сумма([Сумма продажи]) / Сумма(Количество)

    А лучше так

    Выбор когда Сумма(Количество) = 0 Тогда 0 Иначе Сумма([Сумма продажи]) / Сумма(Количество) Конец

    Reply
  28. oksevi

    Спасибо.

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

    Если точнее — номенклатура учитывается в штуках, но в комментарии каждой номенклатуры проставлен объем. Необходимо в пользовательском поле отчета проставить формулу: количество номенклатуры из документа * на объем из комментария к исходной номенклатуры

    [Номенклатура.Комментарий] * Количество или Число([Номенклатура.Комментарий]) * Количество -не проходит.

    Reply
  29. Константин С.

    (27) oksevi, увы такой возможности нет.

    Но можно, используя в компоновке данных, в Вычисляемых полях используя внешнюю функцию получить нужное значение.

    Еще вариант использовать Свойства справочника, т.е. создать к примеру для Номенклатуры свойство Объем с типом число. Вот к нему обращаться.

    Reply
  30. s_vidyakin

    Маленькая деталь — в режиме конструктора поля должны задаваться по ПУТИ, а в пользовательском режиме — по ЗАГОЛОВКУ. Т.е. одно и то же выражение в конструкторе должно задаваться как «ДоляПоСтатье*СтоимостьПродажи», а в пользовательском режиме уже как «[Доля по статье]*[Стоимость продажи]».

    У хрусталевой это не описано, найдено методом тыка

    Reply
  31. нОлька

    Очень полезная статья. Спасибо автору. !!!!

    Reply
  32. makcyta.89

    Обращаюсь ко всем есть отчет свод начислений после некоторых настроек он теперь имеет вид в прикрепленном файле. нужно создать пользовательское поле которое будет отображать по каждому подразделению среднею зарплату.

    Образно примерно так:

    Среднее начисление = ПодразделениеОрганизации.Сумма/ ПодразделениеОрганизации.КоличествоСотрудников

    Reply
  33. makcyta.89

    Обращаюсь ко всем есть отчет свод начислений после некоторых настроек он теперь имеет вид в прикрепленном файле. нужно создать пользовательское поле которое будет отображать по каждому подразделению среднею зарплату.

    Образно примерно так:

    Среднее начисление = ПодразделениеОрганизации.Сумма/ ПодразделениеОрганизации.КоличествоСотрудников

    Reply
  34. b1958

    (32) donex, Удалось ли решить поставленную задачу с использованием пользовательских полей?

    Reply
  35. Константин С.
  36. alex_shkut

    Вы забыли указать функцию Формат(Выражение, «ЧДЦ=2»), иногда помогает побороть числа типа 12,1254000000123

    Reply
  37. Alex1Cnic

    Нашел статью вовремя… Плюсууую

    Reply
  38. nana_rge

    (35)

    В УПП у меня не работает, пишет — неверные параметры AVG.

    Такой вариант

    Окр(Выражение, 2)

    можно использовать.

    Reply
  39. nana_rge

    а… ну «неверные параметры AVG» выходило из-за среднего по итогам,

    в режиме суммы по итогам просто пустое поле выводит без ошибок…

    Reply
  40. wowkai

    Спасибо! очень пригодилась инфа.

    А кто подскажет у пользовательских полях есть возможность использовать функции из общего модуля? Или эта возможность только есть в вычисляемых полях.

    Reply
  41. jobkostya1c8

    Хорошая статья для практики.

    Reply
  42. b1958

    (34) «Страница не найдена» — интересно, что на ней было?

    Reply
  43. Константин С.

    (41) b1958,

    пример как реализовать.

    Reply
  44. blacat09

    (42) подскажите, пожалуйста как сделать выравнивание пользовательской колонки по правой стороне? По умолчанию выравнивание левое.

    Reply
  45. Константин С.

    (43) blacat09, в принце для этого есть «Условное оформление», там можно по играться с положением поля. Только для числа это не работает.

    Reply
  46. Leits

    а в пользовательских полях можно поймать текущую дату?

    Reply
  47. Константин С.

    ТекущаяДата()

    в полях можно использовать теже выражения что в запросе

    Reply
  48. SlavaVNL

    (22) Респект за отличную идею!

    Не могу не поделиться!

    Половину дня сидел думал как в СКД представить дату в виде HH:mm:ss, при условии, что часов больше 24. СКД хоть убей ставит следующий день и часы новых суток.

    Так, например, 30 часов в вышеозначенном формате выглядит так: 06:00:00. Попытка вычислять и собирать часы минуты секунды как текст ни к чему путному не привела.

    И тут:

    Хрусталёва «разработка сложных отчетов» страница 138 . Перефразирую: «В пользовательских полях и в выражениях представления можно использовать функции из общего модуля. Для этого они должны быть объявлены как экспортные». ДА! эта фраза должна быть первой строкой в учебниках по СКД!

    Reply
  49. AnPet

    Спасибо за полезную статью!

    Два дня мучился чтобы посчитать итоги по условию и эта конструкция разрешила проблему:

    Сумма(Выбор

    А я Сумму() пытался применять внутри конструкции Выбор.

    Reply
  50. tdml

    Хорошая статья, спасибо автору.

    Часто ещё округление необходимо, добавлю пример типа:

    Выбор
    Когда [Начальный остаток] + Приход <> 0
    Тогда Выразить(Расход / ([Начальный остаток] + Приход) * 100, «ЧИСЛО(3, 0)»)
    Иначе 0
    Конец
    Reply
  51. Гость

    ЗУП 2,5 отчет список сотрудников

    В пользовательском поле -> формула ->[Оклад, тарифная ставка]/[Cтавка]

    Только берется первая «Оклад, тарифная ставка», которая имеет строковой тип

    Ошибка: Отчет не сформирован. Неверные параметры «/».

    Как указать в пользовательском поле брать ресурс, если 2 поля с одинаковым названием?

    Reply
  52. Гость

    (50) Гость, Подскажите, нашли ли вы ответ «Как указать в пользовательском поле брать ресурс, если 2 поля с одинаковым названием? »

    Такая же проблема

    Reply
  53. OksDallas

    ЗУП 2,5 отчет список сотрудников

    Как бы в формулу пользовательского поля втиснуть текущую дату или параметр Период? Пробовала через общие модули — ошибка формулы.

    Reply
  54. Константин С.

    используйте &

    Reply
  55. echo77

    (54) Можно сделать вот так:

    К параметрам обращаться нужно через слово Параметры, затем точка и как ты видишь название параметра в режиме предприятие. Если название параметра состоит из нескольких слов — то его нужно взять в квадратные скобки.

    Вот еще нормальная статья https://infostart.ru/public/267055/

    Reply
  56. Johney20

    (45) у вас получилось?

    Reply
  57. Johney20

    (46) может, я что-то не так делаю, но у меня просто «ТекущаяДата()» не работает(

    Reply
  58. Константин С.

    (58) чуть ниже посмотрите п.55 и 56, там описанно

    Reply
  59. Volfy

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

    Reply
  60. ya1

    Как в пользовательском поле указать выражение на выбор первого дата платежа

    Reply
  61. ya1

    во вложении пример в отчете

    Reply
  62. Константин С.

    (62) Не уверен что это можно решить пользовательским полями.

    Если на вскидку такое или в запросе вычислять или попробовать СКД — Ресурс

    Reply
  63. trular7

    (13) Ваш упрощенный вариант не будет работать в пользовательских полях. У автора рабочий вариант.

    Reply
  64. user670203_terskovaoa

    Здравствуйте. Подскажите пожалуйста, пытаюсь вывести в отчете пользовательскими полями информацию о проценте купленного товара по каждому клиенту. И дальше мне нужно посчитать среднее значение. Но не получается. Помогите пожалуйста.

    Среднее(Выбор
    Когда Количество > 0
    Тогда 1
    Иначе 0
    Конец) * 100 / [Номер по порядку], «ЧДЦ=0»)
    Reply
  65. Regner

    Подскажите как правильно обращаться к полям составного типа в выражении, например

    Выразить(Регистратор, «Документ.ПоступлениеТоваровУслуг»).Номер — система выдает синтаксическая ошибка

    Reply
  66. SlavaVNL

    (66) выбор когда Регистратор ссылка Документ.ПоступлениеТоваровУслуг Тогда Регистратор.Номер Конец

    Reply
  67. laf

    Люди, как в отчете «Анализ зарплаты по сотрудникам» ЗУП пользовательским полем получить норму дней по графику сотрудника? Можно или нет? !!!

    Reply
  68. Константин С.

    (68) Ну скорей всего нет.

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

    т.е. отчет придется сделать внешним.

    Reply
  69. ledidinka

    Спасибо за статью!!! С ее помощь настроила вывод сумм договоров в разных валютах по разным колонкам в отчете.

    Детальные записи:

    Выбор
    Когда [Валюта.Цифровой код] = «643»
    Тогда Сумма
    Иначе 0
    Конец

    Итоговые записи:

    Сумма(Выбор
    Когда [Валюта.Цифровой код] = «643»
    Тогда [Документ.Сумма]
    Иначе 0
    Конец)
    Reply

Leave a Comment

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