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

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

    ШТаблицы = 0;

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

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

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

    КонецЕсли;

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

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

    КонецЦикла;

    КонецЦикла;
```

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

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

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

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

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

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

    КонецЦикла;

    КонецЦикла;
```

Вариант через одно место, но вроде рабочий.
---
```1c
    Т.Добавить(ШапкаДокумента);
    Т.Добавить(СтрокаДокумента);
    Т.Добавить(ПодвалДокумента);
    Если Не ТабДок.ПроверитьВывод(Т) Тогда
    Сообщить("Документ не умещается на страницу!");
    КонецЕсли;
```
---
При чем тут это?
Попробую объяснить попроще. В MXL (moxel) макетах есть такое понятие как "Формат строк", которого нет у Excel. Собственный формат строки позволяет настраивать собственную ширину колонок только для конкретных выбранных строк таблицы. Тут об этом написано: https://its.1c.ru/db/metod8dev#content:2227:hdoc
Так вот если использовать метод ШиринаТаблицы() на документе, где есть строки с собственным форматом строк, то этот метод возвращает максимальное количество колонок находящихся в одной из строк табличного документа. Предположим вам понадобилось выставить жирный шрифт в каждой ячейки таблицы,
был написан цикл типа "Для НомерКолонки = 1 По ТД.ШиринаТаблицы() Цикл". И тут цикл натыкается на строку, где стоит собственный формат и в этой строке всего
1 колонка. Вопрос, зачем выставлять остальным 50-и колонкам такой строки жирный шрифт и смещать область границы печати далеко вправо, когда размер всего 1 колонки равен размеру 50-ти колонок в одной из строк табличного документа?
---
Если я правильно понял - можно программно получить "Объединенную" область таблицы, например так

```1c
    Обл = ТД.Область("R3C1:R3C5")
```

Затем у области прочитать свойства
```1c
    Обл.Лево, Обл.Право
```
 - это и есть номера колонок начальная и конечная. Разность получится равной количеству колонок в области.
Еще поиграйтесь с методами "Разъединить, Объединить" - возможно Вам полезно будет для решения задачи
---
Попробовал. Наткнулся на баг платформы. Этот код обрушивает клиент:

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

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

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

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

    КонецЦикла;

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

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

    ШТаблицы = 0;

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

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

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

    КонецЕсли;

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

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

    КонецЦикла;

    КонецЦикла;
```

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

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

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

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

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

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

    КонецЦикла;

    КонецЦикла;
```

Вариант через одно место, но вроде рабочий.
---
Спасибо, применил у себя:

```1c
    Процедура УстановитьОсновнойЦветСтроки(ТабДок, Стр, Цвет) Экспорт
    //https://forum.infostart.ru/forum9/topic183005/

    Т = Новый ТабличныйДокумент();
    //ОбластьСтрока = ТабДок.Область("R" + XMLСтрока(Стр));
    ТДСтрока = ТабДок.ПолучитьОбласть("R" + XMLСтрока(Стр));
    ОсновнойЦвет = ТабДок.Область(Стр, 1).ЦветФона;
    Для Кол = 1 По ТДСтрока.ШиринаТаблицы Цикл
    ТекущийЦвет = ТабДок.Область(Стр, Кол).ЦветФона;
    Если ОсновнойЦвет = ТекущийЦвет Тогда
    ТабДок.Область(Стр, Кол).ЦветФона = Цвет;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```
---
Столкнулся с такой же проблемой - пошел через Сериализацию

```1c
    Функция КолонокПоСтрокам(Таб) Экспорт
    Запись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)<>Число(ЭлИД) Тогда
    ВызватьИсключение "Ошибка";
    КонецЕсли;
    КонецЦикла;
    Возврат Мсв;
    КонецФункции
```