<?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='\
Дополнение готовых отчетов своими колонками.
В отчета сделанных с помощью «Схемы компоновки данных» из пользовательского режима можно добавлять свои Поля, которые будет выводиться при формировании.
В данных полях позволительно применять арифметические действа.
Перейти к публикации
Спасибо! Такие небольшие статьи (своего рода «маленькие хитрости») очень даже как нужны, особенно при начальном освоении 8-ки.
Совсем не русский? Беда… Использовал гугл-переводчик? Я плакал над текстом. О, ужас!
Тема < NULL
Хотя нет, лучше бы гугл-переводчик юзал. Он по-крайней мере не делает грамматических ошибок…
(4) extrim-style, сограшусь орфография и стилистика изложения не мой конек. Статья направлена не 1С:специалисту, а пользователю пытающему упростить себе жизнь. По этому изложение на «бытовом» уровне, минимальнотехничесвом языке.
иногда пользовательские поля, ой как выручают.
Раз публикация называется «Пользовательские поля в отчетах СКД» то вы и про поле выбора упомяните, тоже вещь полезная, может пригодиться. А если-бы добавили ещё и список функций которые можно использовать в полях выражения, то вообще супер была-бы публикация.
Спасибо автору. Действительно, этот момент нигде не описан (ну или по крайней мере, мне прежде не встречалось). Мне пригодится, часто работаю с СКД.
А какие функции можно использовать в пользовательских полях ?
А то арифметических действий не хватает.
Не осознал ценности данной статьи.
http://infostart.ru/public/97199/
У Хрусталёвой гораздо грамотнее написано. Вот если б где найти полное описание синтаксиса и допустимых функций для этого «языка СКД»… Так надоело искать аналоги и в угадайку играть.
Хотя вот есть
(10) ИТС. Статья «Язык выражений системы компоновки данных».
(10) Yashazz, публикация расчитана на пользователя который не открывает конфигуратор, т.е. не программиста. Для бухгатера которому надо чуть добавить информации в готовый отчет, в ней изложенно достаточно. А если он/она захочет большего, тогда в помощь книги, синтакс-помошник, итс и прочее…
последний пример можно упростить
ВЫБОР
КОГДА УСЛОВИЕ_1
ТОГДА ВАРИАНТ_1
КОГДА УСЛОВИЕ_2
ТОГДА ВАРИАНТ_2
…
ИНАЧЕ
ВАРИАНТ_ИНАЧЕ
КОНЕЦ
Спасибо автору. Я только начинаю осваивать СКД.
Если уж описывать пользовательские поля, можно было бы упомянуть о возможности использования этих полей не только как ресурсов, но и как измерений для группировок по ним
Для этого не нужно заполнять итоговое поле, можно оставить его пустым.
В результате у поля будет не зеленый значок, обозначающий ресурс, а обычный.
Подобное поле удобно юзать, например, как период и делать группировку по нужным периодам (день, неделя, месяц и т.п.)
Что ни говорите, а статья полезна своим содержанием! Делает из пользователя-обезьяны продвинутого пользователя, учит его шевелить мозгами, повышает самооценку и удовлетворение от работы. Лично я угробил полдня на разборы работы пользовательских полей и дальше арифметических действий так и не ушел. Спасибо автору.
Однако, действительно жалко, что русские люди не знают русского языка.
Однако, действительно жалко, что русские люди не знают русского языка.
вы так уверены, в моей национальности?
не возникало вопроса, что отсутствует способность к таким знаниям (кому что дано)?
Очень полезная публикация. Спасибо автору.
(17) Если задел Вас этим, то прошу у Вас прощения!
На заметку. Может кому пригодиться:
будет всегда возвращать 1, а вот этот работает корректно
отличная статья, спасибо.
Хорощая статья для юзеров.
А программерам очень рекомендую книгу Хрусталевой Е.Ю. «Разработка сложных отчетов в 1С Предприятии 8. Система компоновки данных». Не ленитесь, там таких «откровений» полкниги, а вторые полкниги — как это все реализуется программно.
Спасибо, отличная статья, с помощью нее смог создать несколько пользовательских полей, которые очень помогают в работе! Автор молодец!
Очень помогло! Спасибо автору!
Интересно, я с пользовательскими работала, но только примитивно, сложение-вычитание, не знала, что можно делать сложные практически запросы именно из пользовательского режима…
Цена продажи для итоговых полей неправильно написана. Должно быть так
Сумма([Сумма продажи]) / Сумма(Количество)
А лучше так
Выбор когда Сумма(Количество) = 0 Тогда 0 Иначе Сумма([Сумма продажи]) / Сумма(Количество) Конец
Спасибо.
Подскажите, пожалуйста, возможно ли в пользовательском поле выполнить преобразование текстовой строки в число для выполнения арифметической операции?
Если точнее — номенклатура учитывается в штуках, но в комментарии каждой номенклатуры проставлен объем. Необходимо в пользовательском поле отчета проставить формулу: количество номенклатуры из документа * на объем из комментария к исходной номенклатуры
[Номенклатура.Комментарий] * Количество или Число([Номенклатура.Комментарий]) * Количество -не проходит.
(27) oksevi, увы такой возможности нет.
Но можно, используя в компоновке данных, в Вычисляемых полях используя внешнюю функцию получить нужное значение.
Еще вариант использовать Свойства справочника, т.е. создать к примеру для Номенклатуры свойство Объем с типом число. Вот к нему обращаться.
Маленькая деталь — в режиме конструктора поля должны задаваться по ПУТИ, а в пользовательском режиме — по ЗАГОЛОВКУ. Т.е. одно и то же выражение в конструкторе должно задаваться как «ДоляПоСтатье*СтоимостьПродажи», а в пользовательском режиме уже как «[Доля по статье]*[Стоимость продажи]».
У хрусталевой это не описано, найдено методом тыка
Очень полезная статья. Спасибо автору. !!!!
Обращаюсь ко всем есть отчет свод начислений после некоторых настроек он теперь имеет вид в прикрепленном файле. нужно создать пользовательское поле которое будет отображать по каждому подразделению среднею зарплату.
Образно примерно так:
Среднее начисление = ПодразделениеОрганизации.Сумма/ ПодразделениеОрганизации.КоличествоСотрудников
Обращаюсь ко всем есть отчет свод начислений после некоторых настроек он теперь имеет вид в прикрепленном файле. нужно создать пользовательское поле которое будет отображать по каждому подразделению среднею зарплату.
Образно примерно так:
Среднее начисление = ПодразделениеОрганизации.Сумма/ ПодразделениеОрганизации.КоличествоСотрудников
(32) donex, Удалось ли решить поставленную задачу с использованием пользовательских полей?
(32)
http://infostart.ru/public/202133/
(33)
Вы забыли указать функцию Формат(Выражение, «ЧДЦ=2»), иногда помогает побороть числа типа 12,1254000000123
Нашел статью вовремя… Плюсууую
(35)
В УПП у меня не работает, пишет — неверные параметры AVG.
Такой вариант
можно использовать.
а… ну «неверные параметры AVG» выходило из-за среднего по итогам,
в режиме суммы по итогам просто пустое поле выводит без ошибок…
Спасибо! очень пригодилась инфа.
А кто подскажет у пользовательских полях есть возможность использовать функции из общего модуля? Или эта возможность только есть в вычисляемых полях.
Хорошая статья для практики.
(34) «Страница не найдена» — интересно, что на ней было?
(41) b1958,
пример как реализовать.
(42) подскажите, пожалуйста как сделать выравнивание пользовательской колонки по правой стороне? По умолчанию выравнивание левое.
(43) blacat09, в принце для этого есть «Условное оформление», там можно по играться с положением поля. Только для числа это не работает.
а в пользовательских полях можно поймать текущую дату?
ТекущаяДата()
в полях можно использовать теже выражения что в запросе
(22) Респект за отличную идею!
Не могу не поделиться!
Половину дня сидел думал как в СКД представить дату в виде HH:mm:ss, при условии, что часов больше 24. СКД хоть убей ставит следующий день и часы новых суток.
Так, например, 30 часов в вышеозначенном формате выглядит так: 06:00:00. Попытка вычислять и собирать часы минуты секунды как текст ни к чему путному не привела.
И тут:
Хрусталёва «разработка сложных отчетов» страница 138 . Перефразирую: «В пользовательских полях и в выражениях представления можно использовать функции из общего модуля. Для этого они должны быть объявлены как экспортные». ДА! эта фраза должна быть первой строкой в учебниках по СКД!
Спасибо за полезную статью!
Два дня мучился чтобы посчитать итоги по условию и эта конструкция разрешила проблему:
Сумма(Выбор
А я Сумму() пытался применять внутри конструкции Выбор.
Хорошая статья, спасибо автору.
Часто ещё округление необходимо, добавлю пример типа:
ЗУП 2,5 отчет список сотрудников
В пользовательском поле -> формула ->[Оклад, тарифная ставка]/[Cтавка]
Только берется первая «Оклад, тарифная ставка», которая имеет строковой тип
Ошибка: Отчет не сформирован. Неверные параметры «/».
Как указать в пользовательском поле брать ресурс, если 2 поля с одинаковым названием?
(50) Гость, Подскажите, нашли ли вы ответ «Как указать в пользовательском поле брать ресурс, если 2 поля с одинаковым названием? »
Такая же проблема
ЗУП 2,5 отчет список сотрудников
Как бы в формулу пользовательского поля втиснуть текущую дату или параметр Период? Пробовала через общие модули — ошибка формулы.
используйте &
(54) Можно сделать вот так:
https://infostart.ru/public/267055/
К параметрам обращаться нужно через слово Параметры, затем точка и как ты видишь название параметра в режиме предприятие. Если название параметра состоит из нескольких слов — то его нужно взять в квадратные скобки.
Вот еще нормальная статья
(45) у вас получилось?
(46) может, я что-то не так делаю, но у меня просто «ТекущаяДата()» не работает(
(58) чуть ниже посмотрите п.55 и 56, там описанно
У меня в таблице была подобная ошибка из за незаполненного одного поля в документе, по итогу данные есть но группировку сделать таблица не могла и обработчики Insull не срабатывали.
Как в пользовательском поле указать выражение на выбор первого дата платежа
во вложении пример в отчете
(62) Не уверен что это можно решить пользовательским полями.
Если на вскидку такое или в запросе вычислять или попробовать СКД — Ресурс
(13) Ваш упрощенный вариант не будет работать в пользовательских полях. У автора рабочий вариант.
Здравствуйте. Подскажите пожалуйста, пытаюсь вывести в отчете пользовательскими полями информацию о проценте купленного товара по каждому клиенту. И дальше мне нужно посчитать среднее значение. Но не получается. Помогите пожалуйста.
Подскажите как правильно обращаться к полям составного типа в выражении, например
Выразить(Регистратор, «Документ.ПоступлениеТоваровУслуг»).Номер — система выдает синтаксическая ошибка
(66) выбор когда Регистратор ссылка Документ.ПоступлениеТоваровУслуг Тогда Регистратор.Номер Конец
Люди, как в отчете «Анализ зарплаты по сотрудникам» ЗУП пользовательским полем получить норму дней по графику сотрудника? Можно или нет? !!!
(68) Ну скорей всего нет.
Но если загнать получение норма дней в функцию общего модуля, то к ней можно обратиться из Вычисляемого поля.
т.е. отчет придется сделать внешним.
Спасибо за статью!!! С ее помощь настроила вывод сумм договоров в разных валютах по разным колонкам в отчете.
Детальные записи:
Итоговые записи: