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