Имя: Пароль:
1C
 
Вот два куска аналогичного по фукционалу кода. Чей лучший?
0 bizon2008
 
19.10.16
08:15
Пару товарищам было выдано - задание было простое, внешняя печатная форма к доку реализация товаров и услуг. Максимально упрощенная.
Просьба дать оценку. Причем, как мне кажется первый пытался списывать у второго.

Код 1.

Функция Печать() Экспорт
    
    ТабДокумент = ПечатьДокумента();
    
    Возврат ТабДокумент;
КонецФункции





Функция ПечатьДокумента() экспорт
// запрос на Заголовок    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
    Запрос.Текст =
    "выбрать
    |    РеализацияТоваровУслуг.Номер,
    |    РеализацияТоваровУслуг.Дата,
    |    РеализацияТоваровУслуг.Контрагент как Покупатель,
    |   РеализацияТоваровУслуг.Организация,
    |    РеализацияТоваровУслуг.Организация как Поставщик
    |из
    |    Документ.РеализацияТоваровУслуг как РеализацияТоваровУслуг
    |где
    |    РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент";

    Шапка = Запрос.Выполнить().Выбрать();
    Шапка.Следующий();    
    
    
// запрос на товары

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаОбъект);
    Запрос.Текст =
    "
    |   выбрать
    |    РеализацияТоваровУслугТовары.Номенклатура.Артикул как Артикул,
    |    РеализацияТоваровУслугТовары.Номенклатура.НаименованиеПолное как Товар,
    |    РеализацияТоваровУслугТовары.Количество/ЕдиницыИзмерения.Коэффициент как Мест,
    |    РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаИзмеренияМест как ЕдиницаИзмеренияМест,
    |    РеализацияТоваровУслугТовары.Количество как Количество,
    |    РеализацияТоваровУслугТовары.ЕдиницаИзмерения
    | из
    |      Справочник.ЕдиницыИзмерения как ЕдиницыИзмерения
    |        Левое соединение Документ.РеализацияТоваровУслуг.Товары как РеализацияТоваровУслугТовары
    |        по (РеализацияТоваровУслугТовары.ЕдиницаИзмеренияМест = ЕдиницыИзмерения.Ссылка)
    | где
    |    РеализацияТоваровУслугТовары.Ссылка.Ссылка = &СсылкаНаДокумент";
    
    
    ЗапросТовары = Запрос.Выполнить().Выгрузить();

    ТабДокумент = Новый ТабличныйДокумент;

    Макет = ПолучитьМакет("РасходнаяНакладная");
    
    //шапка накладной
    ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокДокумента");
    ОбластьМакета.Параметры.НаименованиеДокумента = ОбщегоНазначения.СформироватьЗаголовокДокумента(Шапка, "Расходная накладная");
    ТабДокумент.Вывести(ОбластьМакета);

    //покупатель
    ОбластьМакета = Макет.ПолучитьОбласть("Покупатель");
    ОбластьМакета.Параметры.Покупатель = Шапка.Покупатель;
    ТабДокумент.Вывести(ОбластьМакета);
    
    // заголовок таблицы
    ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ТабДокумент.Вывести(ОбластьМакета);
    
    // товары
     ОбластьМакета = Макет.ПолучитьОбласть("Строка");
     КоличествоСтрокТовары = ЗапросТовары.Количество();
     ИтогоМест = 0;
     ИтогоКоличество = 0;
     Для НомерСтрокиВыборки = 0 По КоличествоСтрокТовары-1 Цикл
        ВыборкаСтрок =  ЗапросТовары[НомерСтрокиВыборки];
        ИтогоМест = ИтогоМест + ВыборкаСтрок.Мест;
        ИтогоКоличество = ИтогоКоличество + ВыборкаСтрок.Количество;
        ОбластьМакета.Параметры.Заполнить(ВыборкаСтрок);
        ОбластьМакета.Параметры.НомерСтроки = НомерСтрокиВыборки + 1;
             Если  Окр(ВыборкаСтрок.Мест,0,0) <> ВыборкаСтрок.Мест тогда
                  ОбластьМакета.Параметры.Примечание = "Ящик неполный";
                  
            КонецЕсли;
     ТабДокумент.Вывести(ОбластьМакета);        
     КонецЦикла;        
            
    // итоги        
     ОбластьМакета = Макет.ПолучитьОбласть("Итоги");
     ОбластьМакета.Параметры.ИтогоМест = ИтогоМест;
     ОбластьМакета.Параметры.ИтогоКоличество = ИтогоКоличество;
     ТабДокумент.Вывести(ОбластьМакета);

    
    
    
    
    Возврат ТабДокумент;
КонецФункции    

Код 2.

Функция ПолучитьТовары()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РеализацияТоваровУслугТовары.Номенклатура.Артикул КАК Артикул,
    |    РеализацияТоваровУслугТовары.Номенклатура.НаименованиеПолное КАК Товар,
    |    ЕдиницыИзмерения.Коэффициент КАК Коэффициент,
    |    РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаИзмеренияМест КАК ЕдиницаИзмеренияМест,
    |    РеализацияТоваровУслугТовары.Количество КАК Количество,
    |    РеализацияТоваровУслугТовары.Количество / ЕдиницыИзмерения.Коэффициент КАК Мест,
    |    РеализацияТоваровУслугТовары.ЕдиницаИзмерения
    |ИЗ
    |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |        ПО (РеализацияТоваровУслугТовары.ЕдиницаИзмеренияМест = ЕдиницыИзмерения.Ссылка)
    |ГДЕ
    |    РеализацияТоваровУслугТовары.Ссылка.Ссылка = &Док";

    Запрос.УстановитьПараметр("Док", СсылкаНаОбъект);
    ДанныеТовара = Запрос.Выполнить().Выгрузить();
    
    Возврат ДанныеТовара
КонецФункции    

// Внешняя функция печати
// Параметры
//  ИмяМакета  – Строка – имя формы печати
//
// Возвращаемое значение:
//   Булево   –Печать прошла успешно - Истина, иначе - Ложь
//
Функция Печать() Экспорт
    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("Макет");
    ОбластьЗаголовок   = Макет.ПолучитьОбласть("Заголовок");
    Док = СсылкаНаОбъект.ПолучитьОбъект();
    НомерДок  = Док.Номер;
    ДатаДок = Формат(Док.Дата,"ДЛФ=DD");
    ОбластьЗаголовок.Параметры.ЗаголовокПредставление = "Расходная накладная № " + НомерДок + " от " + ДатаДок;
    ОбластьЗаголовок.Параметры.Контрагент = Док.Контрагент.НаименованиеПолное;
    ТабДок.Вывести(ОбластьЗаголовок);
    
    ОбластьЗаголовокТаблицы   = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ТабДок.Вывести(ОбластьЗаголовокТаблицы);
    ДанныеНоменклатуры = ПолучитьТовары();
    нс = 1;
    Для Каждого СтрТовар Из ДанныеНоменклатуры Цикл
            ОбластьСтрока   = Макет.ПолучитьОбласть("Строка");
            ОбластьСтрока.Параметры.Заполнить(СтрТовар);
            ОбластьСтрока.Параметры.нс = нс;
            Если  Окр(СтрТовар.Мест,0,0) <> СтрТовар.Мест тогда
                ОбластьСтрока.Параметры.Примечание = "Ящик неполный"
            КонецЕсли;
            ТабДок.Вывести(ОбластьСтрока);
            нс = нс + 1;
    КонецЦикла;    
    
    ОбластьИтого   = Макет.ПолучитьОбласть("Итого");
    ОбластьИтого.Параметры.ИтогоМест = ДанныеНоменклатуры.Итог("Мест") ;
    ОбластьИтого.Параметры.ИтогоКолво  = ДанныеНоменклатуры.Итог("Количество") ;
    ТабДок.Вывести(ОбластьИтого);


            
    Возврат ТабДок

КонецФункции // Печать()


Спасибо.
1 bizon2008
 
19.10.16
08:15
От же криво вставилось.
2 rifat
 
19.10.16
08:17
Зачем это все?
3 bizon2008
 
19.10.16
08:24
(2) Я не силен. Но мне надо дать оценку соискателям.
4 SadrArt
 
19.10.16
08:32
Имхо первый код более читабелен. И он "стандартный"
5 4St
 
19.10.16
08:33
Запрос по товарам  некорректный и неоптимальный в обоих вариантах.

В коде варианта 2 присутствуют неявные запросы при заполнении шапки (Док.Контрагент.НаименованиеПолное), описание функции в комментариях не соответствует действительности (возвращает ТабличныйДокумент, а не Булево). Но код при этом чуть лучше структурирован, чем в портянке из 1. В варианте 1
непонятно, зачем нужна функция Печать() без параметров (рекомендуется к прочтению подход YAGNI).
6 АНДР
 
19.10.16
08:33
Первый.

Во втором

// Параметры
//  ИмяМакета  – Строка – имя формы печати

//
// Возвращаемое значение:

//   Булево   –Печать прошла успешно - Истина, иначе - Ложь
//

Функция Печать() Экспорт




    Док = СсылкаНаОбъект.ПолучитьОбъект();
    НомерДок  = Док.Номер;
    ДатаДок = Формат(Док.Дата,"ДЛФ=DD");
7 igorP
 
19.10.16
08:34
Первый вариант получше, т.к. второй получает параметры шапки через точку от Документа - лишнии запросы к бд. Но данный тест не показателен.
8 bizon2008
 
19.10.16
08:39
(5) Запрос по товарам  некорректный и неоптимальный в обоих вариантах.

Можете более подробно расписать? Спасибо.

В коде варианта 2 присутствуют неявные запросы при заполнении шапки (Док.Контрагент.НаименованиеПолное)

Это уже не допустимо так писать в восьмой версии?
9 Остап Сулейманович
 
19.10.16
08:40
(3) "Я не силен. Но мне надо дать оценку соискателям."
Я немножко в осадке. Бывший зема : где гарантия, что оценка будет хоть что-то отражать?
10 zva
 
19.10.16
08:41
(3) Не силен в чем?
Первый получает данные шапки одним запросом и работает с результатом выборки, второй каждый раз обращается Док.Номер, Док.Контрагент.НаименованиеПолное и т.д. - кто лучше очевидно. Далее работая с ТЧ оба зачем-то выгружают результат запроса в ТЗ вместо того, чтоб работать с выборкой запроса.
Комментарии к функции у второго тоже доставляют:
// Возвращаемое значение:
//   Булево   –Печать прошла успешно - Истина, иначе - Ложь
а в самой функции:
Возврат ТабДок
11 bizon2008
 
19.10.16
08:41
(4) А где критерии стандартности можно посмотреть, заинтересовало.
12 bizon2008
 
19.10.16
08:42
(9) Поэтому я у вас народ и спрашиваю. Вот лично мне код 2 понравился больше, а оно эвоно как, код 1 то лучше однако.
13 igorP
 
19.10.16
08:45
Тест не показателен, первый мог содрать структуру печатной формы с типовой, немного переделав,второй написал сам, хоть и чуть хуже
14 bizon2008
 
19.10.16
08:46
(10) второй каждый раз обращается Док.Номер, Док.Контрагент.НаименованиеПолное

Интересно, но там типа выше получен объект. А получается при Док.Номер, Док.Контрагент.НаименованиеПолное это отдельные запросы которые 1с сама генерирует однако? Думал ПолучитьОбъект сразу все притаскивает.
15 Остап Сулейманович
 
19.10.16
08:47
(12) Код 1 более привычен. Получается из-под конструктора печати, затем допиливается, если нужно, напильником.
По большому счету код 2 ничем не хуже. Замечание по поводу "Док.Контрагент.НаименованиеПолное" в данном случае необоснованно. Если бы нужно было получать несколько полей элемента справочника - тогда все так. Поскольку поле одно - количество обращений к базе будет одно. Хоть запросом, хоть через точку.
16 bizon2008
 
19.10.16
08:48
(13) Коли Вам не в тягость, может у Вас есть более показательный тест? Заранее благодарен.
17 IlyaSR
 
19.10.16
08:49
У второго больше косяков, например
каждый раз зачем-то получает ОбластьСтрока   = Макет.ПолучитьОбласть("Строка");
также зачем-то получает объект Док = СсылкаНаОбъект.ПолучитьОбъект();


Теперь осталось первому дать написанное вторым и наоборот, чтобы нашли и объяснили ошибки, вот тут сразу станет все понятно с пониманием написания кода
18 АНДР
 
19.10.16
08:50
(8) Писать допустимо, но не оптимально. А вот получать объект - явно лишнее.

P.S. И комментарии не соответствующие коду - совсем не хорошо.
19 Dotoshin
 
19.10.16
08:50
(8) + В первом варианте, вместо обхода результатов запроса зачем-то используется цикл со счетчиком, кроме этого зачем-то два раза выбирается Организация, это было логично, если бы использовался метод - Заполнить для области табличного документа.
Во втором варианте тоже вместо обхода результата выборки она зачем-то выгружается  в ТЗ.
Ну остальное уже в других постах описали...
20 igorP
 
19.10.16
08:51
(15) В данном случае вообще неоптимально получать объект, т.к. изменять его не планируем. Нужно было запросом получить нужные поля для шапки
21 HawkEye
 
19.10.16
08:51
(0) бери обоих на испытательный срок... без вводных такие тесты - не показательны...
22 Dotoshin
 
19.10.16
08:53
(8) >>Это уже не допустимо так писать в восьмой версии?
Так писать не оптимально, такая форма записи порождает запрос к БД. Если у вас будет реализована групповая печать этих документов, то такой код будет совсем "не айс".
23 Лефмихалыч
 
19.10.16
08:53
первый лучше - косвенных запросов нет и запросами получается то и только то, что необходимо.

ПолучитьОбъект() читает и табличные части тоже, то есть данные по товарам читаются два раза. Да и обращение через точку - это плюс запрос.

Которого из них брать, по этому коду не скажешь. Вообще по коду такое решение нельзя принимать. Кто умнее, того и бери.
24 FIXXXL
 
19.10.16
08:55
(14) Док.Контрагент.НаименованиеПолное получает неявно по ссылке весь объект Контрагент, от которого в Док только ссылка
25 ks_83
 
19.10.16
09:01
Оба г., потому что писать отчеты надо на СКД. И объясните мне что там делает левое соединение справочника ЕдиницыИзмерения с табличной частью?
26 АНДР
 
19.10.16
09:03
(25) Похоже оба соискателя решили топикстартера проверить на "левое соединение". ;)
27 igorP
 
19.10.16
09:03
(16)Тестовое мини-задание.



Есть справочники:

- Номенклатура

- Склады (содержит реквизит ТипРозничныхЦен(СправочникСсылка.ТипыЦенНосенклатуры))

- ТипыЦенНоменклатуры



Регистр Сведений: ЦеныНоменклатуры (Периодический, подчинен регистратору)

- Измерения:   Номенклатура, ТипЦен

- Ресурс: Цена



Регистр накопления: ТоварыНаСкладах(Остатки)

- Измерения: Склад, Номенклатура

- Ресурс: Количество



Задача: Написать запрос(отчет), который бы показывал остатки и цены номенклатуры в разрезе складов и номенклатуры. Так же необходимо, чтобы в этом отчете выводились нулевые остатки и цены.
28 АНДР
 
19.10.16
09:03
(26) + Об этом в (8) написано.
29 bizon2008
 
19.10.16
09:05
(21) Они оба на испытательном, который подходит к концу. Аборигены в 1С как в апельсинах. Я так типа вообще гуру однако. Вот такой вариант придумал. Первый чисто на програ претендует, второй очень неплохой сисадмино, прог он так побочно. Если берем первого на прога, то второй в админы перейдет. Но первый УПП не знает, второй более - менее шарит.
30 aleks_default
 
19.10.16
09:07
(29)У вас весь отдел уволить надо
31 bizon2008
 
19.10.16
09:08
(25) Это не отчет, это внешняя печатная форма. Там СКД вроде не работает.
Узнают сколько бутылок в ящике, это коэффициент в единицах измерения.
32 bizon2008
 
19.10.16
09:09
(30) А нет отдела. ИТ инфраструктура в зачаточном состоянии, как-то работает и ладно.
33 FIXXXL
 
19.10.16
09:10
(31) левое то соединение нафига? из Справочник.ЕдиницыИзмерения как ЕдиницыИзмерения никаких данных не используется

они похоже скопипастили запрос откуда-то
34 aleks_default
 
19.10.16
09:11
РеализацияТоваровУслугТовары.Ссылка.Ссылка
РеализацияТоваровУслугТовары.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка
35 Dotoshin
 
19.10.16
09:11
(31) ЛВЗ?
36 bizon2008
 
19.10.16
09:14
(27) Чето просто как-то, СКД один запрос. Вы если не против я попробу, а потом Вас позову глянуть чего это я сварганил.

Такая интересная тема получилась. Спасибо всем. Большое такое.
37 scanduta
 
19.10.16
09:14
(0) Сравнивать код в печатной форме, да вам заняться больше нечем
38 PLUT
 
19.10.16
09:15
(31) чой-то? СКД везде работает, даже с внешними источникам данных и с вызовом экспортных функций
39 bizon2008
 
19.10.16
09:15
(35)Нет, типовая УПП. Причем нафуя ее брали, им БП с головой. Работает с десяток бухов. Смотрят только проводки, где не сходится тупо операциями колбасят, и потом классика программа плохая.
40 bizon2008
 
19.10.16
09:16
(37) Ну первое что в голову пришло. Можете предложить что-то лучше?
41 Дарлок
 
19.10.16
09:17
(0)
это писал один и тот же человек
42 FIXXXL
 
19.10.16
09:18
(41) или сдернуто с одного места и переделано, как курсовик с инета :)
43 Дарлок
 
19.10.16
09:18
+(41) либо второй писал видя первый код
44 Дарлок
 
19.10.16
09:19
(42) ;)) бинго
45 bizon2008
 
19.10.16
09:21
(33) Коэффициент получить.
Вот тута.   РеализацияТоваровУслугТовары.Количество/ЕдиницыИзмерения.Коэффициент как Мест,
46 bizon2008
 
19.10.16
09:21
(43) Второй написан раньше.
47 bizon2008
 
19.10.16
09:23
(38) Это как 1С далеко ушла та. Я в типовых такое не видел. На СКД печатаные формы доков еще не попадались. Надо будем в новых поискать однако.
48 Дарлок
 
19.10.16
09:24
(46) не существенно. в обоих вариантах одни и те же генетические ошибки. А если по мелочам, то в втором варианте, тоже свои плюсы есть
49 ks_83
 
19.10.16
09:24
(31) Во-первых слева должна быть табличная часть, а во вторых соединение вообще там не нужно, ибо коэффициент и так уже есть в ЕдиницаИзмеренияМест.
50 Dotoshin
 
19.10.16
09:30
(47) Лучше в интернете поищи, вот например: https://helpf.pro/faq/view/1400.html
51 bizon2008
 
19.10.16
09:31
(48)Вы же дружно зафукали второй.
52 laeg
 
19.10.16
09:35
(0) Оба варианта криво написаны. Дать еще одно контрольное задание.
53 FIXXXL
 
19.10.16
09:35
(49) +1
54 igorP
 
19.10.16
09:39
(36) Тест простой, но в запросе будет видна работа с виртуальными таблицами, правильностью соединений, конструкция ЕстьNull и т.д.
55 bizon2008
 
19.10.16
09:39
(49)Так?
ВЫБРАТЬ
    Товары.Номенклатура.Артикул КАК Артикул,
    Товары.Номенклатура.НаименованиеПолное КАК Товар,
    Товары.Номенклатура.ЕдиницаИзмеренияМест КАК ЕдиницаИзмеренияМест,
    Товары.Количество КАК Количество,
    Товары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    Товары.Номенклатура.ЕдиницаИзмеренияМест.Коэффициент КАК Коэффициент,
    Товары.Количество / Товары.Номенклатура.ЕдиницаИзмеренияМест.Коэффициент КАК Мест
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
    Товары.Ссылка.Ссылка = &Док
56 bizon2008
 
19.10.16
09:40
(54) Отлично. Спасибо.
57 FIXXXL
 
19.10.16
09:41
(55) типа того
НО на больших объемах выборки, по феншую, надо все-таки левое соединение, план запроса оптимальнее получится
58 mkalimulin
 
19.10.16
09:41
(0) Второй лучше.
59 bizon2008
 
19.10.16
09:43
(57) Дык сказали хрено оно тама.
60 Dotoshin
 
19.10.16
09:45
(40) Устрой им экзамен. Скачай билеты по 1с, выбери из них вопросы в которых сам шаришь и протестируй своих подопечных.
61 igorP
 
19.10.16
09:46
(56) Для усложнения, можно попросить добавить отбор по номенклатуре и склада.
62 mkalimulin
 
19.10.16
10:17
Не надо ничего усложнять. Из приведенного в (0) ясно, что второй код писал более опытный человек.
63 Dmitrii
 
гуру
19.10.16
10:22
(0) Оба фигню написали, так как не соответсвует требованиям продсистемы Печать БСП:
http://its.1c.ru/db/bspdoc#content:446:1:issogl2_разработка_процедуры_печать
Для того, чтобы их поделку можно было использовать, как внешнюю печатную форму, эти требования должны выполняться.

Если выбирать из двух вариантов, то первый лучше.
Но оба почему-то делают отдельные запросы к шапке и к табличной части.
То есть групповая печать ими не рассматривается вообще? При печати сотни накладных будет выполнено 200 запросов.
За запросы в цикле вроде как бы расстрел без права переписки полагается.
Второй еще и объект тянет из базы зачем-то.

Если выбирать не из чего, то оставлять первого. Ибо второй вообще не понимает что делает.

(11) >> А где критерии стандартности можно посмотреть, заинтересовало.
http://its.1c.ru/db/bspdoc#content:427:1:issogl3_пример_внешняя_печатная_форма
http://its.1c.ru/db/bspdoc#content:446:1:issogl2_разработка_процедуры_печать
64 Мойдодыр
 
19.10.16
10:26
по 3 балла из 5 каждому
65 Timon1405
 
19.10.16
10:26
(0) задача делается очень быстро с помощью v8: Конструктор внешних печатных форм NEW (обычные и управляемые приложения)
считаю, что задача программиста в том числе уметь найти оптимальное решение по-максимуму используя имеющиеся в т.ч. чужие наработки.
решение в данном случае - погуглить, подумать, сделать
66 Dmitrii
 
гуру
19.10.16
10:28
+ к (63) Ссылки почему-то криво вставились. Хвосты определились просто как кусок текста.
67 Dmitrii
 
гуру
19.10.16
10:30
(27) >> чтобы в этом отчете выводились нулевые остатки и цены

Ну с нулевыми ценами понятно.
А что такое нулевые остатки? То есть предполагается, что вся номенклатура как она там есть в справочнике может присутствовать на каждом из складов? Какой в этом сокральный смысл? В 90% случаев набор номенклатуры обритающейся на каждом из складов довольно разный.

В любом случае ничего особо сложного в этом отчете нет.
Если группировку по номенклатуре сделать в строках, а по складам - в колонках, то даже симпатичненько может получиться (если только складов не слишком много).
68 Господин ПЖ
 
19.10.16
10:30
> что задача программиста в том числе уметь найти оптимальное решение по-максимуму используя имеющиеся в т.ч. чужие наработки.

чужие проверять надо сверху донизу. на это тоже время надо. иногда сопоставимое с собственной писаниной
69 bizon2008
 
19.10.16
10:39
(63) Но оба почему-то делают отдельные запросы к шапке и к табличной части.

А как один засунуть? Сходу что не соображу.

Да вообще запрос в шапке возвращает одну строку. Ее так и гонять как выборку что ли?
70 Dmitrii
 
гуру
19.10.16
10:39
(65) В топку такой конструктор. Ибо результат его работы не вписывается в актуальные версии БСП. А раз так, то чем он лучше встроенного в конфигуратор конструктора? Только наличием шаблона?
71 bizon2008
 
19.10.16
10:39
(69) Мне вот это сосем не нравится.
Шапка = Запрос.Выполнить().Выбрать();
ДанныеШапки = Шапка.Следующий();
72 Timon1405
 
19.10.16
10:41
(70) так-то у ТС УПП, так что шаблоны БСП для них неактуальны
73 Господин ПЖ
 
19.10.16
10:43
>у ТС УПП

тогда накуа вообще вся эта затея с "конструкторами"

для обычных форм требований всего два - реквизит и экспортная функция. шаблон с авторегистрацией - добавить по вкусу
74 ks_83
 
19.10.16
10:44
Может ТС нас разводит? Ему дали тестовое задание, а мы теперь ему решения предлагаем.
75 Мойдодыр
 
19.10.16
10:47
(71) ты что, это же стандарт от 1с во всех типовых
76 bizon2008
 
19.10.16
10:48
(74) Нет. Слово офицера. Я блин в коли веки, тут выполз в Интернете посидеть, да вот озадачили. Но я столько нового узнал. Спасибо.
Могу подписку притащить.
77 Vladal
 
19.10.16
10:48
(10) Хм.. посмотрите в типовой отчет по отпускам или печать ведомости отпусков...  Цикли Если Истина ... ... прерва иначе выборка = запрос.выполнить; КонецЦикла
78 bizon2008
 
19.10.16
10:50
(75) Нихрена себе а в не 1С за это рукам бьют.
Линейкой.
Я вот наваял.
Функция ПолучитьШапку()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РеализацияТоваровУслуг.Номер КАК Номер,
    |    РеализацияТоваровУслуг.Дата КАК Дата,
    |    РеализацияТоваровУслуг.Контрагент.НаименованиеПолное КАК Контрагент
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |    РеализацияТоваровУслуг.Ссылка = &Док";
    
    Запрос.УстановитьПараметр("Док", СсылкаНаОбъект);
    Шапка = Запрос.Выполнить().Выбрать();
    ДанныеШапки = Шапка.Следующий();
    
    Возврат ДанныеШапки

КонецФункции    

Потом к ней пытаюсь обратится.

ДанныеШапки = ПолучитьШапку();
    НомерДок  = ДанныеШапки.Номер;
    ДатаДок = Формат(ДанныеШапки.Дата,"ДЛФ=DD");
    ОбластьЗаголовок.Параметры.ЗаголовокПредставление = "Расходная накладная № " + НомерДок + " от " + ДатаДок;
    ОбластьЗаголовок.Параметры.Контрагент = ДанныеШапки.Контрагент;
    ТабДок.Вывести(ОбластьЗаголовок);

И получаю облом.
Значение не является значением объектного типа (Номер)
НомерДок  = ДанныеШапки.Номер;
79 spock
 
19.10.16
10:52
Обоих не брать :)
80 bizon2008
 
19.10.16
10:53
(79) Дык больше вариантов нету.
81 spock
 
19.10.16
10:56
+79 чисто с практической стороны, ведь может быть такое, что в табличной части документа не будет указана ед.изм. в какой-нибудь строке. Тогда оба эти примера выведут на печать макеты без этих строк, т.к. левое соединение не сработает.
82 spock
 
19.10.16
10:56
+81 а претенденты, явно видно, не умеет писать запросы без конструктора.
83 Мойдодыр
 
19.10.16
10:57
(82) Умение писать без конструктора - это уже почти сеньор
84 spock
 
19.10.16
10:58
+82 в обоих случаях "РеализацияТоваровУслугТовары.Ссылка.Ссылка" - wtf.

Выгнать обоих на склад кладовщиками работать :)
85 ptiz
 
19.10.16
10:58
(78) ДанныеШапки = Шапка.Следующий();
возвращает булево вообще-то :)
86 Мойдодыр
 
19.10.16
10:58
(78) Ты левй код написал. Следующий() возвращает булево
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) типа, как в анекдоте: "знал бы за что...", не?)