Имя: Пароль:
1C
 
Вот два куска аналогичного по фукционалу кода. Чей лучший?
,
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
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
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) типа, как в анекдоте: "знал бы за что...", не?)