Как объединить ячейки в Табличном Документе
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
как вам уже многие ответили - проблема в том, что в вашей переменной ТабДок - не табличный документ, соответсвенно и данные методы которые можно использовать после точки - не обнаружены.
чтобы в переменной ТабДок - был табличный документ. можно сделать например так:
ТабДок = Новый ТабличныйДокумент;
и далее
ТабДок.Область("....").Объединить();
как вам уже многие ответили - проблема в том, что в вашей переменной ТабДок - не табличный документ, соответсвенно и данные методы которые можно использовать после точки - не обнаружены.
чтобы в переменной ТабДок - был табличный документ. можно сделать например так:
ТабДок = Новый ТабличныйДокумент;
и далее
ТабДок.Область("....").Объединить();
(8) Вариант синтаксиса: По имени
Синтаксис:
Область(<ИмяОбласти>)
Параметры:
<ИмяОбласти> (обязательный)
Тип: Строка.
Имя области или адрес в формате "R1C1:R2C2", где число после "R" обозначает номер строки, число после "C" - номер колонки, символом ":" (двоеточие) разделяются координаты левого верхнего и правого нижнего угла области. В качестве имени также можно передавать пересечение двух областей, записываемое как "<Имя области 1> | <Имя области 2>".
Вариант синтаксиса: По адресу
Синтаксис:
Область(<НомерПервойСтроки>, <НомерПервойКолонки>, <НомерПоследнейСтроки>, <НомерПоследнейКолонки>, <ФорматСтрок>)
Параметры:
Синтаксис:
Область(<ИмяОбласти>)
Параметры:
<ИмяОбласти> (обязательный)
Тип: Строка.
Имя области или адрес в формате "R1C1:R2C2", где число после "R" обозначает номер строки, число после "C" - номер колонки, символом ":" (двоеточие) разделяются координаты левого верхнего и правого нижнего угла области. В качестве имени также можно передавать пересечение двух областей, записываемое как "<Имя области 1> | <Имя области 2>".
Вариант синтаксиса: По адресу
Синтаксис:
Область(<НомерПервойСтроки>, <НомерПервойКолонки>, <НомерПоследнейСтроки>, <НомерПоследнейКолонки>, <ФорматСтрок>)
Параметры:
(11) я в курсе, а вы не понимаете, что без смазочных материалов применяете возвратно-поступательные движения к фаллическим объектам выполняя преобразование числа к строке только для того, чтобы обратится к области по ее дефолтному имени, когда можно обращаться, указывая числовые значения напрямую.
(18) в программировании не все обуславливается исключительно производительностью, но для вас это, видимо, за гранью вашего понимания.
Впринципе, любой код можно писать вот так:
, ограничений же никаких нет, даже производительнее будет.
Впринципе, любой код можно писать вот так:
Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСтатьиФинансированияЗарплата") Тогда Возврат; КонецЕсли; Если Объект.СуммыВозврата.Количество() = 0 Тогда Возврат; КонецЕсли;Организация = Объект.Организация; Период = Объект.Месяц;ФизическиеЛица = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект.Сотрудник);НакопленныеКорректировки = ВзаиморасчетыССотрудниками.КорректировкиВыплаты(Организация, Период, ФизическиеЛица, Объект.Ссылка);НакопленныеКорректировки.Колонки.СуммаКорректировки.Имя = "Сумма";ТаблицаНДФЛ = Новый ТаблицаЗначений;ТаблицаНДФЛ.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("Число"));ТаблицаНДФЛ.Колонки.Добавить("ФизическоеЛицо", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));ТаблицаНДФЛ.Колонки.Добавить("ВидУдержания", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыОсобыхНачисленийИУдержаний")); ТаблицаНДФЛ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")); ТаблицаНДФЛ.Колонки.Добавить("ВидДоходаИсполнительногоПроизводства", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыДоходовИсполнительногоПроизводства")); ТаблицаНДФЛ.Колонки.Добавить("БазаПоУмолчанию", Новый ОписаниеТипов("Булево"));
Для каждого СтрокаТЗ Из Объект.СуммыВозврата Цикл Если СтрокаТЗ.Налог > 0 Тогда НоваяСтрока = ТаблицаНДФЛ.Добавить(); НоваяСтрока.ИдентификаторСтроки = СтрокаТЗ.НомерСтроки; НоваяСтрока.ФизическоеЛицо = Объект.Сотрудник; НоваяСтрока.Сумма = СтрокаТЗ.Налог; НоваяСтрока.ВидУдержания = Перечисления.ВидыОсобыхНачисленийИУдержаний.НДФЛ; НоваяСтрока.БазаПоУмолчанию = (СтрокаТЗ.СтавкаНалогообложенияРезидента <> Перечисления.НДФЛСтавкиНалогообложенияРезидента.Ставка13); НоваяСтрока.ВидДоходаИсполнительногоПроизводства = Перечисления.ВидыДоходовИсполнительногоПроизводства.ЗарплатаВознаграждения;КонецЕсли;Если СтрокаТЗ.НалогСПревышения>0 Тогда НоваяСтрока = ТаблицаНДФЛ.Добавить(); НоваяСтрока.ИдентификаторСтроки = СтрокаТЗ.НомерСтроки;НоваяСтрока.ФизическоеЛицо = бъект.Сотрудник;НоваяСтрока.Сумма = СтрокаТЗ.НалогСПревышения; НоваяСтрока.ВидУдержания= Перечисления.ВидыОсобыхНачисленийИУдержаний.НДФЛСПревышения; НоваяСтрока.БазаПоУмолчанию = (СтрокаТЗ.СтавкаНалогообложенияРезидента <> Перечисления.НДФЛСтавкиНалогообложенияРезидента.Ставка13); НоваяСтрока.ВидДоходаИсполнительногоПроизводства = Перечисления.ВидыДоходовИсполнительногоПроизводства.ЗарплатаВознаграждения;КонецЕсли;КонецЦикла; РезультатыРаспределения = ОтражениеЗарплатыВУчете.ВозвратНДФЛПоРабочимМестамИСтатьям(ТаблицаНДФЛ, НакопленныеКорректировки, Организация, Период);КодыСтатейФинансирования = ОтражениеЗарплатыВБухучетеРасширенный.КодыСтатейФинансирования(); ОтражениеЗарплатыВБухучетеРасширенный.ЗаполнитьКодСтатьиФинансирования(РезультатыРаспределения, КодыСтатейФинансирования);ПараметрыДляПроверкиРезультатаРаспределения = ОтражениеЗарплатыВБухучетеРасширенный.ПараметрыДляПроверкиРезультатовРаспределенияУдержаний(); Отбор = Новый Структура("ИдентификаторСтроки");Для Каждого СтрокаТЧ Из Объект.СуммыВозврата Цикл Отбор.ИдентификаторСтроки = СтрокаТЧ.НомерСтроки; СтрокиРаспределения = РезультатыРаспределения.НайтиСтроки(Отбор);РезультатРаспределения = ЗарплатаКадрыРасширенный.ТаблицаЗначенийВСтруктуру(СтрокиРаспределения); СтрокаТЧ.РезультатРаспределения = РезультатРаспределения; СтрокаТЧ.КомандаРедактированияРаспределения = ОтражениеЗарплатыВБухучетеРасширенный.ПредставлениеРезультатаРаспределенияСтрокиУдержания( СтрокаТЧ.Налог + СтрокаТЗ.НалогСПревышения, РезультатРаспределения, ПараметрыДляПроверкиРезультатаРаспределения);КонецЦикла;
, ограничений же никаких нет, даже производительнее будет.
(19) Конструктива быть не может, по определению. Некоторые стандарты разработки мне известны. А вам, видимо, доступны все ресурсы, раз выбрались за грань понимания словосочетания "его использование никто не ограничивает". Боюсь представить, что с вами сделается при виде кода, в котором будет обращения по индексу, не сможете устоять от язвительных сообщений, в роли провожатого.
(21)
если в коде обращения по индексу, будет бессмысленно выполнятся преобразование из числа в строку и обратно, то будет такая же реакиция, а вам, по всей видимости, без разницы и вы до сих пор не поняли суть моих претензий к коду в (8)
Никто ж не ограничивает такое обращение по индексу и производительность не пострадала
Боюсь представить, что с вами сделается при виде кода, в котором будет обращения по индексу
если в коде обращения по индексу, будет бессмысленно выполнятся преобразование из числа в строку и обратно, то будет такая же реакиция, а вам, по всей видимости, без разницы и вы до сих пор не поняли суть моих претензий к коду в (8)
Для Сч = 0 По МаксимальныйИндекс Цикл
Значение = Коллекция[Число(Строка(Сч))];
КонецЦикла;
Никто ж не ограничивает такое обращение по индексу и производительность не пострадала
(18)
В наличии: Ложка.
Вопрос: надо ли из ложки выпиливать палочки (или на худой конец вилку), если меня никто в этом не ограничивает?
В справке есть такой вариант синтаксиса, его использование никто не ограничивает.
Лапшу можно есть: ложкой, вилкой, палочками.
В наличии: Ложка.
Вопрос: надо ли из ложки выпиливать палочки (или на худой конец вилку), если меня никто в этом не ограничивает?
(25) Обращение к области по имени может оказаться быстрее, чем по номерам строк/колонок, но это не оправдывает использование "Строка", которое нивелирует это быстродействие. Вместо "Строка" следовало бы использовать XMLСтрока, который работает на порядок быстрее и, главное, корректно.
Также обращение по номерам строк/колонок выглядит и чище и читабельнее.
Также обращение по номерам строк/колонок выглядит и чище и читабельнее.
(30) Вообще судя по сериализованному ТабДок , объект хранит свои ячейки по номерам и наверняка там парсер строкового имени в числовые. Но опять же это не относится к именованным областям.
Я б писал условно так:
Если тип вх значения строка тогда перебрать все именнованные области до успеха. Если не найдено - распарсить строку в номера столбцов и строк и передать методу Область(сч, сч, сч, сч)
Я б писал условно так:
Если тип вх значения строка тогда перебрать все именнованные области до успеха. Если не найдено - распарсить строку в номера столбцов и строк и передать методу Область(сч, сч, сч, сч)
(28)
(32)
(33)
как-то так:
1 место: обращение по пользовательским именам областей
2 место: обращение по каноническим именам с использованием XMLСтрока и обычной конкатенацией
3 место: обращение по номерам
4 место: обращение по каноническим именам с использованием XMLСтрока и конкатенацией с помощью СтрШаблон
5 место: обращение по каноническим именам с обычной конкатенацией
(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 место: обращение по каноническим именам с обычной конкатенацией
Прикрепленные файлы:
(36)
можно в соответствие запихать коллекцию имен областей и получать по арифметической функции от номера строки и колонки - должно быть еще быстрее.
PS. но считаю что все это от лукавого. самое главное качество кода это его легкочитаемость. тогда его и поддерживать просто и работает он надежнее.
а эти наносекунды имеют значение в достаточно редких случаях.
отправил документ на печать... он вышел за 4 наносекунды или за 15 наносекунд, думаю мало кто заметит разницу )
можно в соответствие запихать коллекцию имен областей и получать по арифметической функции от номера строки и колонки - должно быть еще быстрее.
PS. но считаю что все это от лукавого. самое главное качество кода это его легкочитаемость. тогда его и поддерживать просто и работает он надежнее.
а эти наносекунды имеют значение в достаточно редких случаях.
отправил документ на печать... он вышел за 4 наносекунды или за 15 наносекунд, думаю мало кто заметит разницу )
(40) На форме типового отчета есть функционал: вывести сумму (среднее и т.п.) выделенных ячеек табдока. Это всё на клиенте делается при активизации ячейки. На больших отчетах тормоза будут ощутимыми, в случае неоптимального кода. Там, кстати, тоже используется соответствие имен ячеек, чтобы решить проблему пересекающихся областей в случае "сложного" выделения и исключить двойной подсчет.
(42)
понятие оптимальной код - весьма туманно и расплывчато.
в данном конкретном примере я бы предпочем вариант с цифровой нумерацией( пункт 2 в посте (36)).
но по скорости он немного уступает двум другим, но немного...
стоит ли целый день разработки(вчерашние исследования) - таких изменений? или же лучше сделать легкочитаемый код? - вопрос индивидуального предпочтения.
PS. из моего опыта. вначале есть просто код... потом код 3-5 доработок от сторонних разрабов.
и после этих доработок код становится ну совершенно не читаемым, про оптимальность совсем молчу.
и далее... начинаются баги основанные на не документированнх возможностях в промежутках между доработками...
понятие оптимальной код - весьма туманно и расплывчато.
в данном конкретном примере я бы предпочем вариант с цифровой нумерацией( пункт 2 в посте (36)).
но по скорости он немного уступает двум другим, но немного...
стоит ли целый день разработки(вчерашние исследования) - таких изменений? или же лучше сделать легкочитаемый код? - вопрос индивидуального предпочтения.
PS. из моего опыта. вначале есть просто код... потом код 3-5 доработок от сторонних разрабов.
и после этих доработок код становится ну совершенно не читаемым, про оптимальность совсем молчу.
и далее... начинаются баги основанные на не документированнх возможностях в промежутках между доработками...
(44) написание обработки и тестирование 10М итераций вместе заняли минут 30 времени :)
я больше марафет в коде наводил........
Еще раз уточню суть моих претензий к коду из (8): в нем выполняется бессмысленное преобразование значения типа число к значению типа строка. Это выполняется исключительно для того, что обратится к области табдока по каноническому имени, хотя, судя по коду, номера колонок - числа и есть возможность обращаться к области по числовому значению строки/колонки. Причем, преобразование числа к строке выполняется с помощью метода Строка(), что сразу же вызовет ошибку при числах >= 1000.
Если будет ситуация, когда нет числовых значений номеров строк/колонок, тогда, ессно, придется воспользоваться вариантом обращения к областям по именам, а не приводить имеющиеся строковые значения к числам - это как минимум говорит о квалификации программиста
В (27) я показал какую дичь можно творить в коде при получении значений коллекции по индексу, ну а чО, никто ж не ограничивает так делать......
я больше марафет в коде наводил........
Еще раз уточню суть моих претензий к коду из (8): в нем выполняется бессмысленное преобразование значения типа число к значению типа строка. Это выполняется исключительно для того, что обратится к области табдока по каноническому имени, хотя, судя по коду, номера колонок - числа и есть возможность обращаться к области по числовому значению строки/колонки. Причем, преобразование числа к строке выполняется с помощью метода Строка(), что сразу же вызовет ошибку при числах >= 1000.
Если будет ситуация, когда нет числовых значений номеров строк/колонок, тогда, ессно, придется воспользоваться вариантом обращения к областям по именам, а не приводить имеющиеся строковые значения к числам - это как минимум говорит о квалификации программиста
В (27) я показал какую дичь можно творить в коде при получении значений коллекции по индексу, ну а чО, никто ж не ограничивает так делать......
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот