Имя: Пароль:
1C
1С v8
Помогите, пожалуйста, решить тестовое задание.
0 lou-bega
 
03.05.18
09:22
Документ ПоступлениеТоваров при проведении делает движения по 2 регистрам:
- приход по регистру накопления ТоварыНаСкладах
- расход по регистру накопления ЗаказыПоставщикам
Запись в регистр накопления ТоварыНаСкладах делается в рублях (Сумма) и в долларах (СуммаВал). Курс берется на дату партии.
Документ может содержать в табличной части Товары тысячи строк с различными пар-тиями.
Ниже представлена обработка проведения документа ПоступлениеТоваров.
Необходимо указать на ошибки и неоптимальные решения в процедуре проведения.

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Партия КАК Партия,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма,
| Заказы.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ
|РегистрНакопления.ЗаказыПоставщикам.Остатки(&Период, Контрагент = &Контрагент) КАК Заказы
| ПО Товары.Номенклатура = Заказы.Номенклатура
| И Товары.Партия = Заказы.Партия
|ГДЕ
| Товары.Ссылка = &Ссылка
| И (Заказы.Номенклатура, Заказы.Партия) В
| (ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Партия
| ИЗ
| Документ. ПоступлениеТоваров.Товары КАК Товары
| ГДЕ
| Товары.Ссылка = &Ссылка)
|ИТОГИ
| СУММА(Количество),
| СУММА(Сумма),
| СУММА(КоличествоОстаток)
4
|ПО
| Номенклатура,
| Партия";
ВыборкаНоменклатура = Запрос.Выполнить().Выбрать();
Пока ВыборкаНоменклатура.Следующий() Цикл
Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
Сообщить("Количество в поступлении "
+ВыборкаНоменклатура.Количество
+ " " + ВыборкаНоменклатура.Номенклатура.ЕдиницаИзмерения
+ " превышает остаток по заказам "
+ВыборкаНоменклатура.КоличествоОстаток
+ " " + ВыборкаНоменклатура.Номенклатура.ЕдиницаИзмерения);
Иначе
ВыборкаПартия = ВыборкаНоменклатура.Выбрать();
Пока ВыборкаПартия.Следующий() Цикл
СуммаВал = СуммаВал
+ РегистрыСведений.КурсыВалют.ПолучитьПоследнее(
ВыборкаПартия.Партия.Дата
,Новый Структура("Валюта", Справочники.Валюты.НайтиПоНаименованию(«USD»)));
Движение = РегистрыНакопления.ЗаказыПоставщикам.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаПартия.Номенклатура;
Движение.Количество = ВыборкаПартия.Количество;
КонецЦикла;
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
Движение.Количество = ВыборкаНоменклатура.Количество;
Движение.Сумма = ВыборкаНоменклатура.Сумма;
Движение.СуммаВал = СуммаВал;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
1 Fish
 
03.05.18
09:29
(0) Собеседование проходишь?
2 Timon1405
 
03.05.18
09:30
зарплату тоже за тебя получать?
3 Krendel
 
03.05.18
09:31
быстрее
4 Krendel
 
03.05.18
09:31
не видите человек горит
5 lou-bega
 
03.05.18
09:33
(4) )))
Да, прислали задачку на собеседование!
6 lou-bega
 
03.05.18
09:34
Да я так сходу, без конструктора не могу!
7 Волшебник
 
03.05.18
09:34
(5) В принципе уже понятно, что будет, когда тебя примут на работу и начнут давать новые задачки. Всю мисту засрёшь своими задачками, как ЛивингСтар.
8 Krendel
 
03.05.18
09:35
(7) Это новые ветки, новые рекламодатели, новые деньги ;-)
9 lou-bega
 
03.05.18
09:37
(7) Такое возможно, но как же учиться если не спрашивать советов у старших коллег?
10 Волшебник
 
03.05.18
09:38
(9) Читай документацию, учи матчасть, изучай типовые.
11 Малыш Джон
 
03.05.18
09:40
(9) советов. но не "сделайте за меня". в чем конкретно у тебя затруднения? на какой строчке споткнулся?
12 MakaMaka
 
03.05.18
09:45
(0) Вот это

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

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

Получать курсы валют надо тем же запросом, что и остатки,
т.е. вот за это

РегистрыСведений.КурсыВалют.ПолучитьПоследнее(
ВыборкаПартия.Партия.Дата
,Новый Структура("Валюта", Справочники.Валюты.НайтиПоНаименованию(«USD»)));

Надо сечь, жестко сечь.
13 СвинТуз
 
03.05.18
09:46
Помню на спецкурсе в университете задачу дали.
Я ее нормально смог решить, а остальные нет.
Давно это было. Тогда и литературы не было.
Вот это было круто. А 1с? Бери книги и читай. Даже подвига никакого не нужно.
14 xxTANATORxx
 
03.05.18
09:47
(12) >>Справочники.Валюты.НайтиПоНаименованию(«USD»)

так лучше не делать
15 Рэйв
 
03.05.18
09:48
(0)На вскидку. Получай товары документа отдельно в вт и потом ее соединяй. Твое условие ГДЕ накладывается уже после того как  ты соединишь все товары всех документов со всеми остатками.
16 MakaMaka
 
03.05.18
09:49
(14) а в цикле обращение в РС это норм? За это надо пороть или ломать палец за каждое лишнее обращение к БД.
17 HardBall
 
03.05.18
09:51
Два раза выбираются данные из  Документ.ПоступлениеТоваров.Товары
18 lou-bega
 
03.05.18
09:51
(12) Спасибо, сейчас пытаюсь запрос в базе воссоздать.
(14) Почему так лучше не делать?
19 Волшебник
 
03.05.18
09:51
(16) У профессионалов запросы в циклах не тормозят.
20 MakaMaka
 
03.05.18
09:52
(18) У тебя идет обращение к БД в цикле, это насилует БД, работает эта конструкция оч медленно, везде где это возможно надо использовать запрос, запрос получает данные из БД за одно обращение, потом работай с выборкой запроса сколько хочешь.
21 СвинТуз
 
03.05.18
09:53
(19)

))) точно. В типовых например.
Должен быть буфер. При частых обращениях данные берутся из него.
22 MakaMaka
 
03.05.18
09:53
(19) Ага, запрос в цикле работает как должен работать, тормозит все остальное у непрофессионалов. )))))))
23 HardBall
 
03.05.18
09:55
"ВыборкаНоменклатура.Номенклатура.ЕдиницаИзмерения"
24 MakaMaka
 
03.05.18
09:57
(23) за это надо тоже ругать
25 Fish
 
03.05.18
09:58
в 29-й строке ошибка
26 lou-bega
 
03.05.18
09:58
Спасибо большое за помощь.
27 Мимохожий Однако
 
03.05.18
10:02
(26) Что, взяли? ))
29 lou-bega
 
03.05.18
10:18
(27) Если честно, не очень к ним хочу, но и в грязь лицом тоже не хочется упасть! )
30 MakaMaka
 
03.05.18
10:24
(29) с такой аватаркой ты обязан к ним устроиться
31 lou-bega
 
03.05.18
10:26
(30) Это точно )
32 ColonelAp4u
 
03.05.18
10:31
(29) ну раз совсем не хочешь в грязь лицом то еще у запроса не установлены параметры
Контрагент и период
33 ColonelAp4u
 
03.05.18
10:32
(32) и ссылка)
34 ERWINS
 
03.05.18
10:33
Запрос = Новый Запрос;
Запрос.Текст = "
ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Партия КАК Партия,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма
| Поместить ТЗ
| ИЗ
| Документ. ПоступлениеТоваров.Товары КАК Товары
| ГДЕ
| Товары.Ссылка = &Ссылка)
| ;
| ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Партия КАК Партия,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма,
| Заказы.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| ТЗ КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ
|РегистрНакопления.ЗаказыПоставщикам.Остатки(&Период, Контрагент = &Контрагент  И
| (Номенклатура, Партия) В
| (ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Партия
| ИЗ
| ТЗ КАК Товары
| ГДЕ
| Товары.Ссылка = &Ссылка)
|) КАК Заказы
| ПО Товары.Номенклатура = Заказы.Номенклатура
| И Товары.Партия = Заказы.Партия


+ добавить сюда выборку курсов валют

ИТОГИ вещь от лукавого
35 lou-bega
 
03.05.18
10:37
(33) Спасибо большое.
36 lou-bega
 
03.05.18
10:46
Еще раз, всех благодарю.
Указали на грубые ошибки, я в них разобрался.
37 ERWINS
 
03.05.18
10:48
СуммаВал = СуммаВал
+ РегистрыСведений.КурсыВалют.ПолучитьПоследнее(
ВыборкаПартия.Партия.Дата
,Новый Структура("Валюта", Справочники.Валюты.НайтиПоНаименованию(«USD»)));

Запрос в цикле что не допустимо
+
СуммаВал постоянно увеличивается, так не должно быть

СуммаВал = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(
ВыборкаПартия.Партия.Дата
,Новый Структура("Валюта", Справочники.Валюты.НайтиПоНаименованию(«USD»)))*ВыборкаНоменклатура.Сумма;
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший