Базовый курс. Домашнее задание №1

Первое задание по 0-му блоку базового курса.

Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 1. Развитие линейки «1С:Предприятие 8»
Глава 2. Базовые понятия
Глава 3. Установка платформы и конфигураций
Глава 4. Общие сведения о платформе
Глава 5. Список информационных баз
Глава 6. Пользовательский режим
Глава 7. Базовые приемы работы в конфигураторе
Глава 8. Средства разработчика
Глава 9. Объекты
Глава 10. База данных
Глава 11. Программный код
Глава 12. Примитивные типы данных

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 146 на “Базовый курс. Домашнее задание №1”

  1. Добрый день. Выполнено.
    (ВК = “ВИП” И СТ = “Высший”)  Или Не (ВК = “ВИП” Или СТ = “Высший”);

  2. Задание выполнил (правда до конца уроки еще не прошел, уж больно интересно было).
    <code> Функция РазрешенаПродажа(ВидКлиента, СортТовара)    
    Результат1 = ВидКлиента = “VIP”;
    Результат2 = СортТовара = “Высший”;             
    Возврат ?((Результат1 + Результат2)=1, Ложь, Истина)    
    КонецФункции </code>
    Вариантов много, но более короткого не придумал. Хотя можно было не вычислять промежуточные значения сравнения, а поместить все в одни оператор, хотя так более наглядно.

    • Только сейчас понял. Можно не использовать оператор ?( , , ,) вообще, а сделать так.
      <code> Функция РазрешенаПродажа(ВидКлиента, СортТовара)    
      Возврат ((ВидКлиента = “VIP”) + (СортТовара = “Высший”))<>1;
      КонецФункции </code>

  3. TZvorygina 20.01.2011 в 11:35

    Порядок решения:
    Создала функцию – аналог XOR, которая возвращает Истину по условию
    ( А И НЕ Б ИЛИ НЕ А И Б ).
    В переменную А записываю значение вспомогательной функции, которая истинна, если передано значение “VIP”.
    В переменную Б записываю значение другой вспомогательной функции, которая истинна, если передано значение “Высший”.
    В функции РазрешенаПродажа вызываю функцию-аналог XOR и инвертирую ее значение.

  4. Сделано.  Сначала написал по простому

    Функция РазрешенаПродажа(ВидКлиента, СортТовара)
    Если ВидКлиента=”VIP” И СортТовара = “Высший” Тогда Возврат Истина;
    ИначеЕсли ВидКлиента<>”VIP” И СортТовара<>”Высший” Тогда Возврат Истина;
    Иначе Возврат Ложь;
    КонецЕсли;
    КонецФункции

    потом сократилось до одной строки.

  5. Выполнила так:
    <code>
    Возврат(Контрагент=”VIP” и Сорт=”Высший”) или не (Контрагент=”VIP” или Сорт=”Высший”);
    </code>
     

  6. Домашнее задание выполнено.
    Последовательность решения:
    1. Создаем внешнюю обработку.
    2. Создаем форму обработки.
    3. В модуле формы создаем обработчик события “ПриСозданииНаСервере”, а также функцию “РазрешенаПродажа” с директивой компиляции “&НаСервере”.
    4. Алгоритм функции “РазрешенаПродажа”:
    Если (VIP Клиент И Сорт Высший) ИЛИ
                (НЕ VIP Клиент И НЕ Сорт Высший) Тогда Возврат Истина
    Иначе Возврат Ложь
    5. В обработчике “ПриСозданииНаСервере” с помощью процедуры “Сообщить” проверяем работу функции “РазрешенаПродажа” согласно входным данным, указанным в тексте задания.
    6. Запускаем конфигурацию в пользовательском режиме, открываем созданную обработку и в окне “Сообщения” видим результат: Нет, Да, Нет, Да

  7. ДЗ выполнено
    <code>
    Если ВидКлиента = “VIP” И СортТовара = “Высший” ИЛИ 
    НЕ (ВидКлиента = “VIP”) И НЕ (СортТовара = “Высший”) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    </code>

  8. Давыдяк Сергей 20.01.2011 в 06:30

    Задание выполнено.
    <code>
    &НаСервереБезКонтекста
    Функция РазрешенаПродажа(ВидКлиента, СортТовара)
    Если ((ВидКлиента = “VIP”) и (СортТовара = “Высший”)) или ((ВидКлиента <> “VIP”) и (СортТовара <> “Высший”)) Тогда
    Возврат Истина
    Иначе
    Возврат Ложь
    КонецЕсли;
    КонецФункции

    </code>
    Идею “&НаСервереБезКонтекста” позаимствовал у одного из участников, пока без особого понимания процесса, думаю так правильнее.

  9. Задание выполнено.  Спасибо за интересное первое ДЗ. Ожидал чего-нибудь более тривиального. Для себя вспомнил самое на мой взгляд простое словесное описание исключающего или: “xor для двух переменных отвечает на вопрос “различны ли значения переменных”. “фича” с кавычками тоже улыбнула.

  10. Антон 20.01.2011 в 00:36

    Задание сделал. XOR реализовал так:
    возврат Число(ВидКлиента = “VIP”) + Число(НЕ (СортТовара = “Высший”)) = 1;

    • Антон 20.01.2011 в 00:49

      Без явного преобразования к числу тоже работает

      <code>
      возврат (ВидКлиента = “VIP”) + (НЕ (СортТовара = “Высший”)) = 1;
      возврат (ВидКлиента = “VIP”) + (НЕ (СортТовара = “Высший”)) = 1;
      </code>

      • Антон 20.01.2011 в 01:09

        или так
        <code>
        возврат (ВидКлиента = “VIP”) <> (НЕ (СортТовара = “Высший”))
        </code>

  11. Задание выполнено. kst красава
    <code>

    &НаСервереБезКонтекста
    Функция РазрешенаПродажа(ВидКлиента, СортТовара)

    а = ВидКлиента = “VIP”;
    б = СортТовара = “Высший”;

    Возврат (а И б) Или (Не а И Не б);

    КонецФункции
    &НаСервереБезКонтекста
    Функция РазрешенаПродажа(ВидКлиента, СортТовара)
    а = ВидКлиента = “VIP”;
    б = СортТовара = “Высший”;
    Возврат (а И б) Или (Не а И Не б);
    КонецФункции
    </code>

  12. Задание выполнено. Сделала все в одной внешней обработке.
    1)  определила два булевских реквизита на форме и кнопку6 на клиенте выполнялось сообщение, на сервере вычислялась функция НЕИЛИ(Опр1, Опр2). При условии: Булево(Опр1)=Булево(Опр2) возвращало истину. Использование приведение типа к булеву несколько расширяет типы операндов, правда не на много.
    2) в этой же обработке определила функцию РазрешенаПродажа и поставила сообщения как было указано. В условии использовала ту самую исключающую ИЛИ
    НЕ НЕИЛИ(ВидКлиента = “VIP”, СортТовара = “Высший”)
    И все получилось.

    • Посмотрев комментарии ниже, поняла что сглупила с певым пунктом

  13. Выполнено, но получившаяся функция только имитирует XOR. В комментарии собственно XOR.
    <code>
    Функция XOR(Булево1, Булево2)
     
     Возврат Булево((Число(Булево1)+Число(Булево2))%2);
     
    КонецФункции
    </code>

  14. Задание выполнено.
    Созданы
    Справочник.Товары
    Поле ВысшийСорт – Булево
    Справочник.Клиент
    Поле VIP – Булево
    Документ.Расход
    В табличной форме товары
    При записи документа проверка табличной части
    <code>
    Процедура Передзаписью(Отказ,РежимЗаписи ,режимПроведения)
    Для Каждого ТекущаяСтрока Из Табличнаячасть Цикл
    /// Сравниваем реквизит клиента и реквизит товара в текущей строке цикла, если хоть один товар из списка не совпадает-  закрываем возможность сохранения и выдаем ссылку пользователю на ошибку
     
    </code>
     
    Единственный вопрос, можно ли не выводить номер строки методом Сообщить(), а привязать Сообщение.Поле к строке с ошибкой?

    • >Единственный вопрос, можно ли не выводить номер строки методом Сообщить(), а привязать Сообщение.Поле к строке с ошибкой?
      Да, конечно можно.

      Вы немного забегаете в материал первого блока.
      Необходимо использовать тип данных СообщениеПользователю, заполнить свойство Поле и использовать метода УстановитьДанные().
      Пример есть в синтакс-помощнике.

      • я так и не смог понять как это можно реализовать в многострочной табличной части.
        в итоге сделал проверку на соответствие не при сохранении а при подборе товара, что более правильно.

        • Полагаю, что вопросы должны сняться когда мы будем выводить такие диагностические сообщения об ошибках (во втором блоке).
          Если “непонятности” останутся – welcome в мастер-группу.

  15. Решено.

  16. Собственно сама функция не проблемна: обычная строгаю дизъюнкция из бинарки a<>b
    соответственно
    <code>Возврат ((ВидКлиента=”VIP”)<>(СортТовара=”Высший”));</code>
    Гораздо больше проблем вызвала попытка схалтурить и копипастой вставить код на “Сообщить” из текста задания, пока не догадался кавычки поправить) Потом уже в комментариях здесь увидел, что я не один такой.

  17. Переделал задание:
    <code>
    Функция РазрешенаПродажа(Клиент,Сорт)
    Возврат ((Клиент = “VIP”) и (Сорт = “Высший”)) или ((Клиент <> “VIP”) и (Сорт <> “Высший”));
    КонецФункции
    </code>
    Результат:
    Нет
    Да
    Нет
    Да

  18. Фархад 19.01.2011 в 20:38

    Функция РазрешенаПродажа(ВидКлиента, СортТовара)

    Если ВидКлиента = “VIP” И СортТовара = “Высший” Тогда
    Возврат Истина;
    ИначеЕсли ВидКлиента = “Должник” ИЛИ СортТовара = “Высший” ИЛИ ВидКлиента = “VIP” Тогда
    Возврат Ложь;
    ИначеЕсли ВидКлиента = “Старый знакомый” И СортТовара = “Первый сорт” Тогда
    Возврат Истина;
    Иначе
    Возврат Истина;
    КонецЕсли;

    КонецФункции // РазрешенаПродажа()

    • Фархад 20.01.2011 в 12:14

      из кода можно исключить этот часть:
      ИначеЕсли ВидКлиента = «Старый знакомый» И СортТовара = «Первый сорт» Тогда
      Возврат Истина;

  19. Дмитрий 19.01.2011 в 19:50

    1.Сначала набросал таблицу для функции РазрешенаПродажа:
    Клиент=”VIP” |Сорт =”Высший”|РазрешенаПродажа
    Ложь                   |  Ложь                    |  Истина
    Ложь                   |  Истина                |  Ложь
    Истина               |  Ложь                    |  Ложь
    Истина               |  Истина                |  Истина
    2.Сравнил эту таблицу с таблицей описания XOR и получил:
    <code>
    Функция РазрешенаПродажа(ВидКлиента,СортТовара)
    Возврат НЕ XOR(ВидКлиента=”VIP”,СортТовара=”Высший”);
    КонецФункции
    </code>
    3.Результат XOR Истина, если его операнды различны.
    <code>
    Функция XOR(А,Б)
    Возврат А<>Б;
    КонецФункции
    </code>

  20. Создал обработку и форму на ней. В модуле формы создал обработчик “ПриСозданииНаСервере”. Далее написал функцию РазрешенаПродажа с директивой компиляции &НаСервереБезКонтекста, т.к. из серверной процедуры можно сделать только серверный вызов и контекст формы нам не нужен. В теле функции воспользовался конструкцией Если ИначеЕсли. Может не так элегантно, но наглядно, и легко читается с листа. Результат: Нет, Да, Нет, Да.

  21. Задание выполнено.  Код в виде вложенных если.

  22. &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));
    Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”));
    Сообщить(РазрешенаПродажа(“VIP”, “Брак”));
    Сообщить(РазрешенаПродажа(“VIP”, “Высший”));

    КонецПроцедуры
    Функция РазрешенаПродажа(_Клиент,Товар)

    Если (_Клиент = “VIP”) И (Товар = “Высший”) Тогда
    Возврат Истина;
    ИначеЕсли НЕ(_Клиент = “VIP”) И НЕ(Товар = “Высший”) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции // РазрешенаПродажа()
    &НаСервереПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Сообщить(РазрешенаПродажа(“Постоянный”, “Высший”));  Сообщить(РазрешенаПродажа(“Непостоянный”, “Брак”));  Сообщить(РазрешенаПродажа(“VIP”, “Брак”));  Сообщить(РазрешенаПродажа(“VIP”, “Высший”)); КонецПроцедуры
    Функция РазрешенаПродажа(_Клиент,Товар) Если (_Клиент = “VIP”) И (Товар = “Высший”) Тогда Возврат Истина; ИначеЕсли НЕ(_Клиент = “VIP”) И НЕ(Товар = “Высший”) Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли;
    КонецФункции // РазрешенаПродажа()
    Нет
    Да
    Нет
    Да

  23. Задание решено.Функция РазрешенаПродажа. Сначала использовал несколько условий Если..Иначе. А после, поразмыслив, получилось решение в одну строку.

  24. дошло, что xor- это просто проверка двух булевых на равенство, что собственно kst красиво продемонстрировал

  25. Выполнено.
    <code>
    Функция РазрешенаПродажа(Клиент,Сорт)
    Возврат (Клиент = “VIP”) или (Сорт <> “Высший”);
    КонецФункции // РазрешенаПродажа()
    </code>

  26. сделал так:

    Функция РазрешенаПродажа(ВидКлиента, СортТовара)
     
    <code>
     &НаКлиенте
    Функция РазрешенаПродажа(ВидКлиента, СортТовара)
     
     Если (ВидКлиента = “вип”) И (СортТовара = “высший”) Тогда
      Возврат Истина;
     ИначеЕсли (ВидКлиента <> “вип”) И (СортТовара <> “высший”) Тогда
      Возврат Истина;
     Иначе
      Возврат Ложь; 
     КонецЕсли;
      
    КонецФункции
    </code>

  27. Понравилось как kst сделал, коротко и понятно

  28. Тоже помучился с кавычками, Решил по простому
    Функция РазрешенаПродажа(ВидКлиента,СортТовара)
     Если (ВидКлиента=”Vip”) тогда
      Если (СортТовара=”Высший”) тогда
       Возврат Истина;
      Иначе
       Возврат Ложь;
      КонецЕсли;
     Иначе //клиент не vip
      Если (СортТовара<>”Высший”) тогда
       Возврат Истина;
      Иначе
       Возврат Ложь;
      КонецЕсли;
     КонецЕсли; 
    КонецФункции

  29. Задание выполнено с XOR и без.

  30. сначала вычислил две булевы переменные,
    VIP и Высший
    потом в если/иначе возвращаю истину или ложь
    получил нет,да,нет,да
    начал вспоминать что такое xor – получилось
     Не(х)*y + x*не(у)
    * и + соотв И и ИЛИ
    те можно вернуть и одной строчкой
    но мне через если больше нравиться

  31. Гуляев Алексей 19.01.2011 в 15:21

    Моя выгрузка по ДЗ №1.
    https://www.dropbox.com/s/ocvy4rc0q6ycdau/Homework_1.dt

    • Гуляев Алексей 19.01.2011 в 15:24

      Только вот я как то не совсем понял задания, поэтому сделал как понимаю…. Все-таки учусь. красиво и все реализовано.
      XOR решается по нажатию кнопки (предварительно выбрав поставив галочки).
      А “Продажа разрешена” при закрытие редактируемого клиента.

    • Выгрузку делать не требуется, достаточно текстового комментария.

  32. Выполнила. Неожиданно…
    Вставила в процедуру текст из ДЗ: Сообщить(РазрешенаПродажа(«Постоянный», «Высший»)); и т.д.  Получила сообщение о синтаксической ош. Исправила кавычки на ” и получила OK.

    • >Исправила кавычки на »
      Код хранится в формате Юникод, поэтому угловые кавычки и другие символы могут вставляться.
      Но не могут компилироваться :)

    • Я имела ввиду форму кавычек (шрифт).
      Исправила ‘треугольные’ кавычки на ‘запятые’ ” и получила модуль без ош.

  33. 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.

    • Есть специальная тема – “Пожелания”

  34. ДЗ №1 выполнено :)
    текст функции:
    <code>
    Функция РазрешенаПродажа(ВидКлиента,СортТовара)
    Возврат (ВидКлиента=”VIP”) <> (СортТовара=”Высший”);
    КонецФункции
    </code>

    • упс, немного ошибся при переписывании :)
      должно быть так:
      <code>
      Функция РазрешенаПродажа(ВидКлиента,СортТовара)
      Возврат (ВидКлиента=”VIP”) = (СортТовара=”Высший”);
      КонецФункции
      </code>

  35. 1 вариант: попробовал описать одной строкой условие получилось. результат Нет, Да, Нет, Да
    2 вариант: определил функцию на сервере и описал поведение как “xor”, и использовал в функции РазрешенаПродажа. результат: Нет, Да, Нет, Да

  36. Я не понял, нужно разработать две функции:
    XOR и РазрешенаПродажа() ==> не понятно как XOR может использоваться в РазрешенаПродажа()?
    Сообщения РазрешенаПродажа():
    Постоянный – Высший: Нет
    Непостоянный – Брак: Да
    VIP – Брак: Нет
    VIP – Высший: Да
    // Строка(Истина) = “Да” в 8.2

    • Функция нужна одна – РазрешенаПродажа().
      Она очень похожа на XOR (обратная ей функция), поэтому можно использовать XOR, а можно обойтись и без нее.
      >Строка(Истина) = «Да» в 8.2
      Это действительно так и совершенно не случайно. Дело в том, что пользователей пугает слово “Ложь”, они сразу подозревают подвох, обман :)
      Поэтому были введено пользовательское представление типа Булево.

  37. <code>
    &НаСервере
    Функция XOR(Операнд1,Операнд2)
    Возврат НЕ(Операнд1 = Операнд2);
    КонецФункции
    </code>
    Для того чтобы обязательно воспользоваться функцией XOR, как сформулировано задание создаем следующую функцию
    <code>
    &НаСервере
    Функция РазрешенаПродажа(ВидКлиента, СортТовара)
    Возврат XOR(ВидКлиента=”VIP”,СортТовара<>”Высший”);
    КонецФункции

    </code>

  38. Виктор Вахненко 19.01.2011 в 13:26

    Создал внешнюю обработку. Создал форму обработки.
    В модуле формы создал функцию, которая имитирует XOR: Возврат НЕ (Условие1 = Условие2);
    Использовал свою функцию XOR в функции РазрешенаПродажа
    Установил галочки “Установить режим разрешения отладки” и “Начать отладку при запуске”.
    Проверил работу кода под отладчиком.
    Результат:
    Нет
    Да
    Нет
    Да
    Вопрос: а как сделать так, чтобы сообщение с результатом выводилось прикрепленным к окну обработки, а не к главному окну приложения?

    • Виктор Вахненко 19.01.2011 в 13:32

      Кстати, заметил один косяк с комментами: при вставке текста комментария из блокнота, в результате текст задваивается (что можно увидеть в прошлом моем посте). Второй раз на эти грабли наступаю (((

      • Мы знаем об этой особенности, сейчас изучаем возможные причины..

    • Для вывода сообщения в форме обработке достаточно выводить его после того, как форма уже открыта.
      Например, в обработчике события ПриОткрытии, либо по нажатию на какую-нибудь кнопку.

  39. Выполнено. Я так понимаю, нужно здесь написать получившуюся функцию? Если нет, то удалите ее из комментария.
    Если ВидКлиента = “VIP” и СортТовара = “Высший” Тогда
    Возврат Истина;
    ИначеЕсли НЕ(ВидКлиента = “VIP”) и НЕ (СортТовара = “Высший”) Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;

     

    • Да, функцию можно описать здесь.
      Но в последующих заданиях не нужно в комментарии приводить весь код решения.
      Лучше коротко его описать словами.

  40. Задание выполнено. Поначалу сильно путаешься с логикой. Уже хотелось толмуды по булевой логике начинать изучать :) А потом пришло простое решение в одну строчку.