<?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='\
Хорошие задачи .. )) .. а первая вообще из 10 класса средней школы!! 🙂
Задачи понравились, +
Кстати для первой:
А = А + В;
В = А — В;
А = А — В;
Для третьей задачи всего одна строка:
B = 2 — A;
Задача №5
КоличествоЭлементов = Массив.Количество();
СуммаЧиселМассива = 0;
СуммаЧиселРяда = 0;
Для Счетчик = 1 По КоличествоЭлементов Цикл
СуммаЧиселМассива = СуммаЧиселМассива + Массив[Счетчик — 1];
СуммаЧиселРяда = СуммаЧиселРяда + Счетчик;
КонецЦикла;
Сообщить(СуммаЧиселРяда — СуммаЧиселМассива);
Показать
(4) Можно чуток попроще. Сумма чисел арифметической прогрессии равна (Начало+Конец) * (Количество / 2). Пример: 1-100; Сумма = (1+101) *(100/2) = 5050 т.к. пропущенное число только одно разница между суммой массива и полной прогрессией и будет то число.
>>> Прислал работодатель в качестве тестового задания.
Надо было послать этого работодателя. На три буквы, например в лес.
Ну и для второй задачки ответ:
(8) неверно
При N=4 правильно (1! = 1) * (2! =2) * (3! = 6) *(4! = 24) = 144
У вас результат 1*(2#k8SjZc9Dxk3 = 8)*(3#k8SjZc9Dxk2=9)*(4#k8SjZc9Dxk1) = 288
(9) 1*2*6*24=288 (с) calc
Или у нас калькуляторы разные? (в уме я считать не умею!)
(10) Сорри моя ошибка все верно
Задача 3:
В=2#k8SjZc9DxkA
Я даже догадываюсь, что за работодатель 🙂
Нормальный тест. Сразу отфильтровывают тех, кто подумать не может. Только присылать его как-то бессмысленно, ибо есть гугл и время не ограничено.
Хорошая зарядка для ума, вот обработку даже захотелось сделать 🙂
(13)
напиши пожалуйста в личку
Свою задачу эти задачки решают. Я допустим взял на заметку.
(12) Для A=0 B= 2
А у вас 2#k8SjZc9Dxk0=1
1). A=A+B; B=A-B; A=A-B
2). Расчет факториала выносим в рекурсивную функцию(по условию задачи использование рекурсии не запрещено), а сами n! перемножаем в цикле.
3). B = 2 — A
(3) А вот и нет. B = 1+(A=0);
Согласно условию задачи:
если А = 0 тогда В = 2
если А = 1 тогда В = 1
если же считать по формуле в (17)
если А = 0 тогда В = 1
если А = 1 тогда В = 2
(18) да не все правильно. В 1С Число(Истина) = 1; Число(Ложь) = 0 вот и результат
(19) Действительно правильно. А я сначала не врубился.
Задача 4
(19),(20) Только вот зачем? Смотрите сами, зачем городить огород:
1 — операция сравнения
2 — неявное приведение типа (Булево->Число)
3 — Сложение
Ведь В зависит от А линейно => B = 2 — A более логично … 🙂
(22) Да согласен сложнее. Зато тоже правильно и по другому.
И возможно человек просто не прочитал «А может принимать значение 0 или 1» и написал просто замену
для любых значений А
❗ код может и ошибочный, но алгоритм мне нравицо 😀
Задача 4:
*точно ошибочный 🙂
вот вроде бы правильное решение:
Показать
// чА число А
// чБ Число Б
чА = (чА+чБ)-чА;
чБ = (чА+чБ)-чБ;
// НчА конечный результат число А
// НчБ конечный результат числа Б
при учете что числа положительные….
в (24) по сравнению с вариантом (21) итераций как будто меньше 😀
вероятно так заработает тоже, но по скорости уступит (24)
Показать
Для (25) 1-я задача, я так понимаю
чА = (чА+чБ)-чА;
чБ = (чА+чБ)-чБ;
— в последнем варажении уже чА=чБ, поэтому чБ будет = чБ
мое решение:
А = А — Б
Б = Б + А
А = Б — А
2-я задача — рекурсия скорее всего
3-я: В = 2 — А
4-я:
счА = 1;
счВ = 1;
Для Сч = 1 По а + в Цикл
Если счА > а Тогда
Если счВ > в Тогда
Прервать;
Иначе
Сообщить(В[счВ]);
счВ = счВ + 1;
Конецесли;
ИначеЕсли А[счА] < B[счВ] Тогда
Сообщить(А[счА]);
счА = счА + 1;
Иначе
Сообщить(В[счВ]);
счВ = счВ + 1;
Конецесли;
Конеццикла;
Вот выпендрЁЖный вариант (21), если немного отступить от «буквы» задания
Можно еще сократить одну строку, если дважды вычислять «що».
А по скорости было бы сравнить интересно…
вторая задача легко пишется и без рекурсии:
Показать
1. Решение: при b<>0
a = a*b
b=a/b
a=a/b
для первой задачи, если нужно поменять местами не числовые переменные (а произвольные двоичные данные), то можно написать так:
тут xor — оператор логического исключающего ИЛИ
1. a=a*b=20; b=a/b=5; a=a/b=4
2. F=1; Для K=1 По n Цикл F=F*(K)#k8SjZc9Dxk(n-K+1) КонецЦикла
3. B=2-A
4. Для Сч=1 По а+b Цикл
ТекНомерА=0; ТекНомерB=0;
Если А[ТекНомерА+Сч]>B[ТекНомерB+Сч] Тогда
ТекНомерА=ТекНомерА+1; Сообщить(А[ТекНомерА]);
Иначе
ТекНомерB=ТекНомерB+1; Сообщить(B[ТекНомерB]);
КонецЕсли
1. a=a*b=20; b=a/b=5; a=a/b=4
2. F=1; Для K=1 По n Цикл F=F*(K)#k8SjZc9Dxk(n-K+1) КонецЦикла
3. B=2-A
4. Для Сч=1 По а+b Цикл
ТекНомерА=0; ТекНомерB=0;
Если А[ТекНомерА+Сч]>B[ТекНомерB+Сч] Тогда
ТекНомерА=ТекНомерА+1; Сообщить(А[ТекНомерА]);
Иначе
ТекНомерB=ТекНомерB+1; Сообщить(B[ТекНомерB]);
КонецЕсли
(31) Я решил аналогично
(32) в решении
A=A+B;….
есть момент — переполнение (выход за границы типа) хотя в 1С это наверно не актуально ну в вашем решении этот момент более актуален
(33) Правильно конечно, но в 1С нет XOR (вариант с XOR более универсален он обменяет значениями не только числа)
(34), (35) неверно 4
Вынести за цикл:
Заменить
на
по возрастанию
и еще учесть что массив А полностью меньше массива Б
вероятно был у этого же работодателя, только решал эти задачи на месте на листке. И кстати в задании не сказано, что задачи надо решать методами 1С 🙂
в 3 задаче я не сразу заметил условие что «А может принимать значение 0 или 1»
и решил ее при условии, что А может принимать любое значение — положительное, отрицательное или 0.
а вы попробуйте! задача гораздо интереснее получается. 😎
(37) спасибо за поправки. накалякал просто идеи без проверки 🙂
(39) Это очень плохо, если Вы даже условие прочитать не можете правильно, что же дальше то будет, когда до реализации дойдёт 😮
Я бы такого работника не взял 😀
я просто усложнил задачу…
мне по барабану что ты там думаешь, я бы тебя тоже не взял 😎
ты реши с тем условием, что я написал, потом пальцы кидай 😉
Задачки все десткие, но, честно говоря, над последней пришлось подумать минутку… 😳
(41) Жизнь научила, что думать надо сразу универсально 🙂 иначе бы А было Булевым.
На четвёртую задачку: не оттестированный, но вроде корректный вариант
Показать
(44) В институте научили, что самое главное правильно понять и усвоить условия задачи.
Если это сделано — то пол задачи решено 🙂
(45) Однако при числовом реквизите А «защиту от дурака» лучше поставить 😉 мало ли что пользователь введёт? Или до того проверку влепить, или делать неявным приведением значения.
Во всяком случае наши преподаватели обязательно попробуют ввести при проверке А=3 😎
Я тоже их на месте решал. И работодатель известный 🙂 Что-то не верю в то что их прислали… 😉
задача 3
В=2-А
Для первой задачки:
не так изящно, но все же….
а=Строка(а)+»*»+Строка(б);
б=Число(Лев(а,Найти(а,»*»)-1));
а=Число(Сред(а,Найти(а,»*»)+1));
Задача 3. Решение для любого значения А 😀
Попытка
В = 1/А;
В = 2;
Исключение
В = 1 ;
КонецПопытки;
(51) Ну ты дружок замутил … Попытка … Исключение … КонецПопытки
Одна из самых медленных конструкций в 1С …
А куда нам торопиться?
а теперь решите в таком варианте:
Написать функцию B=F(A) на встроенном языке 1С, при следующих условиях:
1. если А=0, то B=2, иначе B=1
2. полученное однострочное выражение, должно выполняться в табло 1С при различных значениях A
3. не допускается использование условных операторов (например , ?(А = 0;2;1)), не допускается использование попыток/исключений (что в общем то в табло и не получится :).
PS: мы в конторе уже напридумывали 3 варианта решения.
(18)(19)(20) в (17) проверка УСЛОВИЯ (Истина/Ложь), что по условию задачи низзя 😉
(55) По условии задачи нельзя использовать условных операторов например ?.
В решении B = 1+(A=0); нет условных операторов.
Мне тоже такие присылали по почте. Довольно занятно было порешать, даже без особой цели устроиться к ним на работу:)
Да, работодатель известный. Года 3 назад у них в офисе я эти задачки решал на листочке. Странно, что они их до сих пор совсем не изменили.
По поводу 2-й задачки. Тут кто-то рекурсию предлагал. Я тоже тогда рекурсию замутил. Меня, естественно, завернули с этой мыслью несуразной 😀 , т.к. циклов должно быть по условию всего ОДИН, а рекурсия это уже совсем не один. Не додумался тогда сходу, ну да ладно.
1) # a=4 b=5
a=a+b # a=9 b=5
b=a-b # a=9 b=4
a=a-b # a=5 b=4
2) Результат=1; Элемент=1;
Для Инд=1 По Н Цикл
Элемент=Элемент*Инд;
Результат=Результат*Элемент;
КонецЦикла;
# Результат = F(n)
3) B=2-A
4) Инд1=1; Инд2=1; Эл1=А[Инд1]; Эл2=В[Инд2];
Для Инд=1 По а+в Цикл
Если (Эл1<Эл2) И (Инд1<а) Тогда
Сообщить(Эл1); Инд1=Инд1+1; Эл1=А[Инд1];
Иначе
Сообщить(Эл2); Инд2=Инд2+1; Эл2=В[Инд2];
КонецЕсли;
КонецЦикла;
5) Контроль=0; Сумма=0;
Для Инд=1 По Н Цикл
Контроль=Контроль+Инд;
Сумма=Сумма+А[Инд];
КонецЦикла;
Пропавший=Контроль-Сумма;
*везде подразумевается индексация массивов с 1
1) подразумевается, что оба числа не равны нулю, в другом случае делается проверка и решение очевидно. Итак решение: b=b*a; a=b/a; b=b/a
2)Значение = 1;
Для н=1 по нн Цикл
Значение = Значение * Значение * н;
н = н + 1;
КонецЦикла
3)В = 2 — А
4) и 5) думаю много похожих решений уже есть. А теперь почитаю, чего написали другие =)
Задача №5
Сум = А.Количество();
Для н = 0 По А.Количество()-1 Цикл
Сум = Сум — А[н] + н;
КонецЦикла;
Сообщить(Сум);
Задача №4
ИндА = 0;
ИндБ = 0;
Для н = 1 По (КолА + КолБ) Цикл
Если (КолА = ИндА) и (КолБ = ИндБ) Тогда
Прервать;
ИначеЕсли (КолА = ИндА) и Не (КолБ = ИндБ) Тогда
Сообщить(Б[ИндБ]);
ИндБ = ИндБ+1;
ИначеЕсли Не (КолА = ИндА) и (КолБ = ИндБ) Тогда
Сообщить(А[ИндА]);
ИндА = ИндА+1;
ИначеЕсли А[ИндА] < Б[ИндБ] Тогда
Сообщить(А[ИндА]);
ИндА = ИндА+1;
ИначеЕсли А[ИндА] > Б[ИндБ] Тогда
Сообщить(Б[ИндБ]);
ИндБ = ИндБ+1;
ИначеЕсли А[ИндА] = Б[ИндБ] Тогда
Сообщить(А[ИндА]);
Сообщить(Б[ИндБ]);
ИндА = ИндА+1;
ИндБ = ИндБ+1;
КонецЕсли;
КонецЦикла;
1) а = а + (b — a)
b = b — (b — a)
2) Перем Факт, Рез, Знач;
Рез = 1; Знач = 1;
Для ин= 1 По Факт Цикл
Знач = Знач*ин;
Рез = Рез*Знач;
КонецЦикла;
3) B = (B + A) — A
(2) YVolohov,
Другое решение:
b=b-a
a=a+b
b=a-b
Ответ на первую задачу из 10 класса :
А=4;
Б=5;
Если А=4 тогда
А=5 ;
Иначе Сообщить(«Условие не выполнено») ;
КонецЕсли ;
Если Б=5 тогда
Б=4
Иначе Сообщить («Условие не выполнено») ;
КонецЕсли ;
АА=»А=»+А ;
ББ=»Б=»+Б ;
Сообщить (АА);
Сообщить (ББ);
(65)
Задача 1.
Объявлены две числовые переменные a и b. Необходимо сделать так, чтобы без объявления других переменных в результате работы алгоритма значения переменных поменялись местами. Например, если изначально a = 4, b = 5, то в результате алгоритма стало a = 5, b = 4. Применять можно только операции присваивания и арифметические операции с числами и значениями переменных.
Решение:
b=b-a
a=a+b
b=a-b
, для любого значения А.
Спасибо автору данной публикации.
Пост 6.
Всё-таки надо было гуглить и тогда бы прочитал местный пост Поручика.
(3) YVolohov, При А = 100, например, результат будет явно не верным.
(22) ll13, см. мой предыдущий комментарий.
(63) rom-x,
2) Перем Факт, Рез, Знач;
Рез = 1; Знач = 1;
Для ин= 1 По Факт Цикл
Знач = Знач*ин;
Рез = Рез*Знач;
КонецЦикла;
Переменная Факт не инициализирована, 1С сразу выдаст сообщение об ошибке о невозможности приведения переменной Факт к типу «Число».
a,b = b,a
(19)
(24) Зачем так сложно? В форме рисуем числовое поле, (число1 же), вбиваем туда любое число и считаем факториал.
Процедура КнопкаВыполнитьНажатие(Кнопка)
Счетчик = 1;
Факториал = 1;
Пока Счетчик <= Число1 Цикл
Факториал = Факториал * Счетчик;
Счетчик = Счетчик + 1;
КонецЦикла;
Сообщить(Факториал);
КонецПроцедуры
(19)
(24) Зачем так сложно? В форме рисуем числовое поле, (число1 же), вбиваем туда любое число и считаем факториал.
Показать
(75) и чему там получится 0! ?
(76)
единице, конечно =)
Переменная счетчик = 1, переменная факториал = 1, 1*1 сколько будет? =)))). По определению факториал 0 = 1, поэтому переменные начинаются с 1, исключая возможность умножения на 0 =)
(75)
Так, ну отвечая на вопрос я описал только факториал, а само решение Задачи будет таким:
Показать
Просто все эти факториалы фигачим в массив, который перемножаем.
5 Задача
Имеется НЕУПОРЯДОЧЕННЫЙ массив из n различных целых чисел от 0 до n (0,1,…,j-1,j+1,….,n). Необходимо за один цикл определить недостающее число j:
Ну ок, нигде не написано, что нельзя его упорядочить…
Показать
(79)
n = М.Количество()+1;
k = (n+1)*n/2;
Для Сч = 0 По n-2 Цикл
k = k — М[Сч];
КонецЦикла;
Сообщить(k);
где (n+1)*n/2; — сумма всех чисел в массиве
вычитанием элементов из этой суммы определяем недостающее число
Задача 3:
B = 1 + 0#k8SjZc9DxkA