Имя: Пароль:
1C
1С v8
Программный код 1С
,
0 Pe3HuK
 
29.12.15
13:52
Я новичок в 1с. Не могу разобраться в коде программиста. Сам код:
Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗаказПокупателяТовары.Количество,
    |    ЗаказПокупателяТовары.Ссылка.Ссылка КАК Документ,
    |    ЗаказПокупателяТовары.Сумма,
    |    ЗаказПокупателяТовары.Цена,
    |    ЗаказПокупателяТовары.Номенклатура
    |ИЗ
    |    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
    |ГДЕ
    |    ЗаказПокупателяТовары.Ссылка.Проведен = &Истина
    |
    |УПОРЯДОЧИТЬ ПО
    |    ЗаказПокупателяТовары.Ссылка.Номер";
    Запрос.УстановитьПараметр("Истина", Истина);
    
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    
    Если Не Результат.Пустой() Тогда
        
        
             
        Ссылка = "";
        Ит = 1;
        
        Пока Выборка.Следующий() Цикл
            
            
            
            Если Ссылка <> Выборка.Документ И Ит = 1 Тогда
                
                ЗаказПокупателя = ФабрикаXDTO.Создать(ЗаказПокупателяТип);
                ЗаказПокупателя.Номер = Выборка.Документ.Номер;
                ЗаказПокупателя.Дата = Выборка.Документ.Дата;
                Ссылка = Выборка.Документ;
                Ит =2;
                ЗаказПокупателяСтрока = ФабрикаXDTO.Создать(ЗаказПокупателяСтрокаТип);
                Номенклатура = ФабрикаXDTO.Создать(НоменклатураТип);
                Номенклатура.Код = Выборка.Номенклатура.Код;
                Номенклатура.Наименование = Выборка.Номенклатура.Наименование;
                ЗаказПокупателяСтрока.Номенклатура = Номенклатура;
                ЗаказПокупателяСтрока.Количество = Выборка.Количество;
                ЗаказПокупателяСтрока.Цена = Выборка.Цена;
                ЗаказПокупателяСтрока.Сумма = Выборка.Сумма;
                ЗаказПокупателя.Товары.Добавить(ЗаказПокупателяСтрока);
                МассивЗаказовПокупателей.ЗаказПокупателя.Добавить(ЗаказПокупателя);
                
            ИначеЕсли Ссылка <> Выборка.Документ  Тогда
                
                ЗаказПокупателя = ФабрикаXDTO.Создать(ЗаказПокупателяТип);
                ЗаказПокупателя.Номер = Выборка.Документ.Номер;
                ЗаказПокупателя.Дата = Выборка.Документ.Дата;
                Ссылка = Выборка.Документ;
                ЗаказПокупателяСтрока = ФабрикаXDTO.Создать(ЗаказПокупателяСтрокаТип);
                Номенклатура = ФабрикаXDTO.Создать(НоменклатураТип);
                Номенклатура.Код = Выборка.Номенклатура.Код;
                Номенклатура.Наименование = Выборка.Номенклатура.Наименование;
                ЗаказПокупателяСтрока.Номенклатура = Номенклатура;
                ЗаказПокупателяСтрока.Количество = Выборка.Количество;
                ЗаказПокупателяСтрока.Цена = Выборка.Цена;
                ЗаказПокупателяСтрока.Сумма = Выборка.Сумма;
                ЗаказПокупателя.Товары.Добавить(ЗаказПокупателяСтрока);
                МассивЗаказовПокупателей.ЗаказПокупателя.Добавить(ЗаказПокупателя);
                
            Иначе
                
                Ссылка = Выборка.Документ;
                ЗаказПокупателяСтрока = ФабрикаXDTO.Создать(ЗаказПокупателяСтрокаТип);
                Номенклатура = ФабрикаXDTO.Создать(НоменклатураТип);
                Номенклатура.Код = Выборка.Номенклатура.Код;
                Номенклатура.Наименование = Выборка.Номенклатура.Наименование;
                ЗаказПокупателяСтрока.Номенклатура = Номенклатура;
                ЗаказПокупателяСтрока.Количество = Выборка.Количество;
                ЗаказПокупателяСтрока.Цена = Выборка.Цена;
                ЗаказПокупателяСтрока.Сумма = Выборка.Сумма;
                ЗаказПокупателя.Товары.Добавить(ЗаказПокупателяСтрока);
            КонецЕсли;    
        КонецЦикла;
    КонецЕсли;
    
Не понятно для чего и как работает условие Если, и можно ли как то упростить сам код?
1 Lexey_
 
29.12.15
13:54
|ГДЕ
|    ЗаказПокупателяТовары.Ссылка.Проведен = &Истина
Запрос.УстановитьПараметр("Истина", Истина)
это пять
2 mikecool
 
29.12.15
13:56
(1) в 8.0 вроде как еще приходилось так писать или ошибаюсь?
3 Garykom
 
гуру
29.12.15
13:57
(1) а вдруг оно не истина/ложь а непределено/нулл ?
4 Lexey_
 
29.12.15
13:59
(2)на счет 8.0 не скажу
(3)не в этом запросе
5 mikecool
 
29.12.15
14:00
(4) согласен, в этом запросе обматерит в случае Заказ = нулл
6 Живой Ископаемый
 
29.12.15
14:07
2(0) Код простой. Условие Если Ссылка <> Выборка.Документ
проверяет - сменился ли документ в выборке, или по-прежнему все еще тот что и в предыдущей строке.

Избавиться от условия вообще наверное можно, изменив сам запрос. Все
7 Ластик
 
29.12.15
14:09
насколько помню все что сравнивается с нулом считается ложью, так что пофигу, и в 8.0 это тоже работало без сравнения
8 18_plus
 
29.12.15
14:10
не будет в этом запросе никаких нуллов.

если тока база битая.
9 Enterprise
 
29.12.15
14:14
(8) +1
10 Сияющий Асинхраль
 
29.12.15
14:16
Если в запросе поставить итоги по документу, то, в принципе, "если" не нужны, ну и код подсократиться и внятней станет, правда цикла тогда два должно быть - по документу и по номенклатуре...
11 Mort
 
29.12.15
14:17
Вброшу:
Больше 12 строк между "Если " и "КонецЕсли" или аналогичных структур это г-код.

(0) А по теме надо сделать в запросе итоги по ссылке и обходить ссылки, а по ним строки.
12 18_plus
 
29.12.15
14:38
(11) с каких пор ветвление стало г-кодом?
аналогичные структуры это циклы и попытки?
13 Garykom
 
гуру
29.12.15
14:41
(11) да группировку по заказу сделать чтобы товары заказа вместе были и 2 циклами их обойти
14 Живой Ископаемый
 
29.12.15
14:44
2(11) В 8.3 отлично работает рефакторинг.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший