8.х Сложный макет

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Antohadj, 22 дек 2013.

  1. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Всем привет. Нужна помощь. 1С 8.1. Есть справочник торговые точки с реквизитами: код, наименование, адрес, агент, день визита (строка, где 1 - это ПН, 2 - ВТ и т.д., 24 - это ВТ и ЧТ и т.д.).
    Нужно вывести что-то типа маршрутного листа по определенному агенту по дням. Второй скрин - пример оформления в Ecxel. Макет - первый скрин. С выводом точек, у которых в "дне визита" содержится 1 (точки на понедельник) проблем нет. Но как справа к "Понедельнику" присоединить "Вторник", "Среду" и т.д. никак не смекну. То все в понедельник заполняется, то все дублируется по несколько раз в каждом столбце (пробуя и "Вывести" и "Присоединить").
    Код для вывода одного дня:

    Код:
      
    Процедура КнопкаСформироватьНажатие(Кнопка)
    Если Агент = "" ИЛИ Агент = Неопределено ИЛИ Агент.Пустая() Тогда
    Сообщить("Не выбран Торговый представитеь!", СтатусСообщения.Важное);
    Иначе
    СформироватьОтчет(Этаформа.ЭлементыФормы.ТабДок);
    КонецЕсли;
    КонецПроцедуры
    
    Процедура СформироватьОтчет (ТабДок)
    ТабДок.Очистить();
    Макет = ПолучитьМакет("Макет");
    Шапка = Макет.ПолучитьОбласть("ОблШапка");
    
    Шапка.Параметры.Агент = Агент;
    ТабДок.Вывести(Шапка);
    ТабДок.НачатьАвтогруппировкуКолонок();
    Область = Макет.ПолучитьОбласть("ОблСтрока|ОблДень");
    ОблПодписи = Макет.ПолучитьОбласть("ОблПодписи|ОблДень");
    ОблПодписи.Параметры.День = "Понедельник";
    ТабДок.Вывести(ОблПодписи, 1, "Группа1");
    ОблПодписи.Параметры.День = "Вторник";
    ТабДок.Присоединить(ОблПодписи, 1, "Группа2");
    ОблПодписи.Параметры.День = "Среда";
    ТабДок.Присоединить(ОблПодписи, 1, "Группа3");
    ОблПодписи.Параметры.День = "Четверг";
    ТабДок.Присоединить(ОблПодписи, 1, "Группа4");
    ОблПодписи.Параметры.День = "Пятница";
    ТабДок.Присоединить(ОблПодписи, 1, "Группа5");
    // Зададим параметры макета
    ТабДок.ПолеСверху			  = 0;
    ТабДок.ПолеСлева			   = 5;
    ТабДок.ПолеСнизу			   = 0;
    ТабДок.ПолеСправа			  = 5;
    ТабДок.АвтоМасштаб			 = Истина;
    ТабДок.ОриентацияСтраницы	  = ОриентацияСтраницы.Ландшафт;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТорговыеТочки.Код КАК Код,
    | ТорговыеТочки.Наименование,
    | ТорговыеТочки.Адрес,
    | ТорговыеТочки.ОсновнойАгент КАК Агент,
    | ТорговыеТочки.ДеньВизита
    |ИЗ
    | Справочник.ТорговыеТочки КАК ТорговыеТочки
    |ГДЕ
    | ТорговыеТочки.ОсновнойАгент = &Агент
    | И ТорговыеТочки.ДеньВизита <> """"
    |
    |УПОРЯДОЧИТЬ ПО
    | Код";
    Запрос.УстановитьПараметр("Агент", Агент);
    Результат = Запрос.Выполнить();
    Ном1 = 1;
    Точка = Результат.Выбрать();
    Пока Точка.Следующий() Цикл
    Если Найти(Точка.ДеньВизита, "1") <> 0 Тогда
    Область.Параметры.Номер1 = Ном1;
    Область.Параметры.Кодтт1 = Точка.Код;
    Область.Параметры.Наименование1 = Точка.Наименование;
    Область.Параметры.Адрес1 = Точка.Адрес;
    Ном1 = Ном1 + 1;
    ТабДок.Вывести(Область, 1, "Группа1")
    КонецЕсли;
    КонецЦикла;
    
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.Показать();
    КонецПроцедуры;
    

    Вложения:

  2. La Navidad
    Offline

    La Navidad Опытный в 1С

    Регистрация:
    25 дек 2012
    Сообщения:
    203
    Симпатии:
    1
    Баллы:
    26

    НЕ?

    Ну или макет создать не по одному дню недели, а по всем пяти сразу.
  3. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    По поводу "Присоединить" - это понятно, понятно, что надо именно этот метод использовать. Но вот как правильно его применить ...
    Макет на все 5 дней пробовал уже - не выходит.
    Тут надо понимать что происходит:
    1. Выполнили запрос
    2. Перебираем запрос:
  4. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    По поводу "Присоединить" - это понятно, понятно, что надо именно этот метод использовать. Но вот как правильно его применить ...
    Макет на все 5 дней пробовал уже - не выходит.
    Тут надо понимать что происходит:
    1. Выполнили запрос
    2. Перебираем запрос:
    а. берем запись
    б. проверяем что в "дне визита", если содержит "1", то вставляем в таблицу (или облясть для понедельника)
    в. если "2", то во вторник.
    и .тд.

    сложность в том, что каждый раз необходимо данные выводить именно в определенный день и именно после последней записи в этом дне. Ведь в каждом дне может быть разное количество клиентов (я не зря выложил скрин Excel-я :).

    Попробовал в запросе сортировку по дню визита, чтобы сначала ПН заполнить, потом ВТ ... Опять проблема: в дне визита попадают значения с несколькими символами 14, 25, 12345
  5. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Т.е. Например вывели 3 строки для понедельника. Как потом добавить "область" для вторника, если вторник еще не заполнялся и нужно начать с первой строки для вторника? Ведь "вывести" выводит ниже, а "Присоединить" - справа от последней.
    Вот такая проблема :(
  6. La Navidad
    Offline

    La Navidad Опытный в 1С

    Регистрация:
    25 дек 2012
    Сообщения:
    203
    Симпатии:
    1
    Баллы:
    26
    А если сначала таблицу значений заполнять, а потом уже табличный документ.
  7. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    Код:
    		Результат = Запрос.Выполнить();
    Точка = Результат.Выбрать();
    
    День   = Новый Массив(6);
    День[1]= Новый Массив;
    День[2]= Новый Массив;
    День[3]= Новый Массив;
    День[4]= Новый Массив;
    День[5]= Новый Массив;
    
    Пока Точка.Следующий() Цикл
    Для номСимв=1 По СтрДлина(СокрЛП(Точка.ДеньВизита)) Цикл
    День[Число(Сред(Точка.ДеньВизита),номСимв,1)].Добавить(Точка.Ссылка);
    КонецЦикла;
    КонецЦикла;
    
    Область = Макет.ПолучитьОбласть("ОблСтрока|ОблДень");
    ПустаяОбласть = Макет.ПолучитьОбласть("ОблПустаяСтрока|ОблДень");
    ширинаОбл=Область.ШиринаТаблицы;
    отШапки=ТабДок.ВысотаТаблицы+1;
    
    максКоличество = Макс(День[1].Количество,День[2].Количество,День[3].Количество,День[4].Количество,День[5].Количество);
    
    Для номСтроки=1 По максКоличество Цикл
    Для НомерДня=1 По 5 Цикл
    вСтроку=отШапки+номСтроки; отКолонки=(НомерДня-1)*ширинаОбл+1;
    Если номСтроки>День[НомерДня].Количество Тогда
    ТабДок.ВставитьОбласть(ПустаяОбласть,ТабДок.Область(вСтроку,отКолонки,вСтроку,отКолонки+ширинаОбл),,);
    Иначе
    наТочку=День[НомерДня][номСтроки];
    Область.Параметры.Заполнить(наТочку);
    ТабДок.ВставитьОбласть(Область,	  ТабДок.Область(вСтроку,отКолонки,вСтроку,отКолонки+ширинаОбл),,);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    что-то я наверное перемудрил, может где ошибку сделал не проверял
    но если срочно то можно и так

    лично я бы лучше создал массив количество выведенных значений на каждый день и напрямую (без использования областей)
    изменял значение ячейки:
    Масс5[НомерДня] = Масс5[НомерДня]+1;
    ТабДок.Область(СтрокШапки+ Масс5[НомерДня] ,НомерДня*ширинуОбл+1).Значение = Точка.<>;
  8. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Думал тоже... Только как сделать: в таблицу значений записать все данные или создать 5 таблиц для каждого дня? Если 5 таблиц, то как их потом выводить в табдок?
  9. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    создайте 1 таблицу, просто когда будете выводить, разделите по дням (предварительно можно же по дням и отсортировать записи в ТЗ), ну а вывести "рядом" таблицу в Табличный документ можно методом присоединить
  10. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Вся беда в том что, цитирую:
    ТабличныйДокумент.Присоединить (SpreadsheetDocument.Join)
    Присоединяет табличный документ к результирующему табличному документу, помещая его в следующей колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий табличный документ.

    Т.Е. таблица присоединяется справа, но НИЖЕ, левой таблицы. А надо не с последней строки, предыдущей таблицы, а так же с первой строки!

    Сдается мне, что скорее всего подайдет метод ВставитьОбласть().
  11. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    И кстати, сортировать записи в ТЗ тоже нет смысла, т.к. в дне визита попадают значения с несколькими символами, например "14", "25", "12345" и бывает даже наоборот "41"
  12. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    В общем, пока рационального решения не нашел. Сделал кустарным способом, кому интересно: решил выводить данные напрямую в ячейку.
    Код:
    Процедура СформироватьОтчет (ТабДок)
    ТабДок.Очистить();
    Макет = ПолучитьМакет("Daily");
    Шапка = Макет.ПолучитьОбласть("ОблШапка");
    Шапка.Параметры.Агент = Агент;
    ТабДок.Вывести(Шапка);  // Вывели шапку
    
    // Зададим параметры макета
    ТабДок.ПолеСверху	= 0;
    ТабДок.ПолеСлева	= 5;
    ТабДок.ПолеСнизу	= 0;
    ТабДок.ПолеСправа	= 5;
    ТабДок.АвтоМасштаб	= Истина;
    ТабДок.ОриентацияСтраницы  = ОриентацияСтраницы.Ландшафт;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТорговыеТочки.Код КАК Код,
    | ТорговыеТочки.Наименование,
    | ТорговыеТочки.Адрес,
    | ТорговыеТочки.ОсновнойАгент КАК Агент,
    | ТорговыеТочки.ДеньВизита КАК ДеньВизита
    |ИЗ
    | Справочник.ТорговыеТочки КАК ТорговыеТочки
    |ГДЕ
    | ТорговыеТочки.ОсновнойАгент = &Агент
    | И ТорговыеТочки.ДеньВизита <> """"
    |
    |УПОРЯДОЧИТЬ ПО
    | Код";
    Запрос.УстановитьПараметр("Агент", Агент);
    Результат = Запрос.Выполнить();
    Ном1 = 0; Ном2 = 0; Ном3 = 0; Ном4 = 0; Ном5 = 0;
    
    Рамка = Новый Линия (ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
    Точка = Результат.Выбрать();
    Пока Точка.Следующий() Цикл
    Если Найти(СокрЛП(Точка.ДеньВизита), "1") <> 0 Тогда
    Ном1 = Ном1 + 1;
    ТабДок.Область("R" + (Ном1 + 5) + "C2").Текст = Строка(Точка.Код);
    ТабДок.Область("R" + (Ном1 + 5) + "C3").Текст = Строка(Точка.Наименование);
    ТабДок.Область("R" + (Ном1 + 5) + "C4").Текст = Строка(Точка.Адрес);
    ИначеЕсли Найти(СокрЛП(Точка.ДеньВизита), "2") <> 0 Тогда
    Ном2 = Ном2 + 1;
    ТабДок.Область("R" + (Ном2 + 5) + "C5").Текст = Строка(Точка.Код);
    ТабДок.Область("R" + (Ном2 + 5) + "C6").Текст = Строка(Точка.Наименование);
    ТабДок.Область("R" + (Ном2 + 5) + "C7").Текст = Строка(Точка.Адрес);
    ИначеЕсли Найти(СокрЛП(Точка.ДеньВизита), "3") <> 0 Тогда
    Ном3 = Ном3 + 1;
    ТабДок.Область("R" + (Ном3 + 5) + "C8").Текст = Строка(Точка.Код);
    ТабДок.Область("R" + (Ном3 + 5) + "C9").Текст = Строка(Точка.Наименование);
    ТабДок.Область("R" + (Ном3 + 5) + "C10").Текст = Строка(Точка.Адрес);
    ИначеЕсли Найти(СокрЛП(Точка.ДеньВизита), "4") <> 0 Тогда
    Ном4 = Ном4 + 1;
    ТабДок.Область("R" + (Ном4 + 5) + "C11").Текст = Строка(Точка.Код);
    ТабДок.Область("R" + (Ном4 + 5) + "C12").Текст = Строка(Точка.Наименование);
    ТабДок.Область("R" + (Ном4 + 5) + "C13").Текст = Строка(Точка.Адрес);
    ИначеЕсли Найти(СокрЛП(Точка.ДеньВизита), "5") <> 0 Тогда
    Ном5 = Ном5 + 1;
    ТабДок.Область("R" + (Ном5 + 5) + "C14").Текст = Строка(Точка.Код);
    ТабДок.Область("R" + (Ном5 + 5) + "C15").Текст = Строка(Точка.Наименование);
    ТабДок.Область("R" + (Ном5 + 5) + "C16").Текст = Строка(Точка.Адрес);
    КонецЕсли;
    КонецЦикла;
    
    НомМакс = Макс (Ном1, Ном2, Ном3, Ном4, Ном5);
    Для НомНом = 1 По НомМакс Цикл
    ТабДок.Область("R" + (НомНом + 5) + "C1").Текст = Строка(НомНом);
    КонецЦикла;
    
    ТабДок.Область("R6" + "C1" + ":" + "R" + (НомМакс + 5) + "C16" ).ГраницаСлева = Рамка;
    ТабДок.Область("R6" + "C1" + ":" + "R" + (НомМакс + 5) + "C16" ).ГраницаСправа = Рамка;
    ТабДок.Область("R6" + "C1" + ":" + "R" + (НомМакс + 5) + "C16" ).ГраницаСверху = Рамка;
    ТабДок.Область("R6" + "C1" + ":" + "R" + (НомМакс + 5) + "C16" ).ГраницаСнизу = Рамка;
    ТабДок.Область("R6" + "C1" + ":" + "R" + (НомМакс + 5) + "C16" ).РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
    ТабДок.Область("R6" + "C1" + ":" + "R" + (НомМакс + 5) + "C16" ).ВертикальноеПоложение = ВертикальноеПоложение.Центр;
    
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.Показать("Маршрутный Лист");
    КонецПроцедуры
    
  13. TopicStarter Overlay
    Antohadj
    Offline

    Antohadj

    Регистрация:
    22 дек 2013
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Скрин:

    Вложения:

  14. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    это все решается, берете левый табдок и собираете в него вашу таблицу почастям используя метод присоединить. Поищите, я помнится, пример уже такой приводила. У меня работает
  15. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    из-за ИначеЕсли возможны пропуски, каждой точки покажет только один "меньший" день недели.
    если уж решил делать как я предложил, то делай уж цикл по дням указанных в Точка.ДеньВизита
    Код:
    Процедура СформироватьОтчет (ТабДок,Агент="")
    ТабДок.Очистить();
    Макет = ПолучитьМакет("Daily");
    Шапка = Макет.ПолучитьОбласть("ОблШапка");
    Шапка.Параметры.Агент = Агент;
    ТабДок.Вывести(Шапка);  // Вывели шапку
    
    // Зададим параметры макета
    ТабДок.ПолеСверху = 0;
    ТабДок.ПолеСлева = 5;
    ТабДок.ПолеСнизу = 0;
    ТабДок.ПолеСправа = 5;
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы  = ОриентацияСтраницы.Ландшафт;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТорговыеТочки.Код КАК Код,
    | ТорговыеТочки.Наименование,
    | ТорговыеТочки.Адрес,
    | ТорговыеТочки.ОсновнойАгент КАК Агент,
    | ТорговыеТочки.ДеньВизита КАК ДеньВизита
    |ИЗ
    | Справочник.ТорговыеТочки КАК ТорговыеТочки
    |ГДЕ
    | ТорговыеТочки.ОсновнойАгент = &Агент
    | И ТорговыеТочки.ДеньВизита <> """"
    |
    |УПОРЯДОЧИТЬ ПО
    | Код";
    Запрос.УстановитьПараметр("Агент", Агент);
    Результат = Запрос.Выполнить();
    номСтроки = Новый Массив(6);
    
    Для Каждого НомерДня Из номСтроки Цикл
    номСтроки[НомерДня] = 5;
    КонецЦикла;
    
    Точка = Результат.Выбрать();
    Пока Точка.Следующий() Цикл
    Для ПозицияДня=1 По СтрДлина(СокрЛП(Точка.ДеньВизита)) Цикл
    НомерДня=Число(Сред(СокрЛП(Точка.ДеньВизита),ПозицияДня,1));
    номСтроки[НомерДня] = номСтроки[НомерДня]+1;
    //
    ТабДок.Область(номСтроки[НомерДня],НомерДня*3-1).Текст = Строка(Точка.Код);
    ТабДок.Область(номСтроки[НомерДня],НомерДня*3  ).Текст = Строка(Точка.Наименование);
    ТабДок.Область(номСтроки[НомерДня],НомерДня*3+1).Текст = Строка(Точка.Адрес);
    //
    КонецЦикла;
    ТабДок.Область(ТабДок.ВысотаТаблицы,1).Текст = Строка(ТабДок.ВысотаТаблицы-5);
    КонецЦикла;
    
    Рамка = Новый Линия (ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
    ОблТабДок = ТабДок.Область(6,1,ТабДок.ВысотаТаблицы,16);
    ОблТабДок.ГраницаСлева = Рамка;
    ОблТабДок.ГраницаСправа = Рамка;
    ОблТабДок.ГраницаСверху = Рамка;
    ОблТабДок.ГраницаСнизу = Рамка;
    ОблТабДок.РазмещениеТекста  = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
    ОблТабДок.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
    
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.Показать("Маршрутный Лист");
    КонецПроцедуры

Поделиться этой страницей