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