Как объединить ячейки в Табличном Документе

1. user1979322 18.09.24 09:49 Сейчас в теме
Имеется задача, нужно объединить ячейки в таблице. В интернете нашел метод ТабДок.Область("....").Объединить
Выдается ошибка метод объекта не обнаружен (Область).
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
13. Anton_new01 18.09.24 11:10 Сейчас в теме
(1)
как вам уже многие ответили - проблема в том, что в вашей переменной ТабДок - не табличный документ, соответсвенно и данные методы которые можно использовать после точки - не обнаружены.

чтобы в переменной ТабДок - был табличный документ. можно сделать например так:
ТабДок = Новый ТабличныйДокумент;
и далее
ТабДок.Область("....").Объединить();
17. user1979322 18.09.24 11:23 Сейчас в теме
(13) Спасибо, по пробую с этой стороны зайти.
2. truba 18.09.24 10:11 Сейчас в теме
3. user1979322 18.09.24 10:19 Сейчас в теме
(2) Нет, на сайте кусок кода и в нем так записано
ТабДок.Область("....").Объединить

Решил у себя попробовать, прочитал про метод и ошибка непонятная
4. truba 18.09.24 10:25 Сейчас в теме
(3) Какой тип переменной ТабДок? Выполните в отладчике эту команду ТипЗнч(ТабДок)
5. user1979322 18.09.24 10:51 Сейчас в теме
(4) Мне нужно в обработке нужно объединить ячейки в таблице значений или в табличном документе. Я нашел кусок кода и он не работает. Вопрос какой код позволит объединить ячейки
6. SlavaKron 18.09.24 11:00 Сейчас в теме
(5) Потому что в вашей переменной ТабДок не табличный документ. Объединить же ячейки в таблице значений невозможно.
7. romulanin 18.09.24 11:01 Сейчас в теме
(5) у тебя спрашивают - какой тип значения у переменной "табдок". Возможно это не табличный документ.

ТабличныйДокумент.Область("R3C"+Строка(НомерЯчейки+1) + ":R3C"+Строка(НомерЯчейки+2)).Объединить(); 
8. nomad_irk 76 18.09.24 11:04 Сейчас в теме
(7)
ТабличныйДокумент.Область("R3C"+Строка(НомерЯчейки+1) + ":R3C"+Строка(НомерЯчейки+2)).Объединить();


да жеванный крот.....где вы этому учитесь?

ТабличныйДокумент.Область(3, НомерЯчейки + 1, 3, НомерЯчейки + 2).Объединить();
orakool; user2033930; +2 Ответить
9. user1979322 18.09.24 11:05 Сейчас в теме
(8) Ошибка в том что ТабличныйДокумент не имеет метод Область. Как это исправить. Как обьединить ячейки
11. romulanin 18.09.24 11:07 Сейчас в теме
(8) Вариант синтаксиса: По имени
Синтаксис:
Область(<ИмяОбласти>)
Параметры:
<ИмяОбласти> (обязательный)
Тип: Строка.
Имя области или адрес в формате "R1C1:R2C2", где число после "R" обозначает номер строки, число после "C" - номер колонки, символом ":" (двоеточие) разделяются координаты левого верхнего и правого нижнего угла области. В качестве имени также можно передавать пересечение двух областей, записываемое как "<Имя области 1> | <Имя области 2>".
Вариант синтаксиса: По адресу
Синтаксис:
Область(<НомерПервойСтроки>, <НомерПервойКолонки>, <НомерПоследнейСтроки>, <НомерПоследнейКолонки>, <ФорматСтрок>)
Параметры:
14. nomad_irk 76 18.09.24 11:15 Сейчас в теме
(11) я в курсе, а вы не понимаете, что без смазочных материалов применяете возвратно-поступательные движения к фаллическим объектам выполняя преобразование числа к строке только для того, чтобы обратится к области по ее дефолтному имени, когда можно обращаться, указывая числовые значения напрямую.
orakool; SlavaKron; user2033930; +3 Ответить
15. romulanin 18.09.24 11:20 Сейчас в теме
(14) Дк вы приведите замеры производительности, где преобразование к строке замедляет работу. Все ваши замеры будут в пределах погрешности, не нужно выполнять возвратно-поступательные движения, доказывая всем, что жеванный крот жить не может.
16. пользователь 18.09.24 11:22
Сообщение было скрыто модератором.
...
18. romulanin 18.09.24 11:31 Сейчас в теме
(16) Ну посчитать нужным устраивать из этого флудильню, это конечно к Вам. Я предлагаю вам сделать замер и доказать что-то, а не выражать свое ИМХО. В справке есть такой вариант синтаксиса, его использование никто не ограничивает.
19. nomad_irk 76 18.09.24 11:36 Сейчас в теме
(18) в программировании не все обуславливается исключительно производительностью, но для вас это, видимо, за гранью вашего понимания.

Впринципе, любой код можно писать вот так:

Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСтатьиФинансированияЗарплата") Тогда Возврат; КонецЕсли; Если Объект.СуммыВозврата.Количество() = 0 Тогда Возврат; КонецЕсли;Организация = Объект.Организация; Период = Объект.Месяц;ФизическиеЛица = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект.Сотрудник);НакопленныеКорректировки = ВзаиморасчетыССотрудниками.КорректировкиВыплаты(Организация, Период, ФизическиеЛица, Объект.Ссылка);НакопленныеКорректировки.Колонки.СуммаКорректировки.Имя = "Сумма";ТаблицаНДФЛ = Новый ТаблицаЗначений;ТаблицаНДФЛ.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("Число"));ТаблицаНДФЛ.Колонки.Добавить("ФизическоеЛицо", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));ТаблицаНДФЛ.Колонки.Добавить("ВидУдержания", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыОсобыхНачисленийИУдержаний"));	ТаблицаНДФЛ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));	ТаблицаНДФЛ.Колонки.Добавить("ВидДоходаИсполнительногоПроизводства", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыДоходовИсполнительногоПроизводства"));	ТаблицаНДФЛ.Колонки.Добавить("БазаПоУмолчанию", Новый ОписаниеТипов("Булево"));
Для каждого СтрокаТЗ Из Объект.СуммыВозврата Цикл Если СтрокаТЗ.Налог > 0 Тогда НоваяСтрока = ТаблицаНДФЛ.Добавить(); НоваяСтрока.ИдентификаторСтроки = СтрокаТЗ.НомерСтроки;		НоваяСтрока.ФизическоеЛицо = Объект.Сотрудник;	НоваяСтрока.Сумма = СтрокаТЗ.Налог;			НоваяСтрока.ВидУдержания = Перечисления.ВидыОсобыхНачисленийИУдержаний.НДФЛ;			НоваяСтрока.БазаПоУмолчанию = (СтрокаТЗ.СтавкаНалогообложенияРезидента <> Перечисления.НДФЛСтавкиНалогообложенияРезидента.Ставка13); НоваяСтрока.ВидДоходаИсполнительногоПроизводства = Перечисления.ВидыДоходовИсполнительногоПроизводства.ЗарплатаВознаграждения;КонецЕсли;Если СтрокаТЗ.НалогСПревышения>0 Тогда НоваяСтрока = ТаблицаНДФЛ.Добавить();			НоваяСтрока.ИдентификаторСтроки = СтрокаТЗ.НомерСтроки;НоваяСтрока.ФизическоеЛицо 	= бъект.Сотрудник;НоваяСтрока.Сумма	= СтрокаТЗ.НалогСПревышения;			НоваяСтрока.ВидУдержания= Перечисления.ВидыОсобыхНачисленийИУдержаний.НДФЛСПревышения;			НоваяСтрока.БазаПоУмолчанию	= (СтрокаТЗ.СтавкаНалогообложенияРезидента <> Перечисления.НДФЛСтавкиНалогообложенияРезидента.Ставка13);			НоваяСтрока.ВидДоходаИсполнительногоПроизводства = Перечисления.ВидыДоходовИсполнительногоПроизводства.ЗарплатаВознаграждения;КонецЕсли;КонецЦикла;	РезультатыРаспределения = ОтражениеЗарплатыВУчете.ВозвратНДФЛПоРабочимМестамИСтатьям(ТаблицаНДФЛ, НакопленныеКорректировки, Организация, Период);КодыСтатейФинансирования = ОтражениеЗарплатыВБухучетеРасширенный.КодыСтатейФинансирования();	ОтражениеЗарплатыВБухучетеРасширенный.ЗаполнитьКодСтатьиФинансирования(РезультатыРаспределения, КодыСтатейФинансирования);ПараметрыДляПроверкиРезультатаРаспределения = ОтражениеЗарплатыВБухучетеРасширенный.ПараметрыДляПроверкиРезультатовРаспределенияУдержаний();	Отбор = Новый Структура("ИдентификаторСтроки");Для Каждого СтрокаТЧ Из Объект.СуммыВозврата Цикл		Отбор.ИдентификаторСтроки = СтрокаТЧ.НомерСтроки;	СтрокиРаспределения = РезультатыРаспределения.НайтиСтроки(Отбор);РезультатРаспределения = ЗарплатаКадрыРасширенный.ТаблицаЗначенийВСтруктуру(СтрокиРаспределения); 		СтрокаТЧ.РезультатРаспределения = РезультатРаспределения;		СтрокаТЧ.КомандаРедактированияРаспределения = ОтражениеЗарплатыВБухучетеРасширенный.ПредставлениеРезультатаРаспределенияСтрокиУдержания(			СтрокаТЧ.Налог + СтрокаТЗ.НалогСПревышения, РезультатРаспределения, ПараметрыДляПроверкиРезультатаРаспределения);КонецЦикла;

, ограничений же никаких нет, даже производительнее будет.
21. romulanin 18.09.24 12:30 Сейчас в теме
(19) Конструктива быть не может, по определению. Некоторые стандарты разработки мне известны. А вам, видимо, доступны все ресурсы, раз выбрались за грань понимания словосочетания "его использование никто не ограничивает". Боюсь представить, что с вами сделается при виде кода, в котором будет обращения по индексу, не сможете устоять от язвительных сообщений, в роли провожатого.
24. nomad_irk 76 18.09.24 12:44 Сейчас в теме
(21)
Боюсь представить, что с вами сделается при виде кода, в котором будет обращения по индексу

если в коде обращения по индексу, будет бессмысленно выполнятся преобразование из числа в строку и обратно, то будет такая же реакиция, а вам, по всей видимости, без разницы и вы до сих пор не поняли суть моих претензий к коду в (8)

Для Сч = 0 По МаксимальныйИндекс Цикл
     Значение = Коллекция[Число(Строка(Сч))];
КонецЦикла;

Никто ж не ограничивает такое обращение по индексу и производительность не пострадала
orakool; user2033930; +2 Ответить
25. romulanin 18.09.24 12:54 Сейчас в теме
(23)
(24)
Хотел бы есть палочками. Да и складывается ощущение, что одни метафористы и философы, хотят оставить свой бездоказательный след и гнусно внушить свою точку зрения.
26. user2033930 18.09.24 13:05 Сейчас в теме
(25)
бездоказательный след
Интересно так же узнать, что сейчас доказываешь ты, и какой след это оставит после тебя.
27. nomad_irk 76 18.09.24 13:47 Сейчас в теме
(24) Очешуеть, что делает динамическая типизация :)
Прикрепленные файлы:
20. user2033930 18.09.24 12:15 Сейчас в теме
(18)
В справке есть такой вариант синтаксиса, его использование никто не ограничивает.
Лапшу можно есть: ложкой, вилкой, палочками.
В наличии: Ложка.
Вопрос: надо ли из ложки выпиливать палочки (или на худой конец вилку), если меня никто в этом не ограничивает?
22. romulanin 18.09.24 12:38 Сейчас в теме
(20) Надо. Смотря, что ты хочешь получить в итоге, имея только ложку.
23. user2033930 18.09.24 12:43 Сейчас в теме
(22) Съесть лапшу. Не более.
10. user1979322 18.09.24 11:07 Сейчас в теме
(7) Я еще раз напишу, я не знаю какой тип был в примере, я выложил кусок кода который у меня не работает. Мне нужно обьединить ячейки в таблице, как это сделать
12. romulanin 18.09.24 11:09 Сейчас в теме
(10) отладчиком умеете пользоваться ? Нужно выполнить ТипЗнч(ТабДок)
28. SlavaKron 18.09.24 14:38 Сейчас в теме
(25) Обращение к области по имени может оказаться быстрее, чем по номерам строк/колонок, но это не оправдывает использование "Строка", которое нивелирует это быстродействие. Вместо "Строка" следовало бы использовать XMLСтрока, который работает на порядок быстрее и, главное, корректно.
Также обращение по номерам строк/колонок выглядит и чище и читабельнее.
29. truba 18.09.24 15:01 Сейчас в теме
(28) важное уточнение - по каконическому имени столбец+строка или по имени именованной области?
38. SlavaKron 18.09.24 16:22 Сейчас в теме
(29) Я имел в виду формат "R1C1:R2C2". Только это же обсуждается.
30. nomad_irk 76 18.09.24 15:04 Сейчас в теме
(28) Как-то так:
Прикрепленные файлы:
Anton_new01; +1 Ответить
31. truba 18.09.24 15:09 Сейчас в теме
(30) Вообще судя по сериализованному ТабДок , объект хранит свои ячейки по номерам и наверняка там парсер строкового имени в числовые. Но опять же это не относится к именованным областям.

Я б писал условно так:
Если тип вх значения строка тогда перебрать все именнованные области до успеха. Если не найдено - распарсить строку в номера столбцов и строк и передать методу Область(сч, сч, сч, сч)
39. SlavaKron 18.09.24 16:35 Сейчас в теме
(31)
объект хранит свои ячейки по номерам
По диапазонам строк, внутри которых диапазоны колонок. Там точно нет матрицы, которая бы обеспечивала быстрый доступ по номеру строки и колонки.
32. Sashares 35 18.09.24 15:10 Сейчас в теме
(30) Замените конкатенацию на СтрШаблон, а то как-то не совсем то замеряется.
Anton_new01; +1 Ответить
34. user2033930 18.09.24 15:13 Сейчас в теме
(32) Вторая сторона из (7) настаивает именно на конкатенации. Потому что "никто ж не ограничивает".
35. Sashares 35 18.09.24 15:28 Сейчас в теме
36. nomad_irk 76 18.09.24 15:43 Сейчас в теме
(28)
(32)
(33)
как-то так:

	ТабДок = Новый ТабличныйДокумент;
	
	Время1 = 0;
	Время2 = 0;
	Время3 = 0;
	Время4 = 0;
	Время5 = 0;
	
	Сч = 1;
	Для НомерСтроки = 1 По 5000 Цикл
		Для НомерКолонки = 1 По 2000 Цикл
			ТабДок.Область(НомерСтроки, НомерКолонки).Имя = "ИмяОбласти" + XMLСтрока(Сч);
		КонецЦикла;
	КонецЦикла;	
	
	Для НомерСтроки = 1 По 5000 Цикл
		Для НомерКолонки = 1 По 2000 Цикл
			Нач = ТекущаяУниверсальнаяДатаВМиллисекундах();Область = ТабДок.Область("R" + XMLСтрока(НомерСтроки) + "C" + XMLСтрока(НомерКолонки));Кон = ТекущаяУниверсальнаяДатаВМиллисекундах();
			Время1 = Время1 + (Кон - Нач);
			Нач = ТекущаяУниверсальнаяДатаВМиллисекундах();Область = ТабДок.Область(НомерСтроки, НомерКолонки);Кон = ТекущаяУниверсальнаяДатаВМиллисекундах();
			Время2 = Время2 + (Кон - Нач);
			Нач = ТекущаяУниверсальнаяДатаВМиллисекундах();Область = ТабДок.Область("ИмяОбласти" + XMLСтрока(Сч));Кон = ТекущаяУниверсальнаяДатаВМиллисекундах();
			Время3 = Время3 + (Кон - Нач);
			Нач = ТекущаяУниверсальнаяДатаВМиллисекундах();Область = ТабДок.Область(СтрШаблон("R%1C%2", XMLСтрока(НомерСтроки), XMLСтрока(НомерКолонки)));Кон = ТекущаяУниверсальнаяДатаВМиллисекундах();
			Время4 = Время4 + (Кон - Нач);
			Нач = ТекущаяУниверсальнаяДатаВМиллисекундах();Область = ТабДок.Область("R" + Формат(НомерСтроки, "ЧГ=") + "C" + Формат(НомерКолонки, "ЧГ="));Кон = ТекущаяУниверсальнаяДатаВМиллисекундах();
			Время5 = Время5 + (Кон - Нач);
		КонецЦикла;
	КонецЦикла;
	
	Сообщить("Обращение по каноническим именам(XMLСтрока, обычная конкатенация): " + Формат(Время1, "ЧГ=0") + "мс");
	Сообщить("Обращение по номерам: " + Формат(Время2, "ЧГ=0") + "мс");
	Сообщить("Обращение по пользовательскому имени области: " + Формат(Время3, "ЧГ=0") + "мс");
	Сообщить("Обращение по каноническим именам(XMLСтрока, конкатенация через СтрШаблон): " + Формат(Время4, "ЧГ=0") + "мс");
	Сообщить("Обращение по каноническим именам(обычная конкатенация): " + Формат(Время5, "ЧГ=0") + "мс");
Показать


1 место: обращение по пользовательским именам областей
2 место: обращение по каноническим именам с использованием XMLСтрока и обычной конкатенацией
3 место: обращение по номерам
4 место: обращение по каноническим именам с использованием XMLСтрока и конкатенацией с помощью СтрШаблон
5 место: обращение по каноническим именам с обычной конкатенацией
Прикрепленные файлы:
Sashares; Anton_new01; +2 Ответить
37. SlavaKron 18.09.24 16:20 Сейчас в теме
(36) Это можно ускорить, если часть имени формировать на уровне строки: не обязательно для каждой колонки вычислять XMLСтрока(НомерСтроки).
Измерять следовало бы выполнение всего цикла в каждом варианте.
41. nomad_irk 76 18.09.24 16:50 Сейчас в теме
(37) согласен, но ускорение не будет драмматичным
40. Anton_new01 18.09.24 16:37 Сейчас в теме
(36)
можно в соответствие запихать коллекцию имен областей и получать по арифметической функции от номера строки и колонки - должно быть еще быстрее.

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

отправил документ на печать... он вышел за 4 наносекунды или за 15 наносекунд, думаю мало кто заметит разницу )
42. SlavaKron 18.09.24 20:11 Сейчас в теме
(40) На форме типового отчета есть функционал: вывести сумму (среднее и т.п.) выделенных ячеек табдока. Это всё на клиенте делается при активизации ячейки. На больших отчетах тормоза будут ощутимыми, в случае неоптимального кода. Там, кстати, тоже используется соответствие имен ячеек, чтобы решить проблему пересекающихся областей в случае "сложного" выделения и исключить двойной подсчет.
44. Anton_new01 19.09.24 08:26 Сейчас в теме
(42)
понятие оптимальной код - весьма туманно и расплывчато.
в данном конкретном примере я бы предпочем вариант с цифровой нумерацией( пункт 2 в посте (36)).
но по скорости он немного уступает двум другим, но немного...

стоит ли целый день разработки(вчерашние исследования) - таких изменений? или же лучше сделать легкочитаемый код? - вопрос индивидуального предпочтения.

PS. из моего опыта. вначале есть просто код... потом код 3-5 доработок от сторонних разрабов.
и после этих доработок код становится ну совершенно не читаемым, про оптимальность совсем молчу.
и далее... начинаются баги основанные на не документированнх возможностях в промежутках между доработками...
45. nomad_irk 76 19.09.24 08:31 Сейчас в теме
(44) написание обработки и тестирование 10М итераций вместе заняли минут 30 времени :)
я больше марафет в коде наводил........

Еще раз уточню суть моих претензий к коду из (8): в нем выполняется бессмысленное преобразование значения типа число к значению типа строка. Это выполняется исключительно для того, что обратится к области табдока по каноническому имени, хотя, судя по коду, номера колонок - числа и есть возможность обращаться к области по числовому значению строки/колонки. Причем, преобразование числа к строке выполняется с помощью метода Строка(), что сразу же вызовет ошибку при числах >= 1000.

Если будет ситуация, когда нет числовых значений номеров строк/колонок, тогда, ессно, придется воспользоваться вариантом обращения к областям по именам, а не приводить имеющиеся строковые значения к числам - это как минимум говорит о квалификации программиста

В (27) я показал какую дичь можно творить в коде при получении значений коллекции по индексу, ну а чО, никто ж не ограничивает так делать......
46. Anton_new01 19.09.24 08:33 Сейчас в теме
(45) знаю я эту песню)))

в ветке было 3-4 разработчика как минимум.
начали в 09:49
закончили в 15:43.
т.е. 6 полных часов 3 разраба итого 18 часов разработки )) потраченно.
вот ваши пол часа )))
47. nomad_irk 76 19.09.24 08:45 Сейчас в теме
(46) там 90% из этих 6 полных часов ушло на выяснение отношений :)
и всего 5% - на сам тест(вместе с написанием обработки) :)
48. user2033930 19.09.24 08:46 Сейчас в теме
(47)
там 90% из этих 6 полных часов ушло на выяснение отношений :)
Это самое главное в нашей работе - точно согласовать ТЗ и роли при его исполнении )))
49. user1880116 19.09.24 09:55 Сейчас в теме
(47)
там 90% из этих 6 полных часов ушло на выяснение отношений :)
и всего 5% - на сам тест(вместе с написанием обработки)
Работа по Agile в чистом виде- планирование спринта, дейли, ретро...
50. user2033930 19.09.24 09:57 Сейчас в теме
33. Anton_new01 18.09.24 15:11 Сейчас в теме
так кто в итоге победил?
(30)

принимаются ставки )))
43. user1880116 18.09.24 21:41 Сейчас в теме
Бедный Слава, опять его никто не понимает.
Оставьте свое сообщение

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