Базовый курс. Домашнее задание №1
Первое задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 1. Развитие линейки «1С:Предприятие 8»
Глава 2. Базовые понятия
Глава 3. Установка платформы и конфигураций
Глава 4. Общие сведения о платформе
Глава 5. Список информационных баз
Глава 6. Пользовательский режим
Глава 7. Базовые приемы работы в конфигураторе
Глава 8. Средства разработчика
Глава 9. Объекты
Глава 10. База данных
Глава 11. Программный код
Глава 12. Примитивные типы данных
Задание выполнено.
Немного запутало введение при постановке задачи.
<code>Если ВидКлиента = “ВИП” и СортТовара=”Высший” тогда
Возврат истина
ИначеЕсли не ВидКлиента = “ВИП” и не СортТовара=”Высший” тогда
Возврат истина
иначе
Возврат ложь
КонецЕсли;
</code>
Получилось нет,да,нет,да
Если НЕ(ВидКлиента = “VIP” и СортТовара = “Высший”) или (ВидКлиента <> “VIP” и СортТовара = “Высший”) Тогда
Возврат “Запрещено”;
Иначе
Возврат “Разрешено”;
КонецЕсли;
XOR сложение в конечном поле размерности 2 может иметь более двух аргументов.
Сравнение строк точное посимвольное через массив, особенность работы с разными кодировками.
//Приоритеты выполнения:
// 1 2 1 3
Учитывая приоритеты выполнения НЕ, И, ИЛИ, тело функции без скобок может быть выглядеть так:
Возврат
НЕ ВидКлиента = “VIP” И НЕ СортТовара=”Высший” ИЛИ
ВидКлиента = “VIP” И СортТовара=”Высший”;
Проверял. Возвращает правильные значения.
&НаКлиенте
Процедура ВызовТонкийКлиент(Команда)
//общие данные тестов функции == Математика.ИсключающееИЛИ(
А1 = 1;
А2 = 2;
А3 = 2;
СтруКонтекст = Новый Структура;
СтруКонтекст.Вставить(“А1”, А1);
СтруКонтекст.Вставить(“А2”, А2);
СтруКонтекст.Вставить(“А3”, А3);
ИмяТеста = “тест1”;
МассивИлиСтрокаУсловий = “(СтруКонтекст.А1 = 1) <> (СтруКонтекст.А2 = 1)”;
РезультатПроверки = Математика.ИсключающееИЛИ(МассивИлиСтрокаУсловий,СтруКонтекст);
Сообщить(“Результат проверки =условие строкой==”+ИмяТеста+”= “+РезультатПроверки);
ИмяТеста = “тест2”;
МассивИлиСтрокаУсловий = “СтруКонтекст.А1 <> СтруКонтекст.А2”;
РезультатПроверки = Математика.ИсключающееИЛИ(МассивИлиСтрокаУсловий,СтруКонтекст);
Сообщить(“Результат проверки =условие строкой==”+ИмяТеста+”= “+РезультатПроверки);
ИмяТеста = “тест3”;
МассивИлиСтрокаУсловий = Новый Массив;
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.А1 = 1”);
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.А2 = 1”);
РезультатПроверки = Математика.ИсключающееИЛИ(МассивИлиСтрокаУсловий,СтруКонтекст);
Сообщить(“Результат проверки =массив условий==”+ИмяТеста+”= “+РезультатПроверки);
ИмяТеста = “тест4”;
МассивИлиСтрокаУсловий = Новый Массив;
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.А1 = 1”);
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.А2 = 1”);
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.А3 = 1”);
РезультатПроверки = Математика.ИсключающееИЛИ(МассивИлиСтрокаУсловий,СтруКонтекст);
Сообщить(“Результат проверки =массив условий==”+ИмяТеста+”= “+РезультатПроверки);
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить(Математика.РазрешенаПродажа(“«Постоянный»”, “«Высший»”));
Сообщить(Математика.РазрешенаПродажа(“«Непостоянный»”, “«Брак»”));
Сообщить(Математика.РазрешенаПродажа(“«VIP»”, “«Брак»”));
Сообщить(Математика.РазрешенаПродажа(“«VIP»”, “«Высший»”));
Сообщить(Математика.РазрешенаПродажа(“«Алиса»”, “«Высший»”, “Привет soft&hard”));
КонецПроцедуры
<code>
// ИсключающееИЛИ{XOR}
// сложение в конечном поле размерности 2 если передается массив условий
// проверка произвольного условия если условие строкой
// Результат – Булево или в случае ошибки Неопределено
// МассивИлиСтрокаУсловий – массив условий или собранная строка условий
// СтруКонтекст – контекст проверки
// СтруОписаниеОшибки – структура для описания искючительных ситуаций
Функция ИсключающееИЛИ(МассивИлиСтрокаУсловий, СтруКонтекст, СтруОписаниеОшибки = Неопределено) Экспорт
// сложение в конечном поле размерности 2 если передается массив условий
// проверка произвольного условия если условие строкой
// тут явная передача контекста проверки на сервер в стилистике КД
СтрокаУсловие = “”;
Если ТипЗнч(МассивИлиСтрокаУсловий) = Тип(“Массив”) Тогда
Для каждого эл Из МассивИлиСтрокаУсловий Цикл
СтрокаУсловие = СтрокаУсловие + ?(ПустаяСтрока(СтрокаУсловие),””,” + “) + ” ?(“+СокрЛП(эл)+”,1 ,0 ) “;
КонецЦикла;
// сумма в конечном поле размерности 2
СтрокаУсловие = “(“+СтрокаУсловие + ” % 2 ) = 1″;
ИначеЕсли ТипЗнч(МассивИлиСтрокаУсловий) = Тип(“Строка”) Тогда
СтрокаУсловие = МассивИлиСтрокаУсловий;
Иначе
Возврат (Неопределено);
КонецЕсли;
РезультатПроверки = Неопределено;
Попытка
// проверка безопасности производиться не будет
Выполнить(“РезультатПроверки = ” + СтрокаУсловие);
Возврат(РезультатПроверки);
Исключение
Если СтруОписаниеОшибки = Неопределено Тогда
СтруОписаниеОшибки = Новый Структура;
КонецЕсли;
СтруОписаниеОшибки.Вставить(“ИсключительнаяСитуация_ПроверкаУсловия”, “{“+СтрокаУсловие+”} =описание ошибки= {“+ОписаниеОшибки()+”}”);
Выполнить(Неопределено);
КонецПопытки;
КонецФункции // ИсключающееИЛИ{XOR}
// создадим из строки символов массив
Функция СоздатьМассивСимволов(СтрВходящая)
КоличествоСимволов = СтрДлина(СтрВходящая);
МассивСимволовВидКлиента = Новый Массив;
Для НомерСимвола = 1 По КоличествоСимволов Цикл
МассивСимволовВидКлиента.Добавить(КодСимвола(Сред(СтрВходящая,НомерСимвола,1)));
КонецЦикла;
Возврат (МассивСимволовВидКлиента);
КонецФункции
// проверим совпадение массивов символов
Функция СовпадениеМассивовСимволов(МассивСимволов1, МассивСимволов2)
ВсегоСимволовВмассиве = МассивСимволов1.Количество();
Если ВсегоСимволовВмассиве <> МассивСимволов2.Количество() Тогда
Возврат (Ложь);
КонецЕсли;
Для ИндексЭлементаМассива = 0 По ВсегоСимволовВмассиве – 1 Цикл
Если МассивСимволов1[ИндексЭлементаМассива] <> МассивСимволов2[ИндексЭлементаМассива] Тогда
Возврат (Ложь);
КонецЕсли;
КонецЦикла;
Возврат (Истина);
КонецФункции
// проверяем точное совпадение с эталонными строками т.к. например символы « и ” имеют различный код :)
Функция РазрешенаПродажа(ВидКлиента, СортТовара, A1КВА=””) Экспорт
// в точном соответствии с условиями задачи скопировано из pdf
МассивСимволовВИП = СоздатьМассивСимволов(“«VIP»”);
МассивСимволовВысший = СоздатьМассивСимволов(“«Высший»”);
МассивСимволовВидКлиента = СоздатьМассивСимволов(ВидКлиента);
МассивСимволовСортТовара = СоздатьМассивСимволов(СортТовара);
Совпадение_с_ВИП = СовпадениеМассивовСимволов(МассивСимволовВИП, МассивСимволовВидКлиента);
НЕ_Совпадение_с_Высший = НЕ СовпадениеМассивовСимволов(МассивСимволовВысший, МассивСимволовСортТовара);
СтруКонтекст = Новый Структура;
// структура эталона
СтруКонтекст.Вставить(“Совпадение_с_ВИП”, Совпадение_с_ВИП);
СтруКонтекст.Вставить(“НЕ_Совпадение_с_Высший”, НЕ_Совпадение_с_Высший);
МассивИлиСтрокаУсловий = Новый Массив;
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.Совпадение_с_ВИП”);
МассивИлиСтрокаУсловий.Добавить(“СтруКонтекст.НЕ_Совпадение_с_Высший”);
Если НЕ ПустаяСтрока(A1КВА) Тогда
МассивИлиСтрокаУсловий.Добавить(“Истина”);
КонецЕсли;
РезультирующееРазрешение = ИсключающееИЛИ(МассивИлиСтрокаУсловий, СтруКонтекст);
Возврат(РезультирующееРазрешение);
КонецФункции
</code>
Впечатляющее объемом кода решение :)
Но, кажется, Вы сильно усложнили задачу.
Такой универсальности не требовалось.
Задание выполнено. С помощью конспекта по мат. логике я заметил, что по условиям задачи требуется результат выполнения двойной импликации. В устной речи это операция выражается словами “тогда и только тогда”. Поэтому решение основано на этом факте.
<code>
ПереданВипКлиент = (ВидКлиента = “VIP”);
ПереданВысшийСорт = (СортТовара = “Высший”);
Возврат (ПереданВипКлиент = ПереданВысшийСорт);
</code>
Результат: Нет, да, нет, да.
П. С. Заметил, что при копировании строчки из pdf-файла
Сообщить(РазрешенаПродажа(«Постоянный», «Высший»));
платформа воспринимает кавычки «и » как один символ, но при этом безбочно ругается при синтаксическом контроле :(. Замена на стандартные ” и ” решает проблему.
Выполнил ДЗ.
вот функция
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат ?(ВидКлиента = “VIP”, СортТовара = “Высший” , Не СортТовара = “Высший”);
КонецФункции
Результат
Нет
Да
Нет
Да
Задание выполнил. Не могу сказать что открыл для себя что-то новое.
Это вводное задание, если у вас был опыт разработки, то об открытиях говорить пока рано..
Задание выполнено.Функция РазрешенаПродажа.
Сначала попробывал сделать через Если..Иначе.
Потом понял что все можно сделать проще.
Если (_Клиент = «VIP») И (Товар = «Высший») Тогда
Возврат Истина;
ИначеЕсли НЕ(_Клиент = «VIP») И НЕ(Товар = «Высший») Тогда
Возврат Истина;
Иначе
Возврат Ложь;
Результат: Нет, Да, Нет, Да.
Задание выполнено.Функция РазрешенаПродажа. Сначала попробывал сделать через Если..Иначе.Потом понял что все можно сделать проще.
Если (_Клиент = «VIP») И (Товар = «Высший») Тогда Возврат Истина;
ИначеЕсли НЕ(_Клиент = «VIP») И НЕ(Товар = «Высший») ТогдаВозврат Истина;
ИначеВозврат Ложь;
Результат: Нет, Да, Нет, Да.
Здравствуйте! Выполнено. Затруднений по платформе не возникло. Сначала написал функцию с разветвлением по двум условиям. Потом подумал, сократил
<code>
Возврат(Контрагент=”VIP” и Сорт=”Высший”) или (Контрагент<>”VIP” и Сорт<>”Высший”);
</code>
Вообще булева логика тренирует мозг. :)
В результате анализа условий задачи перевел их в формальный вид и составил истинностную таблицу для функции «РазрешенаПродажа». Таблица выглядит следующим образом:
АBС
1 1 1
0 0 1
1 0 0
0 1 0
Заглянул в учебник логики – оказалось эта функция называется эквиваленция.
Затем составил логическую формулу данной функции: (А И В) ИЛИ (НЕ А И НЕ В), где А-«ВидКлиента, В-«СортТовара». Формулу можно упростить: (А И В) ИЛИ НЕ(А ИЛИ В). Для визуализации таблицы значений и конструирования формулы использовал Excel.
Далее конструирую функцию в конфигураторе. Сравниваю переданный параметр «ВидКлиента» со значением «вип», параметр «СортТовара» со значением «высший»:
<code>
ВидКлиента=ВидКлиента=”вип”;
СортТовара=СортТовара=”высший”;
</code>
Далее с помощью условной конструкция «Если…Тогда…Иначе» реализуем формулу (А И В) ИЛИ НЕ(А ИЛИ В) и возвращаем «Истина» или «Ложь».
После этого я увидел второй вариант решения и реализовал его с помощью дополнительной переменной «РазрешитьПродажу» и присвоения ей результата вычисления логического выражения, созданного с помощью конструкции «?(вычислить выражение по условию)». Код стал более компактным. И только здесь я обратил внимание на закономерность – значение функции истинно, когда операнды равны. После этого код ещё более упростился путем упрощения логического выражения. Были исключены логические операторы – И, ИЛИ, НЕ. Осталась строка:
<code>
РазрешитьПродажу=?(ВидКлиента=СортТовара,Истина,Ложь);
Возврат РазрешитьПродажу;
</code>
Ну а затем удалось увидеть ещё более изящное решение (четвёртый вариант!):
<code>
РазрешитьПродажу=ВидКлиента=СортТовара;
Возврат РазрешитьПродажу;
</code>
Даже название у этой функции есть :)
Отличное решение!
Это все вопрос определений )
http://en.wikipedia.org/wiki/Xnor
Восторг(= так детально изучил такую простую задачу +1
Выполнила через вложенные условия:
<code>
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Если (ВидКлиента = “vip”) тогда
Если (СортТовара = “высший”) тогда //Клиент vip, Сорт высший
Возврат Истина;
Иначе //Клиент vip, Сорт не высший
Возврат Ложь;
КонецЕсли;
Иначе
Если (СортТовара <> “высший”) тогда //Клиент не vip, Сорт не высший
Возврат Истина;
Иначе //Клиент не vip, Сорт высший
Возврат Ложь;
КонецЕсли;
КонецЕсли;
КонецФункции
</code>
<code>
&НаКлиентеНаСервереБезКонтекста
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если (ВидКлиента = “VIP” И СортТовара = “Высший”) Или (ВидКлиента <> “VIP” И СортТовара <> “Высший”) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
</code>
содержание функции (сделана внешняя обработка):
<code>
возврат (ВидКлиента = «VIP») <> (НЕ (СортТовара = «Высший»));
</code>
&НаКлиенте
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если
(ВидКлиента= “VIP” И СортТовара= “Высший”)
ИЛИ (ВидКлиента <> “VIP” И СортТовара <> “Высший”) Тогда
Результат =”Нет”
Иначе
Результат =”Да”;
Возврат Результат;
КонецЕсли;
КонецФункции
Решение:
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат ( ВидКлиента=”VIP” И СортТовара=”Высший” ) ИЛИ ( НЕ ВидКлиента=”VIP” И НЕ СортТовара=”Высший” );
КонецФункции // РазрешенаПродажа()
ДЗ № 1 выполнил следующим образом:
Если (У1 и У2) или (У3 и У4) тогда
возврат истина;
Иначе
возврат ложь;
КонецЕсли;
Уважаемые коллеги. Хотя выполнил задание и написал короткую функцию в одну строку: <code>
Возврат ((ВидКлиента = «VIP») + (СортТовара = «Высший»))<>1; </code> до сих пор не могу понять почему в описание задачи шел разговор о XOR, ведь решение задачи это по факту функция логической эквиваленции (оба условия Истина, либо оба условия Ложь) ?
А для получения XOR необходимо изменить функцию следующий образом (заменит “<>” на “=”): <code>
Возврат ((ВидКлиента = «VIP») + (СортТовара = «Высший»))=1; </code> (только одно условие Истина).
В текущем домашнем задании необходимо программно сымитировать операцию, обратную XOR.
Для заданных условий достаточно:
<code>
Если ВидКлиента=”VIP” и СортТовара=”Высший”
или ВидКлиента<>”VIP” и СортТовара<>”Высший” тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
</code>
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ((ВидКлиента=”VIP”) и (СортТовара=”Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара<>”Высший”)) тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Разобрался на половину, и то с уже “написанной другими функцией”. Понятно что функция будет возвращать то или иное значение. А дальше ?……
Сообщить(РазрешенаПродажа(«Постоянный», «Высший»));
Сообщить(РазрешенаПродажа(«Непостоянный», «Брак»));
Сообщить(РазрешенаПродажа(«VIP», «Брак»));
Сообщить(РазрешенаПродажа(«VIP», «Высший»));
>А дальше ?
А дальше будут следующие задания, разумеется, более сложные. Первое задание было разминочным. Ведь некоторые участники на платформе 1С пишут впервые, поэтому такие задания необходимы.
Ход решения:
На бумаге набросал условия продажи товара.
Вид клиента = VIP / Сорт товара = Высший / Возможность продажи
Ложь/Ложь/Истина
Ложь/Истина/Ложь
Истина/Ложь/Ложь
Истина/Истина/Истина
Заметил обратную связь между работой XOR и условиями возможности продажи (столбец 3 и 4):
Вид клиента = VIP / Сорт товара = Высший / Возможность продажи / Результат оператора XOR
Ложь/Ложь/Истина/Ложь
Ложь/Истина/Ложь/Истина
Истина/Ложь/Ложь/Истина
Истина/Истина/Истина/Ложь
Написал функцию c 2-я параметрами, имитирующую работу оператора XOR. Использовал однострочный оператор «Если …. Тогда …… Иначе». При условии равенства 2-х параметров, функция возвращает Ложь, иначе функция возвращает Истина.
Написал функцию «Разрешена Продажа». В функции использовал однострочный оператор «Если …. Тогда …… Иначе». В условии оператора вызываю функцию XOR и передаю в неё 2 параметра:
ВидКлиента = «VIP»
СортТовара = «Высший»
Т.к. оператор XOR и условия продажи имеют обратную связь, то при возврате значения Ложь, присваиваю функции «Разрешена продажи» значение Истина и, наоборот, при возврате Истина, присваиваю Ложь.
Сложности:
Логика решения д/з трудностей не вызвала. Много проблем было с зашиванием алгоритма в программу. Синтаксический контролер оборался. Долго не мог понять ошибку “о не возможности преобразования значения в Булево”. С помощь Табло разобрался.
Отличный анализ задачи!
&НаСервере
Функция Исключающее_ИЛИ(Операнд1, Операнд2)
Возврат ?(ТипЗнч( Операнд1 ) = Тип(“Булево”) И ТипЗнч( Операнд2 ) = Тип(“Булево”), Операнд1 <> Операнд2, Неопределено);
КонецФункции
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат НЕ Исключающее_ИЛИ(ВидКлиента = “VIP”, СортТовара = “Высший”);
КонецФункции
&НаСервере
Функция Исключающее_ИЛИ(Операнд1, Операнд2)
Возврат ?(ТипЗнч( Операнд1 ) = Тип(“Булево”) И ТипЗнч( Операнд2 ) = Тип(“Булево”), Операнд1 <> Операнд2, Неопределено);
КонецФункции
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат НЕ Исключающее_ИЛИ(ВидКлиента = “VIP”, СортТовара = “Высший”);
КонецФункции
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат (ВидКлиента = “VIP” И СортТовара = “Высший”)
ИЛИ (Не ВидКлиента = “VIP” И Не СортТовара = “Высший”);
КонецФункции
Функция РазрешенаПродажа (ВидКлиента, СортТовара) // Oliwer
Если (ВидКлиента = “VIP” И СотрТовара = “ВЫСШИЙ”) ИЛИ (ВидКлиента <> “VIP” И СортТовара <> “Высший”) Тогда
Возврат;
КонецФункции
Функция РазрешенаПродажа (ВидКлиента, СортТовара)
Если (ВидКлиента = “VIP” И СотрТовара = “ВЫСШИЙ”) ИЛИ (ВидКлиента <> “VIP” И СортТовара <> “Высший”) Тогда
Возврат;
КонецФункции
Чтоб хоть чем то отличаться засуну сюда функцию сравнить. А вообще у ira самый наглядный вариант.
<code>
функция РазрешенаПродажа (ВидКлиента,СортТовара)
Сравнение = Новый СравнениеЗначений;
VIPВысший=Сравнение.Сравнить(ВидКлиента+СортТовара,”VIPВысший”);
НеVIP=Сравнение.Сравнить(ВидКлиента,”VIP”);
НеВысший=Сравнение.Сравнить(СортТовара,”Высший”);
Если (VIPВысший=0) или (НеVIP<>0 и НеВысший<>0) Тогда
Результат=”Да”;
иначе
Результат=”Нет”;
КонецЕсли;
Возврат Результат;
КонецФункции
</code>
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара) Экспорт
Возврат ВидКлиента=”VIP” и СортТовара = “Высший” или
ВидКлиента<>”VIP” и СортТовара<> “Высший”;
КонецФункции
На форме внешней обработки разместил 2 кнопки. При нажатии первой выполняется проверка без XOR
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат (((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара <> “Высший”)));
КонецФункции // РазрешенаПродажа()
При нажатии второй – проверяется с XOR
&НаСервереБезКонтекста
Функция РазрешенаПродажаXOR(ВидКлиента,СортТовара)
Возврат (НЕ XOR(ВидКлиента=”VIP”,СортТовара=”Высший”));
КонецФункции // РазрешенаПродажаXOR()
Все сообщения выводятся в поле формы.
При срабатывании события ПриСозданииНаСервере сообщения выводятся непосредственно в рабочую область.
Такое различие объясняется, вероятно, разным контекстом исполнения.
Функция РазрешенаПродажа(Клиент, товар)
кто = Клиент=”VIP” ;
что = товар=”Высший”;
Возврат(кто и что или не кто и не что)
КонецФункции
Решение:<code>&НаCервере
Функция РазрешенаПродажа(ТипКлиента,СортТовара)
Возврат (ТипКлиента=”вип” и СортТовара=”высший”)
или (Не ТипКлиента =”вип” и Не СортТовара =”высший”);
КонецФункции</code>
Сделал так
&НаСервере
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат(ВидКлиента=”V” и СортТовара=”B”)или (ВидКлиента<>”V” и СортТовара<>”B”);
КонецФункции // РазрешенаПродажа()
ЕСЛИ можно как то короче, поделитесь.
&НаСервере
Функция РазрешенаПродажа(ТипКлиента, СортТовара)
Возврат (ТипКлиента=”VIP” и СортТовара=”Высший”) или (ТипКлиента<>”VIP” и СортТовара<>”Высший”)
КонецФункции
Реализация.
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
возврат (ВидКлиента = “VIP” и СортТовара = “Высший”) или (Не ВидКлиента = “VIP” и Не СортТовара = “Высший”);
КонецФункции
Решил. <code>Возврат ((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или (НЕ(ВидКлиента = “VIP”)) и (Не(СортТовара = “Высший”))</code>
Согласен, просто делал на скорую руку – НДС сегодня все-таки
Нажимайте на кнопку “Ответить” для нужно сообщения.
Сейчас ваши сообщения попадают в корень записи.
Реализация:
функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат ВидКлиента = (НЕ СортТовара);
конецфункции
Вызов:
РазрешенаПродажа(ВидКлиента=”VIP”, СортТовара”Высший”)
fix
Вызов:
<code>РазрешенаПродажа(ВидКлиента=”VIP”, СортТовара<>”Высший”)</code>
Функция XOR
Функция НЕ_ИЛИ(Пар1, Пар2)
Возврат ?(Пар1 = Пар2, Ложь, Истина);
КонецФункции
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ВидКлиента = “VIP” Тогда
Если СортТовара = “Высший” Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли
Иначе
Возврат ?(СортТовара = “Высший”, Ложь, Истина);
КонецЕсли;
КонецФункции
Сделал домашнее задание. Сначала запутался, потом распутался :)
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат ((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара <> “Высший”));
КонецФункции
Результат:
Нет
Да
Нет
Да
Задание выполнил, чтобы не париться создал функцию xor по логике, а потом просто вызвал требуемое равенство
Функция xor(Операнд1, Операнд2)
возврат ?(Операнд1,Не Операнд2,Операнд2)
КонецФункции
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат xor(ВидКлиента = “VIP”, СортТовара = “Высший”);
КонецФункции
Реализуем функцию Xor:
Xor(a,b)=(a И НЕ b) ИЛИ (НЕ а И b)
Реализуем функцию РазрешенаПродажа:
РазрешенаПродажа(ВидКлиента,СортТовара)=
Xor(ВидКлиента=«VIP»,СортТовара<>«Высший»);
А если случайно ВидКлиента=«vip» (все символы в нижнем регистре),
скажем в случае ошибки пользователя , хотя пользователь подразумевал VIP клиента,
тогда есть смысл перед сравнением строк переводить их в нижний или верхний регистр?
Разумеется, если решать общую задачу, то на сравнения строк лучше не опираться.
Необходимо использовать какие-либо константные значения (перечисления, предопределенные элементы справочников).
Но в этом задании не требуется использовать данные объекты.
А для приведения строки к нужному регистру можно использовать функции ВРег() и НРег().