Форум программистов, компьютерный форум, киберфорум
Наши страницы
Войти
Регистрация
Восстановить пароль
 
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
#1

Формирование отчета, захватывает лишние строки - 1С/1C 8.x

18.05.2018, 11:42. Просмотров 268. Ответов 12
Метки нет (Все метки)

Доброго времени суток,

Прошу помочь разобраться с формированием запроса - пытаюсь разобраться, но все никак. Вроде бы изначально все работало, но в ходе проверок выявил странное поведение. Имеется две функции:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Функция СформироватьЗапросДляПечатиЛичнаяПремия()
 
    Запрос = Новый Запрос;
 
    // Установим параметры запроса
    Запрос.УстановитьПараметр("ДокументСсылка", Ссылка);
    Запрос.УстановитьПараметр("ДатаДокумента",  Дата);
 
            Макет = Документы.ЗаработнаяПлатаСотрудникиАГЗС.ПолучитьМакет("ЛичнаяТаблица");
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |      ЗаработнаяПлатаСотрудникиАГЗС.ФИОСотрудника,
        |      ЗаработнаяПлатаСотрудникиАГЗСРеквизиты.РасчетныйМесяц,
        |      ЗаработнаяПлатаСотрудникиАГЗС.Тариф,
        |      СлужебнаяЗаписка.Процент,
        |      ЛучшиеПродажиСправочник.Третья,
        |      ЗаработнаяПлатаСотрудникиАГЗС.ИтогоКНачислению
        |ИЗ
        |      Документ.ЗаработнаяПлатаСотрудникиАГЗС КАК ЗаработнаяПлатаСотрудникиАГЗСРеквизиты,
        |      Документ.ЗаработнаяПлатаСотрудникиАГЗС.ОбщийСписок КАК ЗаработнаяПлатаСотрудникиАГЗС
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВСлужебнаяЗаписка КАК СлужебнаяЗаписка
        |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ТипСлужебнойЗаписки = СлужебнаяЗаписка.Ссылка,
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВСотрудники КАК Сотрудники
        |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ФИОСотрудника = Сотрудники.Ссылка,
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВЛучшиеПродажи КАК ЛучшиеПродажиСправочник
        |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ЛучшиеПродажи = ЛучшиеПродажиСправочник.Ссылка
        |ГДЕ
        |      ЗаработнаяПлатаСотрудникиАГЗС.Ссылка В(&Ссылка)";
        Запрос.Параметры.Вставить("Ссылка", Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
 
    Возврат Запрос.Выполнить();
 
 
КонецФункции
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Функция ПечатьЛичнаяТаблица(ДокументОбъект)
 
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ПолеСлева = 0;
    ТабДокумент.ПолеСправа = 0;
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
 
    // получаем данные для печати
    ВыборкаДанные = СформироватьЗапросДляПечатиЛичнаяПремия().Выбрать();
    
    Пока ВыборкаДанные.Следующий() Цикл
        Макет = ПолучитьМакет("ЛичнаяТаблица");
        ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка"); // Шапка документа.
        ОбластьМакетаТаблица = Макет.ПолучитьОбласть("Таблица");// Подвал документа
        ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал"); // строка работника
        
        ВыводитьИтоги = Ложь;
        
        Если ВыборкаДанные.Следующий() Тогда 
            ОбластьМакетаШапка.Параметры.Заполнить(ВыборкаДанные); // Шапка документа.
            
        
            ТабДокумент.Вывести(ОбластьМакетаШапка);
                
            ОбластьМакетаТаблица.Параметры.Заполнить(ВыборкаДанные); // Шапка документа.
            
            ТабДокумент.Вывести(ОбластьМакетаТаблица);
            
            
            ОбластьМакетаПодвал.Параметры.Заполнить(ВыборкаДанные); // Шапка документа.
            
        КонецЕсли;
        
                ТабДокумент.Вывести(ОбластьМакетаПодвал);
    КОНЕЦЦИКЛА; 
 
    ТабДокумент.АвтоМасштаб = Истина;
    
    Возврат ТабДокумент;
 
КонецФункции
И все как мне казалось работает, но в отчет попадает по нескольку фамилий сотрудников, хотя в документе она фигурировала лишь один раз. Я посмотрел и понял, что она вероятно подтягивается из прошлых документов. Поэтому удалил строки: "ЗаработнаяПлатаСотрудникиАГЗСРеквизиты.РасчетныйМесяц," и "Документ.ЗаработнаяПлатаСотрудникиАГЗС КАК ЗаработнаяПлатаСотрудникиАГЗСРеквизиты,".
Конструктор запросов показывает, что все хорошо, но на деле перестала попадать часть сотрудников в макет. Просто подтягивается один из трех, причем логика по которой он подтягивается мне непонятно.
Помогите, пожалуйста разобраться в чем дело. Сколько не формировал запросов - везде все работало, а тут я в тупике.
Честно скажу, в 1С не силен, делаю больше для себя в свободное от основной работы время, за основу брал функции из ЗУП)
Заранее благодарю.
0
Изображения
 
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2018, 11:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос 1C 8.x Формирование отчета, захватывает лишние строки (1С):

Формирование отчета
Подскажите, как сделать формирование отчета, если он выполнен без использования...

формирование отчета в 1С 8.0
с нуля разработал конфигуратор (1С Предприятие 8 ) суть заключается в чем, есть...

Формирование отчета
Здравствуйте! Помогите переправить отчет пожалйста. Есть отчет Движение...

Формирование отчета
Здравствуйте! Никак не могу разобраться. Я создал отчет с нуля. Мне нужно при...

Формирование отчета в самописной конфигурации
В начале немного о конфигурации - приведу скриншоты объектов конигурации. ...

Проблема при формирование отчета в Рознице
Есть док. (рис.1), при формирование отчета др. сумма (рис.2), а при расшифровке...

12
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
18.05.2018, 14:34  [ТС] #2
Прошу прощения, почитал описание, понял что очень все запутал. Проблема в том, что задваивает сотрудников в формируемом печатном документе.
Я попробовал и если я удаляю "Документ.ЗаработнаяПлатаСотрудникиАГЗС.ОбщийСписок КАК ЗаработнаяПлатаСотрудникиАГЗС" то формирует правильное количество шаблонов, но мне не удается подтянуть в них данные.
Если удаляю "Документ.ЗаработнаяПлатаСотрудникиАГЗС КАК ЗаработнаяПлатаСотрудникиАГЗСРеквизиты", то выводятся все нужные данные, но только для одного сотрудника из 3-х внесенных в документ.
Под удаляю я имею ввиду что удаляю и меняю запросы.
0
Volexovich
193 / 170 / 27
Регистрация: 24.10.2011
Сообщений: 667
18.05.2018, 16:24 #3
Ты изначально запариваешь ситуацию. Несколько тем назад уже рассматривалась похожая тема, но там было про СОМ-соединение.
Фишка в том, что документы это одна таблица, а табличная часть документа, это другая таблица. По этому ты можешь обращаться чисто к таблице с табличной частью документа, так как она обязательно будет содержать ссылку на сам документ из которого тебе нужны реквизиты.
1
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
18.05.2018, 17:33  [ТС] #4
Цитата Сообщение от Volexovich Посмотреть сообщение
Ты изначально запариваешь ситуацию. Несколько тем назад уже рассматривалась похожая тема, но там было про СОМ-соединение.
Фишка в том, что документы это одна таблица, а табличная часть документа, это другая таблица. По этому ты можешь обращаться чисто к таблице с табличной частью документа, так как она обязательно будет содержать ссылку на сам документ из которого тебе нужны реквизиты.
Добрый день,
Спасибо за ответ.
Прошу прощения, если не до конца понял, но я пытаюсь составить даже самый простой запрос:
1C
1
2
3
4
5
6
"ВЫБРАТЬ
        |      ЗаработнаяПлатаСотрудникиАГЗС.ФИОСотрудника
        |ИЗ
        |      Документ.ЗаработнаяПлатаСотрудникиАГЗС.ОбщийСписок КАК ЗаработнаяПлатаСотрудникиАГЗС
        |ГДЕ
        |      ЗаработнаяПлатаСотрудникиАГЗС.Ссылка В(&Ссылка)";
И у меня выводит лишь одного сотрудника из трех. Я абсолютно не понимаю логику, почему так.
То-ли пятница, сказывается, то-ли я вплотную не вижу темы на которую Вы ссылаетесь)

Т.е. Вы имеете ввиду, что мне нужно сделать соединение между документом и табличной частью по аналогии с этим?
1C
1
2
|       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВСлужебнаяЗаписка КАК СлужебнаяЗаписка
      |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ТипСлужебнойЗаписки = СлужебнаяЗаписка.Ссылка,
Прошу простить если задаю совсем глупый вопрос, но, я в каком то ступоре от вылезшего косяка, а к подобным вопросам в своем обучении 1С я еще не дошел.
Спасибо.
0
Volexovich
193 / 170 / 27
Регистрация: 24.10.2011
Сообщений: 667
21.05.2018, 12:51 #5
Запрос правильный, должен выбрать всех кто в табличных частях, левое соединение с документом избыточно.
И вообще сбор инормации по списку документов это моветон, обычно информацию собирают из регистров, они созданы для частых обращений к ним, обращения непосредственно к документам проходят дольше.
1
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
21.05.2018, 14:46  [ТС] #6
Спасибо.
Как мне много предстоит еще узнать. А как я могу заменить левое соединение в данном случае? Я их сделал после того, как мне выбивало ошибку, что неоднозначные значения.
Честно говоря по регистрам не очень понял что имеется ввиду, но, думаю я еще к этому просто не дошел.
0
Volexovich
193 / 170 / 27
Регистрация: 24.10.2011
Сообщений: 667
21.05.2018, 17:02 #7
Цитата Сообщение от Гидролокатор Посмотреть сообщение
А как я могу заменить левое соединение в данном случае?
Соединения делаются, если запрос захватывает несвязанные с документом данные или требуется специфическая компановка данных.
У вас же все данные можно вытягивать из самого документа.
Цитата Сообщение от Гидролокатор Посмотреть сообщение
регистрам не очень понял что имеется ввиду
Если документ делает движения по регистрам, то информацию лучше брать из них.
1
Yulunga
301 / 204 / 62
Регистрация: 22.04.2013
Сообщений: 1,188
Завершенные тесты: 1
21.05.2018, 18:27 #8
Гидролокатор, вот так обычно происходит ( ПКО - модуль объекта ). и брать из регистра накопления потом, а не из документа
1
Миниатюры
Формирование отчета, захватывает лишние строки  
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
22.05.2018, 11:48  [ТС] #9
Volexovich, Спасибо.
Т.е. в данном случае, если я беру данные из справочника, в котором есть данные поля, а в моем созданном документе их нет, то я могу обойтись без них? Сейчас попробую, я просто за счет соединений исправил ошибку, возможно я сам не понял как.
Сегодня дополнительно попробую корректировать запрос, не удается за него серьезно засесть.

Добавлено через 3 минуты
Yulunga, Спасибо, честно говоря у меня была идея сделать через него, но я не знал как и решил отложить на потом. По сути сейчас без особых знаний основ придумываю велосипед. К сожалению.
0
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
22.05.2018, 12:09  [ТС] #10
Yulunga, Volexovich, Убрал из запроса все левые соединения(для теста), получилась ситуация, что в отчет попадает 4 человека, ходя заводилось 3. Виталий номер 2 вывелся два раза. У одного поле "Расчетный месяц" пустое, а у второго как документе. ВОт этого я совсем не понимаю, почему их всех не задвоило.
0
Миниатюры
Формирование отчета, захватывает лишние строки  
Volexovich
193 / 170 / 27
Регистрация: 24.10.2011
Сообщений: 667
22.05.2018, 15:12 #11
Измени запрос на
Кликните здесь для просмотра всего текста
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      "ВЫБРАТЬ
        |      ЗаработнаяПлатаСотрудникиАГЗС.ФИОСотрудника,
        |      ЗаработнаяПлатаСотрудникиАГЗС.Ссылка.РасчетныйМесяц КАК РасчетныйМесяц,
        |      ЗаработнаяПлатаСотрудникиАГЗС.Тариф,
        |      СлужебнаяЗаписка.Процент,
        |      ЛучшиеПродажиСправочник.Третья,
        |      ЗаработнаяПлатаСотрудникиАГЗС.ИтогоКНачислению
        |ИЗ
        |      Документ.ЗаработнаяПлатаСотрудникиАГЗС.ОбщийСписок КАК ЗаработнаяПлатаСотрудникиАГЗС
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВСлужебнаяЗаписка КАК СлужебнаяЗаписка
        |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ТипСлужебнойЗаписки = СлужебнаяЗаписка.Ссылка,
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВСотрудники КАК Сотрудники
        |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ФИОСотрудника = Сотрудники.Ссылка,
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФВЛучшиеПродажи КАК ЛучшиеПродажиСправочник
        |       ПО ЗаработнаяПлатаСотрудникиАГЗС.ЛучшиеПродажи = ЛучшиеПродажиСправочник.Ссылка
        |ГДЕ
        |      ЗаработнаяПлатаСотрудникиАГЗС.Ссылка В(&Ссылка)";

Цитата Сообщение от Гидролокатор Посмотреть сообщение
Т.е. в данном случае, если я беру данные из справочника, в котором есть данные поля, а в моем созданном документе их нет, то я могу обойтись без них?
Нет не так. Если в твоем документе есть ссылка на элемент справочника, то ты можешь вытащить любое значение этого элемента справочника через сам документ. А вот если у тебя связанный справочник, в котором несколько связанных значений исходного элмента докуента, то тут да, только левое соединение.

Например: Есть Физ лицо, у него есть дочь, сын, жена, брат и т.д. (Справочник РодняФизЛиц с измерениемяи Физлицо,Родство,ФИО). Ты принимаешь его на работу документом. Вот в этом случае по физлицу из документа приема на работу через левое соединение по физлицу ты тащишь из справочника всю его родню.
1
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
22.05.2018, 16:03  [ТС] #12
Volexovich, Спасибо, понял, я думал что оно как-то так, но не знал все как сказать.
P.S. По моему я нашел косяк, осталось протестировать полную версию и ради интереса выложу что именно было. Вдруг, кому-то делающему что-то так же коряво как и я, пригодится)
0
Гидролокатор
2 / 2 / 0
Регистрация: 20.05.2010
Сообщений: 22
05.06.2018, 17:03  [ТС] #13
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Функция ПечатьЛичнаяТаблица(ДокументОбъект)
 
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ПолеСлева = 0;
    ТабДокумент.ПолеСправа = 0;
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
 
    // получаем данные для печати
    ВыборкаДанные = СформироватьЗапросДляПечатиЛичнаяПремия().Выбрать();
    
    //Пока ВыборкаДанные.Следующий() Цикл
        Макет = ПолучитьМакет("ЛичнаяТаблица");
        ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка"); // Шапка документа.
        ОбластьМакетаТаблица = Макет.ПолучитьОбласть("Таблица");// Подвал документа
        ОбластьМакетаПодвал = Макет.ПолучитьОбласть("Подвал"); // строка работника
        
        ВыводитьИтоги = Ложь;
        
        Пока ВыборкаДанные.Следующий() Цикл
            ОбластьМакетаШапка.Параметры.Заполнить(ВыборкаДанные); // Шапка документа.
            
        
            ТабДокумент.Вывести(ОбластьМакетаШапка);
                
            ОбластьМакетаТаблица.Параметры.Заполнить(ВыборкаДанные); // Шапка документа.
            
            ТабДокумент.Вывести(ОбластьМакетаТаблица);
            
            
            ОбластьМакетаПодвал.Параметры.Заполнить(ВыборкаДанные); // Шапка документа.
            
       // КонецЕсли;
        
                ТабДокумент.Вывести(ОбластьМакетаПодвал);
    КОНЕЦЦИКЛА; 
 
    ТабДокумент.АвтоМасштаб = Истина;
    
    Возврат ТабДокумент;
 
КонецФункции
Пример после исправления. Я не в том месте поставил ЦИКЛ и из-за этого неправильно обрабатывалось.
Все спасибо за помощь.
0
05.06.2018, 17:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2018, 17:03
Привет! Вот еще темы с решениями:

Лишние строки
Добрый день! Я использую программу "1C: Предприятие 7.7", конфигуация...

1C 8.1 Редактирование отчета созданного с помощью универсального отчета
Создал отчет с помощью универсального отчета, все работает, не получается...

Формирование отчета aida32 в виде строки в формате xls
известная программа aida32 может формировать отчет в нескольких...

Формирование отчета
У меня есть БД, с данными о студентах, также и о его родителях. Когда я вывожу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru