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

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

Demy

  • Пользователь
  • **
  • Сообщений: 21
  • ФИО: Demy
Задача 1.01
« Ответ #345 : Апрель 25, 2014, 09:01:31 am »
Цитата MorningStalker ()
Вот с этим я не согласен, реквизит "ЭтоУслуга" у справочника "Номенклатура" использовать гораздо удобнее, чем перечисление.
Удобней? Возможно. Но правильно ли? Задачи на экзамене все-таки имитируют реальные задачи, поэтому представим случай из реальности. Например, сделал ты так задачу, а заказчик через время подходит и говорит: "А сделай еще и материалы". И что? Будешь добавлять еще реквизит "ЭтоМатериал"? Но тогда возможен конфликт реквизитов, который необходимо решать программно. Плюс к этому все документы уже написаны без учета материалов. Это конечно относиться к проектированию базы, но возможно экзаменаторы обратят на это внимание.

MorningStalker

  • Пользователь
  • **
  • Сообщений: 10
  • ФИО: Дмитрий Корчагин
Задача 1.01
« Ответ #346 : Апрель 25, 2014, 09:33:42 am »
Цитата Demy ()
Удобней? Возможно. Но правильно ли? Задачи на экзамене все-таки имитируют реальные задачи, поэтому представим случай из реальности. Например, сделал ты так задачу, а заказчик через время подходит и говорит: "А сделай еще и материалы". И что? Будешь добавлять еще реквизит "ЭтоМатериал"? Но тогда возможен конфликт реквизитов, который необходимо решать программно. Плюс к этому все документы уже написаны без учета материалов. Это конечно относиться к проектированию базы, но возможно экзаменаторы обратят на это внимание.
Demy, ты сам создаешь себе ненужные трудности. В задаче не сказано, что механизм распознавания Товаров и Услуг должен быть реализован с помощью Перечисления - значит разработчик может делать так, как ему удобней. И с помощью реквизита это сделать быстрее и удобней, и время написания кода сокращается, и отборы делать проще.

 Вот тебе еще один "СЛУЧАЙ ИЗ РЕАЛЬНОСТИ": в типовых конфигурациях все манипуляции с ОбработкойПроведения сделаны с помощью передачи данных в ОбщиеМодули и выполнения там с ними всех манипуляций. Т.е. согласно твоей логике, так как построение решений реальных задач подразумевает именно такой подход, то и тебе нужно ОбработкуПроведения реализовывать таким же образом. Я даже затрудняюсь представить, насколько увеличатся затраты по времени при реализации таким способом 3х разделов билета.

 Тебе нужно настроить конфигурацию так, чтобы было реализовано каждое утверждение задачи, а как ты это сделаешь настройками или кодом, общими модулями или модулем документа, реквизитом ЭтоУслуга или Перечислением.ВидыНоменклатуры - это твое личное дело, ты разработчик, ты выбираешь способ реализации.

 Нужно уметь видеть главное, иначе на экзамене, из-за набора подобных мелочей, тебе банально не хватит времени на решение билета.


Demy

  • Пользователь
  • **
  • Сообщений: 21
  • ФИО: Demy
Задача 1.01
« Ответ #347 : Апрель 25, 2014, 10:56:40 am »
Цитата MorningStalker ()
Demy, ты сам создаешь себе ненужные трудности. В задаче не сказано, что механизм распознавания Товаров и Услуг должен быть реализован с помощью Перечисления - значит разработчик может делать так, как ему удобней. И с помощью реквизита это сделать быстрее и удобней, и время написания кода сокращается, и отборы делать проще.
Проще? Ну не знаю... Мне, например, без разницы сделать так или так. К тому же я не утверждал что мое мнение единственно правильное, но высказал сомнение что экзаменаторы оценят способ решения без перечисления.
Цитата MorningStalker ()
Вот тебе еще один "СЛУЧАЙ ИЗ РЕАЛЬНОСТИ": в типовых конфигурациях все манипуляции с ОбработкойПроведения сделаны с помощью передачи данных в ОбщиеМодули и выполнения там с ними всех манипуляций. Т.е. согласно твоей логике, так как построение решений реальных задач подразумевает именно такой подход, то и тебе нужно ОбработкуПроведения реализовывать таким же образом. Я даже затрудняюсь представить, насколько увеличатся затраты по времени при реализации таким способом 3х разделов билета.
А вот не надо путать теплое с мягким. Впадать здесь в крайности вовсе ни к чему.
Цитата MorningStalker ()
Нужно уметь видеть главное, иначе на экзамене, из-за набора подобных мелочей, тебе банально не хватит времени на решение билета.
А главное как раз и складывается из мелочей. Мы можем тут на мыло изойтись споря какое решение правильней, но сомневаюсь что это к чему-нибудь приведет. Поэтому я и хотел бы знать мнение экзаменатора.

otymko

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Oleg Tymko
Задача 1.01
« Ответ #348 : Апрель 25, 2014, 02:57:14 pm »
Цитата: Demy;34687
otymko, посмотрел твое решение:
 1. Зачем в справочнике "Номенклатура" использовать реквизит услуга, есть же "Перечисления.ВидыНоменклатуры"? (правда не знаю как к этому относятся на экзамене).
 2. В расходной накладной при получении партий в запросе нужно сортировать по моменту времени, а не по ссылке.
 3. В той же расходной накладной признак услуги лучше вытянуть в запросе, иначе платформа постоянно читает номенклатуру из базы.
 4. Так делать не обязательно:           
 Код
 Если КолНужно < ДанныеП.КолОст Тогда
                  КолС = КолНужно;
                  СуммаС = ДанныеП.СуммаОст * КолНужно / ДанныеП.КолОст;
              Иначе
                  КолС = ДанныеП.КолОст;
                  СуммаС = ДанныеП.СуммаОст;
              КонецЕсли;
 можно обойтись:
                
 Код
 КолС = Мин(КолНужно, ДанныеП.КолОст);
                  СуммаС = ДанныеП.СуммаОст * КолС / ДанныеП.КолОст;
 проблема копеек не возникнет.
 5. Не знаю как к этому относятся на экзамене, но в отчете по остаткам думаю выводить количество по партиям и в общих итогах не нужно.


 Спасибо что посмотрели. Во вложении переосмысленное решение.
 1. В задании не было сказано сделать решение вида номенклатуры через перечисление.(для решения можно использовать не только каркасную конфигурацию). Поэтому было решено сделать через булево.
 2. Исправлено. Через момент времени правильнее всего.
 3. Исправлено. Действительно (проверено через замер), если выбрать реквизиты в запросе - то цикл быстрее выполняется.
 4. Ну это не критическая ошибка. И так и так правильно.
 5. По поводу отчета можете пояснить? Не совсем понятно что именно не так.
Вложения:
otymko_1.1.dt

Demy

  • Пользователь
  • **
  • Сообщений: 21
  • ФИО: Demy
Задача 1.01
« Ответ #349 : Апрель 25, 2014, 04:39:14 pm »
Цитата otymko ()
1. В задании не было сказано сделать решение вида номенклатуры через перечисление.(для решения можно использовать не только каркасную конфигурацию). Поэтому было решено сделать через булево.
Я просто обратил на это внимание. В любом случае не помешает знать несколько подходов.
 
Цитата otymko ()
5. По поводу отчета можете пояснить? Не совсем понятно что именно не так.
Я не думаю что на экзамене на это будут обращать внимание, но тем не менее если посмотреть на отчет глазами пользователя (экзаменатор тоже так умеет :)), то его интересует в итоге только сумма товара на складе. А итоговая информация о количестве, например что на складе находится в общем 4-е единицы чего-то, пользователю ничего не скажет. Может не очень понятно, поэтому подкреплю картинкой:
 
 Также еще пара замечаний:
 1. Не помню как было в изначальной версии, может я это упустил, но зачем в расходной накладной делать вложенный запрос при выборке данных табличной части документа? Вполне можно обойтись так:
Код
ВЫБРАТЬ
     РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
     СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
     СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
 ПОМЕСТИТЬ втТаблица
 ИЗ
     Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
 ГДЕ
     РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Документ

 СГРУППИРОВАТЬ ПО
     РасходнаяНакладнаяСписокНоменклатуры.Номенклатура

 ИНДЕКСИРОВАТЬ ПО
     Номенклатура
2. Не помню где это читал или кто мне говорил, но лучше сделать чтобы из формы документа сразу можно было посмотреть его движения. Это будет удобней и для тебя на этапе отладки и для проверяющего.
Вложения:
s4491394.png

Demy

  • Пользователь
  • **
  • Сообщений: 21
  • ФИО: Demy
Задача 1.01
« Ответ #350 : Май 02, 2014, 11:36:32 pm »
Прилагаю мой вариант решения. Покритикуйте, будьте добры. Заранее благодарен.
Вложения:
Demy_1_01.dt

program1Cer

  • Новичок
  • *
  • Сообщений: 8
  • ФИО: Алексей
Задача 1.01
« Ответ #351 : Май 25, 2014, 04:56:03 pm »
Покритикуйте и мой вариант решения.
 Интересует мнения по поводу подсчета суммы документа.
 И проверка учетной политики на соответствие году. В задании делается акцент именно на том, что она действует год, значит ли это, что если есть данные по учетной политике за 2013, но нет за 2014, то необходимо выдать сообщение?

Вложения:
op_ex1.1.dt

Zhuravlik

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Уничкин Роман Александрович
Задача 1.01
« Ответ #352 : Май 27, 2014, 11:34:21 am »
Demy,
 1) Можно приходовать услуги
 2) Чистов советовал в качестве источника данных для блокировки использовать не табличную часть, а результат запроса к табличной части. В самом запросе соотв. использовать менеджер временных таблиц. Это позволяет избежать двух запросов к табличной части.
 3) При оперативном проведении дату итогов нужно использовать пустую (Дата(1,1,1))
 4) При расчете себестоимости для списания нельзя просто писать как у вас:
 Стоимость = КСписанию * ДетальнаяВыборка.СуммаОстатка / ДетальнаяВыборка.Остаток;

  - нужна "защита от копеек", 1С рекомендует делать это вот так:
 Если КСписанию = ДетальнаяВыборка.Остаток Тогда
     Стоимость = ДетальнаяВыборка.СуммаОстатка;
 Иначе
     Стоимость = КСписанию * ДетальнаяВыборка.СуммаОстатка / ДетальнаяВыборка.Остаток;
 КонецЕсли;

 5) Это мелочь конечно, но в задаче явно попутали имена переменных (стоимость и себестоимость). Должно быть: Списывается - себестоимость, приходуется в продажи - стоимость, у вас наоборот.
 зы. Чтобы проверять на услугу, лучше (проще) использовать реквизит типа булево "ЭтоУслуга", а не возиться с перечислением. Мелочь, а приятно =)

Добавлено (27.05.2014, 11:25)
---------------------------------------------
program1Cer, то-же, что и в предидущем сообщении. Услуги при оприходовании проверяете, но я все привык через запросы делать, не знаю, по моему правильно только так.
 Да, в корне конфигурации режим управления блокировкой - не выставлен в управляемый, это сразу минус.
 И то, что блокировки не используете в принципе - тоже не допустимо на экзамене, прочитайте требования.
 Я бы не стал проверять значение учетной политики четко для текущего года. Т.е. отказ от проведения - только если его нет в срезе последних (да и то, можно просто по-умолчанию ФИФО использовать, и об этом пользователю сообщать).
 В самих запросах 1С рекомендует избегать вложенных запросов, в пользу временных таблиц.

Добавлено (27.05.2014, 11:34)
---------------------------------------------
+ Не тратьте время на расчет сумм при изменении цены/количества. Вообще формы документов нужно создавать, если об этом явно сказано.
 Я удаляю просто неиспользуемые реквизиты "Цена" из табл. части  и "СуммаДокумента" - из шапки, если по задаче не надо, никто этого не требует.
 Вот модуль приходной накладной, как мне кажется самый идеальный вариант (Павел приводил такой пример где-то, потом говорил, что все-равно как оприходовать. Но мне этот вариант больше всех импонирует):
 Процедура ОбработкаПроведения(Отказ, Режим)
     
     Движения.ОстаткиНоменклатуры.Записывать = Истина;
     Движения.ОстаткиНоменклатуры.Очистить();
     
     Запрос = Новый Запрос;
     Запрос.Текст =
         "ВЫБРАТЬ
         |    ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура,
         |    СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
         |    СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
         |    &Дата КАК Период,
         |    &Ссылка КАК Партия
         |ИЗ
         |    Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
         |ГДЕ
         |    ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
         |    И ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура.ЭтоУслуга = ЛОЖЬ
         |
         |СГРУППИРОВАТЬ ПО
         |    ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура";
     
     Запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатуры);
     Запрос.УстановитьПараметр("Дата", Дата);
     Запрос.УстановитьПараметр("Ссылка", Ссылка);
     
     РезультатЗапроса = Запрос.Выполнить();
     
     Движения.ОстаткиНоменклатуры.Загрузить(РезультатЗапроса.Выгрузить());
     
 КонецПроцедуры


program1Cer

  • Новичок
  • *
  • Сообщений: 8
  • ФИО: Алексей
Задача 1.01
« Ответ #353 : Май 27, 2014, 02:33:56 pm »
2Zhuravlik, спасибо!

 Объясни, пожалуйста, почему никто не переключает Удаление движений в Удалять автоматически, а по-прежнему оставляют Удалять автоматически при отмене проведения?
« Последнее редактирование: Май 27, 2014, 02:43:56 pm от Алексей »

Zhuravlik

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Уничкин Роман Александрович
Задача 1.01
« Ответ #354 : Май 27, 2014, 02:52:19 pm »
program1Cer, это обьяснял Чистов, в одном из своих вебинаров. Если стоит "Удалять автоматически", это означает что перед началом проведения *каждый раз* происходит запись в базу пустого набора записей неявно, т.е. это делает платформа. А если "Удалять автоматически при отмене проведения" - то этого не происходит, и разработчик сам решает когда и в каких случаях нужно записывать. Т.е. следующий код:

 Если Режим = РежимПроведения.Оперативный Тогда
     Движения.Остатки.Записать();
 КонецЕсли;
 
 Имеет смысл только при "Удалять автоматически при отмене проведения", и экономит производительность в случае неоперативного проведения документа.

program1Cer

  • Новичок
  • *
  • Сообщений: 8
  • ФИО: Алексей
Задача 1.01
« Ответ #355 : Май 27, 2014, 04:06:25 pm »
2Zhuravlik, да я помню и там задавался примерно тот же вопрос, но там был ответ что режим "Удалять автоматически при отмене проведения" необходим если документ проводится несколько раз и нам для корректной работы необходимы уже сделанные движения (очень частая ситуация при расчете начислений), но в задачах по оперативному учету я такой необходимости не вижу.

 "Имеет смысл только при "Удалять автоматически при отмене проведения", и экономит производительность в случае неоперативного проведения документа."

 Каким образом увеличивается производительность, за счет отсутствия записи пустого набора записей?

 И об услугах, в примере из сборника задач в документе Приходная накладная при выборе номенклатуры стоит отбор по товару, таким образом услуги в ТЧ не попадают.
« Последнее редактирование: Май 27, 2014, 04:08:28 pm от Алексей »

Demy

  • Пользователь
  • **
  • Сообщений: 21
  • ФИО: Demy
Задача 1.01
« Ответ #356 : Май 27, 2014, 11:15:18 pm »
Цитата Zhuravlik ()
1) Можно приходовать услуги
Есть такое. Кстати в примере из сборника тоже можно приходовать услуги.
 
Цитата Zhuravlik ()
2) Чистов советовал в качестве источника данных для блокировки использовать не табличную часть, а результат запроса к табличной части. В самом запросе соотв. использовать менеджер временных таблиц. Это позволяет избежать двух запросов к табличной части.
Интересная идея, попробую. Спасибо.
Цитата Zhuravlik ()
3) При оперативном проведении дату итогов нужно использовать пустую (Дата(1,1,1))
Не понял... может не пустую дату, а "неопределено"? Но в задании об этом не сказано.
Цитата Zhuravlik ()
4) При расчете себестоимости для списания нельзя просто писать как у вас:Стоимость = КСписанию * ДетальнаяВыборка.СуммаОстатка / ДетальнаяВыборка.Остаток;

 - нужна "защита от копеек", 1С рекомендует делать это вот так:
 Если КСписанию = ДетальнаяВыборка.Остаток Тогда
 Стоимость = ДетальнаяВыборка.СуммаОстатка;
 Иначе
 Стоимость = КСписанию * ДетальнаяВыборка.СуммаОстатка / ДетальнаяВыборка.Остаток;
 КонецЕсли;
Слышал уже неоднократно. Но может приведет кто-то пример где остатки в ноль не выводятся при таком решении. А то все об этом говорят, но никто не знает почему это так. У меня уже даже начинает складываться впечатление что 1С - это секта, где просто говорят: "... веруй, брат, это истина...".
Цитата Zhuravlik ()
5) Это мелочь конечно, но в задаче явно попутали имена переменных (стоимость и себестоимость). Должно быть: Списывается - себестоимость, приходуется в продажи - стоимость, у вас наоборот.
Это тоже не понял. В регистре продаж есть и себестоимость, и стоимость продажи. Делал этот регистр по отчету "Продажи", указанному в задании.
Цитата Zhuravlik ()
зы. Чтобы проверять на услугу, лучше (проще) использовать реквизит типа булево "ЭтоУслуга", а не возиться с перечислением.
Ну не знаю, мне проще с перечислениями. Рефлекс!

 По поводу формирования движений запросом в приходной накладной имею следующие замечания:
 1. При увеличении количества документов запрос начинает выполняться медленнее (по крайней мере в файл-серверном варианте).
 2. Не считаю что при проведении нужно просто игнорировать услуги. Нужно чтобы программа хотя бы выругалась.

 P.S. Спасибо за замечания.

Zhuravlik

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Уничкин Роман Александрович
Задача 1.01
« Ответ #357 : Май 28, 2014, 09:29:39 am »
Цитата program1Cer ()
Каким образом увеличивается производительность, за счет отсутствия записи пустого набора записей
- да
 
Цитата program1Cer ()
таким образом услуги в ТЧ не попадают
- дело ваше =) Как по мне, - проще при проведении задать фильтр, чем городить огород на форме (это конечно в рамках экзамена).
« Последнее редактирование: Май 28, 2014, 09:30:22 am от Уничкин Роман Александрович »

korsal

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Королёв Сергей Александрович
Задача 1.01
« Ответ #358 : Май 28, 2014, 11:13:13 am »
Цитата Zhuravlik ()
Как по мне, - проще при проведении задать фильтр, чем городить огород на форме

 Умение писать запросы - это, конечно, хорошо. Но вот давать пользователю выбирать то, чего выбирать нельзя, а потом в запросе отбрасывать - это нехорошо. В табличной части строка с услугой вроде как есть, а ни в какой регистр не попадает. Так нельзя ! cool

Xsazar

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Сергей
Задача 1.01
« Ответ #359 : Июнь 06, 2014, 08:26:21 pm »
вы тут не актуальных билетов решения предлагаете, да? dry