Определение ширины табличного документа

1. PerlAmutor 129 11.12.17 17:05 Сейчас в теме
Хочу обойти табличный документ сверху вниз и заполнить свойства ячеек. Есть замечательные методы ТабличныйДокумент.ШиринаТаблицы и ТабличныйДокумент.ВысотаТаблицы. Однако проблема возникает тогда, когда в этом ТД используются строки с отдельными форматами колонок, т.е.
на одной строке это 20 колонок, а на второй строке уже 1 колонка, но широкая на суммарную ширину колонок первой строки.
Так вот если я проставлю второй строке свойства в 20 колонках, то в просмотре перед печатью видно, что таблицу сильно сдвинуло влево и откуда-то образовалось
свободное пространство. В связи с чем возник вопрос определения количества колонок в конкретной строке. Методов сделать этого для области табличного документа я не нашел. Подскажите куда рыть?
По теме из базы знаний
Найденные решения
6. PerlAmutor 129 12.12.17 09:04 Сейчас в теме
Вот что обнаружилось:
1. Конструктор для вызова метода Область вида "Область(НомерСтроки,,,,)" - обрушивает клиент. Нужно использовать "Область(НомерСтроки,,НомерСтроки)".
2. Метод Право() возвращает число "0" в таком коде на каждую строку:
        Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл

            ШТаблицы = 0;

            ТДОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки,,НомерСтроки);
            Если ТипЗнч(ТДОбластьСтроки) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда

                ШТаблицы = ТДОбластьСтроки.Право;

                Сообщить(ШТаблицы);

            КонецЕсли;

              Для НомерКолонки = 1 По ШТаблицы Цикл

                Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
                Ячейка.Защита = Истина;

            КонецЦикла;

        КонецЦикла;
Показать


3. Мне удалось решить вопрос через преобразование строки табличного документа в отдельный табличный документ:

        Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл

            ТДОбластьСтроки = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки,,НомерСтроки);
            ШТаблицы = 0;

            Если ТипЗнч(ТДОбластьСтроки) = Тип("ТабличныйДокумент") Тогда
                ШТаблицы = ТДОбластьСтроки.ШиринаТаблицы;
                Сообщить(ШТаблицы);
            КонецЕсли;

            Для НомерКолонки = 1 По ШТаблицы Цикл

                Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
                Ячейка.Защита = Истина;

            КонецЦикла;

        КонецЦикла;
Показать


Вариант через одно место, но вроде рабочий.
fixin; Orlando Skibraves; SergeyRomanov; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. bs.nnov 11.12.17 19:16 Сейчас в теме
Т.Добавить(ШапкаДокумента);
Т.Добавить(СтрокаДокумента);
Т.Добавить(ПодвалДокумента);
Если Не ТабДок.ПроверитьВывод(Т) Тогда
    Сообщить("Документ не умещается на страницу!");
КонецЕсли;
3. PerlAmutor 129 11.12.17 21:14 Сейчас в теме
(2) При чем тут это?
Попробую объяснить попроще. В MXL (moxel) макетах есть такое понятие как "Формат строк", которого нет у Excel. Собственный формат строки позволяет настраивать собственную ширину колонок только для конкретных выбранных строк таблицы. Тут об этом написано: https://its.1c.ru/db/metod8dev#content:2227:hdoc
Так вот если использовать метод ШиринаТаблицы() на документе, где есть строки с собственным форматом строк, то этот метод возвращает максимальное количество колонок находящихся в одной из строк табличного документа. Предположим вам понадобилось выставить жирный шрифт в каждой ячейки таблицы,
был написан цикл типа "Для НомерКолонки = 1 По ТД.ШиринаТаблицы() Цикл". И тут цикл натыкается на строку, где стоит собственный формат и в этой строке всего
1 колонка. Вопрос, зачем выставлять остальным 50-и колонкам такой строки жирный шрифт и смещать область границы печати далеко вправо, когда размер всего 1 колонки равен размеру 50-ти колонок в одной из строк табличного документа?
4. artkor 270 11.12.17 22:44 Сейчас в теме
Если я правильно понял - можно программно получить "Объединенную" область таблицы, например так
Обл = ТД.Область("R3C1:R3C5")

Затем у области прочитать свойства
Обл.Лево, Обл.Право
- это и есть номера колонок начальная и конечная. Разность получится равной количеству колонок в области.
Еще поиграйтесь с методами "Разъединить, Объединить" - возможно Вам полезно будет для решения задачи
5. PerlAmutor 129 12.12.17 08:19 Сейчас в теме
(4) Попробовал. Наткнулся на баг платформы. Этот код обрушивает клиент:

        Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл

            ШТаблицы = ТабличныйДокумент.Область(НомерСтроки,,,,).Право();

            Для НомерКолонки = 1 По ШТаблицы Цикл

                Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
                Ячейка.Защита = Истина;

            КонецЦикла;

        КонецЦикла;
Показать
6. PerlAmutor 129 12.12.17 09:04 Сейчас в теме
Вот что обнаружилось:
1. Конструктор для вызова метода Область вида "Область(НомерСтроки,,,,)" - обрушивает клиент. Нужно использовать "Область(НомерСтроки,,НомерСтроки)".
2. Метод Право() возвращает число "0" в таком коде на каждую строку:
        Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл

            ШТаблицы = 0;

            ТДОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки,,НомерСтроки);
            Если ТипЗнч(ТДОбластьСтроки) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда

                ШТаблицы = ТДОбластьСтроки.Право;

                Сообщить(ШТаблицы);

            КонецЕсли;

              Для НомерКолонки = 1 По ШТаблицы Цикл

                Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
                Ячейка.Защита = Истина;

            КонецЦикла;

        КонецЦикла;
Показать


3. Мне удалось решить вопрос через преобразование строки табличного документа в отдельный табличный документ:

        Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл

            ТДОбластьСтроки = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки,,НомерСтроки);
            ШТаблицы = 0;

            Если ТипЗнч(ТДОбластьСтроки) = Тип("ТабличныйДокумент") Тогда
                ШТаблицы = ТДОбластьСтроки.ШиринаТаблицы;
                Сообщить(ШТаблицы);
            КонецЕсли;

            Для НомерКолонки = 1 По ШТаблицы Цикл

                Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
                Ячейка.Защита = Истина;

            КонецЦикла;

        КонецЦикла;
Показать


Вариант через одно место, но вроде рабочий.
fixin; Orlando Skibraves; SergeyRomanov; +3 Ответить
8. fixin 4253 15.04.24 20:44 Сейчас в теме
(6) Спасибо, применил у себя:
Процедура УстановитьОсновнойЦветСтроки(ТабДок, Стр, Цвет) Экспорт
	//https://forum.infostart.ru/forum9/topic183005/
	
	Т = Новый ТабличныйДокумент();
	//ОбластьСтрока = ТабДок.Область("R" + XMLСтрока(Стр));
	ТДСтрока = ТабДок.ПолучитьОбласть("R" + XMLСтрока(Стр));
	ОсновнойЦвет = ТабДок.Область(Стр, 1).ЦветФона;
	Для Кол = 1 По ТДСтрока.ШиринаТаблицы Цикл
		ТекущийЦвет = ТабДок.Область(Стр, Кол).ЦветФона;
		Если ОсновнойЦвет = ТекущийЦвет Тогда
			ТабДок.Область(Стр, Кол).ЦветФона = Цвет;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать
7. user700897_nkt1c 26.04.19 13:42 Сейчас в теме
Столкнулся с такой же проблемой - пошел через Сериализацию

Функция КолонокПоСтрокам(Таб) Экспорт
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("UTF-8");
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML,Таб);
	ЧтениеXML = Новый ЧтениеXML;
	Стр = ЗаписьXML.Закрыть();
	ЧтениеXML.УстановитьСтроку(Стр);	
	ПостроительDOM = Новый ПостроительDOM;
	Ъ = ПостроительDOM.Прочитать(ЧтениеXML);
	СооК = Новый Соответствие;
	Колонки = Ъ.ПолучитьЭлементыПоИмени("columns");	
	Для А = 1 По Колонки.Количество() Цикл 
		Кл = Колонки[А-1];
		ЭлИД = Кл.ПолучитьЭлементыПоИмени("id");
		Если ЭлИД.Количество()>0 Тогда
			ИД = ЭлИД[0].ДочерниеУзлы[0].ЗначениеУзла;
		Иначе 
			ИД = "Общий";
		КонецЕсли;	
		ЭлРазмер = Кл.ПолучитьЭлементыПоИмени("size");
		Если ЭлРазмер.Количество()>0 Тогда
			Размер = ЭлРазмер[0].ДочерниеУзлы[0].ЗначениеУзла;
		Иначе 
			ВызватьИсключение "Ошибка";
		КонецЕсли;			
		СооК[ИД] = Число(Размер);
	КонецЦикла;
	
	Строки = Ъ.ПолучитьЭлементыПоИмени("rowsItem");
	Мсв = Новый Массив;
	Для А = 1 По Строки.Количество() Цикл 
		Стр = Строки[А-1];
		ЭлИД = Стр.ПолучитьЭлементыПоИмени("index")[0].ДочерниеУзлы[0].ЗначениеУзла;
		ЭлКИД = Стр.ПолучитьЭлементыПоИмени("row")[0].ПолучитьЭлементыПоИмени("columnsID");
		Если ЭлКИД.Количество() = 0 Тогда
			ИДКолонки = "Общий";
		Иначе 
			ЭлСтр = ЭлКИД[0];
			Если ЭлСтр.ДочерниеУзлы.Количество() = 0 Тогда
				ИДКолонки = "Общий";
			Иначе 
				ИДКолонки = ЭлСтр.ДочерниеУзлы[0].ЗначениеУзла;
			КонецЕсли;
		КонецЕсли;
		Мсв.Добавить(СооК[ИДКолонки]);
		Если (Мсв.Количество()-1)<>Число(ЭлИД) Тогда
			ВызватьИсключение "Ошибка";
		КонецЕсли;
	КонецЦикла;
	Возврат Мсв;	
КонецФункции
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот