|
Вот два куска аналогичного по фукционалу кода. Чей лучший? | ☑ | ||
---|---|---|---|---|
0
bizon2008
19.10.16
✎
08:15
|
Пару товарищам было выдано - задание было простое, внешняя печатная форма к доку реализация товаров и услуг. Максимально упрощенная.
Просьба дать оценку. Причем, как мне кажется первый пытался списывать у второго. Код 1. Функция Печать() Экспорт ТабДокумент = ПечатьДокумента(); Возврат ТабДокумент; КонецФункции Функция ПечатьДокумента() экспорт // запрос на Заголовок Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект); Запрос.Текст = "выбрать | РеализацияТоваровУслуг.Номер, | РеализацияТоваровУслуг.Дата, | РеализацияТоваровУслуг.Контрагент как Покупатель, | РеализацияТоваровУслуг.Организация, | РеализацияТоваровУслуг.Организация как Поставщик |из | Документ.РеализацияТоваровУслуг как РеализацияТоваровУслуг |где | РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент"; Шапка = Запрос.Выполнить().Выбрать(); Шапка.Следующий(); // запрос на товары Запрос = Новый Запрос; Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаОбъект); Запрос.Текст = " | выбрать | РеализацияТоваровУслугТовары.Номенклатура.Артикул как Артикул, | РеализацияТоваровУслугТовары.Номенклатура.НаименованиеПолное как Товар, | РеализацияТоваровУслугТовары.Количество/ЕдиницыИзмерения.Коэффициент как Мест, | РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаИзмеренияМест как ЕдиницаИзмеренияМест, | РеализацияТоваровУслугТовары.Количество как Количество, | РеализацияТоваровУслугТовары.ЕдиницаИзмерения | из | Справочник.ЕдиницыИзмерения как ЕдиницыИзмерения | Левое соединение Документ.РеализацияТоваровУслуг.Товары как РеализацияТоваровУслугТовары | по (РеализацияТоваровУслугТовары.ЕдиницаИзмеренияМест = ЕдиницыИзмерения.Ссылка) | где | РеализацияТоваровУслугТовары.Ссылка.Ссылка = &СсылкаНаДокумент"; ЗапросТовары = Запрос.Выполнить().Выгрузить(); ТабДокумент = Новый ТабличныйДокумент; Макет = ПолучитьМакет("РасходнаяНакладная"); //шапка накладной ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокДокумента"); ОбластьМакета.Параметры.НаименованиеДокумента = ОбщегоНазначения.СформироватьЗаголовокДокумента(Шапка, "Расходная накладная"); ТабДокумент.Вывести(ОбластьМакета); //покупатель ОбластьМакета = Макет.ПолучитьОбласть("Покупатель"); ОбластьМакета.Параметры.Покупатель = Шапка.Покупатель; ТабДокумент.Вывести(ОбластьМакета); // заголовок таблицы ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокТаблицы"); ТабДокумент.Вывести(ОбластьМакета); // товары ОбластьМакета = Макет.ПолучитьОбласть("Строка"); КоличествоСтрокТовары = ЗапросТовары.Количество(); ИтогоМест = 0; ИтогоКоличество = 0; Для НомерСтрокиВыборки = 0 По КоличествоСтрокТовары-1 Цикл ВыборкаСтрок = ЗапросТовары[НомерСтрокиВыборки]; ИтогоМест = ИтогоМест + ВыборкаСтрок.Мест; ИтогоКоличество = ИтогоКоличество + ВыборкаСтрок.Количество; ОбластьМакета.Параметры.Заполнить(ВыборкаСтрок); ОбластьМакета.Параметры.НомерСтроки = НомерСтрокиВыборки + 1; Если Окр(ВыборкаСтрок.Мест,0,0) <> ВыборкаСтрок.Мест тогда ОбластьМакета.Параметры.Примечание = "Ящик неполный"; КонецЕсли; ТабДокумент.Вывести(ОбластьМакета); КонецЦикла; // итоги ОбластьМакета = Макет.ПолучитьОбласть("Итоги"); ОбластьМакета.Параметры.ИтогоМест = ИтогоМест; ОбластьМакета.Параметры.ИтогоКоличество = ИтогоКоличество; ТабДокумент.Вывести(ОбластьМакета); Возврат ТабДокумент; КонецФункции Код 2. Функция ПолучитьТовары() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура.Артикул КАК Артикул, | РеализацияТоваровУслугТовары.Номенклатура.НаименованиеПолное КАК Товар, | ЕдиницыИзмерения.Коэффициент КАК Коэффициент, | РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаИзмеренияМест КАК ЕдиницаИзмеренияМест, | РеализацияТоваровУслугТовары.Количество КАК Количество, | РеализацияТоваровУслугТовары.Количество / ЕдиницыИзмерения.Коэффициент КАК Мест, | РеализацияТоваровУслугТовары.ЕдиницаИзмерения |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары | ПО (РеализацияТоваровУслугТовары.ЕдиницаИзмеренияМест = ЕдиницыИзмерения.Ссылка) |ГДЕ | РеализацияТоваровУслугТовары.Ссылка.Ссылка = &Док"; Запрос.УстановитьПараметр("Док", СсылкаНаОбъект); ДанныеТовара = Запрос.Выполнить().Выгрузить(); Возврат ДанныеТовара КонецФункции // Внешняя функция печати // Параметры // ИмяМакета – Строка – имя формы печати // // Возвращаемое значение: // Булево –Печать прошла успешно - Истина, иначе - Ложь // Функция Печать() Экспорт ТабДок = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); Док = СсылкаНаОбъект.ПолучитьОбъект(); НомерДок = Док.Номер; ДатаДок = Формат(Док.Дата,"ДЛФ=DD"); ОбластьЗаголовок.Параметры.ЗаголовокПредставление = "Расходная накладная № " + НомерДок + " от " + ДатаДок; ОбластьЗаголовок.Параметры.Контрагент = Док.Контрагент.НаименованиеПолное; ТабДок.Вывести(ОбластьЗаголовок); ОбластьЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы"); ТабДок.Вывести(ОбластьЗаголовокТаблицы); ДанныеНоменклатуры = ПолучитьТовары(); нс = 1; Для Каждого СтрТовар Из ДанныеНоменклатуры Цикл ОбластьСтрока = Макет.ПолучитьОбласть("Строка"); ОбластьСтрока.Параметры.Заполнить(СтрТовар); ОбластьСтрока.Параметры.нс = нс; Если Окр(СтрТовар.Мест,0,0) <> СтрТовар.Мест тогда ОбластьСтрока.Параметры.Примечание = "Ящик неполный" КонецЕсли; ТабДок.Вывести(ОбластьСтрока); нс = нс + 1; КонецЦикла; ОбластьИтого = Макет.ПолучитьОбласть("Итого"); ОбластьИтого.Параметры.ИтогоМест = ДанныеНоменклатуры.Итог("Мест") ; ОбластьИтого.Параметры.ИтогоКолво = ДанныеНоменклатуры.Итог("Количество") ; ТабДок.Вывести(ОбластьИтого); Возврат ТабДок КонецФункции // Печать() Спасибо. |
|||
87
bizon2008
19.10.16
✎
10:58
|
(82) Второй умеет, но ленится. Да и простой запрос быстрей мышкой наклацать.
|
|||
88
Мойдодыр
19.10.16
✎
10:59
|
(87) не умеет, по тексту запроса это выидно
|
|||
89
bizon2008
19.10.16
✎
11:00
|
(85) (86) Я догадаться. Вопрос как оно тама должно быть. В таблицу значений вы сами запретили выгружать однако.
|
|||
90
Dotoshin
19.10.16
✎
11:00
|
(78) Вместо Возврат ДанныеШапки
напиши Возврат Шапка |
|||
91
bizon2008
19.10.16
✎
11:02
|
(90) Дык это выборка будет. Потом опять. Шапка.Следующий(), но уже в основном коде.
|
|||
92
spock
19.10.16
✎
11:02
|
(87) оба наклацали - ошибки детские.
|
|||
93
bizon2008
19.10.16
✎
11:03
|
Вы мне народ попроще, я полгода по другой специализации работал, плюс побили немного. Так что где-то туго на поворотах соображаю. Спасибо.
|
|||
94
bizon2008
19.10.16
✎
11:04
|
(92) Второй наклацал - первый списал.
|
|||
95
Dotoshin
19.10.16
✎
11:04
|
Интересно, те товарищи, которым было дадено задание наиписать ВПФ, мисту читают?
Вот будет прикольно если в эту ветку зайдут :) |
|||
96
singlych
19.10.16
✎
11:04
|
Очевидно, что первый скопипастил код второго, но исправил некоторые косяки, типа сделал запрос к шапке вместо ПолучитьОбъект, вынес получение области макета за цикл. Даже, возможно, пытался сделать что-то (безуспешно, правда) с ужасным запросом к табличной части, судя по тому, что "выбрать" и "Левое соединение" маленькими буквами. Так что я за первого.
|
|||
97
Dmitrii
гуру
19.10.16
✎
11:04
|
(69) Например, так:
ВЫБРАТЬ РеализацияТоваровУслугТовары.Ссылка КАК Накладная, РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер, РеализацияТоваровУслугТовары.Ссылка.Дата КАК Дата, РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент, РеализацияТоваровУслугТовары.Ссылка.Организация КАК Организация, РеализацияТоваровУслугТовары.НомерСтроки, РеализацияТоваровУслугТовары.Номенклатура, РеализацияТоваровУслугТовары.Количество, РеализацияТоваровУслугТовары.Цена, РеализацияТоваровУслугТовары.Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ИТОГИ МАКСИМУМ(Номер), МАКСИМУМ(Дата), МАКСИМУМ(Контрагент), МАКСИМУМ(Организация) ПО Накладная Потом делаем иерархическую выборку Шапка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Накладная"); ПервыйДокумент = Истина; Пока Шапка.Следующий() Цикл Если Не ПервыйДокумент Тогда ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ПервыйДокумент = Ложь; //Выводим шапку; //Потом строки ОбходПоСтрокам = Шапка.Выбрать(); Пока ОбходПоСтрокам.Следующий() Цикл //Выводим строки; КонецЦикла; //Выводим подвал; КонецЦикла; |
|||
98
bizon2008
19.10.16
✎
11:05
|
(95) Второй точно, это мой племяшь. Под мной иногда вопросы задает.
|
|||
99
Курцвейл
19.10.16
✎
11:05
|
(81) За такие запросы надо обеих по рукам линейкой
|
|||
100
4St
19.10.16
✎
11:05
|
(8) я смотрю, тут уже ответили ))
Лично я бы оставил второго за то, что он получение таблицы товаров вынес отдельной функцией. И долго учил, учил, учил. |
|||
101
Dotoshin
19.10.16
✎
11:05
|
(91) Точней сказать запись выборки.
|
|||
102
4St
19.10.16
✎
11:06
|
(100) кармически более правильно обучить )) А экономически - пожалуй, найти уже опытного.
|
|||
103
Курцвейл
19.10.16
✎
11:07
|
У обеих затребовать объяснение зачем регулярно делать дефрагментацию индексов БД.
Исходя из ответов принять решение. |
|||
104
Мойдодыр
19.10.16
✎
11:08
|
(97) тебе надо максимум по всем полям шапки делать, а их можеть быть под сотню
|
|||
105
Timon1405
19.10.16
✎
11:08
|
(98) так с этого надо было начинать
http://s1.funon.cc/img/orig/201407/12/53c0de1f41db6.jpg |
|||
106
bizon2008
19.10.16
✎
11:10
|
(97) Я вот этого финта не понял. В чем фишка?
ПервыйДокумент = Истина; Пока Шапка.Следующий() Цикл Если Не ПервыйДокумент Тогда ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ПервыйДокумент = Ложь; |
|||
107
VladZ
19.10.16
✎
11:11
|
(0) Чтобы принять решение кого из них оставить "в программистах" - нужно посмотреть, как они решают разные задачки. Внешняя печ.форма - не показатель.
|
|||
108
Дарлок
19.10.16
✎
11:12
|
(51) я не фукал. они одинаковы
|
|||
109
Dmitrii
гуру
19.10.16
✎
11:13
|
(87) >> Второй умеет
Судя по абсолютно детским и грубым ошибкам, я в этом сильно сомневаюсь. Я бы брал первого. Даже если предположить, что он всё списал со второго. Он исправил явные грубейшие ошибки (типа получения объекта). И повторюсь: Второй явно не понимает смысла того, что он делает. Сначала лепит запрос и выборку, а потом тянет сам объект..... Вот спрашивается нафуя? Либо откажись от выборки, либо не тяни объект. PS Кстати не понимаю почему этот факт (получение объекта) ни у кого не вызывает возмущения. Как и то, что второй постоянно лепит неявные запросы к базе Док.Контрагент.НаименованиеПолное. На сертификационных экзаменах на спеца (которые все тут считают бессмыслеными) за такое незачет ставят. Или народ уже настолько привык хавнокодить, что просто не обращает на такие "мелочи" внимания?.... |
|||
110
Dmitrii
гуру
19.10.16
✎
11:14
|
(106) Групповая печать документов.
Лучше, когда два документа печатаются на двух разных листа (через горизонтальный разделитель), чем на одном )))) |
|||
111
Dotoshin
19.10.16
✎
11:16
|
(106) В выборку может попасть не один документ, если печатаем не первый документ - надо его печатать на след.листе, для этого он выводит разделитель.
У него кстати фраза "ГДЕ" отсутствует, так что поосторожней с этим кодом, а то запустишь на печать все 10 000 документов реализации, ну или сколько там их у вас есть :) |
|||
112
bizon2008
19.10.16
✎
11:17
|
(109) Согласен, с получением объекта это явно что-то не то.
Но блин, каждый раз все запросами оформлять тоже как-то, ну не знаю. Я вот грешен, все через точку таскаю. Ну не тормозить и ладно, зато удобно. На больших объемах конечно себе такого не позволяю однако. |
|||
113
bizon2008
19.10.16
✎
11:19
|
(105) Я беспристрастен, и вообще я админом устраивал. А оно вона как. Ну уйдет в другую контору, на крайняк на полигон прапором посажу.
|
|||
114
Dmitrii
гуру
19.10.16
✎
11:20
|
(111) >> У него кстати фраза "ГДЕ"
У него пример на коленке в конструкторе слепленный и ни в коем случае не претендующий на законченность ))) А так да. Должно бытье ГДЕ РеализацияТоваровУслугТовары.Ссылка В (&МассивСсылок) |
|||
115
Dotoshin
19.10.16
✎
11:20
|
(114) Ну вот! Другое дело :)
|
|||
116
ifso
19.10.16
✎
11:22
|
(3) запастить попкорном и соискателей в банку, не?)
|
|||
117
Мойдодыр
19.10.16
✎
11:22
|
пригласить сразу 2х и устроить соревнование )))
|
|||
118
Dotoshin
19.10.16
✎
11:22
|
(114) Я просто предупредил ТС-а, вдруг он не глядя "воткнет" твой запрос в ВПФ и напечатает ее. Обидеть никого не не хотел есичио :)
|
|||
119
Sammo
19.10.16
✎
11:23
|
Обоих в сад.
1. Условие на .Ссылка.Ссылка 2. Соединение в запросах кривое (левое от справочника единицы измерения, превращенное условием во внутреннее) 3. Двойная точка. |
|||
120
bizon2008
19.10.16
✎
11:24
|
(101) Ну все равно это набор данных будет, который в цикле перебирать или явно переходить надо.
|
|||
121
Dmitrii
гуру
19.10.16
✎
11:25
|
(112) >> Я вот грешен, все через точку таскаю. Ну не тормозить и ладно, зато удобно
1С тоже этим грешит. Но зачем самому себе гадить? А потом все удивляются, что пользователи жалуются на тормоза этой вашей 1С. |
|||
122
Dmitrii
гуру
19.10.16
✎
11:26
|
(117) >> и устроить соревнование
отжимания, приседания, подтягивания, стрельба?... Или сразу - кто лучше пол в серверной вымоет? |
|||
123
wertyu
19.10.16
✎
11:27
|
бери двух на по полЗП, через три месяца выживет сильнейший или один сразу свалит )
|
|||
124
Мойдодыр
19.10.16
✎
11:27
|
(122) По шахбоксу
|
|||
125
FIXXXL
19.10.16
✎
11:28
|
кстати
РеализацияТоваровУслугТовары.Количество/ЕдиницыИзмерения.Коэффициент нет проверки на 0 и НУЛЛ теоритически может ошибку выбить |
|||
126
bizon2008
19.10.16
✎
11:29
|
(116) (117) (122) Я это если чего за своего то по любому подпишушь, а так как на моей стороне куча тяжелого вооружения и миста - результат очевиден.
Шутка. |
|||
127
bizon2008
19.10.16
✎
11:30
|
(123) Ну так вот три месяца прошло, никто не свалил. Один ленивый, другому некуда.
|
|||
128
Дарлок
19.10.16
✎
11:30
|
Самое главное, что вкуса нет. А это уже не исправить.
|
|||
129
bizon2008
19.10.16
✎
11:31
|
(125) Это кстати да. Косяк.
|
|||
130
wertyu
19.10.16
✎
11:32
|
(127) ленивого оставляй
|
|||
131
bizon2008
19.10.16
✎
11:33
|
Я повторюсь(78), но меня реально заинтересовала, как такую хрень по 1С правильно написать?
Я вот наваял. Функция ПолучитьШапку() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Номер КАК Номер, | РеализацияТоваровУслуг.Дата КАК Дата, | РеализацияТоваровУслуг.Контрагент.НаименованиеПолное КАК Контрагент |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Ссылка = &Док"; Запрос.УстановитьПараметр("Док", СсылкаНаОбъект); Шапка = Запрос.Выполнить().Выбрать(); ДанныеШапки = Шапка.Следующий(); Возврат ДанныеШапки КонецФункции Потом к ней пытаюсь обратится. ДанныеШапки = ПолучитьШапку(); НомерДок = ДанныеШапки.Номер; ДатаДок = Формат(ДанныеШапки.Дата,"ДЛФ=DD"); ОбластьЗаголовок.Параметры.ЗаголовокПредставление = "Расходная накладная № " + НомерДок + " от " + ДатаДок; ОбластьЗаголовок.Параметры.Контрагент = ДанныеШапки.Контрагент; ТабДок.Вывести(ОбластьЗаголовок); И получаю облом. Значение не является значением объектного типа (Номер) НомерДок = ДанныеШапки.Номер; |
|||
132
bizon2008
19.10.16
✎
11:34
|
(128) Мыж тупые ремесленники.
|
|||
133
Мойдодыр
19.10.16
✎
11:35
|
(131) Тебе же объяснили уже 5 раз
|
|||
134
Дарлок
19.10.16
✎
11:36
|
(132) тогда в (0) супер офигительные специалисты. 1й- знает глобальные общие процедуры, а 2й - умеет пользоваться конструктором запросов
|
|||
135
Dotoshin
19.10.16
✎
11:36
|
(120) Нет, это будет одна запись из выборки, перебирать ничего не надо, можно сразу читать реквизиты.
|
|||
136
bizon2008
19.10.16
✎
11:37
|
(133) Простите контуженого, не доходит. Ты на пальцах покажи.
|
|||
137
Dotoshin
19.10.16
✎
11:38
|
(136) Напиши Возврат Шапка, вместо Возврат ДанныеШапки
|
|||
138
bizon2008
19.10.16
✎
11:39
|
(137)Может
Возврат Шапка.Следующий(); Шапка это выборка же. |
|||
139
FIXXXL
19.10.16
✎
11:41
|
(136)
Шапка = Запрос.Выполнить().Выбрать(); Если Шапка.Следующий() тогда Возврат Шапка; Иначе Возврат Неопределено; конецесли; Шапка.Следующий() - позиционирует указатель на первой строке (в данном случае) |
|||
140
Dotoshin
19.10.16
✎
11:42
|
(138) Если так напишешь опять получишь ошибку. Метод "Следующий" вернет булевское значение.
Шапка это действительно выборка, точней сказать указатель на текущую запись выборки. |
|||
141
bizon2008
19.10.16
✎
11:45
|
(140)Ага, кажется начинает доходить Шапка это выборка(типа курсор как в БД), а метод Шапка.Следующий() установка на первую запись.
И на выходе у меня выборка с установкой на первую запись. Я правильно понял? |
|||
142
Дарлок
19.10.16
✎
11:46
|
(138) как совет - в отдельную процедуру выноси только текст запроса... т.е. назови функциию "ПолучитьТекстЗапрос()" и верни только текст, так код будет более читаемей и ошибок будет меньше
|
|||
143
bizon2008
19.10.16
✎
11:48
|
Вот типа по феншую.
Но теперь с итогами засада. Функция ПолучитьШапку() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Номер КАК Номер, | РеализацияТоваровУслуг.Дата КАК Дата, | РеализацияТоваровУслуг.Контрагент.НаименованиеПолное КАК Контрагент |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Ссылка = &Док"; Запрос.УстановитьПараметр("Док", СсылкаНаОбъект); Шапка = Запрос.Выполнить().Выбрать(); ДанныеШапки = Шапка.Следующий(); Возврат Шапка КонецФункции Функция ПолучитьТовары() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Номенклатура.Артикул КАК Артикул, | Товары.Номенклатура.НаименованиеПолное КАК Товар, | Товары.Номенклатура.ЕдиницаИзмеренияМест КАК ЕдиницаИзмеренияМест, | Товары.Количество КАК Количество, | Товары.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | Товары.Количество / Товары.Номенклатура.ЕдиницаИзмеренияМест.Коэффициент КАК Мест |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК Товары |ГДЕ | Товары.Ссылка.Ссылка = &Док"; Запрос.УстановитьПараметр("Док", СсылкаНаОбъект); ДанныеТовара = Запрос.Выполнить().Выбрать(); Возврат ДанныеТовара КонецФункции // Внешняя функция печати Функция Печать() Экспорт ТабДок = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ДанныеШапки = ПолучитьШапку(); НомерДок = ДанныеШапки.Номер; ДатаДок = Формат(ДанныеШапки.Дата,"ДЛФ=DD"); ОбластьЗаголовок.Параметры.ЗаголовокПредставление = "Расходная накладная № " + НомерДок + " от " + ДатаДок; ОбластьЗаголовок.Параметры.Контрагент = ДанныеШапки.Контрагент; ТабДок.Вывести(ОбластьЗаголовок); ОбластьЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы"); ТабДок.Вывести(ОбластьЗаголовокТаблицы); ОбластьСтрока = Макет.ПолучитьОбласть("Строка"); ДанныеНоменклатуры = ПолучитьТовары(); нс = 1; Пока ДанныеНоменклатуры.Следующий() Цикл ОбластьСтрока.Параметры.Заполнить(ДанныеНоменклатуры); ОбластьСтрока.Параметры.нс = нс; Если Окр(ДанныеНоменклатуры.Мест,0,0) <> ДанныеНоменклатуры.Мест тогда ОбластьСтрока.Параметры.Примечание = "Ящик неполный" КонецЕсли; ТабДок.Вывести(ОбластьСтрока); нс = нс + 1; КонецЦикла; ОбластьИтого = Макет.ПолучитьОбласть("Итого"); //ОбластьИтого.Параметры.ИтогоМест = ДанныеНоменклатуры.Итог("Мест") ; //ОбластьИтого.Параметры.ИтогоКолво = ДанныеНоменклатуры.Итог("Количество") ; ТабДок.Вывести(ОбластьИтого); Возврат ТабДок КонецФункции // Печать() Их я так понимаю теперь надо в запрос пихать? |
|||
144
Dotoshin
19.10.16
✎
11:49
|
(141) Да, да все правильно, только все же не вся выборка, а одна запись из этой выборки.
|
|||
145
bizon2008
19.10.16
✎
11:51
|
(144) Ага все таки не классический курс БД. Ты смотри как интересно 1с это реализовали.
|
|||
146
Dotoshin
19.10.16
✎
11:55
|
(145) Если хочешь с итогами - сделай как в (97) написано, прямо в функции печать, без "ПолучитьШапку()" и "ПолучитьТовары()"
|
|||
147
Dotoshin
19.10.16
✎
11:59
|
вот текст сгенеренный стандартным конструктором печати:
Процедура Печать(ТабДок, Ссылка) Экспорт //{{_КОНСТРУКТОР_ПЕЧАТИ(Печать) Макет = Документы.ПоступлениеТоваровУслуг.ПолучитьМакет("Печать"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслуг.Валюта, | ПоступлениеТоваровУслуг.Дата, | ПоступлениеТоваровУслуг.Контрагент, | ПоступлениеТоваровУслуг.Номер, | ПоступлениеТоваровУслуг.Склад, | ПоступлениеТоваровУслуг.Товары.( | НомерСтроки, | Товар, | ЕдиницаИзмерения, | Количество, | Цена, | Сумма | ) |ИЗ | Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг |ГДЕ | ПоступлениеТоваровУслуг.Ссылка В (&Ссылка)"; Запрос.Параметры.Вставить("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); Шапка = Макет.ПолучитьОбласть("Шапка"); ОбластьТоварыШапка = Макет.ПолучитьОбласть("ТоварыШапка"); ОбластьТовары = Макет.ПолучитьОбласть("Товары"); ТабДок.Очистить(); ВставлятьРазделительСтраниц = Ложь; Пока Выборка.Следующий() Цикл Если ВставлятьРазделительСтраниц Тогда ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ТабДок.Вывести(ОбластьЗаголовок); Шапка.Параметры.Заполнить(Выборка); ТабДок.Вывести(Шапка, Выборка.Уровень()); ТабДок.Вывести(ОбластьТоварыШапка); ВыборкаТовары = Выборка.Товары.Выбрать(); Пока ВыборкаТовары.Следующий() Цикл ОбластьТовары.Параметры.Заполнить(ВыборкаТовары); ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень()); КонецЦикла; ВставлятьРазделительСтраниц = Истина; КонецЦикла; //}} КонецПроцедуры от себя ниче не добавлял, только мышкой поклацал |
|||
148
bizon2008
19.10.16
✎
12:00
|
(146) Да вроде все хорошо. Но вот
ИТОГИ МАКСИМУМ(Номер), МАКСИМУМ(Дата), МАКСИМУМ(Контрагент), МАКСИМУМ(Организация) ПО Это сейчас запрос мелкий, а что в большом будет. Агрегатные функции как никак, тож ресурсы требуют. Меня всегда учили лучше несколько небольших простых запросов, чем один большой комбайн. |
|||
149
Dotoshin
19.10.16
✎
12:04
|
(148) Можно и без агрегатов сделать - отсортировать по номеру документа и самому отслеживать изменение номера, если изменился значит выводим разделитель и печатаем шапку иначе печатаем ТЧ документа. Ну соответственно при печати первого дока разделитель выводить не тнужно.
|
|||
150
Злопчинский
19.10.16
✎
12:05
|
(84) "Выгнать обоих на склад кладовщиками работать :)"
Склады - это отстойники ресурсов, материальных и человеческих... |
|||
151
bizon2008
19.10.16
✎
12:06
|
(147) А прикольно, вложенный запрос.
|
|||
152
Злопчинский
19.10.16
✎
12:08
|
(147) это хороший код или плохой?
|
|||
153
Господин ПЖ
19.10.16
✎
12:08
|
>Меня всегда учили лучше несколько небольших простых запросов, чем один большой комбайн.
тогда надо думать об их согласованности |
|||
154
Мойдодыр
19.10.16
✎
12:08
|
(149) А можно открыть типовую и посмотреть как делается там
|
|||
155
Dotoshin
19.10.16
✎
12:09
|
(151) Попробуй в конфигураторе правой кнопкой мыши нажать на каком-нить документе и выбрать конструкторы-конструктор печати и потом далее, далее, далее....
|
|||
156
Злопчинский
19.10.16
✎
12:10
|
запрос из (0) надо заюзать в Как быстро найти неоптимальности в запросе (волшебная консоль запросов)
|
|||
157
Dotoshin
19.10.16
✎
12:10
|
(154) Можно и типовую. Вот тока в учебных целях лучше как попроще.
|
|||
158
bizon2008
19.10.16
✎
12:10
|
(154) В типовых как только не делается. На любой вкус пример найти думается можно.
(155) Я в курсе где конструктор, прикольно он запрос то делает. |
|||
159
wertyu
19.10.16
✎
12:14
|
(158) кого выгнал-то?
|
|||
160
Oftan_Idy
19.10.16
✎
12:19
|
(0) оба плохие
|
|||
161
Мойдодыр
19.10.16
✎
12:49
|
(157) Но при этом ты начинаешь за тему "как правильно"
|
|||
162
Dotoshin
19.10.16
✎
13:00
|
(161) Как правильно - это спорный вопрос. В (149) я на правоту ни разу не претендую. Этот способ ничуть не хуже типового, где данные для печати пихают сначала в структуру, причем отдельно результат запроса по шапке, отдельно по строкам, а потом обходя шапки всех документов "выдирают" строки текущего дока из другой выборки (а точнее из тз в которую выкатывается выборка).
Опять же я не говорю что какой-то способ лучше, а какой-то хуже, они просто разные, вот тока в типовой мозги сломаешь пока докопаешься где надо исправить, чтобы что-то добавить/убавить. |
|||
163
bizon2008
19.10.16
✎
13:23
|
Все надо заканчивать. Вот такую я хрень родил.
Но работает зараза. Функция ПолучитьШапку() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Номер КАК Номер, | РеализацияТоваровУслуг.Дата КАК Дата, | РеализацияТоваровУслуг.Контрагент.НаименованиеПолное КАК Контрагент |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Ссылка = &Док"; Запрос.УстановитьПараметр("Док", СсылкаНаОбъект); Шапка = Запрос.Выполнить().Выбрать(); Шапка.Следующий(); Возврат Шапка КонецФункции Функция ПолучитьТовары() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Номенклатура.Артикул КАК Артикул, | Товары.Номенклатура.НаименованиеПолное КАК Товар, | Товары.Номенклатура.ЕдиницаИзмеренияМест КАК ЕдиницаИзмеренияМест, | Товары.Количество КАК Количество, | Товары.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | Товары.Количество / Товары.Номенклатура.ЕдиницаИзмеренияМест.Коэффициент КАК Мест |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК Товары |ГДЕ | Товары.Ссылка.Ссылка = &Док |ИТОГИ | СУММА(Количество), | СУММА(Мест) |ПО | Товары.Ссылка"; Запрос.УстановитьПараметр("Док", СсылкаНаОбъект); ДанныеТовара = Запрос.Выполнить().Выбрать(); Возврат ДанныеТовара КонецФункции // Внешняя функция печати Функция Печать() Экспорт ТабДок = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ДанныеШапки = ПолучитьШапку(); НомерДок = ДанныеШапки.Номер; ДатаДок = Формат(ДанныеШапки.Дата,"ДЛФ=DD"); ОбластьЗаголовок.Параметры.ЗаголовокПредставление = "Расходная накладная № " + НомерДок + " от " + ДатаДок; ОбластьЗаголовок.Параметры.Контрагент = ДанныеШапки.Контрагент; ТабДок.Вывести(ОбластьЗаголовок); ОбластьЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы"); ТабДок.Вывести(ОбластьЗаголовокТаблицы); ОбластьСтрока = Макет.ПолучитьОбласть("Строка"); ДанныеНоменклатуры = ПолучитьТовары(); нс = 0; Пока ДанныеНоменклатуры.Следующий() Цикл Если нс = 0 Тогда ИтогоМест = ДанныеНоменклатуры.Мест; ИтогоКолво = ДанныеНоменклатуры.Количество; Иначе ОбластьСтрока.Параметры.Заполнить(ДанныеНоменклатуры); ОбластьСтрока.Параметры.нс = нс; Если Окр(ДанныеНоменклатуры.Мест,0,0) <> ДанныеНоменклатуры.Мест тогда ОбластьСтрока.Параметры.Примечание = "Ящик неполный" КонецЕсли; ТабДок.Вывести(ОбластьСтрока); КонецЕсли; нс = нс + 1; КонецЦикла; ОбластьИтого = Макет.ПолучитьОбласть("Итого"); ОбластьИтого.Параметры.ИтогоМест = ИтогоМест; ОбластьИтого.Параметры.ИтогоКолво = ИтогоКолво ; ТабДок.Вывести(ОбластьИтого); Возврат ТабДок КонецФункции // Печать() |
|||
164
Мойдодыр
19.10.16
✎
14:09
|
(163) Это п..ц, товарищи
|
|||
165
aleks_default
19.10.16
✎
14:12
|
(164) я ж говорю - уволить всех, ...и расстрелять
|
|||
166
Dotoshin
19.10.16
✎
14:12
|
(164) Не ругайся, лучше наставь человека на путь истинный.
|
|||
167
Dotoshin
19.10.16
✎
14:14
|
||||
168
bizon2008
19.10.16
✎
14:15
|
(164) Ну это мне скучно.
(165) Да не вопрос, я тебе хоть щас пулемет выдам. (166) Я к вам попозже загляну. Хорошо мозги прочищаете. |
|||
169
Dotoshin
19.10.16
✎
14:17
|
(168) >>Я к вам попозже загляну.
http://risovach.ru/upload/2014/05/mem/nu-ty-eto-zovi-esli-chto_51215312_orig_.jpeg |
|||
170
Dmitrii
гуру
19.10.16
✎
14:21
|
(148) Не нравятся агрегатные функции, сделай пакетный запрос, который в первом запросе будет получать данные шапки, а во втором - данные табличных частей.
Вариантов много. В любом случае два запроса - это менее оптимально. |
|||
171
bizon2008
19.10.16
✎
14:24
|
(170) Дык я не спорю. Я согласен.
|
|||
172
Мойдодыр
19.10.16
✎
14:46
|
Вот этот код особенно не нравится
нс = 0; Пока ДанныеНоменклатуры.Следующий() Цикл Если нс = 0 Тогда ИтогоМест = ДанныеНоменклатуры.Мест; ИтогоКолво = ДанныеНоменклатуры.Количество; Иначе Если уж делаешь запрос с группирвокой, то лучше и выбирать по группировкам |
|||
173
Дарлок
19.10.16
✎
14:47
|
(172) ему лишь бы работало. он же ремеслом это считает.
так что пофиг |
|||
174
bizon2008
19.10.16
✎
14:48
|
(172) Ну прикольно же получилось.
(173) Ну да, обычная работа. Не типовые же пишут. |
|||
175
Мойдодыр
19.10.16
✎
14:48
|
(173) Вообоще то тема изначальная про ОЦЕНИТЕ
|
|||
176
Мойдодыр
19.10.16
✎
14:49
|
Иначе и код претендентов работал
|
|||
177
Дарлок
19.10.16
✎
14:52
|
(175) да это его "вояния"... делать видимо нефиг, решил что-то переписать
|
|||
178
bizon2008
19.10.16
✎
14:53
|
Очень интересная тема получилась. Мне понравилось, очень много нового узнал. Мозги прочистил. Спасибо большое.
Сейчас будет у нас небольшой отдых, я еще чего там найду. Приду научите уму разуму. |
|||
179
bizon2008
19.10.16
✎
14:54
|
(177) Не что-то, а правильно. По рекомендации форума. Но да, занесло что-то.
|
|||
180
Дарлок
19.10.16
✎
14:54
|
(178) книжку лучше почитай. Карлсона, например.
|
|||
181
Дарлок
19.10.16
✎
14:55
|
(179) это не правильно, а на "отстань"
|
|||
182
bizon2008
19.10.16
✎
14:55
|
(181) Дык я и говорю, занесло меня.
|
|||
183
Господин ПЖ
19.10.16
✎
15:05
|
||||
184
4St
19.10.16
✎
18:59
|
(163) Тут еще есть что оптимизировать и рефакторить, но для первого раза уже вполне достаточно. Можно остановиться, перевести дух, осмыслить.
ГДЕ | Товары.Ссылка.Ссылка = &Док однозначно прямо сейчас заменить на ГДЕ | Товары.Ссылка = &Док А потом, по желанию, поразбираться с итогами в запросе и обходом их в выборке, пакетными запросами, в идеале - как все это в будущем завернуть на массовую печать. |
|||
185
vyaz
19.10.16
✎
19:25
|
Все понятно кроме одного! Как ТС, сам ничего толком не умея, инспектирует студентов???
|
|||
186
ifso
20.10.16
✎
00:16
|
(185) типа, как в анекдоте: "знал бы за что...", не?)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |