Базовый курс. Домашнее задание №1
Первое задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 1. Развитие линейки «1С:Предприятие 8»
Глава 2. Базовые понятия
Глава 3. Установка платформы и конфигураций
Глава 4. Общие сведения о платформе
Глава 5. Список информационных баз
Глава 6. Пользовательский режим
Глава 7. Базовые приемы работы в конфигураторе
Глава 8. Средства разработчика
Глава 9. Объекты
Глава 10. База данных
Глава 11. Программный код
Глава 12. Примитивные типы данных
Догоняю группу. ДЗ выполнил.
Т.к. в задании явно указано на необходимость имитации работы XOR, сделал так:
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат НЕ ИсклИли(ВидКлиента = “VIP”, СортТовара = “Высший”);
КонецФункции // РазрешенаПродажа()
Функция ИсклИли(А, Б)
Возврат А <> Б;
КонецФункции // ИсклИли()
Подразумевается, что на вход функции ИсклИли подаются только булевы аргументы.
ДЗ № 1
Функция РазрешенаПродажа(Пар1,Пар2)
Перем Рез;
Рез = ?((Пар1=”Вип”)И(Пар2=”Высший”),Истина,?((Пар1<>”Вип”)И(Пар2<>”Высший”),Истина,Ложь));
Возврат Рез;
КонецФункции
Тоже догоняю:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));
Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Высший”));
КонецПроцедуры
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ВидКлиента = “VIP” И СортТовара = “Высший” ИЛИ
ВидКлиента <> “VIP” И СортТовара <> “Высший” Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции // РазрешенаПродажа()
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));
Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Высший”));
КонецПроцедуры
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ВидКлиента = “VIP” И СортТовара = “Высший” ИЛИ ВидКлиента <> “VIP” И СортТовара <> “Высший” Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции // РазрешенаПродажа()
Добрый вечер. При решении задачи применила знания предмета Математическая логика. Потом просмотрела предлагаемые решения, есть что-то похожее на мой вариант.
Добрый вечер!
Мое решение домашнего задания №1:
Возврат ?(СортТовара = “Высший”, ?(ВидКлиента=”Постоянный”,Ложь,Истина),?(ВидКлиента=”VIP”,Ложь,Истина));
Результат получен верный.
Единственное, пришлось немного голову поломать, т.к. думал найти более приятное глазу решение.
Спасибо.
Тоже пытаюсь наверстать, задание сделал так сказать “в лоб”, приводить код смысла нет, посмотрел решение очень оригинально, спасибо!
Всем привет!!!
немного отстал … догоняю …
задание интересное
мое решение:
============================
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));
Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Высший”));
КонецПроцедуры
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
возврат ?(ВидКлиента=”VIP” и СортТовара= “Высший”,Истина,?(ВидКлиента<>”VIP” и СортТовара<>”Высший”,Истина,Ложь))
КонецФункции
==============================
сложностей не возникло
Пытаюсь догнать остальных :)
функция нечто вроде:
&НаСервере
Функция РазрешенаПродажа(ИмяКлиента, Сорт)
Возврат ?(ИмяКлиента = “VIP” И Сорт = “Высший”, Истина, Ложь);
КонецФункции // Проверить()
&НаСервере
Функция РазрешенаПродажа(ИмяКлиента, Сорт)
Возврат ?(ИмяКлиента = “VIP” И Сорт = “Высший”, Истина, Ложь);
КонецФункции // РазрешенаПродажа()
ой, т.е.
&НаСервере
Функция РазрешенаПродажа(ИмяКлиента, Сорт)
Возврат ?(ИмяКлиента = «VIP» И Сорт = «Высший», Истина, Ложь);
КонецФункции // РазрешенаПродажа()
Сделал Функцию XOR прямо в лоб
Функция XOR(парам1,Парам2)
возврат ?((Парам1 И Парам2) ИЛИ НЕ(Парам1 ИЛИ Парам2),Ложь,Истина);
конецФункции
Работает правда только для двух параметров. Можно было бы и расширить, но не стал так как по заданию нет необходимости. Понравилось как проходит сравнение и присвоение при выполнении конструкции
БулевыйПараметр1 = Парам1=”VIP”;
БулевыйПараметр2 = Парам2<>”Высший”;
(может правда из-за того что никогда так не делал, а точнее и не знал что так можно. Всегда делал допустим БулевыйПараметр1 = ?(Парам1=”VIP”,Истина,Ложь); длинее и в простых выражениях менее наглядно).
ну и результирующая строка
РазрешенаПродажа = XOR(БулевыйПараметр1,БулевыйПараметр2);
Функция РазрешенаПродажа(Парам1,Парам2)
Если Парам1 = “VIP” Тогда
Если Парам2 = “Высший” Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если Парам1 <> “VIP” Тогда
Если Парам2 <> “Высший” Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
КонецФункции
Приходится догонять. Задание выполнила
через Если…
После посмотрела видео, решение интересное
Решил также в лоб, зато каждый программист поймет :)
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара);
Если (ВидКлиента = “VIP” И СортТовара = “Высший”) ИЛИ
(ВидКлиента <> “VIP” И СортТовара <> “Высший”) Тогда
Возврат ВидКлиента + ” XOR ” + СортТовара +” = Истина”;
Иначе
Возврат ВидКлиента + ” XOR ” + СортТовара +” = Ложь”;
КонецЕсли;
КонецФункции
&НаСервереФункция РазрешенаПродажа(ВидКлиента, СортТовара); Если (ВидКлиента = “VIP” И СортТовара = “Высший”) ИЛИ (ВидКлиента <> “VIP” И СортТовара <> “Высший”) Тогда Возврат ВидКлиента + ” XOR ” + СортТовара +” = Истина”; Иначе Возврат ВидКлиента + ” XOR ” + СортТовара +” = Ложь”; КонецЕсли; КонецФункции
Отстаю от группы, стараюсь догнать, посему пишу с запозданием. Самое интересное что я написал точно также как и первый пример преподователя. Второй вариант меня сильно порадовал, но я не подумал думать в том направлении :), но решение действительно изящное, спасибо за то что показываете как лучше делать, постараюсь следить теперь за собой :)
Добрый день. Решил сначала самостоятельно после просмотра глав 1-12 нулевого блока:
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ВидКлиента = “VIP” и СортТовара = “Высший” Тогда
Результат = Истина;
ИначеЕсли ВидКлиента <> “VIP” и СортТовара <> “Высший” Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
Нужные значения вроде возвращает, но когда проанализировал таблицу, описывающую как работает исключающее ИЛИ, думаю, что недоработал т.к. в первом условии оба операнда возвращают Истина и результат выполнения тоже Истина, что расходится с описанием работы исплючающего ИЛИ в домашнем задании…
После выполнения стал смотреть комментарии – смотрю, не только я таким путем пошел…
Немного сложно для меня оказалось, но я постепенно разобрался.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));
Сообщить(РазрешенаПродажа(“Постоянный”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Высший”));
КонецПроцедуры
&НаСервере
Функция РазрешенаПродажа(Клиент, Товар)
Если НЕ (Клиент=”VIP” или Товар=”Высший”) Тогда
возврат истина;
иначе
возврат ложь;
КонецЕсли;
КонецФункции // РазрешенаПродажа(Клиент, Товар)
Ваша функция запрещает все, кроме продажи неВипу неВысшего товара, это не то, что нужно по задаче
Вчера “добрался” до домашнего задания.
Возвращаемое функцией значение определил как:
?(ВидКлиента=”VIP”,СортТовара=”Высший”,
Не СортТовара=”Высший”), но после просмотра
решения понял, что этот вариант проигрывает.
Создала функцию
Функция XOR(Парам1, Парам2)
Возврат ?(Парам1 И Парам2, ЛОЖЬ, Парам1 ИЛИ Парам2);
КонецФункции
Из функции РазрешенаПродажа вызывала НЕ XOR( ВидКлиента = “VIP”, СортТовара = “Высший”)
Решение приведенное преподавателем конечно намного элегантнее
Задание выполнил. Сначала проверкой на равенство двух условий итут же на проверку на неравенство обоих условий.
Решение преподавателя – сейчас буду смотреть))
Догоняю вас всех :)
Решила задание, как оказалось, классически (после просмотра готового решения) . Была удивлена предложенным вариантом, все гениально и просто :))) Из уже 12-ти просмотренных тем, подчеркнула для себя много полезных мелочей, о которых даже не догадывалась.
Выполнил домашнее задание №1. После собственного выполнение, посмотрел выложенное решение преподавателя, мое было “в лоб”, т.е. первый вариант ) Конечное решение от преподавателя гораздо изящнее.
Несколько вопросов по материалу:
1) Block0-066-part0-main. Возможно ли, встроенными средствами платформы получить значение GUID конкретной записи? Это может понадобиться при различных обменах между базами или выгрузках.
2) Block0-066-part0-main. Каким образом решается конфликт объявления переменной с одним идентификатором с оператором экспорт в разных модулях?
Еще вопрос, по
Мысль осталась незавершенной…
Еще пара вопросов:
1) Для каждой процедуры/функции модуля нужно указывать, где она исполняется, т.е. &НаКлиенте или &НаСервере?
2) Почему при выводе значения переменной булевого типа, в Сообщить показывает Да/Нет, а не Истина/Ложь?
1. Нет. Рассказано в 1-ом блоке.
2. Для пользователя “Ложь” эквивалентна обману, неправомерным действиям…все это имеет негативный оттенок.
Поэтому ввели пользовательские представления – Да и Нет.
Ответы на вопросы.
1. Да, можно. Подробно как это делается и какие задачи решает рассматривается в 1-вом блоке.
2. Вопрос не совсем понятен, просьба привести пример.
Например, в модуле документа РасходнаяНакладная объявили переменую
Перем Товар; экспорт
и в модуле документа СписаниеТовара
наяНакладная объявили переменую
Перем Товар; экспорт
какая из них будет доступна в модуле третьего документа ПеремещениеТовара?
Т.е. инетерсует контекст действия переменных объявленных в модулях с операндом “экспорт”.
Интересный вопрос.
Ответ в “зоне прямой видимости” не будет переменной Товар в модуле третьего документа.
Предлагаю просмотреть 1-ый блок, и если вопрос не разрешиться, вернемся к нему :)
Согласно приведенным значениям XOR получаем
((X1 ИЛИ X2) И Не(X1 И X2)), тогда
Функция РазрешенаПродажа(ВидКлиента, СортТовара);
Если ВидКлиента=”VIP” тогда
Параметр1 = Истина иначе
Параметр1 = ложь
КонецЕсли;
Если СортТовара = “Высший” тогда
Параметр2 = ложь иначе
Параметр2 = истина
КонецЕсли;
Возврат ((Параметр1 ИЛИ Параметр2) И Не(Параметр1 И Параметр2));
КонецФункции
На выходе получаем
Ложь
Истина
Ложь
Истина
мой вариант:
функция РазрешитьПродажу(клиент,сорттовара)
Если клиент=”vip” и сорттовара=”высший” тогда
возврат Истина;
иначеесли клиент<>”vip” и сорттовара<>”высший” тогда
возврат Истина ;
иначе возврат Ложь ;
КонецЕсли;
Конецфункции
Догоняю. Решение пока не смотрел.
Решение “в лоб” очевидно
Функция XOR(Операнд1,Операнд2)
Возврат НЕ Операнд1 = Операнд2
КонецФункции.
однако, для количества операндов булевого типа более двух, гораздо более универсальным представляется подход с преобразованием типов:
Функция XOR(МассивБулевыхЗначений)
Результат = 0;
Для Каждого ЭлементМассива Из МассивБулевыхЗначений Цикл
Результат = Результат+Число(ЭлементМассива)
Если Результат>1 Тогда Прервать КонецЕсли
КонецЦикла
Возврат Результат = 1;
КонецФункции
========
Примерно так
Не удержалась, посмотрела видео. Забила в базу Ваш способ. Работает. Я решила бы стандартно. Теперь пытаюсь вспомнить, где могла бы это применить.
На мой взгляд не совсем ясная формулировка домашнего задания.
Оно воспринимается как необходимость разработки двух независимых функций XOR и РазрешенаПродажа. Мне кажется, что необходимо четче акцентировать внимание на то, что при разработке функции РазрешенаПродажа необходимо смоделировать функцию XOR. Судя по комментариям такое не понимание возникло не только у меня.
Ничего страшного нет, если в функции ПродажаРазрешена использовать собственную функцию XOR.
в видео не подглядывал решил так
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
ВозвращаемоеЗначение=Ложь;
Если ВидКлиента=”VIP” И СортТовара= “Высший” Тогда
ВозвращаемоеЗначение= Истина;
ИначеЕсли НЕ ВидКлиента=”VIP” И НЕ СортТовара= “Высший” Тогда
ВозвращаемоеЗначение= Истина;
КонецЕсли;
Возврат ВозвращаемоеЗначение;
КонецФункции // РазрешенаПродажа()
после посмотрел видео. конечно супер. и по производительности 0,000034 против 0,000026 за 4 вывода сообщить
ткните пожалуйста – где находится видео решения ?
недождался видео. Вот моё решение:
Функция РазрешенаПродажа(Клиент, Сорт)
ИстинаКлиент = Клиент = “VIP”;
ИстинаСорт = Сорт = “Высший”;
ВсёИстина = ИстинаКлиент и ИстинаСорт;
НичтоНеистина = Не ИстинаКлиент и НЕ ИстинаСорт;
Возврат ВсёИстина или НичтоНеистина;
КонецФункции
Меню: Базовый курс – ДЗ и решения.
Далее ищите нужную запись..
Мое решение:
Возврат ?(ВидКлиента= “VIP” и СортТовара= “Высший”,Истина,
?(ВидКлиента <>”VIP” и СортТовара<> “Высший”,Истина,Ложь));
Догоняю. Т.к XOR это (A ИЛИ B) И (НЕ A ИЛИ Не B), то :
Если ВидКлиента = “VIP” Тогда
A = Истина;
Иначе
A = Ложь;
КонецЕсли;
Если СортТовара = “Высший” Тогда
B = Истина;
Иначе
B = Ложь;
КонецЕсли;
Возврат НЕ((A ИЛИ B) И (НЕ A ИЛИ Не B));
Мое решение:
Функция РазрешенаПродажа(ВидКлиента, СортТовара) Экспорт
Если (СокрЛП(ВидКлиента) = “VIP”) И (СокрЛП(СортТовара) = “Высший”) Тогда
Возврат Истина;
КонецЕсли;
Если (СокрЛП(ВидКлиента) <> “VIP”) И (СокрЛП(СортТовара) <> “Высший”) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция РазрешенаПродажа(ВидКлиента, СортТовара) Экспорт
Если (СокрЛП(ВидКлиента) = “VIP”) И (СокрЛП(СортТовара) = “Высший”) Тогда
Возврат Истина;
КонецЕсли;
Если (СокрЛП(ВидКлиента) <> “VIP”) И (СокрЛП(СортТовара) <> “Высший”) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Задание сделал стандартным образом :
Если ((Пар1 = “VIP”) и (Пар2=”Высший”)) или (НЕ ((Пар1 = “VIP”) и (Пар2=”Высший”))) Тогда
Далее посмотрел готовое решение – необычно и просто, постараюсь запомнить.
1. Функция XOR наиболее короткий вариант у меня получился следующий:
Возврат ?(Оп1<>Оп2, Истина, Ложь);
Если ВидКлиента=”VIP” И СортТовара=”Высший” Тогда
Возврат Истина;
ИначеЕсли ВидКлиента<>”VIP” И СортТовара<>”Высший” Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
2. Функция РазрешенаПродажа написана без изысков, зато понятно
Если ВидКлиента=”VIP” И СортТовара=”Высший” Тогда
Возврат Истина;
ИначеЕсли ВидКлиента<>”VIP” И СортТовара<>”Высший” Тогда
Возврат Истина;
Иначе Возврат Ложь;
КонецЕсли;
сделал так:
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Операнд1 = ВидКлиента = “VIP”;
Операнд2 = СортТовара = “Высший”;
Если (Операнд1 И Операнд2) ИЛИ (НЕ Операнд1 И НЕ Операнд2) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
посмотрел видео с решением – очень интересный вариант
Догоняю. Задание сделал сначала в лоб: если, иначе и т.д. Посмотрел как сделали коллеги, действительно проще.
Сделала так:
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Опер1 = ВидКлиента = “VIP”;
Опер2 = СортТовара = (“Высший”);
Возврат ?((Опер1 И Опер2) Или (Не Опер1 И Не Опер2),Истина,Ложь);
КонецФункции
До просмотра БлокаО не сталкивалась с такой особенностью работы оператора присваивания. Правильное решение уже посмотрела. Взяла на заметку )
Функция XOR (A,B)
X = (А или В) и НЕ(А и В);
возврат х;
КонецФункции;
функция РазрешенаПродажа(ВидКлиента, СортТовара)
да = XOR(ВидКлиента<>”VIP”, СортТовара=”Высший”);
возврат да;
КонецФункции;
Сообщить(РазрешенаПродажа(«Постоянный», «Высший»));//ложь
Сообщить(РазрешенаПродажа(«Непостоянный», «Брак»));//истина
Сообщить(РазрешенаПродажа(«VIP», «Брак»));//ложь
Сообщить(РазрешенаПродажа(«VIP», «Высший»));//истина
Мои варинаты:
1. Возврат (0+(Клиент=”VIP”)+(Сорт=”Высший”))<>1;
2. Возврат СтрЧислоВхождений(“”+(Клиент=”VIP”)+(Сорт=”Высший”),”Да”)<>1;
3. Возврат Не ?(Клиент=”VIP”, Не Сорт=”Высший”, Сорт=”Высший”);
Слелал как у Анны, только скобочек больше – так мне читабельнее.
Догоняю хоть и не легко
видео где ДЗ готовое смотрел.
1) Функция РазрешенаПродажа(Клиент, Сорт)
Возврат (Клиент <> “VIP”) = (Сорт <> “Высший”);
КонецФункции
2) Возврат (НЕ(Клиент = “VIP”)) = (НЕ(Сорт = “Высший”));
Догоняю хоть и не легко
видео где ДЗ готовое смотрел.
1) Функция РазрешенаПродажа(Клиент, Сорт) Возврат (Клиент <> “VIP”) = (Сорт <> “Высший”); КонецФункции
2)
Возврат (НЕ(Клиент = “VIP”)) = (НЕ(Сорт = “Высший”));
Задание выполнил. Особенностей выполнения нет, поскольку решил “в лоб”. Приведённые здесь варианты весьма интересны, спасибо авторам!