Курс от Павла Белоусова!

Автор Тема: Задача 2.1  (Прочитано 15327 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

ВиталийЧебан

  • Проверенный
  • ***
  • Сообщений: 106
  • ФИО: Виталий Чебан
Re: Задача 2.1
« Ответ #45 : Август 03, 2015, 07:23:24 pm »
Виталий, спасибо за развернутый и быстрый ответ. То, что вы описали логично. Мне понятна первая связь на моём скрине, но вторая всё же так и осталось непонятна. Я понимаю что в таблице КурсИсх будут отобраны те записи которые КурсИсх.Валюта = &НоваяВалюта, но получается что таблица Цены и КурсИсх никак не связаны что ли...

Левое соединение выбирает все записи из левой таблицы, и для каждой записи из левой таблицы соединяет записи из правой, удовлетворяющие условию связи.
Предположим что в вашей таблице КурсИсх находятся 2 записи (по одной записи для каждой валюты, так как предполагаю что вы сделали СрезПоследних).

В левой таблице следующие записи:
Номенклатура / Цена
1. Молоко 10
2. Хлеб 5
3. Сахар 15

При левом соединении будут выбраны все записи из левой таблицы.
К каждой записи будут соединены записи из правой таблицы.
Если бы условие соединения было "ИСТИНА", то результат был бы следующим:

Номенклатура / Цена / Курс / Валюта
1. Молоко 10 58 USD
1. Молоко 10 66 EUR
2. Хлеб 5 58 USD
2. Хлеб 5 66 EUR
3. Сахар 15 58 USD
3. Сахар 15 66 EUR

Но так как задано условие соединения КурсИсх.Валюта = &НоваяВалюта, из правой таблицы выбирается только по 1 строке для каждой левой строки, и  результат выглядит так:
Номенклатура / Цена / Курс / Валюта
1. Молоко 10 58 USD
2. Хлеб 5 58 USD
3. Сахар 15 58 USD

Насчет того, что как будто не связаны, то в данном случае вы просто добавляете курс нужной валюты ко всем строкам, без какой либо связи.
Если бы этого условия не было, то все строки бы продублировались (как показал выше), с разными валютами.
А в случае, если бы в левой таблице было поле Валюта, то можно уже связать по Цена.Валюта = КурсИсх.Валюта, и тогда бы дубли исчезли, и выбрались бы нужные курсы соответствующие валюте из левой таблицы.

Номенклатура / Валюта левой таблицы / Цена / Курс / Валюта
1. У меня цена всегда в $, USD 10 58 USD
2. А у меня в евро,  EUR 5 66 EUR
3. У меня тоже, EUR 15 66 EUR
« Последнее редактирование: Август 03, 2015, 07:32:34 pm от ВиталийЧебан »

ВиталийЧебан

  • Проверенный
  • ***
  • Сообщений: 106
  • ФИО: Виталий Чебан
Re: Задача 2.1
« Ответ #46 : Август 03, 2015, 07:38:57 pm »
И еще, я вижу, в соседней теме вы решаете задачу 2.02, советую не тратить время, а решать только задачи из 10 актуальных билетов (в отличии от 2.02, например задача 2.03 в билетах есть).
Их решения нужно довести до автоматизма, я прорешал эти 10 билетов следующим образом: один раз полностью, и второй раз только задачи на изменение конфигурации (2.x).
Если будете сдавать удаленно, то учтите что присутствуют тормоза при работе с базой (не с конфигурированием, а именно при чтении/записи в БД), поэтому задачи которые я решал на своем ПК за 30 мин, на экзамене решил более чем за час.
Это вас не должно пугать (мол есть прайс лист, который я на своем ПК делаю за 2 часа, поэтому на экзамене могу не вписаться), просто задачи которые попадаются на экзамене (10 билетов) нужно довести до автоматизма. А там уже принцип "делай что должен и будь что будет".
« Последнее редактирование: Август 03, 2015, 07:40:41 pm от ВиталийЧебан »

alesema

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: Александр
Re: Задача 2.1
« Ответ #47 : Август 04, 2015, 01:56:37 pm »
А в случае, если бы в левой таблице было поле Валюта, то можно уже связать по Цена.Валюта = КурсИсх.Валюта, и тогда бы дубли исчезли, и выбрались бы нужные курсы соответствующие валюте из левой таблицы.

Виталий, я благодарю Вас за развёрнутый ответ. Всё становится по полочкам и ясно. Вы хорошо объясняете.
Насчет поля Валюта в левой таблице, то оно етсь. Тогда получается можно просто было связать жти две таблицы по валюте, а в параметрах таблицы КурсИсх есть параметр ВалютаНовая, который и выбирается на форме.

Спасибо, за совет насчет билетов и задач. Я прислушаюсь к нему. т.к. сдача намечена на 25 августа. сдавать буду удаленно. насчет компьютеров, тормозов, и неизвестно какой релиз будет стоять слышал.

ВиталийЧебан

  • Проверенный
  • ***
  • Сообщений: 106
  • ФИО: Виталий Чебан
Re: Задача 2.1
« Ответ #48 : Август 04, 2015, 07:59:41 pm »
Насчет поля Валюта в левой таблице, то оно етсь. Тогда получается можно просто было связать жти две таблицы по валюте, а в параметрах таблицы КурсИсх есть параметр ВалютаНовая, который и выбирается на форме.

Насчет поля Валюта в левой таблице, то оно етсь. Тогда получается можно просто было связать жти две таблицы по валюте, а в параметрах таблицы КурсИсх есть параметр ВалютаНовая, который и выбирается на форме.

Смотря что обозначает поле Валюта в левой таблице.
Если в правой таблице только курс &НоваяВалюта, а в левой таблице встречаются несколько валют, или даже одна, но отличная от &НоваяВалюта, то при соединении по валюте, соединения не произойдет, то есть курс будет NULL.

Некоторые возможные ситуации:

Пример 1.
Номенклатура / Вид цены / Валюта вида цены / Цена в валюте
1. Сахар / Экспортный/ EUR / 10
2. Сахар / Оптовый / РУБ / 10
3. Нефть / Экспортный / USD / 10

Задача состоит в том чтобы получить цены в рублях для всех этих позиций.
В таком случае в правой таблице у вас будет СрезПоследних без отбора (либо с отбором всех валют, встречающихся в левой таблице),
и соединение по полям Валюта вида цены = Валюта. Таким образом у вас в каждой строке будет курс нужной валюты.

Номенклатура / Вид цены / Валюта вида цены / Цена в валюте    |    Курс / Цена в рублях (Цена в валюте * курс)
1. Сахар / Экспортный/ EUR / 10 / 66 / 660
2. Сахар / Оптовый / РУБ / 10 / 1 / 10
3. Нефть / Экспортный / USD / 10 / 58 / 580



Пример 2.
Номенклатура / Вид цены / Валюта вида цены / Цена в валюте
1. Сахар / Экспортный/ EUR / 10
2. Сахар / Оптовый / РУБ / 10
3. Нефть / Экспортный / USD / 10

Задача состоит в том чтобы получить цены в выбранной валюте в форме отчета, для всех этих позиций.

В данном случае у нас будет 2 левых соединения, с двумя таблицами курсов.
Одна таблица курсов аналогична предыдущей: СрезПоследних без отбора (либо с отбором всех валют, встречающихся в левой таблице)
Другая: СрезПоследних с отбором по единственной валюте &ВалютаОтчета

С первой таблицей левое соединение по полям Валюта вида цены = Валюта. Таким образом у вас в каждой строке будет курс нужной валюты вида цены.
С второй таблицей левое соединение по условию ИСТИНА. Просто добавляем курс валюты отчета.

Цену в валюте отчета считает как Цена в валюте * Курс валюты вида цены / Курс валюты отчета

Валюта отчета: USD

Номенклатура / Вид цены / Валюта вида цены / Цена в валюте    |    Курс валюты вида цены    |   Курс валюты отчета / Цена в валюте отчета
1. Сахар / Экспортный/ EUR / 10 / 66 / 58 / 11,38
2. Сахар / Оптовый / РУБ / 10 / 1 / 58 / 0,17
3. Нефть / Экспортный / USD / 10 / 58 / 58 / 10

В примерах я не использовал Кратность, а в задачах нужно будет.



Я сдавал 30.07.2015, на удаленном компьютере были шаблоны 11.1.9.70 (самая свежая из доступных, я её взял), еще две 11.1.9.х и одна 11.1.2.х.
« Последнее редактирование: Август 04, 2015, 08:05:59 pm от ВиталийЧебан »

Qwerty1

  • Пользователь
  • **
  • Сообщений: 45
Re: Задача 2.1
« Ответ #49 : Август 08, 2015, 05:15:03 pm »
Здравствуйте, подскажите, в задании имеется в виду, что будет браться курс выбранной валюты на выбранную дату? и умножаться на количество?
Спасибо.
ПРОФ: Пл, БП, УТ, ЗУП
Спец-консультант: УТ, БП
Специалист: УТ

ВиталийЧебан

  • Проверенный
  • ***
  • Сообщений: 106
  • ФИО: Виталий Чебан
Re: Задача 2.1
« Ответ #50 : Август 08, 2015, 06:58:44 pm »
Здравствуйте, подскажите, в задании имеется в виду, что будет браться курс выбранной валюты на выбранную дату? и умножаться на количество?
Спасибо.

Последнюю таблицу сохраняешь в временную таблицу.
И в новом пакете соединяешь временную таблицу с двумя таблицами КурсыВалютСрезПоследних, в одной делаешь отбор по &ВалютаОтчета, в другой по всем валютам из временной таблицы.

В  СуммаНачальныйОстаток (а так же Приход, Расход и КонечныйОстаток) добавить   * КурсыВалютыВидаЦены.Курс * КурсыВалютыОтчета.Кратность / (КурсыВалютыОтчета.Курс * КурсыВалютыВидаЦены.Кратность)
Приложенный отчет под версию 11.1.10.167.  В версии которая была на удаленном экзамене (11.1.9.70), валюта не обновляется на форме при изменении вида цены, нужно было дополнительно еще находить реквизит формы ЗначениеПараметра_Значение_xxxxxxxxx, и ему присваивать новую валюту.

Если ПользовательскаяНастройкаКД.Параметр = Новый ПараметрКомпоновкиДанных("ВидЦены") Тогда
ВалютаОтчета = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(Значение, "ВалютаЦены");
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Отчет.КомпоновщикНастроек, Новый ПараметрКомпоновкиДанных("ВалютаОтчета"), ВалютаОтчета, Истина);

Для 11.1.9.70 тут нужно еще пару строк поиска реквизита и установки, сейчас нет под рукой.

КонецЕсли;
« Последнее редактирование: Август 09, 2015, 10:25:28 am от ВиталийЧебан »

Dimarik_1

  • Пользователь
  • **
  • Сообщений: 69
  • ФИО: Дмитрий
Re: Задача 2.1
« Ответ #51 : Октябрь 26, 2015, 01:36:40 pm »
Никак не могу реализовать следующий функционал: " чтобы после выбора типа цены в реквизит «Валюта», расположенный в диалоге отчета, по умолчанию проставлялась валюта, указанная для выбранного типа цен."
Для этого я скопировал общую форму отчета и в процедуре Подключаемый_ПолеВвода_ПриИзменении написал следующий код:
ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента);
Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ПользовательскаяНастройкаКД.Значение = Значение;

//> 26.10.2015
Если ТипЗнч(Значение) = Тип("СправочникСсылка.ВидыЦен") Тогда
Валюта = ПолучитьВалюту(Значение);

Валютаформы = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки, "Валюта");
Если Валютаформы <> Неопределено Тогда
Валютаформы.Значение = Валюта;
КонецЕсли;


КонецЕсли;

//<<26.10.2015
Иначе
ПользовательскаяНастройкаКД.ПравоеЗначение = Значение;
КонецЕсли;

Вот функция
//>> 26.10.2015
&НаСервере
Функция ПолучитьВалюту(ВидЦены)
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыЦен.ВалютаЦены КАК Валюта
|ИЗ
| Справочник.ВидыЦен КАК ВидыЦен
|ГДЕ
| ВидыЦен.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ВидЦены);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
// Вставить обработку выборки ВыборкаДетальныеЗаписи
Возврат ВыборкаДетальныеЗаписи.Валюта;
Иначе
Возврат Справочники.Валюты.ПустаяСсылка();
КонецЕсли;

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

КонецФункции
//<<26.10.2015
Когда шагаю отладчиком, у меня всё меняется как надо, а по факту - нет. Не могу понять. Или я не то меняю или же где-то дальше в другой процедуре изменения перезатируются.
Специалист по платформе 8.3
Специалист по БП
Специалист по УТ
Специалист-консультант по ЗУП

ress

  • Новичок
  • *
  • Сообщений: 1
Re: Задача 2.1
« Ответ #52 : Декабрь 16, 2015, 01:37:56 pm »
Если мы создаем свою форму отчета с обработкой КомпоновщикНастроекПользовательскиеНастройкиПриИзменении(), то исчезает возможность использовать быструю настройку, поэтому я извратился и использовал общую форму "ФормаОтчета" и внес изменения в процедуру
Подключаемый_ПолеВвода_ПриИзменении()


Если ТипЗнч(Значение) = Тип("СправочникСсылка.ВидыЦен") Тогда
ВалютаФормы = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,"НоваяВалюта");
Если ВалютаФормы <> Неопределено Тогда
ВалютаФормы.Значение = ПолучитьВалютыВидаЦены(Значение);
Для каждого Элемент ИЗ Элементы Цикл
Если Элемент.Заголовок  = "Новая валюта" тогда
ЭтаФорма["Параметр_Значение_"+Прав(Элемент.Имя,32)] = ВалютаФормы.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;


У меня вопрос, вот эта беготня по форме считается приемлемой на экзамене?
« Последнее редактирование: Декабрь 25, 2015, 05:12:37 pm от ress »
Спец 8.3
Спец-Конс УТ 11.1

ikar4ik

  • Пользователь
  • **
  • Сообщений: 12
  • ФИО: Антон
Re: Задача 2.1
« Ответ #53 : Март 15, 2017, 11:50:56 am »
Обновлю тему немного.

Конструкция в запросе отчета:
ВЫБОР
КОГДА &ВалютаОтчёта = ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
ТОГДА ВидыЦен.ВалютаЦены
ИНАЧЕ &ВалютаОтчёта
КОНЕЦ КАК ВалютаДляОтчёта

верная, но не до конца. Если мы очистим параметр ВалютаОтчета в режиме предприятия, то будет ПустаяСсылка, но в компоновщике значение этого параметра будет Неопределено, и данная конструкция не сработает правильно, и отчет выведет пустоту в поле Оценка.

Entropomorph

  • Новичок
  • *
  • Сообщений: 6
Re: Задача 2.1
« Ответ #54 : Апрель 11, 2018, 01:30:48 pm »
Добрый день всем. Попалась на экзамене эта задача. Делаю - не выходит, пишет при формировании отчета "некорректный текст запроса". В результате не сдал. Дома стал копаться и обнаружил, что этот отчет пишет то же самое всегда, даже в том случае, если конфигурация не снималась с поддержки. Конфигурацию взял ту же, что и на экзамене, 11.3.2.157. Платформа, правда, другая...
Сталкивался ли кто-нибудь с таким глюком? Можно ли его как-то обойти, может, я каких-то данных не ввел? А если это действительно глюк конфигурации, то что делать на экзамене, в таких случаях? Поделитесь, кто знает.

Ваша реклама могла бы быть тут...