Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 17:29

"Свой метод" типа Свернуть

Автор beztrud, 16 окт 2014, 22:38

0 Пользователей и 3 гостей просматривают эту тему.

beztrud

Здравствуйте. Необходимо свернуть строки табличной части. Делаю так




&НаКлиенте
Процедура Объединить(Команда)
ОбъединитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбъединитьНаСервере()
   ТаблицаЗначений = Объект.ИсходныеДанные.Выгрузить();
   ТаблицаЗначений.Свернуть("ВысотаПанели, ШиринаПанели", "НаименованиеПанели, Количество, Примечание");
   Объект.ИсходныеДанные.Загрузить(ТаблицаЗначений);
КонецПроцедуры


Где Исходные данные - табличная часть, Количество - число, НаименованиеПанели и Примечание - строки.


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


Мне же нужно, чтобы НаименованиеПанели и Примечание не преобразовывались в 0.


Попытаюсь объяснить наглядно. Есть строки
1) р300  700  300  1  глухая
2) р600  700  300  2  глухие


Хотелось бы получить строку


р300, р600  700  300 3  глухая, глухие
Вопрос. Подскажите пожалуйста как сделать подобное преобразование.


Если использовать Свернуть получаю


0  700  300  3  0.

дфтын

дык вы точно внимательно справку читали?
второй параметр у Свернуть чего значит?
мне просто интересно, как вы хотите примечания с примечаниями сложить
блин ето же 1  класс начальной школы... ужас ужас ужас..
Помог? Нажми - Спасибо :)
skype: Soprov1C

MuI_I_Ika

Ничего не получится суммируемые показатели всегда будут пытаться быть просуммированными. Вам нужно писать собственную процедуру по свертке таблицы.

beztrud

Цитата: MuI_I_Ika от 17 окт 2014, 01:23
Вам нужно писать собственную процедуру по свертке таблицы.

Именно про это и хотел спросить. Как и куда выгружать и как потом свернуть.

Yura063

Напишите обработку в общем модуле и вызывайте ее откуда хотите.
Помогли, отблагодари!

cska-fanat-kz

Цитата: beztrud от 17 окт 2014, 10:14Именно про это и хотел спросить. Как и куда выгружать и как потом свернуть.

Вы же сами убедились что Свернуть() вам не подходит.
Пишете сами. Последовательным перебором строк...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

LexaK

вот набросал небольшую функцию по сворачиванию для для вашего случая,
с небольшими ограничениями, она не универсальная (если захотите можете ее универсализировать)
т.е. вызов будет выглядеть так
ТЗ = СвернутьТЗ(ТЗ,"ПоляКлюч","ПоляСтр","ПоляСум");
где:
"ПоляКлюч" = "Поле1,Поле2..." поля по которым идет поиск, группировка строк
"ПоляСтр" = "ПолеА,ПолеБ..." строковые поля, которые должны складываться через ","
"ПоляСум" = "Поле8,Поле9..." поля по которым идет обычное суммирование


а вот пример упрощеной функции (все обрабатываемые поля зашиты в коде)

&НаСервере
Функция СвернутьТЗ(прТЗ)
//Вставить содержимое обработчика
Если Ложь Тогда
прТЗ = новый ТаблицаЗначений;
КонецЕсли;

//создаем результирующую таблицу
лкТЗ = прТЗ.СкопироватьКолонки();

//создаем структуру поиска
лкПоиск = Новый Структура("ВысотаПанели, ШиринаПанели");
//создаем структуру расчитываемых полей
лкПоля = Новый Структура("НаименованиеПанели, Количество, Примечание");

//начинаем перебирать исходную таблицу
Пока прТЗ.Количество()>0 Цикл
//инициализируем структуру поиска
ЗаполнитьЗначенияСвойств(лкПоиск,прТЗ[0]);
//создаем результирующую строку
лкНов = лкТЗ.Добавить(); //считаем что таблица ТЗ типизирована правильно
//инициализируем структуру полей
ЗаполнитьЗначенияСвойств(лкПоля,лкНов);

//получаем все строки с одинаковыми знаениями  ВысотаПанели, ШиринаПанели
    лкСтроки = прТЗ.НайтиСтроки(лкПоиск);

лкЗпт = "";
//обрабатываем найденные строки
Для каждого лкСтр Из лкСтроки Цикл
лкПоля.Количество = лкПоля.Количество + лкСтр.Количество;
лкПоля.НаименованиеПанели = лкПоля.НаименованиеПанели + лкЗпт + лкСтр.НаименованиеПанели;
лкПоля.Примечание = лкПоля.Примечание + лкЗпт + лкСтр.Примечание;
    лкЗпт = ",";

//обработанная строка больше не нужна, удаляем ее
прТЗ.Удалить(лкСтр);
КонецЦикла;

//закончили обработку найденых строк, заполняем результирующую
ЗаполнитьЗначенияСвойств(лкНов,лкПоиск);
ЗаполнитьЗначенияСвойств(лкНов,лкПоля);

КонецЦикла;

Возврат лкТЗ;

КонецФункции


еще раз говорю это упрощенная функция, она не группирует по примечаниям и наименованиям! т.е.
в результате у вас получится
Поле Примечание = "прим1,прим1,прим2,прим1" - "прим1" повторяется несколько раз
если не нужны повторения, можно легко доработать в этой функции.



Добавлено: 17 окт 2014, 12:29


код на выполнение не проверял, могут быть ошибки
если помогло нажмите: Спасибо!

beztrud

cska-fanat-kz, LexaK большое спасибо, будем пробывать

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск