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

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

1C_CoderVamp

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Василий
Задача 1.4 стр.10
« : Июль 20, 2010, 05:10:06 pm »
Интересная задачка оказалась))
 Собственно, вот решение. Хотелось-бы услышать комментарии по запросу в расходной накладной

Добавлено (18.07.2010, 22:24)
 ---------------------------------------------
 комментариев не густо.....

В общем, сам нашел КОСЯК, невнимательно прочитал задание, оказывается нужно выбирать партию в табличной части ))
 С этим возникли определенные проблемы, но зато был рожден запрос, который все эти проблемы решает!!!

Вот он сам:

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

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

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

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

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

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

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

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

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

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

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

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

ВЫБРАТЬ
 ЕСТЬNULL(ОстаткиПоОбязНоменклатуре.Партия, ЗНАЧЕНИЕ(Документ.ПриходнаяНакладная.ПустаяСсылка)),
 ЕСТЬNULL(ОстаткиПоОбязНоменклатуре.Партия.Дата, &ПустаяДата),
 КСписаниюПоОбязНоменклатуре.Номенклатура,
 ТабЧСвернутая.Количество,
 ЕСТЬNULL(ОстаткиПоОбязНоменклатуре.КоличествоОстаток, 0),
 ЕСТЬNULL(ОстаткиПоОбязНоменклатуре.СтоимостьОстаток, 0),
 2,
 ТабЧСвернутая.СуммаПродажи
 ИЗ
 (ВЫБРАТЬ
 ВыбранныеПартии.Номенклатура КАК Номенклатура,
 СУММА(ТабЧСвернутая.Количество - ВыбранныеПартии.СписаноКол) КАК ОстатокСписанияПоНоменклатуре
 ИЗ
 (ВЫБРАТЬ
 ОстаткиПоВыбраннымПартиям.Номенклатура КАК Номенклатура,
 СУММА(ОстаткиПоВыбраннымПартиям.СписаноКол) КАК СписаноКол
 ИЗ
 ОстаткиПоВыбраннымПартиям КАК ОстаткиПоВыбраннымПартиям

СГРУППИРОВАТЬ ПО
 ОстаткиПоВыбраннымПартиям.Номенклатура) КАК ВыбранныеПартии
 ЛЕВОЕ СОЕДИНЕНИЕ ТабЧСвернутая КАК ТабЧСвернутая
 ПО ВыбранныеПартии.Номенклатура = ТабЧСвернутая.Номенклатура
 ГДЕ
 ТабЧСвернутая.Номенклатура В
 (ВЫБРАТЬ РАЗЛИЧНЫЕ
 Т.Номенклатура
 ИЗ
 ОстаткиПоВыбраннымПартиям КАК Т)

СГРУППИРОВАТЬ ПО
 ВыбранныеПартии.Номенклатура) КАК КСписаниюПоОбязНоменклатуре
 ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
 РегОбщий.Партия КАК Партия,
 РегОбщий.Номенклатура КАК Номенклатура,
 СУММА(РегОбщий.КоличествоОстаток - ЕСТЬNULL(ОстаткиПоВыбраннымПартиям.СписаноКол, 0)) КАК КоличествоОстаток,
 СУММА(РегОбщий.СтоимостьОстаток - ЕСТЬNULL(ОстаткиПоВыбраннымПартиям.СписаноСум, 0)) КАК СтоимостьОстаток
 ИЗ
 РегОбщий КАК РегОбщий
 ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиПоВыбраннымПартиям КАК ОстаткиПоВыбраннымПартиям
 ПО РегОбщий.Партия = ОстаткиПоВыбраннымПартиям.Партия
 И РегОбщий.Номенклатура = ОстаткиПоВыбраннымПартиям.Номенклатура

СГРУППИРОВАТЬ ПО
 РегОбщий.Партия,
 РегОбщий.Номенклатура) КАК ОстаткиПоОбязНоменклатуре
 ПО КСписаниюПоОбязНоменклатуре.Номенклатура = ОстаткиПоОбязНоменклатуре.Номенклатура
 ЛЕВОЕ СОЕДИНЕНИЕ ТабЧСвернутая КАК ТабЧСвернутая
 ПО КСписаниюПоОбязНоменклатуре.Номенклатура = ТабЧСвернутая.Номенклатура

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

ВЫБРАТЬ
 ЕСТЬNULL(РегОбщий.Партия, ЗНАЧЕНИЕ(Документ.ПриходнаяНакладная.ПустаяСсылка)),
 ЕСТЬNULL(РегОбщий.Партия.Дата, &ПустаяДата),
 ТабЧ.Номенклатура,
 ТабЧ.Количество,
 ЕСТЬNULL(РегОбщий.КоличествоОстаток, 0),
 ЕСТЬNULL(РегОбщий.СтоимостьОстаток, 0),
 2,
 ТабЧ.СуммаПродажи
 ИЗ
 ТабЧ КАК ТабЧ
 ЛЕВОЕ СОЕДИНЕНИЕ РегОбщий КАК РегОбщий
 ПО ТабЧ.Номенклатура = РегОбщий.Номенклатура
 ГДЕ
 (НЕ ТабЧ.Номенклатура В
 (ВЫБРАТЬ РАЗЛИЧНЫЕ
 Т.Номенклатура
 ИЗ
 ОстаткиПоВыбраннымПартиям КАК Т))

УПОРЯДОЧИТЬ ПО
 Номенклатура,
 Сортировка,
 ПартияДата
 ИТОГИ
 МИНИМУМ(КСписанию),
 СУММА(КоличествоОстаток),
 МИНИМУМ(СуммаПродажи)
 ПО
 Номенкл атура
 Проблема в одном, на его создание у меня ушло часа 3, при этом мозг усох процентов на 20.... как теперь сдавать спеца не знаю...... (( шучу biggrin

Но, в самом деле, знающие люди подскажите в задачнике много таких геморных заданий??? (еще не было времени обстоятельно познакомится с оным)

Пы.Сы: Кому не влом, проверьте в консольке запросов, жду замечаний! Делал на одном дыхании, поэтому вполне возможно что что-то пропустил, позже сам еще раз просмотрю, возможно подправлю, но пока, все работает как надо))) cool

Пы.Пы.Сы. Добавил новую ДТшку, качать второй файл

Добавлено (20.07.2010, 17:10)
---------------------------------------------
Спять все что-ли? Где разнос? Где гневные комментарии о том, что все не так и что все не работает???

Хоть кто-нибудь.................... neutral


Вложения:
5344707.dt
1Cv8_.dt
« Последнее редактирование: Июль 19, 2010, 10:19:29 am от Василий »

Bepa

  • Модератор
  • Новичок
  • *****
  • Сообщений: 0
  • ФИО: Вера
Задача 1.4 стр.10
« Ответ #1 : Июль 20, 2010, 05:17:50 pm »
у меня старый сборник, по 8.1 апрельское издание.
 напиши в личку условие задачи, постараюсь посмотреть в ближайшее время


1C_CoderVamp

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Василий
Задача 1.4 стр.10
« Ответ #2 : Июль 20, 2010, 06:23:30 pm »
У этой задачи текст совпадает буква в букву))

Serros

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Сергей
Задача 1.4 стр.10
« Ответ #3 : Июль 20, 2010, 06:39:44 pm »
Не верный формат файла для загрузки ИБ...

1C_CoderVamp

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Василий
Задача 1.4 стр.10
« Ответ #4 : Июль 20, 2010, 06:44:32 pm »
Serros,
 Странно.... в 8.2 не загружается? может платформа старая... у меня 8.2.11.236

Serros

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Сергей
Задача 1.4 стр.10
« Ответ #5 : Июль 20, 2010, 08:00:14 pm »
8.2 бета

Добавлено (20.07.2010, 20:00)
---------------------------------------------
ДАТАВРЕМЯ(1,1,1,0,0,0) в запрос вместо параметра &ПустаяДата


Bepa

  • Модератор
  • Новичок
  • *****
  • Сообщений: 0
  • ФИО: Вера
Задача 1.4 стр.10
« Ответ #6 : Июль 20, 2010, 08:21:32 pm »
1C_CoderVamp, раз совпадает буква в букву, то...
 задачу не решала, но
 запрос плохой.
 очень.

Должно быть примерно так:
 

Code

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

  |;

  |ВЫБРАТЬ
  |    ДокТЧ.Номенклатура,
  |    ДокТЧ.Количество,
  |    ДокТЧ.Сумма,
  |    ДокТЧ.Партия,
  |    ЕСТЬNULL(Остатки.КоличествоОстаток,0) КАК КоличествоОстаток,
  |    Остатки.СтоимостьОстаток
  |ИЗ
  |    ДокТЧ КАК ДокТЧ
  |    ЛЕВОЕ СОЕДИНЕНИЕ
  |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени,
  |  (Номенклатура, Партия)
  |  В (ВЫБРАТЬ ДокТЧ.Номенклатура, ДокТЧ.Партия  
  |     ИЗ ДокТЧ КАК ДокТЧ) ) КАК Остатки
  |    ПО
  |    ДокТЧ.Номенклатура = Остатки.Номенклатура
  |  И
  |  ДокТЧ.Партия = Остатки.Партия
  |  
 

запрос не проверяла, попробуй нечто подобное


Bepa

  • Модератор
  • Новичок
  • *****
  • Сообщений: 0
  • ФИО: Вера
Задача 1.4 стр.10
« Ответ #7 : Июль 20, 2010, 08:26:47 pm »
наверное я что-то упустила.
 cool

Serros

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Сергей
Задача 1.4 стр.10
« Ответ #8 : Июль 20, 2010, 09:05:13 pm »
Quote (Bepa)
задачу не решала, но запрос плохой. очень.

 наверное таки упустила... smile запрос в первом посте работает.

Bepa

  • Модератор
  • Новичок
  • *****
  • Сообщений: 0
  • ФИО: Вера
Задача 1.4 стр.10
« Ответ #9 : Июль 21, 2010, 03:37:29 am »
Serros, дело не в том: работает или нет.
 Представь эту задачку на экзамене. Максимум час на нее. И посмотри запрос. Сколько времени на него уйдет?

1C_CoderVamp

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Василий
Задача 1.4 стр.10
« Ответ #10 : Июль 21, 2010, 10:42:40 am »
Bepa,
 
Quote
Представь эту задачку на экзамене. Максимум час на нее. И посмотри запрос. Сколько времени на него уйдет?

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

1) Сначала пакетами запросов выбираем данные, которые в будущем будем неоднократно использовать (хотя в принципе это можно не делать, но так будет быстрее)
 2) В последнем пакете разбиваем требуемые данные на три части и объединяем их:
 а) Здесь получаем остатки по номенклатуре, по которой точно указана партия (партии) в таб.части
 б) Здесь получаем остатки по этой-же номенклатуре, но с учетом ФИФО, ЛИФО, т.е. если остатков по выбранным партиям не хватило
 в) Ну а тут самое простое, выбираются остатки по всем прочим номенклатурам в обычном режиме...

Несомненный плюс этого запроса в том, что он показывает умение сдающего пользоваться возможностями запроса, да и вообще получение всех необходимых данных в одном запросе, еще и в удобном виде - это несомненный плюс!!

Хотя ты права, времени действительно мало, но, по сути, вся задача-то и сводится к одному этому запросу, думаю, что поняв его, можно будет воспроизвести его на экзамене минут за 30 - этого вполне достаточно, т.к. все остальное делается минут за 15-20, при должном умении)))

P.S. Если кому интересно или запрос непонятен, могу описать более подробно что и зачем, по пунктам )))

Serros,
 

Quote
ДАТАВРЕМЯ(1,1,1,0,0,0) в запрос вместо параметра &ПустаяДата

 Спс, учту

Всем спасибо за комменты, хотелось-бы услышать варианты упрощения запроса, а его можно упростить, я в этом уверен


Serros

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Сергей
Задача 1.4 стр.10
« Ответ #11 : Июль 21, 2010, 11:47:27 am »
Quote (Bepa)
Представь эту задачку на экзамене. Максимум час на нее. И посмотри запрос. Сколько времени на него уйдет?

 вся сложность связана с возможностью указания нескольких приоритетных партий в табчасти. Ваш запрос, приведенный
 выше, смотрит остатки по партиям, которые указаны в табчасти, а как быть с пустыми партиями?

Сначала нужно списать из приоритетных партий, потом по Фифо\Лифо (при этом тут могут быть эти же приоритетные партии), сложность и заключается в получении всех остатков с приоритетами одним запросом. Я бы тоже не вложился в указанное время.

« Последнее редактирование: Июль 21, 2010, 11:47:54 am от Сергей »

1C_CoderVamp

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Василий
Задача 1.4 стр.10
« Ответ #12 : Июль 21, 2010, 02:09:23 pm »
Serros,
 
Quote
Ваш запрос, приведенный
 выше, смотрит остатки по партиям, которые указаны в табчасти, а как быть с пустыми партиями?

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

Quote
Сначала нужно списать из приоритетных партий, потом по Фифо\Лифо (при этом тут могут быть эти же приоритетные партии), сложность и заключается в получении всех остатков с приоритетами одним запросом. Я бы тоже не вложился в указанное время.

Ну так запрос это и делает, в отличном виде, вы вообще его проверяли?

Добавлено (21.07.2010, 14:01)
---------------------------------------------
Там есть ДТ'шник, скачайте и поэкспериментируйте с расходной накладной, все считается как надо

Добавлено (21.07.2010, 14:09)
---------------------------------------------
З.Ы. На создание и проверку этого запроса ушло часа 4, так что не надо писать поверхностные комментарии - это неправильно:
 - если есть какое-то конкретное замечание - пишите его как замечание,
 - если есть непонимание - спрашивайте, я поясню

Теперь запрос есть и, на мой взгляд, он абсолютно правильный, работает на 100%, воспроизвести его на экзамене можно за 30 минут, т.к. когда я создавал этот запрос, то он писался на пустом месте, а это очень тяжело приходится думать о том, что получится в итоге и о том, что есть сейчас, и как вообще это заработает??? с готовым решением проще - посмотрел понял суть, запомнил, забыл открыл за день до экзамена конфигуратор, посмотрел запрос, быстро все вспомнил и все ОК

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


old_guest

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Гость
Задача 1.4 стр.10
« Ответ #13 : Июль 21, 2010, 05:02:02 pm »
1C_CoderVamp, прочитал твое сообщение в личке. Запрос посмотрел. Громоздко. Но если работает, то имеет место быть.
 С советами лезть не буду, чтобы не сбивать с истинного пути, т.к. сдавал платформу год назад и наверняка какие-то нюансы подзабыл.
 Поэтому напишу в общем.
 Когда я готовился, решение задачи по ОУ состояло как бы из двух блоков:
 1. Подготовительный. Это запрос. Запросом вытягиваем всю необходимую информацию в выборку, при этом обязательно группируем (не следует понимать буквально) по разрезам (номенклатура, партия или склад) таблицу данных. Под "группируем" имею ввиду тег ИТОГИ ПО, а не СГРУППИРОВАТЬ. Если по партиям есть лифо/фифо, то обязательно нужна соответствующая сортировка по (периоду) партии.
 2. Расчетный. Это обход выборки, но обход надо делать по группировкам с иерархией. Таким путем можно проверить достаточность общего количества товара вообще, на конкретном складе или же по конкретной партии. Партии выбираются в соответствии с сортировкой по фифо/лифо и списываются последовательно.
 Таким образом запрос не очень громоздок (а на это преподаватели обращают внимание, если настроение плохое, то могут и подколоть), в тоже время все проверки и списание абсолютно прозрачны.
 Вот идеология решения (не этой задачи) на примере:
 
Code
    УчетнаяПолитика = РегистрыСведений.УчетнаяПолитика.СрезПоследних(МоментВремени())[0].МетодСписания;
  Если УчетнаяПолитика = перечисления.УчетнаяПолитика.ФИФО тогда
   ПорядокСортировки = "ВОЗР";
  иначе
   ПорядокСортировки = "УБЫВ";
  КонецЕсли;
   
  Запрос = Новый Запрос;
  ТекстЗапроса = "
  |ВЫБРАТЬ
  |  РасходнаяНакладнаяТовары.Номенклатура,
  |  СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество,
  |  СУММА(РасходнаяНакладнаяТовары.Сумма) КАК Сумма
  |    ПОМЕСТИТЬ ДокТЧ
  |    ИЗ
  |  Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
  |    ГДЕ
  |  РасходнаяНакладнаяТовары.Ссылка = &Ссылка
  |  И РасходнаяНакладнаяТовары.Номенклатура.Услуга = ЛОЖЬ
  |  
  |    СГРУППИРОВАТЬ ПО
  |  РасходнаяНакладнаяТовары.Номенклатура
  |
  |;
  |  
  |    ВЫБРАТЬ
  |  ДокТЧ.Номенклатура КАК Номенклатура,
  |  ЕСТЬNULL(Себестоимость.Партия, 0) КАК Партия,
  |  ДокТЧ.Количество КАК КолвоДок,
  |  ДокТЧ.Сумма КАК СуммаДок,
  |  ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КолвоОстаток,
  |  ЕСТЬNULL(Себестоимость.КоличествоОстаток, 0) КАК КолвоСС,
  |  ЕСТЬNULL(Себестоимость.СтоимостьОстаток, 0) КАК СС
  |    ИЗ
  |  ДокТЧ КАК ДокТЧ
  |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени,Склад = &Склад И Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ    Док.Номенклатура ИЗ ДокТЧ КАК Док)) КАК Остатки
  |    ПО ДокТЧ.Номенклатура = Остатки.Номенклатура
  |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Остатки(&МоментВремени,Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ Док.Номенклатура ИЗ ДокТЧ КАК Док)) КАК Себестоимость
  |    ПО ДокТЧ.Номенклатура = Себестоимость.Номенклатура
  |  
  |    УПОРЯДОЧИТЬ ПО
  |  Партия "+ПорядокСортировки+"
  |    ИТОГИ
  |  МИНИМУМ(КолвоДок),
  |  МИНИМУМ(СуммаДок),
  |  СУММА(КолвоОстаток),
  |  СУММА(КолвоСС),
  |  СУММА(СС )
  |    ПО
  |  Номенклатура";
   
  Запрос.Текст = ТекстЗапроса;
  Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
  Запрос.УстановитьПараметр("Ссылка",Ссылка);
  Запрос.УстановитьПараметр("Склад",Склад);
  РезультатЗапроса = Запрос.Выполнить();  
  Выборка1 = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
  Пока Выборка1.Следующий() Цикл
   Если Выборка1.КолвоДок>Выборка1.КолвоОстаток тогда
    Сообщить("Не хвататает "+Выборка1.Номенклатура+" в количестве "+(Выборка1.КолвоДок-Выборка1.КолвоОстаток));
    отказ = истина;
   КонецЕсли;
  КонецЦикла;
   
  Если отказ тогда
   возврат;
  КонецЕсли;
   
  Выборка1.Сбросить();
  Пока Выборка1.Следующий() Цикл
    
   нужноСписать = Выборка1.КолвоДок;
   //Списываем остатки
   Движение = Движения.ОстаткиНоменклатуры.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
   Движение.Период = Дата;
   Движение.Номенклатура = Выборка1.Номенклатура;
   Движение.Склад = склад;
   Движение.Количество = нужноСписать;
    
   Выборка2=Выборка1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока Выборка2.Следующий() И нужноСписать<>0 Цикл
    можноСписать = мин(нужноСписать,Выборка2.КолвоСС);
    //Списываем себестоимость
    Движение = Движения.Себестоимость.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = Выборка2.Номенклатура;
    Движение.Партия = Выборка2.Партия;
    Движение.Количество = можноСписать;
    Если Выборка2.КолвоСС<>0 тогда
     Движение.Стоимость = можноСписать * Выборка2.СС / Выборка2.КолвоСС;
    КонецЕсли;
     
    нужноСписать = нужноСписать - можноСписать;
   КонецЦикла;
  КонецЦикла;
   
  Для Каждого ТекСтрокаТовары Из Товары Цикл
   // регистр Продажи  
   Движение = Движения.Продажи.Добавить();
   Движение.Период = Дата;
   Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
   Движение.Количество = ТекСтрокаТовары.Количество;
   Движение.Стоимость = ТекСтрокаТовары.Сумма;
  КонецЦикла;
 

1C_CoderVamp

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Василий
Задача 1.4 стр.10
« Ответ #14 : Июль 21, 2010, 05:46:18 pm »
Nike,
 Работает )) Но я не думаю, что составители заданий подразумевали, что в решении будет использоваться запрос на 3-4 страницы))) С другой стороны, по-другому, не значит плохо...

Quote
Таким образом запрос не очень громоздок (а на это преподаватели обращают внимание, если настроение плохое, то могут и подколоть), в тоже время все проверки и списание абсолютно прозрачны.

Да, чем больше я над ним думаю, тем больше понимаю, что проще будет сделать два запроса и промежуточную запись в регистры, но это не совсем верно, особенно для 8.2, где каждое лишнее обращение к серверу расценивается как попытка к бегству и карается расстрелом на месте....