1. Arxxximed 8 11.07.19 17:57 Сейчас в теме

Удалить формат строк табличного документа

В интерфейсе поля формы, или редактора Табличного документ в контекстном меню есть пункт "удалить формат строк". Действия этой кнопки можно повторить программно?

Бывает что на выходе получаем табличный документ, в котором содержаться области, со своими форматами строк... Иногда у пользоватлей при редактировании такого табличного документ возникают нюансы..

В довесок еще вопрос... Как можно определить группы областей со своим собственным форматом строк программно? ведь такие области могут находится не сплошняком а с разрывом.
Найденные решения
16. Arxxximed 8 13.07.19 08:06 Сейчас в теме
Итак , результат изысканий:
На программном уровне функции , такие как "Удалить формат строк" и расчет автоширины колонок, не реализованы.
Но найдено два способа обходных путей.
1. сериализация , изменение сериализованного объекта , и обратная десериализация
Пример:
&НаКлиенте
Процедура УдалитьФорматСтрокТабличногоДокумента(Команда)
// Сериализуем наш табличный документ в объект XDTO
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТабличныйДокумент);
// Ищем списокXDTO описывающий колонки
КолонкиXDTO = ОбъектXDTO.columns;
сч = Колонки.Количество()-1;
Пока Сч  >= 0 Цикл
	Колонка = Колонки[сч];
	// Если колонка имеет свой собственный ID, тогда некоторые строки на него ссылаются
	// это и есть те строки, которые имеют собственный формат
	Если ЗначениеЗаполнено(Колонка.id) Тогда
		// удаляем эти колонки
		Колонки.Удалить(Сч);
	КонецЕсли;
	Сч = Сч-1;
КонецЦикла;
// Десериализуем объектXDTO обратно в табличный документ
ТабличныйДокумент = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
КонецПроцедуры
Показать

Данный метод хорош тем, что полностью может отработать НаКлиенте. Но при больших размерах данных в табличном документе время выполнения будет задерживаться в сериализации и десериализации... Так же данный способ позволяет ответить на мой второй вопрос : Найти строки с одинаковым форматом строк... Строки у которых будет одинаковый формат будут ссылаться на один и тот же ID колонок. Пример приводить не буду, пока сильной необходимости нету. А так же метод пока не отлажен, и кто его знает какие есть подводные камни.
Спасибо за идею из (9) и (14) . В (14) считаю излишне перегонять это в xml или json. И тем более перебирать строки. Лучше наверное работать в "объектной" модели.

2. Копирование области в пустую часть, и удаление области с собственным форматом
Пример:
&НаСервере
Процедура УдалитьФорматСтрокТабличногоДокументаНаСервере()
// Попытаемся установить у всех колонок одинаковую ширину
// в данном случае у всех строк Табличного документа станет собственный но одинаковый 
// формат
ТабличныйДокумент.Область().СоздатьформатСтрок();
// Запоминаем высоту и ширину области с данными, что бы потом удалить ненужную область
ВысотаТаблицы  = ТабличныйДокумент.ВысотаТаблицы;
ШиринаТаблицы  = ТабличныйДокумент.ШиринаТаблицы;
// Здесь нужно взять именно область типа "прямоугольник", иначе собственные форматы строк скопируются
// больше всего и было потрачено времени на поиск этой особенности
ОбластьТД = ТабличныйДокумент.Область(1,1,ВысотаТаблицы,ШиринаТаблицы);
// Вставляем нашу область в область табличного документа без собственного формата
// ширины колонок при этом возьмуться из общего табличного документа
ТабличныйДокумент.ВставитьОбласть(ОбластьТД,ТабличныйДокумент.Область(ВысотаТаблицы+1,1));
// удаляем изначальную область. Здесь уже обязательно нужно удалять область типа "строки"
ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(1,,ВысотаТаблицы),ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецПроцедуры
Показать


Минус данного метода, что он выполняется только на НаСервере. На больших данных наблюдается задержка как раз при вызове сервера, а так же при удалении области. Так же минусом будет то, что "полетят" высоты строк
Еще "фишка" данного способа, все "невидимые" строки отобразятся...Иногда это полезно

Спасибо всем за помощь! Надеюсь это поможет кому-либо не потратить много времени на эту маленькую фишку. И привет всем кто пришел сюда после бесполезных ответов на данный вопрос при поиске в интернете :)

PS
Можете спросить а для чего это вообще может понадобиться.
1. Когда предоставляешь пользователю редактировать документ, а он при этом сформирован внешними функциями или отчетом, то иногда пользователь может недоумевать, почему "плывут колонки", или почему я не могу вставить нормально строки.
2. При чтении в табличный документ например из эксель, листы эксель читаются именованными областями, каждая из которых имеет собственный формат строк. А для корректного, последующего чтения данных из табличного документа нужно как раз что бы все было видно достаточно прозрачно.
3. При сохранении табличного документа в эксель, что бы не добавлялись лишние колонки в самом эксель.
Densor1c; SlavaKron; +2 Ответить
Остальные ответы
Избранное Подписка Сортировка: Древо
7. spacecraft 12.07.19 00:09 Сейчас в теме
(1) есть у области табличного документа метод: СоздатьФорматСтрок()
"В новом формате строк размеры колонок будут соответствовать размерам колонок, которые были установлены в области"
8. Arxxximed 8 12.07.19 01:47 Сейчас в теме
(7) ДА, именно этим методом этот формат "собственный" формат строк и создается... Еще он может быть создан если у области типа "строки" просто изменить ширину колонки...
Вопрос собственно как удалить этот формат строк. А еще лучше, найти области с одинаковыми форматами строк.

я в принципе нашел костыльный способ, но хочу посмотреть предложения по решению....

Еще интересно что кнопка "удалить формат строк" не вызывает вызова сервера, но я вообще не нашел как это можно сделать на клиенте
11. spacecraft 12.07.19 09:39 Сейчас в теме
(8) Тогда вопрос, как понимаете "удалить формат строк"? Даже вручную удаляя формат строк, формат сбрасывается на формат основной области. Т.е. если изменили основной формат, то удаление формата строк не сбросит в значение по-умолчанию отдельную область. Сбросит в такое же, как у измененной основной.
Тут принцип тот же.

Вариант1. Определяете нужную область. Для области выставляете нужные ширину колонок. Вызываете СоздатьФорматСтрок(). Для всей области будет нужный формат строк.
Вариант2. В макете находите чистую область нужного форматирования и определяете по ней область. Далее добавляете в не нужные области. Далее вызываете СоздатьФорматСтрок().
12. Arxxximed 8 12.07.19 10:40 Сейчас в теме
(11) Создатьформатстрок добавит свой формат строк... А мне нужно избавиться от него... что бы в какой бы ячейке не находился юзер , смог спокойно изменить ширину колонок, и при этом все не поплыло...
Если взять все заполненные области, применить этот метод, то все равно последняя строка будет отличаться форматом от всего документа... То есть, юзер захочет добавить данные после последней строки, то у этой последней строки будет уже другой формат строк..

Про первый вариант вообще не понял... Особенно с пунктом "определяете нужную область"
13. spacecraft 12.07.19 11:23 Сейчас в теме
(12) первый вариант, если необходимо для всей области прописать нужную ширину колонок.
Если вопрос ставится так, что пользователь еще дополнительно будет вводить строки, тогда да, работать не будет. Только последующей обработкой включение в область и новым форматированием.
Но первоначально был пример (5) о внутреннем форматировании.
2. SlavaKron 11.07.19 18:03 Сейчас в теме
ОбластьЯчеекТабличногоДокумента (SpreadsheetDocumentRange)
Очистить (Clear)
Синтаксис:

Очистить(<ОчищатьТекст>, <ОчищатьФорматирование>, <ОчищатьРамки>)
3. Arxxximed 8 11.07.19 19:22 Сейчас в теме
(2) спасибо большое что цитируете справку.. Но как это относится хотя бы к одному из вопросов? Я не говорю про цвет ячеек или что то в этом роде... А про свои собственные ширины колонок у некоторых строк, которые отличаются от общего документа
4. SlavaKron 11.07.19 19:41 Сейчас в теме
У меня работает:
ТабДок.Область("T").Очистить(Ложь, Истина);
5. Arxxximed 8 11.07.19 22:24 Сейчас в теме
(4)
ТабДок.Область("T").Очистить(Ложь, Истина);

У всех ячеек убирается форматирование, то есть и ширина ставится по умолчанию...Но как у некоторых строк было свои ширины колонок, так и остались.
Для того что бы увидеть - достаточно выделить колонку... Выделение будет с проспусками.
Кстати в этом коде не обязательно указывать букву т
ТабДок.Область().Очистить(Ложь, Истина);
будет работать аналогично
Прикрепленные файлы:
9. SlavaKron 12.07.19 08:39 Сейчас в теме
(5) Правда ваша. Тогда только сериализовать и удалять секции "columns" с уникальными идентификаторами или удалять атрибут "columnsID" у строк. Кстати, всё это можно сделать на клиенте.
Прикрепленные файлы:
10. Arxxximed 8 12.07.19 09:22 Сейчас в теме
(9) а эта идея уже достаточно интересна... По крайней мере отвечает на второй вопрос... По ковыряюсь.. Спасибо.

Только уверен что метод не достаточно будет быстрый... А вот кнопка быстро удаляет формат строк. Странно что не всю функциональность вывели в программный код
14. SlavaKron 12.07.19 18:42 Сейчас в теме
(10)
уверен что метод не достаточно будет быстрый

Попробуйте, такой код. У меня достаточно быстро отрабатывает:
&НаКлиенте
Процедура УдалитьФорматСтрок(Команда)
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТабДок);
	
	Строка = ЗаписьXML.Закрыть();
	ТекущаяПозиция = 1;
	Пока Истина Цикл
		КолонкиНачало = СтрНайти(Строка, "<columns>", , ТекущаяПозиция);
		Если КолонкиНачало = 0 Тогда
			Прервать
		КонецЕсли;
		КолонкиКонец = СтрНайти(Строка, "</columns>", , КолонкиНачало + 9);
		ПозицияИДКолонки = СтрНайти(Строка, "<id>", НаправлениеПоиска.СКонца, КолонкиКонец);
		Если ПозицияИДКолонки = 0 Тогда
			ТекущаяПозиция = КолонкиКонец + 10;
			Продолжить;
		КонецЕсли;
		
		Строка = Лев(Строка, КолонкиНачало - 1) + Сред(Строка, КолонкиКонец + 10);
		
		ТекущаяПозиция = КолонкиНачало;		
	КонецЦикла;
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(Строка);
	ТабДок = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецПроцедуры
Показать
Прикрепленные файлы:
УдалитьФорматСтрок.epf
Arxxximed; +1 Ответить
15. Arxxximed 8 12.07.19 21:00 Сейчас в теме
(14) Не успел предложить свой вариант, точнее два. Завтра отпишу ответом... Ваш код на мой похожий, только я считаю что мой более оптимизированный (спрошу вашего мнения ))
Достаточно быстрый.. я проверял на 10 000 строк табличного документа, отпрабатывает примерно меньше чем за сек... Но все равно не сравнимо если нажать эту злосчастную кнопку в интерфейсе...
16. Arxxximed 8 13.07.19 08:06 Сейчас в теме
Итак , результат изысканий:
На программном уровне функции , такие как "Удалить формат строк" и расчет автоширины колонок, не реализованы.
Но найдено два способа обходных путей.
1. сериализация , изменение сериализованного объекта , и обратная десериализация
Пример:
&НаКлиенте
Процедура УдалитьФорматСтрокТабличногоДокумента(Команда)
// Сериализуем наш табличный документ в объект XDTO
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ТабличныйДокумент);
// Ищем списокXDTO описывающий колонки
КолонкиXDTO = ОбъектXDTO.columns;
сч = Колонки.Количество()-1;
Пока Сч  >= 0 Цикл
	Колонка = Колонки[сч];
	// Если колонка имеет свой собственный ID, тогда некоторые строки на него ссылаются
	// это и есть те строки, которые имеют собственный формат
	Если ЗначениеЗаполнено(Колонка.id) Тогда
		// удаляем эти колонки
		Колонки.Удалить(Сч);
	КонецЕсли;
	Сч = Сч-1;
КонецЦикла;
// Десериализуем объектXDTO обратно в табличный документ
ТабличныйДокумент = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
КонецПроцедуры
Показать

Данный метод хорош тем, что полностью может отработать НаКлиенте. Но при больших размерах данных в табличном документе время выполнения будет задерживаться в сериализации и десериализации... Так же данный способ позволяет ответить на мой второй вопрос : Найти строки с одинаковым форматом строк... Строки у которых будет одинаковый формат будут ссылаться на один и тот же ID колонок. Пример приводить не буду, пока сильной необходимости нету. А так же метод пока не отлажен, и кто его знает какие есть подводные камни.
Спасибо за идею из (9) и (14) . В (14) считаю излишне перегонять это в xml или json. И тем более перебирать строки. Лучше наверное работать в "объектной" модели.

2. Копирование области в пустую часть, и удаление области с собственным форматом
Пример:
&НаСервере
Процедура УдалитьФорматСтрокТабличногоДокументаНаСервере()
// Попытаемся установить у всех колонок одинаковую ширину
// в данном случае у всех строк Табличного документа станет собственный но одинаковый 
// формат
ТабличныйДокумент.Область().СоздатьформатСтрок();
// Запоминаем высоту и ширину области с данными, что бы потом удалить ненужную область
ВысотаТаблицы  = ТабличныйДокумент.ВысотаТаблицы;
ШиринаТаблицы  = ТабличныйДокумент.ШиринаТаблицы;
// Здесь нужно взять именно область типа "прямоугольник", иначе собственные форматы строк скопируются
// больше всего и было потрачено времени на поиск этой особенности
ОбластьТД = ТабличныйДокумент.Область(1,1,ВысотаТаблицы,ШиринаТаблицы);
// Вставляем нашу область в область табличного документа без собственного формата
// ширины колонок при этом возьмуться из общего табличного документа
ТабличныйДокумент.ВставитьОбласть(ОбластьТД,ТабличныйДокумент.Область(ВысотаТаблицы+1,1));
// удаляем изначальную область. Здесь уже обязательно нужно удалять область типа "строки"
ТабличныйДокумент.УдалитьОбласть(ТабличныйДокумент.Область(1,,ВысотаТаблицы),ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецПроцедуры
Показать


Минус данного метода, что он выполняется только на НаСервере. На больших данных наблюдается задержка как раз при вызове сервера, а так же при удалении области. Так же минусом будет то, что "полетят" высоты строк
Еще "фишка" данного способа, все "невидимые" строки отобразятся...Иногда это полезно

Спасибо всем за помощь! Надеюсь это поможет кому-либо не потратить много времени на эту маленькую фишку. И привет всем кто пришел сюда после бесполезных ответов на данный вопрос при поиске в интернете :)

PS
Можете спросить а для чего это вообще может понадобиться.
1. Когда предоставляешь пользователю редактировать документ, а он при этом сформирован внешними функциями или отчетом, то иногда пользователь может недоумевать, почему "плывут колонки", или почему я не могу вставить нормально строки.
2. При чтении в табличный документ например из эксель, листы эксель читаются именованными областями, каждая из которых имеет собственный формат строк. А для корректного, последующего чтения данных из табличного документа нужно как раз что бы все было видно достаточно прозрачно.
3. При сохранении табличного документа в эксель, что бы не добавлялись лишние колонки в самом эксель.
Densor1c; SlavaKron; +2 Ответить
18. SlavaKron 13.07.19 08:47 Сейчас в теме
(16) Да, ваш код лучше и быстрее, хотя производительность упирается не в удаление секций, а в сериализацию/десериализацию. Я, по правде сказать, не знал как это сделать в объектной модели, так что, если мне когда-нибудь понадобиться программно удалить формат строк, воспользуюсь вашим кодом. Было бы неплохо развить этот код до удаления формата выделенных строк, как это и делает интерактивная функция.
19. Arxxximed 8 13.07.19 08:56 Сейчас в теме
(18) Не понял про упор в производительности...
1 Способ сериализует/десериализует, но удаляет только формат колонок, но не удаляет области.
2. Способ возможно лучше применять, когда документ получаем на сервере... Он читабельней, и понятно что делает, и как его изменить, что бы ничего не сломалось... Но вставка области,по своей сути, копирование данных... То есть документ из 10 000 строк временно станет документом из 20 000 строк. Вот тут производительности и упадет.
20. SlavaKron 13.07.19 09:04 Сейчас в теме
(19) Это было про первый способ — основные затраты идут на сериализацию и десериализцию.
17. Arxxximed 8 13.07.19 08:20 Сейчас в теме
Может у кого есть замечания, или другие способы, буду только рад (16)
6. Arxxximed 8 11.07.19 22:38 Сейчас в теме
Ну и еще,.. действие метода области табличного документа Очистить() - совсем не так же работает как если нажать кнопку [удалить формат строк]. Цвета ячеек остаются как и были... только убираются вот эти собственные ширины
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день