Вход | Регистрация

  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
(98) так с этого надо было начинать
http://s1.funon.cc/img/orig/201407/12/53c0de1f41db6.jpg
   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
(116) (117) (122) Я это если чего за своего то по любому подпишушь, а так как на моей стороне куча тяжелого вооружения и миста - результат очевиден.
Шутка.
   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
(132) тогда в (0) супер офигительные специалисты. 1й- знает глобальные общие процедуры, а 2й - умеет пользоваться конструктором запросов
   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
(137)Может
Возврат  Шапка.Следующий();

Шапка это выборка же.
   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
(145) Если хочешь с итогами - сделай как в (97) написано, прямо в функции печать, без "ПолучитьШапку()" и "ПолучитьТовары()"
   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
   Dotoshin
 
157 - 19.10.16 - 12:10
(154) Можно и типовую. Вот тока в учебных целях лучше как попроще.
   bizon2008
 
158 - 19.10.16 - 12:10
(154) В типовых как только не делается. На любой вкус пример найти думается можно.
(155) Я в курсе где конструктор, прикольно он запрос то делает.
   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
(164) Ну это мне скучно.
(165) Да не вопрос, я тебе хоть щас пулемет выдам.
(166) Я к вам попозже загляну. Хорошо мозги прочищаете.
   Dotoshin
 
169 - 19.10.16 - 14:17
   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
(172) ему лишь бы работало. он же ремеслом это считает.
так что пофиг
   bizon2008
 
174 - 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) да это его "вояния"... делать видимо нефиг, решил что-то переписать
   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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует