Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Построение макета документа с группировкой , Проблема с выводом содержимого табличной части документа          
Koriolan Подменю пользователя
сообщение 22.05.16, 19:24
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Добрый день.
Уважаемые форумчане, прошу помощи в технической реализации такой вот проблемы. Есть документ "Прием на работу", табличная часть которого имеет следующую структуру (см. рисунок 1)



напротив каждой фамилии содержится название должности.
В печатном документе необходимо реализовать группировку фамилий по должностям. Интересующая часть макета должна иметь вид (см. рисунок 2):



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


в котором "СписокФізичнихОсіб" как раз и есть название интересующей табличной части документа.

у меня получается вывести только в следующем виде:



,что не совсем красиво.

Подскажите, как перестроить запрос или сформировать код вывода, чтобы документ приобрел нормальный вид. Подозреваю, что решение лежит где-то совсем на поверхности (или другая структура запроса, или сам код вывода), но я самоучка, поэтому многого еще не знаю. Если для ответа нужен код модуля менеджера, то его часть, в которой проблема здесь:
Процедура Друкувати(ТабДок, Ссылка) Экспорт
    //{{_КОНСТРУКТОР_ПЕЧАТИ(Друкувати)
    Макет = Документы.ПрийомНаРоботу.ПолучитьМакет("Друкувати");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПрийомНаРоботу.Дата,
    |    ПрийомНаРоботу.Номер,
    |    ПрийомНаРоботу.Період.НазваПеріодуУРодовомуВідмінку КАК Період,
    |    ПрийомНаРоботу.СписокФізичнихОсіб.(
    |        ФізичнаОсоба.ПрізвищеРодовийВідмінок,
    |        ФізичнаОсоба.ІмяРодовийВідмінок,
    |        ФізичнаОсоба.ПоБатьковіРодовийВідмінок,
    |        ПосадаПоДокументах.НазваПосадиВЗнахідномуВідмінку КАК Посада
    |    )
    |ИЗ
    |    Документ.ПрийомНаРоботу КАК ПрийомНаРоботу
    |ГДЕ
    |    ПрийомНаРоботу.Ссылка В(&Ссылка)
    |    И ПрийомНаРоботу.СписокФізичнихОсіб.Бухгалтерія = &Бухгалтерія";
    Запрос.Параметры.Вставить("Ссылка", Ссылка);
    Запрос.Параметры.Вставить("Бухгалтерія", Истина);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Заголовок = Макет.ПолучитьОбласть("Заголовок");
    ШапкаНаказу = Макет.ПолучитьОбласть("ШапкаНаказу");
    ПунктНаказу = Макет.ПолучитьОбласть("ПунктНаказу");
    Підпункт = Макет.ПолучитьОбласть("Підпункт");
    Підвал = Макет.ПолучитьОбласть("Підвал");
    
    ТабДок.Очистить();

    ВставлятьРазделительСтраниц = Ложь;
    Пока Выборка.Следующий() Цикл
        Если ВставлятьРазделительСтраниц Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;

        //Заголовок    
        ТабДок.Вывести(Заголовок);
        
        //ШапкаНаказу
        ШапкаНаказу.Параметры.ДатаНаказу = Формат(Выборка.Дата,"ДЛФ=DD");
        ШапкаНаказу.Параметры.НомерНаказу = Выборка.Номер;
        ШапкаНаказу.Параметры.ПеріодВРодовомуВідмінку = Выборка.Період;
        ШапкаНаказу.Параметры.ДатаНаказуРік = Формат(Выборка.Дата,"ДФ=yyyy");
        
        ТабДок.Вывести(ШапкаНаказу, Выборка.Уровень());
        
        //ПунктНаказу
        ВыборкаСписокФізичнихОсіб = Выборка.СписокФізичнихОсіб.Выбрать();
        
        Пока ВыборкаСписокФізичнихОсіб.Следующий() Цикл
            
            ПунктНаказу.Параметры.НазваПосадиВЗнахідномуВідмінку = НРег(ВыборкаСписокФізичнихОсіб.Посада);
            // Сода нужно вывести список фамилий
            ТабДок.Вывести(ПунктНаказу, ВыборкаСписокФізичнихОсіб.Уровень());
            
        КонецЦикла;
        
        

        ВставлятьРазделительСтраниц = Истина;
    КонецЦикла;
    //}}
КонецПроцедуры


Заранее благодарен за ответ.

Сообщение отредактировал Vofka - 23.05.16, 8:07

Vofka Подменю пользователя
сообщение 23.05.16, 8:18
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Koriolan,
 ! 

Правила: 8
 


По теме. В запросе нужно обращаться к табличной части. Т.е. ВЫБРАТЬ ... ИЗ Документ.ПрийомНаРоботу.СписокФізичнихОсіб, добавить секцию ИТОГИ ПО НазваПосадиВЗнахідномуВідмінку и выборку сделать 2-х уровневую:

Выборка0 = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка0.Следующий() Цикл
//...
// тут будет доступно поле НазваПосадиВЗнахідномуВідмінку
//...

   Выборка1 = Выборка0.Выбрать();
   Пока Выборка1.Следующий() Цикл
      //...
      // тут доступно остальное
      //...
   КонецЦикла;

КонецЦикла;

Koriolan Подменю пользователя
сообщение 23.05.16, 20:41
Сообщение #3

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Vofka @ 23.05.16, 9:18) *
и выборку сделать 2-х уровневую


Можно подробнее??? не совсем понятно, что отбирать в первом, а что во втором уровнях и как их собрать в Запрос?


Насколько я понял задача решается тремя запросами:
1. Запрос отвечает за формирование основнйо части документа (если таковая имеется)
2. Запрос формирует список уникальных в пределах табличной части наименований должности
3. отбирает фамилии в рамках предыдущего запроса?

ТАк?



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

Koriolan Подменю пользователя
сообщение 24.05.16, 19:32
Сообщение #4

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Спасибо. Попробовал последовать Вашему совету. Вот что получилось:

В модуле у меня вышло два запроса:
1. Первый запрос отвечает за выборку данных для "шапки приказа". Там все просто и работает, если смотреть в отдельности.


Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПрийомНаРоботу.Дата,
    |    ПрийомНаРоботу.Номер,
    |    ПрийомНаРоботу.Період.НазваПеріодуУРодовомуВідмінку КАК Період
    |ИЗ
    |    Документ.ПрийомНаРоботу КАК ПрийомНаРоботу
    |ГДЕ
    |    ПрийомНаРоботу.Ссылка В(&Ссылка)";
    Запрос.Параметры.Вставить("Ссылка", Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();


2. Второй запрос выбирает и группирует данные табличной части. (это мое понимание Вашего совета):

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


(Пробовал было объединить оба запроса в один или перестроить второй запрос без левого соединения, но выдается сообщение, говорящее об ошибке при вызове метода контекста. Группировка по таблицам верхнего уровня и вложенным таблицам .)


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

ПрийомНаРоботу.Ссылка = &Ссылка


А этот параметр необходим, т.к. позволяет работать только с табличной частью открытого документа.

Кроме того конструктор запросов настоятельно добавляет в группировку еще и фамилии.


СГРУППИРОВАТЬ ПО
        |    ПрийомНаРоботуСписокФізичнихОсіб.ПосадаПоДокументах.НазваПосадиВЗнахідномуВідмінку,
        |    ПрийомНаРоботуСписокФізичнихОсіб.ФізичнаОсоба.Наименование



Короче, засада у меня с текстом запроса.

sava1 Подменю пользователя
сообщение 24.05.16, 20:40
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

"ВЫБРАТЬ
        |    ПосадаПоДокументах.НазваПосадиВЗнахідномуВідмінку КАК НазваПосадиВЗнахідномуВідмінку,
        |    ФізичнаОсоба.Наименование КАК ФізичнаОсобаНаименование
        |ИЗ
        |    Документ.ПрийомНаРоботу.СписокФізичнихОсіб КАК Док

        |ГДЕ Док.Ссылка = &Ссылка  И Док.Бухгалтерія

        |СГРУППИРОВАТЬ ПО
        |    ПосадаПоДокументах.НазваПосадиВЗнахідномуВідмінку,
        |    ФізичнаОсоба.Наименование
        |
        |УПОРЯДОЧИТЬ ПО
        |    НазваПосадиВЗнахідномуВідмінку,
        |    ФізичнаОсобаНаименование";

Koriolan Подменю пользователя
сообщение 24.05.16, 22:38
Сообщение #6

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

sava1 @ Сегодня, 21:40 *,
Что-то я все равно упускаю.
Вот фрагмент кода, с данным запросом:
        Запрос0 = Новый Запрос;
        Запрос0.Текст =
        "ВЫБРАТЬ
         |    ПосадаПоДокументах.НазваПосадиВЗнахідномуВідмінку КАК НазваПосадиВЗнахідномуВідмінку,
         |    ФізичнаОсоба.Наименование КАК ФізичнаОсобаНаименование
         |ИЗ
         |    Документ.ПрийомНаРоботу.СписокФізичнихОсіб КАК Док
         |ГДЕ Док.Ссылка = &Ссылка  И Док.Бухгалтерія
         |СГРУППИРОВАТЬ ПО
         |    ПосадаПоДокументах.НазваПосадиВЗнахідномуВідмінку,
         |    ФізичнаОсоба.Наименование
         |
         |УПОРЯДОЧИТЬ ПО
         |    НазваПосадиВЗнахідномуВідмінку,
         |    ФізичнаОсобаНаименование";
        Запрос0.Параметры.Вставить("Ссылка", Ссылка);
        Запрос0.Параметры.Вставить("Бухгалтерія", Истина);

        Выборка0 = Запрос0.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
         Номер = 1;
        Пока Выборка0.Следующий() Цикл
              
              ПунктНаказу.Параметры.ПорядковийНомер = Номер;
              ПунктНаказу.Параметры.НазваПосадиВЗнахідномуВідмінку = НРег(Выборка0.НазваПосадиВЗнахідномуВідмінку);
              Номер = Номер + 1;
              
              ТабДок.Вывести(ПунктНаказу);
              ВыборкаДетальныеЗаписи = Выборка0.Выбрать();
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Підпункт.Параметры.ПрізвищеІмяПоБатьковіПрацівника = ВыборкаДетальныеЗаписи.ФізичнаОсобаНаименование;
                ТабДок.Вывести(Підпункт);
            КонецЦикла;
            
        КонецЦикла;

А вот какое сообщение возвращает система при его исполнении:


sava1 Подменю пользователя
сообщение 25.05.16, 6:47
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Цитата(Koriolan @ 24.05.16, 23:38) *
Запрос0.Параметры.Вставить("Ссылка", Ссылка);


Здесь Ссылка что передаем?

Koriolan Подменю пользователя
сообщение 25.05.16, 18:37
Сообщение #8

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

sava1 @ Сегодня, 7:47 *,

Передаем ссылку на документ, в котором находится табличная часть

sava1 Подменю пользователя
сообщение 25.05.16, 19:12
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Вставте запрос в консоль, проверьте.

Koriolan Подменю пользователя
сообщение 25.05.16, 19:25
Сообщение #10

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(sava1 @ 25.05.16, 20:12) *
Вставте запрос в консоль, проверьте.

В том-то и дело, что консоль дает положительный результат, а при внедрении в код, получается... то, что получается 64000000.gif

sava1 Подменю пользователя
сообщение 25.05.16, 19:43
Сообщение #11

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Тогда там не ссылка

Koriolan Подменю пользователя
сообщение 25.05.16, 20:37
Сообщение #12

Молчаливый
*
Группа: Пользователи
Сообщений: 9
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(sava1 @ 25.05.16, 20:43) *
Тогда там не ссылка


Вот полный листинг со всеми запросами:
Процедура Друкувати(ТабДок, Ссылка) Экспорт
    //{{_КОНСТРУКТОР_ПЕЧАТИ(Друкувати)
    Макет = Документы.ПрийомНаРоботу.ПолучитьМакет("Друкувати");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПрийомНаРоботу.Дата,
    |    ПрийомНаРоботу.Номер,
    |    ПрийомНаРоботу.Період.НазваПеріодуУРодовомуВідмінку КАК Період
    |ИЗ
    |    Документ.ПрийомНаРоботу КАК ПрийомНаРоботу
    |ГДЕ
    |    ПрийомНаРоботу.Ссылка В(&Ссылка)";
    Запрос.Параметры.Вставить("Ссылка", Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    
    
    Заголовок = Макет.ПолучитьОбласть("Заголовок");
    ШапкаНаказу = Макет.ПолучитьОбласть("ШапкаНаказу");
    ПунктНаказу = Макет.ПолучитьОбласть("ПунктНаказу");
    Підпункт = Макет.ПолучитьОбласть("Підпункт");
    Підвал = Макет.ПолучитьОбласть("Підвал");
    
    ТабДок.Очистить();

    ВставлятьРазделительСтраниц = Ложь;
    Пока Выборка.Следующий() Цикл
        Если ВставлятьРазделительСтраниц Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;

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

        ВыборкаПункты = ЗапросПункты.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
         Номер = 1;
        Пока ВыборкаПункты.Следующий() Цикл
              
              ПунктНаказу.Параметры.ПорядковийНомер = Номер;
              ПунктНаказу.Параметры.НазваПосадиВЗнахідномуВідмінку = НРег(ВыборкаПункты.НазваПосадиВЗнахідномуВідмінку);
              Номер = Номер + 1;
              
              ТабДок.Вывести(ПунктНаказу);
              ВыборкаДетальныеЗаписи = Выборкапункты.Выбрать();
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Підпункт.Параметры.ПрізвищеІмяПоБатьковіПрацівника = ВыборкаДетальныеЗаписи.ФізичнаОсобаНаименование;
                ТабДок.Вывести(Підпункт);
            КонецЦикла;
            
        КонецЦикла;
    
    
        
        
        
        

        ВставлятьРазделительСтраниц = Истина;
    КонецЦикла;
    //}}
КонецПроцедуры


Кажется, решил.

Переписал проблемную строку запроса следующим образом:

ПрийомНаРоботуСписокФізичнихОсіб.Ссылка В(&Ссылка)

вместо


ПрийомНаРоботуСписокФізичнихОсіб.Ссылка = &Ссылка


и все заработало icon_beer17.gif

Спасибо всем за помощь.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 23.04.24, 17:56
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!