8.х Подскажите по выводу данных в макет.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем barsuchechechek, 21 апр 2010.

  1. TopicStarter Overlay
    barsuchechechek
    Offline

    barsuchechechek Опытный в 1С

    Регистрация:
    21 фев 2009
    Сообщения:
    265
    Симпатии:
    0
    Баллы:
    26
    У меня есть таблица значений. В ней следующие данные. Контрагент, дата, сумма.
    Мне нужно вывести эти данных в макет следующим образом:

    Дата1, Дата2, Дата3
    Контрагент1, Сумма11, Сумма12, Сумма13,
    Контрагент2,
    Контрагент3 Сумма31, Сумма32, Сумма33

    Не знаю почему не работает форматирование текста Дата1 и т.д. должны быть над Суммами.
    Т.е. Идут колонки с днями и выводятся строки - контрагент и суммы по нему по дням.

    Счас с ума сойду но не могу придумать как присоединять области по дням, а потом по значениям. Не выходит хоть убей. Помагити плиз.
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    принцип присоединения областей: вывел область по вертикали, присоединил по горизонтали область к выведенной, вывел следующую область по вертикали, присоединил по горизонтали область к выведенной и т.д.

    что в коде получилось?
  3. TopicStarter Overlay
    barsuchechechek
    Offline

    barsuchechechek Опытный в 1С

    Регистрация:
    21 фев 2009
    Сообщения:
    265
    Симпатии:
    0
    Баллы:
    26
    Вообще проблема в чем есть Контрагент, Сумма, День.
    Нужно чтоб в строке выводился контрагент и сумма, в столбце день за который эта сумма.
    Не могу придумать и понять как можно обыграть такую напрмер ситуацию:
    Выводим данные:
    Контрагент1 - День1 - сумма1
    Контрагент1 - День2 - сумма2
    Контрагент1 - День3- сумма3
    Дальше берем следующего контрагента и нужно вывести в уже существующие столбики дней данные.
  4. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    НУ вам же написала. Вам нужно написать алгоритм, который бы сначала вывел контрагента метолом вывести, а затем методом присоеденить присоеденял бы все дни день за днем. Вообще я думаю гораздо проще решить эту задачу на скд и она вам все построит сама
  5. TopicStarter Overlay
    barsuchechechek
    Offline

    barsuchechechek Опытный в 1С

    Регистрация:
    21 фев 2009
    Сообщения:
    265
    Симпатии:
    0
    Баллы:
    26
    Сделаю без СКД - но вопрос вот в чем. К примеру выводим контрагент 1 - и по датам - 01.01 например, 03.01, 05.01.
    А как определить куда выводить следующего контра с этими же датами, но каких-то нет. Ии напротив есть даты, которых не было у первого?
  6. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    В том то и вся соль что вам надо сначало в Шапку вывести все возможные даты а потом под нужную заносить .... Может дял этого придется расширить запрос, что бы в итоге давал и просто поля с датами но пустыми значениями...
    Метод вывести выводит вам строку, метода присоединить - присоедеиняет к правому краю поля где сейчас распологается курсор области.

    Т.е Делаете вывести контрагаента, потом присоединением присоедеиняете даты(как вы будете делать это уже алгоритмическая задача и решать ее можно по разному один из способов я предложил)..Затем надо что бы вывести следующего Используем метод Вывести() а потом присоеденить.
    Но на СКД бы это все проще решалось в разы
  7. TopicStarter Overlay
    barsuchechechek
    Offline

    barsuchechechek Опытный в 1С

    Регистрация:
    21 фев 2009
    Сообщения:
    265
    Симпатии:
    0
    Баллы:
    26
    Я понимаю так - я вывожу в шапку все возможные даты по всем контрам.
    Потом вывожу первого контрагента. Но у него значения не по всем датам, по некоторым. Как в таком случае проставить значения суммы только в нужные мне столбцы?
  8. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Не вижу проблем в данном вопросе. Вот вам пример, сделанный для нетиповой базы, решающий проблему точь в точь, как у вас. Макет приклеплён.

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

    Вложения:

  9. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Доктор Руфус Бейли,
    в СКД это делается все без кода :)
  10. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Я предпочитаю легче написать один запрос в СКД чем так. А то потом у заказчика появляется необходимостьеще одну группировку видет и т.д..... в общем как обычно если без ТЗ
  11. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Во-первых, меня СКД никто и никогда не учил (меня вообще никто и никогда 1Ске не учил, хнык), потому делаю, как умею.
    (по по поводу "без ТЗ" - именно потому такая на голову ударенная структура процедур, вложенных друг в друга: я строки со столбцами уже один раз так менял)
    Во-вторых (и только во вторых), господин, для которого был предназначен пример, не хочет СКД.
  12. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Если автор не хочет использовать средства, которые позволяют решить задачу за час, а хочет биться, использую что-то другое...
    Ну что тут можно сказать...

    Это примерно, как в УПП отражать все операцией + корректировкой записей регистров.

    Например для меня - такая постановка: не использовать СКД, совершенно не интересна. Ибо потом встанет задача перенести все это на 8.2 и опять будут танцы с бубном.

    Но это уже ОФФ пошел.

    Задача решается в СКД один запросом и мышкой. И без единой строчки кода.
  13. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    ДА не горичитесь Вы так РУФУС. Многие тут сами изучали 1С. я например и 7ку и 8ку начинал учить по синтаксис помошнику, потом по другим книгам. И когда вот так пару раз приходилось добавлять строки группировок и делать доп расфишровки для всего этого вот тогда ты понимаешь всю прелесть СКД. Как в том мультике "Лучше день потерять(на изучение СКД), потом за 2 часа долететь". И сейчас когда стоит вопрос о написании Кросс таблицы, кроме как СКД для начала ничего вообще не рассматриваю.
    А поповоду замечания что человеку это не надо. Мы ему просто советуем...Он же спрашивает и первый раз делает и не предпологает с чем ему еще прийдется столкнуться. Но у нас у всех принято учиться на своих ошибках. Мы же эти сообщения не для рейтинга себе пишем, если надо мы рейтинг себе и сами выставить можем какй пожелаем.....
  14. TopicStarter Overlay
    barsuchechechek
    Offline

    barsuchechechek Опытный в 1С

    Регистрация:
    21 фев 2009
    Сообщения:
    265
    Симпатии:
    0
    Баллы:
    26
    Ну не работал я с СКД - потому спрашиваю как без этого обойтись. А разговоры о том что надо что-то куда-то перенсти -вода. Такого не было с моей стороны. Просьба была разово решить проблему как вывести данные. Все.
  15. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    вот мы Вас и призываем учиться пусть не сейчас, не на этом примере на других более простых. Но вы поймете как это красиво и удобно...Но одно но - нужно хорошо знать запросы. Например еесть очень прикольный метод как с помошью запроса решить проблему с выводом данных нарастающим итогом, а не в коде прописывать все это...
  16. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Охотно верю. Верите ли вы, что в это не верит работодатель? Сам я пока экспериментирую время от времени с СКД, но пока получается полное непотр######тво. (Комментарий к матофильтру: мата там не было, но запикал он правильно - очень полно теперь передаёт то, что у меня получается)
  17. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Пример отчета, который требовался автору. Сделан за минуту.

    Рассчитан на УТ или УПП (Используется регистры Продажи)
    Уточню, что если нужно выводить пустые колонки за дни, когда не было продаж, нужно устоновить дополнение периода. Но это уже тонкости, а задача решена за минуту!

    Вложения:

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