8.х Таблица значений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем 2wka, 6 июл 2016.

  1. TopicStarter Overlay
    2wka
    Offline

    2wka

    Регистрация:
    6 июл 2016
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Добрый день!
    Извините пожалуйста, необходима ваша помощь в решение задачки, можете пожалуйста помочь :
    необходимо таблицу значений транспонировать
    Аналитика1 —-— Аналитика2------Аналитика3-------Показатель-----— Значение
    Склад Основной-----— ОАО Аист-----— Договор № 344-----— Количество-----— 2
    Склад Основной-----— ОАО Аист-----— Договор № 344-----— Сумма-----— 500
    Склад Основной-----— ОАО Аист-----— Договор № 344-----— Дата-----— 01.01.2015
    Склад Дополнительный-----— ОАО Торнадо-----— Договор № 367-----— Количество —-----10

    Аналитика1----------Аналитика2-------— Аналитика3 —-------Количество —-------Сумма-------— Дата
    Склад Основной-------— ОАО Аист-------— Договор № 344-------— 2-------------500 —-------01.01.2015
    Склад Дополнительный-------— ОАО Торнадо-------— Договор № 367---------10
    подскажите что я делаю не так

    Код:
    &НаКлиенте
    Процедура ТаблицаЗначений(Команда)
    ТЗ ();
    КонецПроцедуры
    
    &НаСервере
    процедура ТЗ ();
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Аналитика1");
    ТЗ.Колонки.Добавить("Аналитика2");
    ТЗ.Колонки.Добавить("Аналитика3");
    ТЗ.Колонки.Добавить("Показатель");
    ТЗ.Колонки.Добавить("Значение");
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Количество" ;
    Строка.Значение = 2 ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Сумма" ;
    Строка.Значение = 500 ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Дата" ;
    Строка.Значение = дата("20150101") ;
    
    //Строка = ТЗ.Добавить();
    //Строка.Аналитика1 = "Склад Дополнительный" ;
    //Строка.Аналитика2 = "ОАО Торнадо" ;
    //Строка.Аналитика3 = "Договор № 367" ;
    //Строка.Показатель = "Количество" ;
    //Строка.Значение = 10 ;
    
    
    ТЗ2=Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Аналитика1");
    ТЗ2.Колонки.Добавить("Аналитика2");
    ТЗ2.Колонки.Добавить("Аналитика3");
    Для Каждого ТекСтрока Из ТЗ Цикл
    ТЗ2.Колонки.Добавить(ТекСтрока.Показатель);
    КонецЦикла;
    
    Строка=ТЗ2.Добавить();
    Строка.Аналитика1=ТЗ[0].Аналитика1;
    Строка.Аналитика2=ТЗ[0].Аналитика2;
    Строка.Аналитика3=ТЗ[0].Аналитика3;
    Для Каждого ТекСтрока Из ТЗ Цикл
    Строка.ТекСтрока.Показатель=ТекСтрока.Значение;
    КонецЦикла;
    
    конецпроцедуры
    Последнее редактирование модератором: 7 июл 2016
  2. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Здравствуйте.
    Как это сделать запросом, не знаю. Тоже хотелось бы научиться.
    А перебором будет выглядеть примерно так:
    Код:
    &НаКлиенте
    Процедура Запуск(Команда)
    ТЗ();
    КонецПроцедуры
    
    &НаСервере
    процедура ТЗ();
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Аналитика1");
    ТЗ.Колонки.Добавить("Аналитика2");
    ТЗ.Колонки.Добавить("Аналитика3");
    ТЗ.Колонки.Добавить("Показатель");
    ТЗ.Колонки.Добавить("Значение");
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Количество" ;
    Строка.Значение = 2 ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Сумма" ;
    Строка.Значение = 500 ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Дата" ;
    Строка.Значение = дата("20150101") ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Дополнительный" ;
    Строка.Аналитика2 = "ОАО Торнадо" ;
    Строка.Аналитика3 = "Договор № 367" ;
    Строка.Показатель = "Количество" ;
    Строка.Значение = 10 ;
    
    Для Каждого Стр Из ТЗ Цикл
        НайденныеСтроки = Объект.Таб.НайтиСтроки(Новый Структура("Аналитика2",Стр.Аналитика2));
        Если НайденныеСтроки.Количество() = 0 Тогда
            Строка = Объект.Таб.Добавить();
            Строка.Аналитика2 = Стр.Аналитика2;
        Иначе
            Строка = НайденныеСтроки[0];
        КонецЕсли;
        Строка.Аналитика1 = Стр.Аналитика1;
        Строка.Аналитика3 = Стр.Аналитика3;
    
        Если СокрЛП(Стр.Показатель) = "Количество" Тогда
            Строка.Количество = Стр.Значение;
        ИначеЕсли  СокрЛП(Стр.Показатель) = "Сумма" Тогда
            Строка.Сумма = Стр.Значение;
        ИначеЕсли  СокрЛП(Стр.Показатель) = "Дата" Тогда
            Строка.Дата = Стр.Значение;
        КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    У меня управляемые формы. Для удобства отображения и простоты кода на форме сделана табличная часть Таб с фиксированными колонками
  3. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    В управляемых формах с табличными частями работают через их идентификаторы
  4. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Не очень понятно. Можно пример?
  5. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Результат запроса можно выгрузить в таблицу :)
  6. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Ой! А покажите, как то же самое можно сделать запросом? Ну пожа-а-а-а-луйста! :)
  7. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    Не вдавался в подробности :). Что нужно сделать ?
  8. roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    Код:
    Запрос=Новый Запрос;
          Запрос.Текст="ВЫБРАТЬ
                       |      ЗарплатаКВыплатеЗарплата.Физлицо как ФизЛицо,
                       |      ЗарплатаКВыплатеЗарплата.Сумма как Сумма
                       |ИЗ
                       |      Документ.ЗарплатаКВыплате.Зарплата как ЗарплатаКВыплатеЗарплата";
    
    Результат=Запрос.Выполнить();
    ТЗ = Результат.Выгрузить();
  9. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    "Плоские" запросы и я умею составлять. :)
    А как запросом сделать задание топикстартера? Нужно разложить строки с одинаковыми атрибутами по колонкам отличающихся значений.
  10. roofless
    Offline

    roofless Опытный в 1С

    Регистрация:
    27 июн 2014
    Сообщения:
    260
    Симпатии:
    7
    Баллы:
    29
    подозреваю, что это http://infostart.ru/public/533198/ поможет
  11. TopicStarter Overlay
    2wka
    Offline

    2wka

    Регистрация:
    6 июл 2016
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    ДОбрый день!
    в задаче необходимо первые три столбца оставить без изменения , а столбец показатель и значение транспонировать


    До
    Аналитика1 Аналитика2 Аналитика3 Показатель Значение
    Склад Основной ОАО Аист Договор № 344 Количество 2
    Склад Основной ОАО Аист Договор № 344 Сумма 500
    Склад Основной ОАО Аист Договор № 344 Дата 01.01.2015
    Склад Дополнительный ОАО Торнадо Договор № 367 Количество 10

    После
    Аналитика1 Аналитика2 Аналитика3 Количество Сумма Дата
    Склад Основной ОАО Аист Договор № 344 2 500 01.01.2015
    Склад Дополнительный ОАО Торнадо Договор № 367 10
  12. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Мой вариант не подходит?
    Можно конечно не делать колонки заранее, а определять их количество на лету, но в управляемых формах это делается сложно (по крайней мере, для меня). Если надо, переработаю, задачка интересная.
  13. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    задача решается с помощью 3-х левых соединений таблицы с собой.
  14. TopicStarter Overlay
    2wka
    Offline

    2wka

    Регистрация:
    6 июл 2016
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Проблема в том что показателей может быть больше чем 3 и поэтому вариант с 3 join не подойдет
  15. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Это можно обойти вот так (если все делать только таблицами значений):
    Код:
    // Заполнение входных данных
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Аналитика1");
    ТЗ.Колонки.Добавить("Аналитика2");
    ТЗ.Колонки.Добавить("Аналитика3");
    ТЗ.Колонки.Добавить("Показатель");
    ТЗ.Колонки.Добавить("Значение");
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Количество" ;
    Строка.Значение = 2 ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Сумма" ;
    Строка.Значение = 500 ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Основной" ;
    Строка.Аналитика2 = "ОАО Аист" ;
    Строка.Аналитика3 = "Договор № 344" ;
    Строка.Показатель = "Дата" ;
    Строка.Значение = дата("20150101") ;
    
    Строка = ТЗ.Добавить();
    Строка.Аналитика1 = "Склад Дополнительный" ;
    Строка.Аналитика2 = "ОАО Торнадо" ;
    Строка.Аналитика3 = "Договор № 367" ;
    Строка.Показатель = "Количество" ;
    Строка.Значение = 10 ;
    
    Таб = Новый ТаблицаЗначений;
    Таб.Колонки.Добавить("Аналитика1");
    Таб.Колонки.Добавить("Аналитика2");
    Таб.Колонки.Добавить("Аналитика3");
    // Конец заполнения
    
    // Заполнение таблицы значений ТАБ
    Для Каждого Стр Из ТЗ Цикл
        НайденныеСтроки = Таб.НайтиСтроки(Новый Структура("Аналитика2",Стр.Аналитика2));
        Если НайденныеСтроки.Количество() = 0 Тогда
            Строка = Таб.Добавить();
            Строка.Аналитика2 = Стр.Аналитика2;
        Иначе
            Строка = НайденныеСтроки[0];
        КонецЕсли;
        Строка.Аналитика1 = Стр.Аналитика1;
        Строка.Аналитика3 = Стр.Аналитика3;
        Колонка = Таб.Колонки.Найти(СокрЛП(Стр.Показатель));
        Если Колонка = Неопределено Тогда
            Таб.Колонки.Добавить(СокрЛП(Стр.Показатель));
            Колонка = Таб.Колонки.Найти(СокрЛП(Стр.Показатель));
        КонецЕсли;
        Строка[Таб.Колонки.Индекс(Колонка)] = Стр.Значение;
    КонецЦикла;
    // Конец заполнения Таб
    
    // Вывод результатов
    Для Каждого Стр Из Таб Цикл
        ТекстСообщения = "";
        Для сч = 0 По Таб.Колонки.Количество()-1 Цикл
            ТекстСообщения = ТекстСообщения + " "+Строка(Стр[сч]);
        КонецЦикла;
        Сообщить(ТекстСообщения);
    КонецЦикла;
    
    PS А "Левое соединение" в День любви, семьи и верности звучит кощунственно! :)
    Последнее редактирование: 8 июл 2016
  16. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Катюфка, все хорошо, за исключением одного НО.
    Что у тебя будет например на таких данных:
    Аналитика1 —-— Аналитика2------Аналитика3-------Показатель-----— Значение
    Склад Основной-----— ОАО Аист-----— Договор № 344-----— Количество-----— 2
    Склад Основной-----— ОАО Аист-----— Договор № 345-----— Сумма-----— 500

    ;)
  17. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Может быть и склад другой. И еще какие-нибудь нюансы, о которых мы не знаем. Достаточно будет в стуктуру добавить нужные колонки и значения их для поиска.
  18. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Угу.

    Код:
        Таб = Новый ТаблицаЗначений;
        Таб.Колонки.Добавить("Аналитика1");
        Таб.Колонки.Добавить("Аналитика2");
        Таб.Колонки.Добавить("Аналитика3");
        Для Каждого СтрокаТаблицыЗначений Из ТЗ Цикл
           
            КлючПоиска = Новый Структура("Аналитика1, Аналитика2, Аналитика3", СтрокаТаблицыЗначений.Аналитика1, СтрокаТаблицыЗначений.Аналитика2, СтрокаТаблицыЗначений.Аналитика3);
            НайденныеСтроки = Таб.НайтиСтроки(КлючПоиска);
            Если НайденныеСтроки.Количество() = 0 Тогда
                НоваяСтрока = Таб.Добавить();
                ЗаполнитьЗначенияСвойств(НоваяСтрока, КлючПоиска);
            Иначе
                НоваяСтрока = НайденныеСтроки[0];
            КонецЕсли;
           
            ИмяКолонки = СокрЛП(СтрокаТаблицыЗначений.Показатель);
            Если Таб.Колонки.Найти(ИмяКолонки) = Неопределено Тогда
                Таб.Колонки.Добавить(ИмяКолонки);
            КонецЕсли;
           
            НоваяСтрока[ИмяКолонки] = СтрокаТаблицыЗначений.Значение;
           
        КонецЦикла;
    
  19. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Ух ты! В индексе можно использовать имя колонки? Буду знать! Это существенно упрощает код.
  20. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Мы еще не учли, что показателем может быть несколько слов, например, Сумма без НДС.
    Лучше будет, наверное, сделать удаление всех пробелов вместо СокрЛП:

    Код:
            ИмяКолонки = СтрЗаменить(СтрокаТаблицыЗначений.Показатель," ","");
    

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