Базовый курс. Домашнее задание №1
Первое задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 1. Развитие линейки «1С:Предприятие 8»
Глава 2. Базовые понятия
Глава 3. Установка платформы и конфигураций
Глава 4. Общие сведения о платформе
Глава 5. Список информационных баз
Глава 6. Пользовательский режим
Глава 7. Базовые приемы работы в конфигураторе
Глава 8. Средства разработчика
Глава 9. Объекты
Глава 10. База данных
Глава 11. Программный код
Глава 12. Примитивные типы данных
Сначала сделал в лоб:
Если (ВидКлиента=”VIP” И СортТовара=”Высший”) ИЛИ
(ВидКлиента<>”VIP” И СортТовара<>”Высший”) Тогда
Возврат(Истина);
Иначе
Возврат(Ложь);
КонецЕсли;
Потом почитал отчеты коллег и реализовал функцию XOR:
Если Операнд1 = Операнд2 Тогда
Возврат(Ложь);
Иначе
Возврат(Истина);
КонецЕсли;
Клиент=ВидКлиента=”VIP”;
Товар=СортТовара=”Высший”;
Если НЕ XOR(Клиент, Товар) Тогда
Возврат(Истина);
Иначе
Возврат(Ложь);
КонецЕсли;
Почерпнул присваивание переменной результата сравнения Товар=СортТовара=”Высший”;
Действительно очень удобно и читабельно:)
Задание выполнил. Функция XOR возвращает результат выражения (НЕ Операнд1 И Операнд2) ИЛИ (Операнд1 И НЕ Операнд2)
Догоняю курс…
домашнее задание реализовала так
Функция РазрешенаПродажа(ВидКлиента, СотрТовара)
Возврат (ВидКлиента = “VIP” И СотрТовара = “Высший”)
ИЛИ (НЕ ВидКлиента = “VIP” И НЕ СотрТовара = “Высший”); КонецФункции
Функция ПродажаРазрешена(ВидКлиента, СортТовара)
ЭтоВысшийСорт = СортТовара = “Высший”;
ЭтоВипКлиент = ВидКлиента = “VIP”;
ПродажаЗапрещена = (ЭтоВипКлиент И НЕ ЭтоВысшийСорт) ИЛИ (НЕ ЭтоВипКлиент И ЭтоВысшийСорт); //mod 2
Возврат Не ПродажаЗапрещена;
КонецФункции
ПродажаЗапрещена = (ЭтоВипКлиент И НЕ ЭтоВысшийСорт) ИЛИ (НЕ ЭтоВипКлиент И ЭтоВысшийСорт); //mod 2
Как результат функции вернем НЕ ПродажаЗапрещена.
Получается, проверили эквивалентность и вернули исключающее или.
эм… Подскажите, а как отредактировать свой комментарий?) а то я по ошибке еще и текст функции привел…
Никак, редактирование пока отключено из соображений безопасности.
Сделал так с использованием списка значений(добавляю туда “Вип” и “Высший”):
Опер1 = СЗ.НайтиПоЗначению(Параметр1);
Опер2 = СЗ.НайтиПоЗначению(Параметр2);
Если Опер1 = Опер2 Или (Не Опер1 = Неопределено И Не Опер2 = Неопределено) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Функция РазрешенаПродажа(Параметр1,Параметр2)
Опер1 = СЗ.НайтиПоЗначению(Параметр1);
Опер2 = СЗ.НайтиПоЗначению(Параметр2);
Если Опер1 = Опер2 Или (Не Опер1 = Неопределено И Не Опер2 = Неопределено) Тогда Возврат Истина;Иначе Возврат Ложь; КонецЕсли;
КонецФункции
Наверно не самый оптимальный метод. Еще столкнулся с тем что 1с ругается на такие кавычки как «», только такие берет “”
Если (ВидКлиента = “VIP” и СортТовара = “Высший”) или (ВидКлиента <> “VIP” и СортТовара <> “Высший”) тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
Решение представляется таким:
Функция XOR(Операнд1, Операнд2)
Если ТипЗнч(Операнд1) = Тип(“Булево”) И ТипЗнч(Операнд2) = Тип(“Булево”) Тогда
Возврат Операнд1 <> Операнд2;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
КлиентVIP = ВидКлиента = “VIP”;
ТоварНеВысший = СортТовара <> “Высший”;
Возврат XOR(КлиентVIP, ТоварНеВысший);
КонецФункции
Функция XOR(Операнд1, Операнд2)
Если ТипЗнч(Операнд1) = Тип(“Булево”) И ТипЗнч(Операнд2) = Тип(“Булево”) Тогда Возврат Операнд1 <> Операнд2; КонецЕсли; Возврат Ложь;
КонецФункции
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
КлиентVIP = ВидКлиента = “VIP”; ТоварНеВысший = НЕ СортТовара = “Высший”; Возврат XOR(КлиентVIP, ТоварНеВысший);
КонецФункции
Скачать материал курса по нижеуказанной ссылке не получилось, ругается что не залогинился. Ввожу логин и попадаю в свой профиль. Так что задания выполнял опираясь на имеющиеся знания.
Вы неверными датами активировали токен доступа.
Исправил.
Теперь можете скачивать все материалы, начиная с 17 октября.
Догоняю группу. Сначала выполнил ДЗ, затем почитал комментарии.
1. Как и многие сделали, сначала создаём функцию, применимую не только для конрагентов и товаров “Исключающее ИЛИ”:
Функция ИсклИЛИ(Операнд1, Операнд2) Экспорт
Возврат НЕ(Операнд1 = Операнд2);
КонецФункции
Эта функция, чтобы можно было использовать её универсальность, должна располагаться в общем модуле (к примеру “ОбщийМодуль1”, выполняется на сервере).
2. В функции ИсклИЛИ() следовало бы предусмотреть возможность неверного типа параметров, перед основным возвратом вставить:
Если ТипЗнч(Операнд1) <> Тип(“Булево”)
ИЛИ ТипЗнч(Операнд2) <> Тип(“Булево”) Тогда
Возврат Неопределено;
КонецЕсли;
Можно было бы что-нибудь сообщить, но пока не буду этого делать, чтобы не гадать, как корректно отправить сообщение с сервера, вообще говоря, неизвестно куда.
3. А к ИсклИЛИ() обращаемся из требуемой функции:
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара) Экспорт
Возврат НЕ ОбщийМодуль1.ИсклИЛИ(ВидКлиента = “VIP”, СортТовара = “Высший”);
КонецФункции
Запустил – получил сообщения: “Нет”, “Да”, “Нет”, “Да”.
Мое решение
Функция РазрешенаПродажа(ВидКлиента,СортТовара) //Не понятная функция
Возврат ((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара <> “Высший”));
КонецФункции
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат ((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара <> “Высший”));
КонецФункции
Задание выполнил. Для себя открыл выражения типа Зн3 = Зн1= Зн2. Теперь можно упростить некоторые выражения с зн3 = ?(зн1=зн2, Истина, Ложь)
Отлично, Евгений!
А мне кажется, что выражение через ? смотрится более читаемо. Может потому, что непривычно конечно.
Сегодня получил доступ догоняю группу, решения думаю что не самое лучше
&НаКлиенте
Функция РазрешенаПрдажа(ВидКлиента, СортТовара) Экспорт
Если XOR( (ВидКлиента = “VIP” и СортТовара = “Высший”),
(ВидКлиента <> “VIP” и СортТовара <> “Высший”)) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаКлиенте
Функция XOR(Операнд1, Операнд2)
Если Операнд1 = Истина и Операнд2 = Ложь Тогда
Возврат Истина;
ИначеЕсли Операнд1 = Ложь и Операнд2 = Истина Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Поспешил скорее вот так &НаКлиенте Функция XOR(Операнд1, Операнд2) Возврат ?((Операнд1 <> Операнд2),Истина,Ложь); КонецФункции
Задание сделал. Один в один совпало с камрадом Martik:
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат(НЕ XOR(ВидКлиента = “VIP”, СортТовара=”Высший”));
КонецФункции // РазрешенаПродажа()
Доброе утро, догоняю.
Особенности ипользования XOR в Функции РазрешенаПродажа
Функция РазрешенаПродажа(Опер1,Опер2)
Если Опер1 = “VIP” Тогда
Oper1 = Истина
Иначе
Oper1 = Ложь
КонецЕсли;
Если Опер2 = “Высший” Тогда
Oper2 = Истина
Иначе
Oper2 = Ложь
КонецЕсли;
Возврат XOR(Oper1,НЕ Oper2)
КонецФункции
Догоняю группу-)))
Домашнее задание №1 сделала.
РазрешенаПродажа(ВидКлиента,СортТовара)Если ВидКлиента = “VIP” Тогда
ПерваяПозиция = 1; Иначе ПерваяПозиция = 0;
КонецЕсли
Если СортТовара <> “Высший” Тогда
ВтораяПозиция = 1; Иначе ВтораяПозиция = 0;
КонецЕсли
Если ПерваяПозиция <> ВтораяПозиция Тогда
Возврат Истина, Иначе Возврат Ложь;
КонецЕсли
Задание сделал.
Поскольку у меня функция РазрешенаПродажа() содержит всего одну строчку кода, приведу её здесь:
возврат ?(((ВидКлиента = “VIP” И СортТовара = “Высший”) ИЛИ (НЕ ВидКлиента = “VIP” и НЕ СортТовара = “Высший”)),истина, ложь);
Т.е. условие распадается на две составляющие – либо имеем продажу товара высшего сорта випу, либо продажу любого другого товара клиенту, статус которого не вип. В этих случаях продажа разрешена (истина). Ну, а во всех других случаях, продажа запрещена (ложь)
На мой взгляд тоже оптимальный код. Разве что, можно избавиться от одного оператора НЕ :
возврат ?((ВидКлиента = “VIP” И СортТовара = “Высший”) ИЛИ (НЕ(ВидКлиента = “VIP” ИЛИ СортТовара = “Высший”)),истина, ложь);
Задание выполнил.
ПС: К сожалению так и не понял где смотреть главы курса для изучения.
Смотрите все записи относящиеся к базовому курсу.
Например, вот 0-вой блок – https://mg.spec8.ru/2010/10/17/%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9-%D0%BA%D1%83%D1%80%D1%81-0-%D0%BE%D0%B9-%D0%B1%D0%BB%D0%BE%D0%BA/.
Там же есть организационное видео.
Поизучайте сайт mg.spec8.ru.
Согласно приведенной таблице функция XOR возвращает результат истина когда операнд1 <> операнд2
т.е.
Функция xor(операнд1,операнд2)
возврат операнд1<>операнд2;
КонецФункции
По поводу функции РазрешенаПродажа(ВидКлиента, СортТовара)
Самый правильный с точки зрения логики вариант приведенный ll13.
Но с точки зрения читаемости уж лучше расписать
рез=ложь;
Если видКлиента=”вип” Тогда
Если сортТовара=”высший” Тогда
рез=истина;
КонецЕсли;
Иначе
Если сортТовара<>”Высший” Тогда
рез=истина;
КонецЕсли;
КонецЕсли;
возврат рез;
Хоть менее красиво зато читаемо.
С читаемостью не угадаешь, каждый под себя подбирает. Мне, например, ближе когда все условия вначале собраны, как у tatianalma:
Если ( (ВидКлиента=VIP) И (СортТовара=Высший) ) ИЛИ ( (ВидКлиента<>VIP) И (СортТовара<>Высший) ) тогда
Возврат Истина; // разрешить продажу
Иначе
Возврат Ложь;
КонецЕсли;
Сегодня присоединился к группе.
Д/З №1
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат (ВидКлиента = “VIP”) = (СортТовара = “Высший”);
КонецФункции
Реализация булево XOR для 1С:
Функция XOR(X, Y)
Возврат НЕ X = Y;
КонецФункции
Задание выполнено.
Функция РазрешенаПродажа (ВидКлиента, СортТовара)
Возврат ((ВидКлиента=”VIP”)+(СортТовара<>”Высший”))=1
КонецФункции
Правда, решение такое уже было.
Данный вариант запретит продажу VIP клиенту обычного товара.
А разве по условиям задачи этого не требуется?
Да, прошу прощения. Сам усложнил себе задачу :)
Тогда проще так:
Возврат (ВидКлиента=”VIP”)=(СортТовара=»Высший»)
Не самое краткое решение….
Функция XOR(Арг1, Арг2) // Аргументы типа boolean….
//реализация XOR
А = Число(Арг1);
Б = Число(Арг2);
ОстатокОтДеления = (А + Б)%2;
Возврат ?(ОстатокОтДеления = 1, Истина, Ложь );
КонецФункции // XOR()
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат(НЕ XOR(ВидКлиента = “VIP”, СортТовара=”Высший”));
КонецФункции // РазрешенаПродажа()
Сумма и ОстатокОтДеления каждый по отдельности смогут реализовать XOR:
Функция XOR(Арг1, Арг2) // Аргументы типа boolean….
Возврат ?(Арг1 + Арг2 = 1, Истина, Ложь );
КонецФункции // XOR()
либо
Функция XOR(Арг1, Арг2) // Аргументы типа boolean….
Возврат ((Арг1 + Арг2)%2);
КонецФункции // XOR()
Задание выполнено.
Особенностей кода нет, в функции идет проверка двух условий.
Задание выполнено.
Решение: Если (ВидКлиента = “VIP” И СортТовара = “Высший”) ИЛИ (НЕ(ВидКлиента = “VIP”) И НЕ(СортТовара = “Высший”)) Тогда Возврат ИСТИНА
Задание сделал, используя операторы сравнения.
Воспользовался тем, что система может складывать значения Истина и Ложь, преобразуя их в численное. Т.е. получается, XOR это (пар1+пар2+пар3=1), где пар1, пар2 и пар3 булево. При этом, количество параметров может быть и больше (в отличие от варианта пар1<>пар2). Пишу и думаю, интересно, а программа выведет итог по колонке таблицы значений с типом Булево… Дальше разные варианты, но я сделал не совсем функцию XOR, но принцип тот же.
Возврат ((ВидКлиента=”VIP”)+(СортТовара<>”Высший”)>0). Т.е. только когда клиент не VIP, а товар “Высший” функция вернет ЛОЖЬ.
Интересное решение, спасибо почерпнула для себя полезное.
p.s. в итоговом возврате опечатка похоже, >0 вместо =1
Спасибо, самому интересно было поразмыслить как применить сложение булевых в данном задании. Но у меня получилась не совсем XOR, т.к. нужно было из 4-х сочетаний событий выделить одно – когда товар не доступен, а это только когда клиент не VIP, а товар высшего сорта, во всех остальных случаях, товар должен быть доступен. Именно поэтому там “>0”.
Или так: Возврат ((СортТовара=»Высший»)-(ВидКлиента=»VIP»)=1)
А вот здесь уже опечатка ;)
Евгений, возник вопрос по классу “СообщениеПользователю”. Сразу извиняюсь, если задаю его не в той ветке.
Вопрос следующий: можно ли сделать привязку сообщения например к кнопке на форме. Например нужно чтобы пользователь нажал на какую-нибудь кнопку, например “заполнить”, хотелось бы привязать сообщение именно к этой кнопке. Почему-то сделать так у меня не получается.
Нет нельзя.
Привязка сообщения возможно только к полю форму, связанному с данными.
Евгений, скажите пожалуйста, комментировать чужие ответы можно?
Да, можно.
Только без личных оценок.
Спасибо, но посмотрев оргвидео по выполнению ДЗ, понял, что можно написать коммент, в качестве описания “хода своих рассуждений” :). Итак, пусть Усл1 – это (Клиент=»вип»), а Усл2 – это (Товар=»высший»).
В процессе решения ДЗ я тоже рассматривал популярный среди ответов алгоритм:
Если Усл1 И Усл2 Тогда Возврат (Истина);
ИначеЕсли (Не Усл1)И(Не Усл2) Тогда Возврат (Истина);
Иначе Возврат (Ложь); КонецЕсли;
Это опять НЕ-XOR, но не суть важно, тем же алгоритмом легко можно получить и XOR.
Смутило другое, прошу поправить если неправ: поверхностное знакомство с С++ подсказывает, что оператор Если, операции со значениями «Булево» и переменными примитивных типов легко компилируются в машинный код – на уровне нескольких байт (почти прямое соответствие командам Ассемблера). А вот обработка реквизитов объектов, особенно через несколько точек может потребовать сотен и более операторов Ассемблера, и это не считая задержек на получение объекта с сервера (не знаю, как в 8.2, но 7.7 известна неэффективными алгоритмами работы через несколько точек). Поэтому для оптимизации скорости выполнения вычисления нужно быть уверенным, что использование агрегатных типов данных минимизировано. Очевидно, что в решаемой нами задаче агрегатные типы данных могут использоваться именно при вычислении Усл1 и Усл2. Таким образом, более универсальным будет алгоритм, гарантировано вычисляющий каждое из этих условий не более 1 раза (т.е. два и только два раза считывающий агрегатные типы). Вышеприведенный алгоритм с этой точки зрения ненадежен. И вот почему: он гарантирует два обращения только будучи заключенным в тело отдельной функции (агрегатные типы, передаваемые в качестве параметров будут определены единожды при вызове функции, а внутри нее будут использоваться переменные примитивных типов, например Документ.Контрагент.ВидКонтрагента.Наименование передается в строковую переменную ВидКлиента). НО! Этот алгоритм в отличие от тех, где гарантировано лишь два вычисления условия (Усл1=Усл2) неэффективно применять в чистом виде (без выделение в отдельную функцию) в теле к-либо более масштабного вычисления, т.е. например:
… проверка разных реквизитов ДокументА… в т.ч.
Если (ДокументА.Контрагент.ВидКонтрагента.Наименование=»вип») И (ДокументА.Товар.КатегорияТовара.Наименование=»высшая») Тогда Решение = (Истина);
ИначеЕсли (Не (ДокументА.Контрагент.ВидКонтрагента.Наименование=»вип») ) И (Не (ДокументА.Товар.КатегорияТовара.Наименование=»высшая») ) Тогда Решение= (Истина);
Иначе Решение = (Ложь); КонецЕсли;
Если бы в 1с8 не было оптимизации вычисления составного условия, такой код обеспечил бы гарантировано 4 вычисления условия. Попробуем посчитать, сколько их будет благодаря оптимизации. Здесь без оценки вероятности не обойтись. Я исхожу из равной вероятности всех событий, а значит и их сочетаний: «вип»/»высший»(далее – ВВ)=25%, «вип»/»невысший»(ВН)=25%, НВ=25%, НН=25%. Проверим, сколько вычислений условий потребовалось для каждого сочетания по каждому Если (цифра в таблице – количество вычисления соотв-х условий В либо (НеВ)):
Оператор\ситуация_______ВВ__ВН___НВ__НН
1. Если Усл1=В И Усл2=В…_1+1__1+1__1+0_1+0
2. ИначеЕсли(НеВ)И(НеВ)…_0+0_1+0__1+1__1+1
Итого за 4 прохождения алгоритма с разными наборами данных 11 вычислений условий, в к-х вероятен запрос агрегатных типов, т.е. всреднем 2,75 вычисления на 1 проход против гарантированных 2-х при варианте (Усл1=Усл2). Предполагаемая разница скорости выполнения 37,5%!
Прошу прощения за «многа букаф», сам не ожидал, что выйдет так длинно :(…
Объемно написано.
Дам короткие комментарии.
>Если, операции со значениями «Булево» и переменными примитивных типов легко компилируются в машинный код – на уровне нескольких байт (почти прямое соответствие командам Ассемблера).
Согласен.
>А вот обработка реквизитов объектов, особенно через несколько точек может потребовать сотен и более операторов Ассемблера, и это не считая задержек на получение объекта с сервера (не знаю, как в 8.2, но 7.7 известна неэффективными алгоритмами работы через несколько точек).
Все верно, чтение из БД – длительная операция. Проблема обращения через несколько точек имеется в 1С:8.
> Поэтому для оптимизации скорости выполнения вычисления нужно быть уверенным, что использование агрегатных типов данных минимизировано.
Согласен. Однако у платформы есть многоуровневые кэши. И значение прочитанное из БД кладется в кэш. Если тут же к нему обратиться еще раз, то оно возьмется из кэша.
Тем менее, лишние обращения к реквизитам – ни к чему.
Почему-то ваши комменты задваиваются.
Отправляете дважды для надежности? :)
Сорри, после отправки и обновления страницы не увидел коммент (как обычно со статусом “Ожидает модерации”), подумал, что всилу размера “в проводах застрял” :). Буду знать, что в таком случае не стоит спешить с повторной отправкой.
ДЗ сделал, можно не пытаться объяснить это словами?
Возврат ((Клиент=”вип”)=(Товар=”высший”));
Извиняюсь, маленькая неточность в приведенном ранее решении – оно реализует функцию НЕ-ХОR, т.к. если использовать удобные для восприятия условия
Усл1 это (Клиент=»вип»)
Усл2 это (Товар=»высший»)
то для правильного ответа в контексте задачи про товары (без дополнительного преобразования НЕ) требуется функция, возвращающая 0+0=1, 1+0=0, 1+1=1, что реализуется через (Усл1)=(Усл2) и соответствует НЕ-ХОR.
Соответственно, простой ХОR реализуется через (Усл1)<>(Усл2)
Можно также, используя неявное преобразование типов, выразить ХОR как ((Усл1)-(Усл2)), но в этом случае возвращаться будет числовое значение (-1,0,1), и если его присовить переменной, то такая переменная сама изменит свой тип на числовой, затруднив интерпретацию полученного ответа, а вот если возвращать его в реквизит объекта с объявленным типом “Булево”, то возвращаемое значение будет автоматически преобразовано в “Булево”, что нам и нужно. Для правильного ответа в контексте поставленной задачи нужно дополнительно инвертировать возвращаемое значение с помощью НЕ(). Благодаря этому произойдет преобразование возвращаемого значения в тип “Булево”, соответственно, его можно возвращать в переменную без дополнительных манипуляций для преобразования типов.
Хотел бы предложить еще один вариант решения НЕ-XOR для задачи про клиента и товар. Его специфика в неочевидности алгоритма (для тех случаев, когда хочется сделать код “трудночитаемым” по к-либо причинам). В данном варианте реализации используется передача третьего параметра – ПринятоеРешение, в который передается реквизит объекта (тип “Булево”), используемый для отображения “принятого решения” (для наглядности его формат можно задать “БЛ=’Не разрешаю’; БИ=Разрешаю” например), (но можно обойтись и без него, тогда первой строкой нужно объявить ПринятоеРешение, как “булево” с любым значением, но такое действие на мой взгляд немного упростит алгоритм для понимания, а хочется “понепонятнее” :) ) :
Функция ХОР (Клиент, Товар, ПринятоеРешение)
Если (Клиент=”вип”)=ПринятоеРешение тогда
ПринятоеРешение = Не (ПринятоеРешение);
КонецЕсли;
Если Товар=”высший” тогда
ПринятоеРешение = Не (ПринятоеРешение);
КонецЕсли;
Возврат ПринятоеРешение;
КонецФункции
Прошу прощения за код, но объяснить его логику не очень легко… мне по-крайней мере :)
Интересный “трудночитаемый” код.
Хотя я не поддерживаю идею, что когда-либо нужно его использовать.
Уж лучше делать хорошие дела :)
Опять извиняюсь, корректнее назвать последнюю функцию НЕ_XOR(Клиент,….).
Для чистого XOR 2-я строка должна быть:
Если (Клиент=”вип”)= (Не(ПринятоеРешение)) тогда…. либо
Если (Клиент=”вип”)<>ПринятоеРешение тогда…..
Задание сделано.
Введём определение вспомогательной функции F(A, B):
если A равно B, тогда F(A, B) есть ИСТИНА, иначе F(A, B) есть ЛОЖЬ.
При таком определении функции F(A, B), при её выполнении происходит проверка всего лишь ОДНОГО условия.
Тогда используя эту функцию, поставленнная задача решается следующим образом:
РазрешенаПродажа(ВидКлиента, СортТовара) = F(ВидКлиента=”VIP”, СортТовара=”Высший”),
и при её выполнении происходит проверка всего лишь ТРЁХ условий (по одному для каждого аргумента функции и одно внутри самой функции).
Напишу, как сделал бы раньше …
Всё делаю через Если Тогда, ИначеЕсли, Иначе.
Перечисляю и сравниваю параметры VIP и Высший, возвращаю Истину. Иначе ЛОЖЬ.
Справился!!! Платформу инсталлировал, базу создал, функцию разработал…
При проверке работы выводятся сообщения “Нет, Да, Нет, Да”
Особенности кода разработанной функци: Три знака равенства в выражении для возвращаемого значения
Функция ХOR(Операнд1, Операнд2 – тип переменных булево)
Если (Операнд1 И НЕ Операнд2) ИЛИ (НЕ Операнд1 И Операнд2) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
Функция РазрешенаПродажа(…)
Если (НЕ XOR(Условие1, Условие2)) ИЛИ (Условие3) , где Условие1 – клиент Vip, Условие2 – сорт товара Высший, Условие3 – клиент Vip + сорт товара Высший
Решил.
Условие (НЕ XOR) = НЕ (вип И НЕ высш ИЛИ НЕ вип И высш) , ну либо (НЕ вип ИЛИ высш) И (вип ИЛИ НЕ высш)
PS Видно все комментарии с решениями. Это так и задумано?
Да, видны все комментарии.
Так и задумано.
Если ( (ВидКлиента=VIP) И (СортТовара=Высший) ) ИЛИ ( (ВидКлиента<>VIP) И (СортТовара<>Высший) ) тогда
Возврат Истина; // разрешить продажу
Иначе
Возврат Ложь;
КонецЕсли;
Вынес отдельную функцию РазрешенаПродажа.
В ней определил переменную Разрешено.
Присваиваю ей Истина если “ВИП” и “Высший” или Не “вип” и не “высший” в остальных случаях Ложь. Возвращаю обратно и сообщаю результат.
Сделано.
Условие А – продажа ВИП клиентам только товаров высшего сорта
Условие Б – продажа НЕ ВИП клиентам только товаров НЕ высшего сорта
Операция XOR(либо А, либо Б) реализована как А <> Б
xor реализовал в отдельной функции.
с двумя параметрами. При НЕ равенстве которых возвращается истина, в противном случае-лож.
Второе задание реализовал так же через “Если ” с условием из двух параметров через “И”.
Задание сделала. Особенности:
Отдельно определила функцию XOR – возвращает Ложь тогда и только тогда когда операнды равны.
А потом тоже использовала отрицание XOR
НЕ XOR(ВидКлиента=”VIP”, СортТовара=”Высший”)
По сути я сделал тоже самое только возвращал сразу правильное значение, т.е. отрицание делал внутри функции XOR, ну и не использовал “НЕ”
Да, Евгений, я так и поняла. Поэтому и написала, что “тоже использовала…”
Кстати, прочитав Ваш комментарий нашел еще одно решение, возможно, что Вы так и сделали:
Если Условие1 = Условие2 Тогда
Истина
Иначе
Ложь
КонецЕсли
Тогда не нужно внешнее отрицание и уменьшается число “если”. При этом условие1 и условие2 принимает значение истина или ложь, т.е. они содержат в себе ответы на вопросы “Это ВИП клиент” и “Это высший сорт”
Я сделала почти так, то есть количество если действительно было меньше. Но при равенстве возвращалась Ложь, то есть отрицание было все-таки отдельно. Как раз прочитав вчера Ваше решение и комментарий тоже подумала, что можно было сразу объединить :)
Особенности такие: по сути я реализовал функцию отрицания xor. Получилось следующее условие:
Если Условие1Тогда
ИначеЕсли Условие2 тогда
Иначе
КонецЕсли
При этом Условие1 и Условие2 это составные условия по “И”, т.е. условие1 = условиеА И УсловиеБ
Отлично, Евгений.
Вот такие отчеты и являются достаточными :)
Спасибо, Евгений.
Задание сделал. А как отчитаться по нему? Выложить здесь код обработки или же просто написать какие особенности кода?
Код выкладывать не нужно.
А вот особенности опишите.