Хочу обойти табличный документ сверху вниз и заполнить свойства ячеек. Есть замечательные методы ТабличныйДокумент.ШиринаТаблицы и ТабличныйДокумент.ВысотаТаблицы. Однако проблема возникает тогда, когда в этом ТД используются строки с отдельными форматами колонок, т.е.
на одной строке это 20 колонок, а на второй строке уже 1 колонка, но широкая на суммарную ширину колонок первой строки.
Так вот если я проставлю второй строке свойства в 20 колонках, то в просмотре перед печатью видно, что таблицу сильно сдвинуло влево и откуда-то образовалось
свободное пространство. В связи с чем возник вопрос определения количества колонок в конкретной строке. Методов сделать этого для области табличного документа я не нашел. Подскажите куда рыть?
Вот что обнаружилось:
1. Конструктор для вызова метода Область вида "Область(НомерСтроки,,,,)" - обрушивает клиент. Нужно использовать "Область(НомерСтроки,,НомерСтроки)".
2. Метод Право() возвращает число "0" в таком коде на каждую строку:
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ШТаблицы = 0;
ТДОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки,,НомерСтроки);
Если ТипЗнч(ТДОбластьСтроки) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
ШТаблицы = ТДОбластьСтроки.Право;
Сообщить(ШТаблицы);
КонецЕсли;
Для НомерКолонки = 1 По ШТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
Ячейка.Защита = Истина;
КонецЦикла;
КонецЦикла;
Показать
3. Мне удалось решить вопрос через преобразование строки табличного документа в отдельный табличный документ:
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ТДОбластьСтроки = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки,,НомерСтроки);
ШТаблицы = 0;
Если ТипЗнч(ТДОбластьСтроки) = Тип("ТабличныйДокумент") Тогда
ШТаблицы = ТДОбластьСтроки.ШиринаТаблицы;
Сообщить(ШТаблицы);
КонецЕсли;
Для НомерКолонки = 1 По ШТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
Ячейка.Защита = Истина;
КонецЦикла;
КонецЦикла;
Т.Добавить(ШапкаДокумента);
Т.Добавить(СтрокаДокумента);
Т.Добавить(ПодвалДокумента);
Если Не ТабДок.ПроверитьВывод(Т) Тогда
Сообщить("Документ не умещается на страницу!");
КонецЕсли;
(2) При чем тут это?
Попробую объяснить попроще. В MXL (moxel) макетах есть такое понятие как "Формат строк", которого нет у Excel. Собственный формат строки позволяет настраивать собственную ширину колонок только для конкретных выбранных строк таблицы. Тут об этом написано: https://its.1c.ru/db/metod8dev#content:2227:hdoc Так вот если использовать метод ШиринаТаблицы() на документе, где есть строки с собственным форматом строк, то этот метод возвращает максимальное количество колонок находящихся в одной из строк табличного документа. Предположим вам понадобилось выставить жирный шрифт в каждой ячейки таблицы,
был написан цикл типа "Для НомерКолонки = 1 По ТД.ШиринаТаблицы() Цикл". И тут цикл натыкается на строку, где стоит собственный формат и в этой строке всего
1 колонка. Вопрос, зачем выставлять остальным 50-и колонкам такой строки жирный шрифт и смещать область границы печати далеко вправо, когда размер всего 1 колонки равен размеру 50-ти колонок в одной из строк табличного документа?
Если я правильно понял - можно программно получить "Объединенную" область таблицы, например так
Обл = ТД.Область("R3C1:R3C5")
Затем у области прочитать свойства
Обл.Лево, Обл.Право
- это и есть номера колонок начальная и конечная. Разность получится равной количеству колонок в области.
Еще поиграйтесь с методами "Разъединить, Объединить" - возможно Вам полезно будет для решения задачи
(4) Попробовал. Наткнулся на баг платформы. Этот код обрушивает клиент:
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ШТаблицы = ТабличныйДокумент.Область(НомерСтроки,,,,).Право();
Для НомерКолонки = 1 По ШТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
Ячейка.Защита = Истина;
КонецЦикла;
КонецЦикла;
Вот что обнаружилось:
1. Конструктор для вызова метода Область вида "Область(НомерСтроки,,,,)" - обрушивает клиент. Нужно использовать "Область(НомерСтроки,,НомерСтроки)".
2. Метод Право() возвращает число "0" в таком коде на каждую строку:
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ШТаблицы = 0;
ТДОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки,,НомерСтроки);
Если ТипЗнч(ТДОбластьСтроки) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
ШТаблицы = ТДОбластьСтроки.Право;
Сообщить(ШТаблицы);
КонецЕсли;
Для НомерКолонки = 1 По ШТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
Ячейка.Защита = Истина;
КонецЦикла;
КонецЦикла;
Показать
3. Мне удалось решить вопрос через преобразование строки табличного документа в отдельный табличный документ:
Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
ТДОбластьСтроки = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки,,НомерСтроки);
ШТаблицы = 0;
Если ТипЗнч(ТДОбластьСтроки) = Тип("ТабличныйДокумент") Тогда
ШТаблицы = ТДОбластьСтроки.ШиринаТаблицы;
Сообщить(ШТаблицы);
КонецЕсли;
Для НомерКолонки = 1 По ШТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки,НомерКолонки);
Ячейка.Защита = Истина;
КонецЦикла;
КонецЦикла;
Столкнулся с такой же проблемой - пошел через Сериализацию
Функция КолонокПоСтрокам(Таб) Экспорт
Запись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)<>Число(ЭлИД) Тогда
ВызватьИсключение "Ошибка";
КонецЕсли;
КонецЦикла;
Возврат Мсв;
КонецФункции