Автор Тема: Задача 1.4 стр.10  (Прочитано 76991 раз)

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

Matcoder

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: алекс
Задача 1.4 стр.10
« Ответ #45 : Январь 17, 2011, 05:57:01 pm »
Gyd,
 
Quote (Gyd)
А у меня разве не модификация происходит?:)

 До этих строк - нет.

Gyd

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Олег
Задача 1.4 стр.10
« Ответ #46 : Январь 20, 2011, 11:48:08 am »
Quote (Matcoder)
До этих строк - нет

 Почему нет? А если сначала условие соблюдается, например товара указанного в первой строке хватает по количеству, добавляются движения по регистру, а потом (по следующему товару) условие не соблюдается - товара не хватает, следовательно все те движения что мы добавили, нужно отменить. А все последующие движения (когда товара хватает) не делались. Для этого и ставится Движение.Остатки.Записывать = Ложь. Я не прав?


Matcoder

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: алекс
Задача 1.4 стр.10
« Ответ #47 : Январь 20, 2011, 05:44:50 pm »
Хорошо соглашусь, ты прав, изменения есть. Но все равно ведь выставлен флаг отказа от завершения транзакции поэтому смысла в этих строках нет.

Gyd

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Олег
Задача 1.4 стр.10
« Ответ #48 : Январь 21, 2011, 09:05:34 am »
Quote (Matcoder)
Но все равно ведь выставлен флаг отказа от завершения транзакции поэтому смысла в этих строках нет.

 я тоже думал зачем Чистов использует это, наверное своего рода небольшая оптимизация.

Gulf_Stream

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Радомский Виктор Сергеевич
Задача 1.4 стр.10
« Ответ #49 : Январь 23, 2011, 01:32:08 pm »
Моё решение,

Запрос для расходной накладной:

Code
ВЫБРАТЬ
  РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
  РасходнаяНакладнаяСписокНоменклатуры.Партия,
  СУММА(РасходнаяНакладнаяСписок Номенклатуры.Количество) КАК Количество,
  СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
 ПОМЕСТИТЬ Док
 ИЗ
  Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
 ГДЕ
  РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка

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

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
  Док.Номенклатура,
  Док.Партия,
  ВЫБОР
   КОГДА Док.Количество >= ОстаткиНоменклатурыОстатки.КоличествоОстаток
    ТОГДА ОстаткиНоменклатурыОстатки.КоличествоОстаток
   ИНАЧЕ Док.Количество
  КОНЕЦ КАК СписаноКоличество,
  ВЫБОР
   КОГДА Док.Количество >= ОстаткиНоменклатурыОстатки.КоличествоОстаток
    ТОГДА ОстаткиНоменклатурыОстатки.СуммаОстаток
   ИНАЧЕ ОстаткиНоменклатурыОстатки.СуммаОстаток * Док.Количество / ОстаткиНоменклатурыОстатки.КоличествоОстаток
  КОНЕЦ КАК СписанноСумма
 ПОМЕСТИТЬ РаспределеноПоПриоритетнымПартиям
 ИЗ
  Док КАК Док
   ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
     &МоментДокумента,
     (Номенклатура, Партия) В
      (ВЫБРАТЬ
       Док.Номенклатура,
       Док.Партия
      ИЗ
       Док)) КАК ОстаткиНоменклатурыОстатки
   ПО Док.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
    И Док.Партия = ОстаткиНоменклатурыОстатки.Партия
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
  ОстаткиНоменклатурыОстатки.Номенклатура,
  ОстаткиНоменклатурыОстатки.Партия,
  ОстаткиНоменклатурыОстатки.КоличествоОстаток,
  О статкиНоменклатурыОстатки.СуммаОстаток
 ПОМЕСТИТЬ СвободныеПартииРазвёрнутые
 ИЗ
  РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    &МоментДокумента,
    Номенклатура В
     (ВЫБРАТЬ
      Док.Номенклатура
     ИЗ
      Док)) КАК ОстаткиНоменклатурыОстатки

 ОБЪЕДИНИТЬ ВСЕ

 ВЫБРАТЬ
  РаспределеноПоПриоритетнымПартиям.Номенклатура,
  РаспределеноПоПриоритетнымПартиям.Партия,
  -РаспределеноПоПриоритетнымПа ртиям.СписаноКоличество,
  -РаспределеноПоПриоритетнымПартиям.СписанноСумма
 ИЗ
  РаспределеноПоПриоритетнымПартиям КАК РаспределеноПоПриоритетнымПартиям
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
  СвободныеПартииРазвёрнутые.Номенклатура,
  СвободныеПартииРазвёрнутые.Партия,
  СУММА(СвободныеПартииРазвёрнутые.КоличествоОстат ок) КАК КоличествоОстаток,
  СУММА(СвободныеПартииРазвёрнутые.СуммаОстаток) КАК СуммаОстаток
 ПОМЕСТИТЬ СвободныеПартии
 ИЗ
  СвободныеПартииРазвёрнутые КАК СвободныеПартииРазвёрнутые

 СГРУППИРОВАТЬ ПО
  СвободныеПартииРазвёрнутые.Номенклатура,
  СвободныеПартииРазвёрнутые.Партия
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
  СвободныеПартии.Номенклатура,
  СвободныеПартии.Партия,
  СвободныеПартии.КоличествоОстаток,
  СвободныеПартии.СуммаОстаток
 ПОМ ЕСТИТЬ СвободныеПартииБезНулей
 ИЗ
  СвободныеПартии КАК СвободныеПартии
 ГДЕ
  (СвободныеПартии.КоличествоОстаток > 0
    ИЛИ СвободныеПартии.СуммаОстаток > 0)
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
  Док.Номенклатура,
  СУММА(Док.Количество) КАК Количество,
  СУММА(Док.Сумма) КАК Сумма
 ПОМЕСТИТЬ СчернутаяТЧ
 ИЗ
  Док КАК Док

 СГРУППИРОВАТЬ ПО
  Док.Номенклатура
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
  СчернутаяТЧ.Номенклатура КАК Номенклатура,
  СчернутаяТЧ.Количество КАК Количество,
  СчернутаяТЧ.Сумма КАК Сумма,
  СвободныеПартии.КоличествоОстаток КАК КоличествоОстаток,
  СвободныеПартии.СуммаОстаток,
  СвободныеПартии.Партия КАК Партия,
  0 КАК Приоритет
 ИЗ
  СчернутаяТЧ КАК СчернутаяТЧ
   ЛЕВОЕ СОЕДИНЕНИЕ СвободныеПартииБезНулей КАК СвободныеПартии
   ПО СчернутаяТЧ.Номенклатура = СвободныеПартии.Номенклатура

 ОБЪЕДИНИТЬ ВСЕ

 ВЫБРАТЬ
  СчернутаяТЧ.Номенклатура,
  СчернутаяТЧ.Количество,
  СчернутаяТЧ.Сумма,
  РаспределеноПоПриоритетнымПартиям.СписаноКоличес тво,
  РаспределеноПоПриоритетнымПартиям.СписанноСумма,
  РаспределеноПоПриоритетнымПартиям.Партия,
  1
 ИЗ
  СчернутаяТЧ КАК СчернутаяТЧ
   ЛЕВОЕ СОЕДИНЕНИЕ РаспределеноПоПриоритетнымПартиям КАК РаспределеноПоПриоритетнымПартиям
   ПО СчернутаяТЧ.Номенклатура = РаспределеноПоПриоритетнымПартиям.Номенклатура

 УПОРЯДОЧИТЬ ПО
  Приоритет УБЫВ,
  Партия
 ИТОГИ
  МАКСИМУМ(Количество),
  МАКСИМУМ(Сумма),
  СУММА(КоличествоОстаток)
 ПО
  Номенклатура

Вложения:
_1.04.dt

old_guest

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Гость
Задача 1.4 стр.10
« Ответ #50 : Апрель 14, 2011, 10:56:18 pm »
Gulf_Stream, ошибка в запросе в том, что в таблице РаспределеноПоПартиям используется полное соединение

Идеальное решения с учётом примера из сборника у Heckfy в сообщении 28. Хотя, забыл установить сортировку в запросе.

Но по моему в сборнике очень усложняется решение получением в запросе таблиц 3.8 и 3.9, хотя они существуют только для того, чтобы получить в запросе остатки по партиям не указанным в документе. А для этого достаточно к таблице 3.7 присоединить таблицу со всеми остатками отфильтрованную по партиям не содержащимся в табличной части документа. Таким образом можно упростить запрос Heckfy раза в два.


Beans

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Beans
Задача 1.4 стр.10
« Ответ #51 : Апрель 15, 2011, 02:46:46 pm »
просмотрел решения - мне они показались или слишком сложными или не универсальными.

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


Вложения:
Beans_1.04.dt

SergTH000

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Сергей
Задача 1.4 стр.10
« Ответ #52 : Апрель 18, 2011, 06:35:46 am »
Matcoder, Gyd, Смысла в таких строках (Движения.....Записывать = ложь) нету и я не понимаю какая тут оптимизация..Записывать - это просто свойство, оно анализируется системой при записи набора записей регистра или при удачном завершении обработки проведения, причем тут кэш?

Наиболее оптимальным вариантом считаю писать не в начале процедуры обработки проведения Движения.....Записывать = Истина;, а в конце - Движения.....Записывать = НЕ Отказ; Тут не придерешься)


garden

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Наталья
Задача 1.4 стр.10
« Ответ #53 : Май 12, 2011, 09:32:14 pm »
Вот мой вариант, надеюсь кто-нибудь глянет. А то в своем глазу и соринки не видно.
Вложения:
1-04_garden.dt

DoctorRoza

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Алексей
Задача 1.4 стр.10
« Ответ #54 : Июнь 21, 2011, 11:26:10 pm »
Я тоже выложу свое решение .. Прошу посмотреть! smile

Добавлено (21.06.2011, 23:26)
---------------------------------------------
garden,
 Не пойму .. зачем использовать МенеджерВременныхТаблиц? 2 запроса .. да еще виртуальную таблицу ОстаткиИОбороты!? Сложное решение, неоптимальное ..


Вложения:
DoctorRoza_1_4.dt

kow1976

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Олег
Задача 1.4 стр.10
« Ответ #55 : Июль 12, 2011, 12:44:30 pm »
DoctorRoza,

 Ваш вариант решения не отрабатывает ситуация когда есть строчка с пустой партией в расходной накладной.
 Строка
 СтрЗаменить(Запрос.Текст, "УБЫВ", Упорядочивание)

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

 При решении получился довольно интересный запрос. .
 Запрос составил из четырех этапов:
 1. получить остатки по заданной номенклатуре и партии
 2. Получить излишки по заданной номенклатуре и партии
 3 .Получить остатки по заданной номенклатуре и партиям не входящим в документ
 4. Объединить три полученные временные таблицы и упорядочить по партиям, а также настроить итоги по номенклатуре.
 Все данные собрал в одном запросе, поэтому обход результата очень простой.
 Если кто то, найдет ошибки или просчеты, то спасибо.
Вложения:
1319902.dt

DoctorRoza

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Алексей
Задача 1.4 стр.10
« Ответ #56 : Июль 12, 2011, 09:09:40 pm »
Соглашусь, насчет пустой партии .. ))) .. надо прописывать запрет записи при пустом поле!
 //////////////////////////
 Иначе
 Сообщ = Новый СообщениеПользователю;
 Сообщ.Текст = "Не выбрана учетная политика, документ не будет проведен!";
 Сообщ.Сообщить();
 КонецЕсли; - документ создается и проводится .. тут лучше заранее Отказ = Истина
 /////////////////////
 Ох! Разрывы запроса .. и временные таблицы .. не дружу с ними! А так все норм!

SergTH000

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Сергей
Задача 1.4 стр.10
« Ответ #57 : Июль 12, 2011, 11:07:46 pm »
kow1976,
Quote
Строка
 СтрЗаменить(Запрос.Текст, "УБЫВ", Упорядочивание)

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


 Очень, очень медленно? На какие доли миллисекунд?
 Мое мнение: не надо доводить ситуацию до абсурда, наверное стрзаменить() работает несколько медленнее, но за счет этого повышается наглядность, упрощается отладка. В типовых решениях используются и тот и другой вариант. На экзамене использовал стрзаменить()..имхо обращайте внимание на более важные вещи..

kow1976

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Олег
Задача 1.4 стр.10
« Ответ #58 : Июль 13, 2011, 05:09:17 am »
На счет СтрЗаменить понял спасибо.

 DoctorRoza,

 Отсекать пустую партию по условию задачи нельзя.
 «В случае если товара по выбранной партии не хватает (или нет), то товар списывается в соответствии с текущей учетной политикой.»

alex_1980

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: Алексей
Задача 1.4 стр.10
« Ответ #59 : Июль 20, 2011, 02:34:14 pm »
Посмотрите, пожалуйста, мой вариант модуля расходной накладной. Пытался обойтись 2-х шаговым запросом и далее однократным проходом по результату запроса
 
Code

  Текст =  
  "ВЫБРАТЬ
  |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
  |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
  |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
  |    РасходнаяНакладнаяСписокНоменклатуры.Партия
  |ПОМЕСТИТЬ Таб
  |ИЗ
  |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
  |ГДЕ
  |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
  |
  |СГРУППИРОВАТЬ ПО
  |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
  |    РасходнаяНакладнаяСписокНоменклатуры.Партия
  |;
  |
  |////////////////////////////////////////////////////////////////////////////////
  |ВЫБРАТЬ
  |    ЕСТЬNULL(Таб.Количество, 0) КАК КоличествоДок,
  |    ЕСТЬNULL(Таб.Сумма, 0) КАК СуммаДок,
  |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОст,
  |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОст,
  |    ВЫБОР
  |  КОГДА ЕСТЬNULL(Таб.Количество, 0) < ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)
  |   ТОГДА ЕСТЬNULL(Таб.Количество, 0)
  |  ИНАЧЕ ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)
  |    КОНЕЦ КАК СписатьПоПартии,
  |    ЕСТЬNULL(Таб.Количество, 0) - ВЫБОР
  |  КОГДА ЕСТЬNULL(Таб.Количество, 0) < ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)
  |   ТОГДА ЕСТЬNULL(Таб.Количество, 0)
  |  ИНАЧЕ ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)
  |    КОНЕЦ КАК ПослеСписДок,
  |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) - ВЫБОР
  |  КОГДА ЕСТЬNULL(Таб.Количество, 0) < ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)
  |   ТОГДА ЕСТЬNULL(Таб.Количество, 0)
  |  ИНАЧЕ ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)
  |    КОНЕЦ КАК ПослеСписОст,
  |    ЕСТЬNULL(Таб.Номенклатура, ОстаткиНоменклатурыОстатки.Номенклатура) КАК Номенклатура,
  |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Партия, Таб.Партия) КАК Партия
  |ИЗ
  |    Таб КАК Таб
  |  ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
  |    &МоментВремени,
  |    Номенклатура В
  |     (ВЫБРАТЬ
  |      Таб.Номенклатура
  |     ИЗ
  |      Таб)) КАК ОстаткиНоменклатурыОстатки
  |  ПО Таб.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
  |   И Таб.Партия = ОстаткиНоменклатурыОстатки.Партия
  |
  |УПОРЯДОЧИТЬ ПО
  |    ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ
  |ИТОГИ
  |    СУММА(КоличествоДок),
  |    СУММА(СуммаДок),
  |    СУММА(ПослеСписДок),
  |    СУММА(ПослеСписОст)
  |ПО
  |    Номенклатура";
   
   
  Если МетодСписания = Перечисления.УчетнаяПолитика.ФИФО Тогда
   Текст = СтрЗаменить(Текст, "УБЫВ","ВОЗР");
  КонецЕсли;
   
  Запрос=  Новый Запрос;
  Запрос.Текст = Текст;
  Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
  Запрос.УстановитьПараметр("Ссылка",Ссылка);
  ВыбНом = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
  Пока ВыбНом.Следующий() Цикл
   //Проверим остаток
   Если ВыбНом.ПослеСписОст<ВыбНом.ПослеСписДок Тогда
    Сообщить("Не хватает остатка номенклатуры "+Строка(ВыбНом.Номенклатура)+". Не хватает "+Строка(ВыбНом.ПослеСписДок-ВыбНом.ПослеСписОст));
    Отказ = Истина;
   Иначе
    ОстатокДляСписания = ВыбНом.ПослеСписДок;
    Стоимость = 0;
    Выб = ВыбНом.Выбрать();
    Пока Выб.Следующий() Цикл
     Списать = Выб.СписатьПоПартии+Мин(ОстатокДляСписания,Выб.ПослеСписОст);
     Если Списать>0 Тогда
      Движение = Движения.ОстаткиНоменклатуры.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.Номенклатура = ВыбНом.Номенклатура;
      Движение.Партия = Выб.Партия;
      Движение.Количество = Списать;
      Если Списать = Выб.КоличествоОст Тогда      
       Движение.Сумма = Выб.СуммаОст;
      Иначе
       Если Выб.КоличествоОст <> 0 Тогда
        Движение.Сумма = Выб.СуммаОст/Выб.КоличествоОст*Списать;
       Иначе
        Движение.Сумма = 0;
       КонецЕсли;
      КонецЕсли;
      Стоимость=  Стоимость+Движение.Сумма;
     КонецЕсли;
     ОстатокДляСписания = ОстатокДляСписания-Списать;
    КонецЦикла;
    //Продажи
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = ВыбНом.Номенклатура;
    Движение.Количество = ВыбНом.КоличествоДок;
    Движение.Себестоимость = Стоимость;
    Движение.Продажа = ВыбНом.СуммаДок;
   КонецЕсли;
  КонецЦикла;