Базовый курс. Домашнее задание №1
Первое задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 1. Развитие линейки «1С:Предприятие 8»
Глава 2. Базовые понятия
Глава 3. Установка платформы и конфигураций
Глава 4. Общие сведения о платформе
Глава 5. Список информационных баз
Глава 6. Пользовательский режим
Глава 7. Базовые приемы работы в конфигураторе
Глава 8. Средства разработчика
Глава 9. Объекты
Глава 10. База данных
Глава 11. Программный код
Глава 12. Примитивные типы данных
Добрый день. Выполнено.
(ВК = “ВИП” И СТ = “Высший”) Или Не (ВК = “ВИП” Или СТ = “Высший”);
Задание выполнил (правда до конца уроки еще не прошел, уж больно интересно было).
<code> Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Результат1 = ВидКлиента = “VIP”;
Результат2 = СортТовара = “Высший”;
Возврат ?((Результат1 + Результат2)=1, Ложь, Истина)
КонецФункции </code>
Вариантов много, но более короткого не придумал. Хотя можно было не вычислять промежуточные значения сравнения, а поместить все в одни оператор, хотя так более наглядно.
Только сейчас понял. Можно не использовать оператор ?( , , ,) вообще, а сделать так.
<code> Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат ((ВидКлиента = “VIP”) + (СортТовара = “Высший”))<>1;
КонецФункции </code>
Порядок решения:
Создала функцию – аналог XOR, которая возвращает Истину по условию
( А И НЕ Б ИЛИ НЕ А И Б ).
В переменную А записываю значение вспомогательной функции, которая истинна, если передано значение “VIP”.
В переменную Б записываю значение другой вспомогательной функции, которая истинна, если передано значение “Высший”.
В функции РазрешенаПродажа вызываю функцию-аналог XOR и инвертирую ее значение.
Сделано. Сначала написал по простому
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ВидКлиента=”VIP” И СортТовара = “Высший” Тогда Возврат Истина;
ИначеЕсли ВидКлиента<>”VIP” И СортТовара<>”Высший” Тогда Возврат Истина;
Иначе Возврат Ложь;
КонецЕсли;
КонецФункции
потом сократилось до одной строки.
Выполнила так:
<code>
Возврат(Контрагент=”VIP” и Сорт=”Высший”) или не (Контрагент=”VIP” или Сорт=”Высший”);
</code>
Домашнее задание выполнено.
Последовательность решения:
1. Создаем внешнюю обработку.
2. Создаем форму обработки.
3. В модуле формы создаем обработчик события “ПриСозданииНаСервере”, а также функцию “РазрешенаПродажа” с директивой компиляции “&НаСервере”.
4. Алгоритм функции “РазрешенаПродажа”:
Если (VIP Клиент И Сорт Высший) ИЛИ
(НЕ VIP Клиент И НЕ Сорт Высший) Тогда Возврат Истина
Иначе Возврат Ложь
5. В обработчике “ПриСозданииНаСервере” с помощью процедуры “Сообщить” проверяем работу функции “РазрешенаПродажа” согласно входным данным, указанным в тексте задания.
6. Запускаем конфигурацию в пользовательском режиме, открываем созданную обработку и в окне “Сообщения” видим результат: Нет, Да, Нет, Да
ДЗ выполнено
<code>
Если ВидКлиента = “VIP” И СортТовара = “Высший” ИЛИ
НЕ (ВидКлиента = “VIP”) И НЕ (СортТовара = “Высший”) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
</code>
Задание выполнено.
<code>
&НаСервереБезКонтекста
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара <> “Высший”)) Тогда
Возврат Истина
Иначе
Возврат Ложь
КонецЕсли;
КонецФункции
</code>
Идею “&НаСервереБезКонтекста” позаимствовал у одного из участников, пока без особого понимания процесса, думаю так правильнее.
Задание выполнено. Спасибо за интересное первое ДЗ. Ожидал чего-нибудь более тривиального. Для себя вспомнил самое на мой взгляд простое словесное описание исключающего или: “xor для двух переменных отвечает на вопрос “различны ли значения переменных”. “фича” с кавычками тоже улыбнула.
Задание сделал. XOR реализовал так:
возврат Число(ВидКлиента = “VIP”) + Число(НЕ (СортТовара = “Высший”)) = 1;
Без явного преобразования к числу тоже работает
<code>
возврат (ВидКлиента = “VIP”) + (НЕ (СортТовара = “Высший”)) = 1;
возврат (ВидКлиента = “VIP”) + (НЕ (СортТовара = “Высший”)) = 1;
</code>
или так
<code>
возврат (ВидКлиента = “VIP”) <> (НЕ (СортТовара = “Высший”))
</code>
Задание выполнено. kst красава
<code>
&НаСервереБезКонтекста
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
а = ВидКлиента = “VIP”;
б = СортТовара = “Высший”;
Возврат (а И б) Или (Не а И Не б);
КонецФункции
&НаСервереБезКонтекста
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
а = ВидКлиента = “VIP”;
б = СортТовара = “Высший”;
Возврат (а И б) Или (Не а И Не б);
КонецФункции
</code>
Задание выполнено. Сделала все в одной внешней обработке.
1) определила два булевских реквизита на форме и кнопку6 на клиенте выполнялось сообщение, на сервере вычислялась функция НЕИЛИ(Опр1, Опр2). При условии: Булево(Опр1)=Булево(Опр2) возвращало истину. Использование приведение типа к булеву несколько расширяет типы операндов, правда не на много.
2) в этой же обработке определила функцию РазрешенаПродажа и поставила сообщения как было указано. В условии использовала ту самую исключающую ИЛИ
НЕ НЕИЛИ(ВидКлиента = “VIP”, СортТовара = “Высший”)
И все получилось.
Посмотрев комментарии ниже, поняла что сглупила с певым пунктом
Выполнено, но получившаяся функция только имитирует XOR. В комментарии собственно XOR.
<code>
Функция XOR(Булево1, Булево2)
Возврат Булево((Число(Булево1)+Число(Булево2))%2);
КонецФункции
</code>
Задание выполнено.
Созданы
Справочник.Товары
Поле ВысшийСорт – Булево
Справочник.Клиент
Поле VIP – Булево
Документ.Расход
В табличной форме товары
При записи документа проверка табличной части
<code>
Процедура Передзаписью(Отказ,РежимЗаписи ,режимПроведения)
Для Каждого ТекущаяСтрока Из Табличнаячасть Цикл
/// Сравниваем реквизит клиента и реквизит товара в текущей строке цикла, если хоть один товар из списка не совпадает- закрываем возможность сохранения и выдаем ссылку пользователю на ошибку
</code>
Единственный вопрос, можно ли не выводить номер строки методом Сообщить(), а привязать Сообщение.Поле к строке с ошибкой?
>Единственный вопрос, можно ли не выводить номер строки методом Сообщить(), а привязать Сообщение.Поле к строке с ошибкой?
Да, конечно можно.
Вы немного забегаете в материал первого блока.
Необходимо использовать тип данных СообщениеПользователю, заполнить свойство Поле и использовать метода УстановитьДанные().
Пример есть в синтакс-помощнике.
я так и не смог понять как это можно реализовать в многострочной табличной части.
в итоге сделал проверку на соответствие не при сохранении а при подборе товара, что более правильно.
Полагаю, что вопросы должны сняться когда мы будем выводить такие диагностические сообщения об ошибках (во втором блоке).
Если “непонятности” останутся – welcome в мастер-группу.
Решено.
Собственно сама функция не проблемна: обычная строгаю дизъюнкция из бинарки a<>b
соответственно
<code>Возврат ((ВидКлиента=”VIP”)<>(СортТовара=”Высший”));</code>
Гораздо больше проблем вызвала попытка схалтурить и копипастой вставить код на “Сообщить” из текста задания, пока не догадался кавычки поправить) Потом уже в комментариях здесь увидел, что я не один такой.
Переделал задание:
<code>
Функция РазрешенаПродажа(Клиент,Сорт)
Возврат ((Клиент = “VIP”) и (Сорт = “Высший”)) или ((Клиент <> “VIP”) и (Сорт <> “Высший”));
КонецФункции
</code>
Результат:
Нет
Да
Нет
Да
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если ВидКлиента = “VIP” И СортТовара = “Высший” Тогда
Возврат Истина;
ИначеЕсли ВидКлиента = “Должник” ИЛИ СортТовара = “Высший” ИЛИ ВидКлиента = “VIP” Тогда
Возврат Ложь;
ИначеЕсли ВидКлиента = “Старый знакомый” И СортТовара = “Первый сорт” Тогда
Возврат Истина;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции // РазрешенаПродажа()
из кода можно исключить этот часть:
ИначеЕсли ВидКлиента = «Старый знакомый» И СортТовара = «Первый сорт» Тогда
Возврат Истина;
1.Сначала набросал таблицу для функции РазрешенаПродажа:
Клиент=”VIP” |Сорт =”Высший”|РазрешенаПродажа
Ложь | Ложь | Истина
Ложь | Истина | Ложь
Истина | Ложь | Ложь
Истина | Истина | Истина
2.Сравнил эту таблицу с таблицей описания XOR и получил:
<code>
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат НЕ XOR(ВидКлиента=”VIP”,СортТовара=”Высший”);
КонецФункции
</code>
3.Результат XOR Истина, если его операнды различны.
<code>
Функция XOR(А,Б)
Возврат А<>Б;
КонецФункции
</code>
Создал обработку и форму на ней. В модуле формы создал обработчик “ПриСозданииНаСервере”. Далее написал функцию РазрешенаПродажа с директивой компиляции &НаСервереБезКонтекста, т.к. из серверной процедуры можно сделать только серверный вызов и контекст формы нам не нужен. В теле функции воспользовался конструкцией Если ИначеЕсли. Может не так элегантно, но наглядно, и легко читается с листа. Результат: Нет, Да, Нет, Да.
Задание выполнено. Код в виде вложенных если.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));
Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Брак”));
Сообщить(РазрешенаПродажа(“VIP”, “Высший”));
КонецПроцедуры
Функция РазрешенаПродажа(_Клиент,Товар)
Если (_Клиент = “VIP”) И (Товар = “Высший”) Тогда
Возврат Истина;
ИначеЕсли НЕ(_Клиент = “VIP”) И НЕ(Товар = “Высший”) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции // РазрешенаПродажа()
&НаСервереПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”)); Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”)); Сообщить(РазрешенаПродажа(“VIP”, “Брак”)); Сообщить(РазрешенаПродажа(“VIP”, “Высший”)); КонецПроцедуры
Функция РазрешенаПродажа(_Клиент,Товар) Если (_Клиент = “VIP”) И (Товар = “Высший”) Тогда Возврат Истина; ИначеЕсли НЕ(_Клиент = “VIP”) И НЕ(Товар = “Высший”) Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли;
КонецФункции // РазрешенаПродажа()
Нет
Да
Нет
Да
Задание решено.Функция РазрешенаПродажа. Сначала использовал несколько условий Если..Иначе. А после, поразмыслив, получилось решение в одну строку.
дошло, что xor- это просто проверка двух булевых на равенство, что собственно kst красиво продемонстрировал
Выполнено.
<code>
Функция РазрешенаПродажа(Клиент,Сорт)
Возврат (Клиент = “VIP”) или (Сорт <> “Высший”);
КонецФункции // РазрешенаПродажа()
</code>
совсем не правильно
Андрей уже сообщил новую версию своего решения.
сделал так:
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
<code>
&НаКлиенте
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Если (ВидКлиента = “вип”) И (СортТовара = “высший”) Тогда
Возврат Истина;
ИначеЕсли (ВидКлиента <> “вип”) И (СортТовара <> “высший”) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
</code>
Понравилось как kst сделал, коротко и понятно
Тоже помучился с кавычками, Решил по простому
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Если (ВидКлиента=”Vip”) тогда
Если (СортТовара=”Высший”) тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Иначе //клиент не vip
Если (СортТовара<>”Высший”) тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
КонецФункции
Задание выполнено с XOR и без.
сначала вычислил две булевы переменные,
VIP и Высший
потом в если/иначе возвращаю истину или ложь
получил нет,да,нет,да
начал вспоминать что такое xor – получилось
Не(х)*y + x*не(у)
* и + соотв И и ИЛИ
те можно вернуть и одной строчкой
но мне через если больше нравиться
Моя выгрузка по ДЗ №1.
https://www.dropbox.com/s/ocvy4rc0q6ycdau/Homework_1.dt
Только вот я как то не совсем понял задания, поэтому сделал как понимаю…. Все-таки учусь. красиво и все реализовано.
XOR решается по нажатию кнопки (предварительно выбрав поставив галочки).
А “Продажа разрешена” при закрытие редактируемого клиента.
Выгрузку делать не требуется, достаточно текстового комментария.
Выполнила. Неожиданно…
Вставила в процедуру текст из ДЗ: Сообщить(РазрешенаПродажа(«Постоянный», «Высший»)); и т.д. Получила сообщение о синтаксической ош. Исправила кавычки на ” и получила OK.
>Исправила кавычки на »
Код хранится в формате Юникод, поэтому угловые кавычки и другие символы могут вставляться.
Но не могут компилироваться :)
Я имела ввиду форму кавычек (шрифт).
Исправила ‘треугольные’ кавычки на ‘запятые’ ” и получила модуль без ош.
Да, я вас понял.
1. Реализовал XOR и сверил выход с табличкой:
<code>
Функция XOR(Оп1,Оп2)
// Работаем как с ИЛИ, плюс исключим ситуацию когда оба операнда равны Истина,
// для этого добавим отрицание их логического произведения.
Возврат (Оп1 ИЛИ Оп2) И НЕ(Оп1 И Оп2)
КонецФункции
// Работаем как с ИЛИ, плюс исключим ситуацию когда оба операнда равны Истина,
// для этого добавим отрицание их логического произведения.
Возврат (Оп1 ИЛИ Оп2) И НЕ(Оп1 И Оп2) КонецФункции
</code>
2. РазрешенаПродажа:
<code>
Оп1 = ВидКлиента=”VIP”;
Оп2 = СортТовара=”Высший”;
Возврат НЕ XOR(Оп1, Оп2)
</code>
3. Выход по порядку: Нет, Да, Нет, Да
P.S. Не удобен редактор комментариев :(
Может убрать class=”right” у обрамляющего его тэга div?
>Может убрать class=»right» у обрамляющего его тэга div?
Можете подробнее расшифровать что неудобно, и что хотелось бы получить.
Я эту информацию передам вебмастеру.
Нужна возможность увеличения ширины поля комментария, а не только высоты.
Ок, передам разработчикам.
Если это пожелание – то ему место в соответствующей теме. Если это просто так – в следующий раз удаляем…
код 1с не выделяется не удобно, ширина страницы не изменяется не удобно!
Такие пожелания у нас записаны.
Но мы отошли от темы этой записи, здесь будем говорить только о ДЗ№1.
Есть специальная тема – “Пожелания”
ДЗ №1 выполнено :)
текст функции:
<code>
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат (ВидКлиента=”VIP”) <> (СортТовара=”Высший”);
КонецФункции
</code>
упс, немного ошибся при переписывании :)
должно быть так:
<code>
Функция РазрешенаПродажа(ВидКлиента,СортТовара)
Возврат (ВидКлиента=”VIP”) = (СортТовара=”Высший”);
КонецФункции
</code>
1 вариант: попробовал описать одной строкой условие получилось. результат Нет, Да, Нет, Да
2 вариант: определил функцию на сервере и описал поведение как “xor”, и использовал в функции РазрешенаПродажа. результат: Нет, Да, Нет, Да
Я не понял, нужно разработать две функции:
XOR и РазрешенаПродажа() ==> не понятно как XOR может использоваться в РазрешенаПродажа()?
Сообщения РазрешенаПродажа():
Постоянный – Высший: Нет
Непостоянный – Брак: Да
VIP – Брак: Нет
VIP – Высший: Да
// Строка(Истина) = “Да” в 8.2
Функция нужна одна – РазрешенаПродажа().
Она очень похожа на XOR (обратная ей функция), поэтому можно использовать XOR, а можно обойтись и без нее.
>Строка(Истина) = «Да» в 8.2
Это действительно так и совершенно не случайно. Дело в том, что пользователей пугает слово “Ложь”, они сразу подозревают подвох, обман :)
Поэтому были введено пользовательское представление типа Булево.
<code>
&НаСервере
Функция XOR(Операнд1,Операнд2)
Возврат НЕ(Операнд1 = Операнд2);
КонецФункции
</code>
Для того чтобы обязательно воспользоваться функцией XOR, как сформулировано задание создаем следующую функцию
<code>
&НаСервере
Функция РазрешенаПродажа(ВидКлиента, СортТовара)
Возврат XOR(ВидКлиента=”VIP”,СортТовара<>”Высший”);
КонецФункции
</code>
Создал внешнюю обработку. Создал форму обработки.
В модуле формы создал функцию, которая имитирует XOR: Возврат НЕ (Условие1 = Условие2);
Использовал свою функцию XOR в функции РазрешенаПродажа
Установил галочки “Установить режим разрешения отладки” и “Начать отладку при запуске”.
Проверил работу кода под отладчиком.
Результат:
Нет
Да
Нет
Да
Вопрос: а как сделать так, чтобы сообщение с результатом выводилось прикрепленным к окну обработки, а не к главному окну приложения?
Кстати, заметил один косяк с комментами: при вставке текста комментария из блокнота, в результате текст задваивается (что можно увидеть в прошлом моем посте). Второй раз на эти грабли наступаю (((
Мы знаем об этой особенности, сейчас изучаем возможные причины..
Для вывода сообщения в форме обработке достаточно выводить его после того, как форма уже открыта.
Например, в обработчике события ПриОткрытии, либо по нажатию на какую-нибудь кнопку.
Выполнено. Я так понимаю, нужно здесь написать получившуюся функцию? Если нет, то удалите ее из комментария.
Если ВидКлиента = “VIP” и СортТовара = “Высший” Тогда
Возврат Истина;
ИначеЕсли НЕ(ВидКлиента = “VIP”) и НЕ (СортТовара = “Высший”) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Да, функцию можно описать здесь.
Но в последующих заданиях не нужно в комментарии приводить весь код решения.
Лучше коротко его описать словами.
Задание выполнено. Поначалу сильно путаешься с логикой. Уже хотелось толмуды по булевой логике начинать изучать :) А потом пришло простое решение в одну строчку.