Собственно проблема.
Есть ТабличныйДокумент-оригинал.
Нужно тупо создать его копию чтобы эту корию попилить-покорёжить.
Неужели только через вызрузку в моксель - загрузку из мокселя???
Йоксель » Главный форум
Присвоить/Выгрузить Таб.Документ ЧТОБЫ НЕ ПО ССЫЛКЕ - ??
(21 posts)-
Отправлено 15 года(лет) назад #
-
И продолжение проблемы.
Собственно дело в сборке XLS-книги с нарезкой одного таб.документа на части и раскладывании его по листам... Переменная типа табличный документ в конвертер по листам оперативно загружается (как? - этот вопрос как раз в заголовке), от него отрезается лишнее и кидается на лист.. так блин получается что в результате на всех листах одинаковое содержимое - а именно последняя нарезка.. как победить?Отправлено 15 года(лет) назад # -
ЗначениеВСтрокуВнутр-ЗначениеИзСторкиВнутр я так понял не поддерживается?..
Отправлено 15 года(лет) назад # -
я только что решал раскидку одного большого файла экселя на кучу маленьких файликов - проблем вообщем нет...
> так блин получается что в результате на всех листах одинаковое содержимое - а именно последняя нарезка
- где-то криво считаешь как резать...???
..
[code]
//**************************************************************************************
Процедура ВырезатьЗаявку(ВыбФайл,строкаН,строкаК,строкаШ)Таб = СоздатьОбъект("ТабличныйДокумент");
Таб.Открыть(ВыбФайл, 2, 0);
Таб.УдалитьСтроки(строкаК+1,(Таб.ВысотаТаблицы()-строкаК));
Если строкаШ = 0
Тогда Таб.УдалитьСтроки(1,строкаН-1);
Иначе
Если (строкаН-1)<(строкаШ+1)
Тогда //первая заявка в общем файле
Иначе Таб.УдалитьСтроки(строкаШ+1,строкаН-строкаШ-1);
КонецЕсли;
КонецЕсли;имяФайла = ""+строкаН+" "+строкаК;
Для ы=строкаШ+1 По Таб.ВысотаТаблицы()
Цикл
ОбластьТД = Таб.Область(ы,1,ы,1);
Маркер = Врег(СокрЛП(ОбластьТД.Текст));
Если Маркер = "ЗАКАЗЧИК"
Тогда //начался новый заказ
имяФайла = НРег(СокрЛП(Таб.Область(ы,3,ы,3).Текст));
ИначеЕсли Лев(Маркер,13)= "НОМЕР ЗАКУПКИ"
Тогда
имяФайла = фуВырезатьЧислоПрав(Таб.Область(ы,3,ы,3).Текст)+" "+имяФайла;
ИначеЕсли Лев(Маркер,13)= "ДАТА ПОСТАВКИ"
Тогда
имяФайла = Формат(Дата(СокрЛП(Таб.Область(ы,3,ы,3).Текст)),"ДГГГГММДД") + " " + имяФайла;
Прервать;
КонецЕсли;
КонецЦикла;
Состояние("создание: "+имяФайла);
имяФайла = глБВК_НормализоватьСтроку(имяФайла,"\/:*?""<>| -.,","#");
Таб.Записать(ВыбКаталог+имяФайла+".xls",1);
Таб = "";КонецПроцедуры //ВырезатьЗаявку()
//**************************************************************************************
Процедура Сформировать()Если ПустаяСтрока(ВыбОбщийФайл)=1
Тогда
Форма.Параметр.Установить("ОШИБКА","имя файла - пустое...");
Возврат;
КонецЕсли;Таб = СоздатьОбъект ("ТабличныйДокумент");
Таб.Открыть(ВыбОбщийФайл, 2, 0);
КС = Таб.ВысотаТаблицы();//определим конечную строку шапки заявки
//маркером будет слово "Заказчик" в первой колонкестрокаШ = -1;
строкаН = 0; //область очередной заявки
строкаК = 0;Для ы = 1 По КС
Цикл
ОбластьТД = Таб.Область(ы,1,ы,1);
Маркер = Врег(СокрЛП(ОбластьТД.Текст));
Если Маркер = "ЗАКАЗЧИК"
Тогда //начался новый заказЕсли строкаШ = -1
Тогда //если "заказчик" встретился первый раз - то кончилась шапка
строкаШ = Макс(0,ы-1);
КонецЕсли;строкаН = ы;
строкаК = 0;
ИначеЕсли Лев(Маркер,14)= "ИТОГО УПАКОВОК"
Тогда
строкаК = ы;
ВырезатьЗаявку(ВыбОбщийФайл,строкаН,строкаК,строкаШ);
строкаН = 0;
КонецЕсли;КонецЦикла;
Состояние("");КонецПроцедуры //Сформировать()
[\code]Отправлено 15 года(лет) назад # -
>> - где-то криво считаешь как резать...???
Да вообще-то нет, через mxl-файл стало нормально только сука доолго (сохранить в mxl -- загрузить из mxl -- нарезать -- засунуть в лист) --- код нарезки НЕ меняя: все стало пихаться на листы нормально.Отправлено 15 года(лет) назад # -
ЗЫ: ну дык ясен пень, ты каждый раз таб.документ перестраиваешь и перезагружаешь из таблицы!.. я ж про ситуацию когда таблиц уже нету, есть таб.документ! который по значению хрен чему присвоишь.
Загрузить из таблицы (1с) есть, а ни выгрузить в другой таб.докумени, ни выгрузить в таблицу 1с - нету ((((Отправлено 15 года(лет) назад # -
Копию табличного документа пока можно создать только через выгрузку/загрузку через MXL.
В планах стоит сделать возможность копировать области из документа в документ и возможность выгрузить один документ в несколько листов Excel, но это не скоро.
Отправлено 15 года(лет) назад # -
угумц, спасибо, будем ждать.
Отправлено 15 года(лет) назад # -
Oleg: "Копию табличного документа пока можно создать только через выгрузку/загрузку через MXL."
Gosha: "угумц, спасибо, будем ждать."
-------
не дождался. когда снова "припекло" и медленность (и некорректность, строго говоря) получения копии таб.документа через файл снова огорчило - нашел штатную (но неочевидную) возможность "развязки ссылки" и присвоения таб.документа по значению(!!!) - использование массива. Тип переменной "массив" в 1с остался с давних времен и имеет следующую особенность: выделение памяти переменным такого типа движком выполняется статически(!!!).
Т.о. прямое присвоение элементу массива значения типа "ТабличныйДокумент" и реализует то самое создание копии табличного документа.
Может кому-то пригодится.Отправлено 15 года(лет) назад # -
А копирование областей не подходит? Там и целиком документ можно скопировать.
Копирование табличного документа - это имеется в виду штатный объект "Таблица"? Копирование для йоксельных документов работать не должно.
Отправлено 15 года(лет) назад # -
Нет, не подходит.
ТабличногоДокумента а не Таблицы (хотя Таблица - тоже так присваивается по значению).
Попробуй сам. ;)Отправлено 15 года(лет) назад # -
Ну и чем не подходит? Создаем новый табличный документ. У исходного получаем область методом Область () без параметров. В новом документе говорим "ВставитьОбласть". Получаем копию документа.
Скопировать штатными методами йоксельный документ нельзя. Только средствами Йокселя.
Отправлено 15 года(лет) назад # -
Например. Собрать в список табличные документы. Логично: переменная типа табличныйдокумент, формируем несколько раз (по неодинаковым данным и неодинаковым способом) и добавляем в сз/тз добавлением+присвоением - и везде по ссылке одно и то же значение типа табличныйдокумент ибо по ссылке. Да и на исходный (см. первый пост в топике) ответа про такое решение никому в голову не пришло рассказать - а в ответ на находку сразу нашлось, несколько забавно выглядит.. ))
а насчет "нельзя". хм. ты попробовал присвоить значение типа ТабличныйДокумент элементу массива? или ты просто запрещаешь копировать? ))
ЗЫ: а вощет немного странно. способ присвоения по значению, о которм было неизвестно, вроде нашел и делюсь - а в ответ объяснение что это "нельзя" и что вообще потому что нафиг не нужно. ну не нужно так не нужно, но не думал, что такая реакция будет. ну, извини.Отправлено 15 года(лет) назад # -
> а насчет "нельзя". хм. ты попробовал присвоить значение типа ТабличныйДокумент элементу массива? или ты просто запрещаешь копировать? ))
> ЗЫ: а вощет немного странно. способ присвоения по значению, о которм было неизвестно, вроде нашел и делюсь - а в ответ объяснение что это "нельзя" и что вообще потому что нафиг не нужно. ну не нужно так не нужно, но не думал, что такая реакция будет. ну, извини."Пробовать" бессмысленно. Обсуждать возможность копирования документа Йокселя штатными методами 1С - это все равно, что обсуждать возможность выхода в Интернет при помощи куска ливерной колбасы. Конечно, если ливер для колбасы был получен от животного, которое всю жизнь кормили галлюциногенной флорой, то да, после употребления этой колбасы можно выйти в некоторое подобие Интернета. Но это будет Интернет такого же рода, что и копия табличного документа Йокселя, полученная штатными методами 1С.
1С в принципе не может сделать копию документа Йокселя. Сделать копию любого нетривиального объекта можно только в том случае, когда известна структура этого объекта. 1С о Йокселе ничего не знает. Для копирования документов в Йокселе специально создан функционал метода "ВставитьОбласть".
Поэтому, наш разговор до сих пор длится по одной из следующих причин:
1) Возможно, у нас разница в терминологии и ты говоришь об одном, а я понимаю это как что-то другое.2) У тебя ошибка в тесте, которым ты определяешь создание копии.
3) Ты наступил на один из глюков 1С или Йокселя и наблюдаешь поведение, которое можно понимать как создание копии документа Йокселе средствами 1С. В таком случае, скорее всего, где-то происходит порча памяти и 1С гавкнется немного погодя на какой-нибудь простой операции.
4) Ты поздновато решил отпраздновать 1 апреля и наш разговор является разводом с твоей стороны.
Отправлено 15 года(лет) назад # -
о "разнице в терминологии". Термины "по значению" и "по ссылке" конечно море толкований допускают, наверное (но я не знал до сих пор об этом, прости дурака). конкретика: у меня не тест. формирую табличные документы в одной переменной и собираю их (присваиванием по значению, которое по твоим словам "нельзя") в массив, из какового массива потом собираю через конвертер эксель (при надобе) или показываю в элементе управления (при надобе). без глюков.
но - "нельзя" так "нельзя", нивапрос - ты не пробовал, но утверждаешь, что это невозможно, Ок, это "один из глюков Йокселя".
ЗЫ: и, Олег, тоном таким снисходительным не стоит со мной разговаривать - я тебе поводов не давал.Отправлено 15 года(лет) назад # -
Конечно же эти термины допускают разное толкование.
Толкование 1. В драной одинэсине объекты делятся на два вида: объекты простых типов и объекты ссылочных типов. При копировании объектов простых типов ("число", "строка", "дата") они всегда копируются по значению. При копировании объектов ссылочных типов копируется только ссылка на них. Это относится к объектам "Документ", "Справочник", "Таблица", "ТаблицаЗначений" и т.д. Т.е. когда мы кодом "А = Б;" "копируем" таблицу значений, то в итоге получаем две переменные со ссылкой на один и тот же объект. Модификация объекта через одну переменную приведет к модификации объекта, доступного через другую переменную (т.к. объект-то один). Иногда требуется сделать копию, например, таблицы значений, чтобы модифицировать два разных объекта независимо друг от друга. Для этого используют специальные методы экспорта-импорта этого объекта.
Толкование 2. При передаче параметров в процедуры и функции параметры могут передаваться в процедуру как по ссылке, так и по значению. Если параметр передается по ссылке (а так обычно и происходит), то модификация параметра процедурой приводит к модификации переменной в вызывающем контексте. При этом в параметре может находиться значение любого типа - хоть простого, хоть ссылочного. Если параметр передается по значению (модификатор "Знач"), то модификация параметра в процедуре не приводит к изменению значения переменной в вызывающем контексте.
Т.к. при работе с объектами Йокселя проблемы в стиле толкования 2 встречаются редко и легко решаются, то, естественно, я предположил, что у тебя проблемы в стиле толкования 1. Для решения этой проблемы была добавлена возможность копирования областей (или документов в целом). В свете толкования 1, когда ты говорил, что у тебя получалось сделать копирование объекта штатными методами 1С, получалось, что ты говорил явный бред - подобное копирование штатными средствами 1С сделать нельзя в принципе. Но у тебя, судя по всему, какая-то другая проблема. Причем, скорее всего, близкая к толкованию 2. Суть ее до сих пор мне не ясна.
По поводу лирики. Мне кажется, ты пересидел на Мисте. Это там постоянно друг с другом собачатся и занимаются перекидыванием говна. Здесь ситуация несколько другая. Поэтому не надо постоянно прикидывать, не собирается ли кто-то самоутвердиться за твой счет. Как минимум, самоутверждаться на собственном форуме глупо. Для этого мне надо было бы ходить на более другие форумы, прикидываясь относительно нормальным человеком.
Отправлено 15 года(лет) назад # -
"по ссылке" и "по значению" - говорилось изначально не во "многих смыслах", так что версии немного мимо (тем более что само несколько натужное разделение толкования на два вида выглядит несколько искусственным и надуманным - они более пересекаются нежели различны).
Нмного о фактах, противоречащих твоему безапеляционному заявлению. Присвоение значения элементу массива выполняется по значению (!!!) для объектов непримитивных типов не являющихся объектами данных, которые ты почему-то (не совсем корректно) свалил в одну кучу со ссылками на объекты данных, назвав "ссылочными", а именно: таблица, список значений, таблица значений (не являющиеся атрибутами формы - сиречь тоже "как-бы-временными-данными", создаваемыми во время компиляции диалога при его загрузке - но это лирика). без "специальных методов экспорта-импорта". Выяснилось, что точно такое же присвоение по значению возможно для объекта типа "табличныйдокумент". я опробовал, выяснил и использую эту возможность. без глюков.
ты же уже столько времени просто долдонишь про то, что все то, что я проверил и использую - невозможно и вообще неправильно потому что "явный бред".
и тут ирония про мисту (даже если оставить за скобками тот факт, что миста занимает в моем даже интернет-общении не просто мало, но очень мало места) никаким боком - достаточно соотнести позиции в этом обмене мнениями: я опробовал и пользуюсь - ты не желая даже проверить(!) упорно долдонишь про "явный бред". мотивация и позиционирование собеседника в обмене мнений довольно прозрачны (и асимметричны): я, относясь к тебе (прежде всего) с уважением, пытаюсь поделиться информацией, которой ты, судя по всему, не обладаешь, и ожидаю обсуждения этой информации по существу - а в ответ получаю только то, что я говорю "явный бред" без даже тени попыток осмыслить и проверить.
и для меня загадка - где ты увидел "у меня, судя по всему, какую-то другую проблему"? вопрос, который изначально был задан и являлся проблемой - так и не получил ответа о копировании областей от более продвинутых собеседников, а когда я сам решил эту проблему и решил поделиться тем что получилось в надежде на обмен мнениями по сути - получил неинформативный и каьтегоричный ответ человека, демонстративно позиционирующего умственные способности собеседника как ничтожные.
извини, но я с сожалением разочаровываюсь в людях и всегда готов менять мнение о собеседнике в лучшую сторону. и вот честно положа руку на сердце - мне сейчас в основном грустно причем именно по этим причинам.
Разговор не получился, к сожалению. Извини, не буду больше отвлекать тебя своими "тупостями".
УДАЧи.Отправлено 15 года(лет) назад # -
ЗЫ: и, да, извини, я уже попрощался - но так, вдогонку, вдруг будешь пробовать - присвоение это выполняется как-бы-не-совсем-по-значению (я и надеялся на диалог по этому поводу) - в единожды созданный массив "сложный" объект (не придумал лучше названия для сз+тз+..., не являющихся объектами данных) загоняется только в первый (вроде) раз, поэтому тупое "разузлование" переменная - элементмассива - другаяпеременная не проходит. наверное потому что массив сам по себе является объектом, выделение памяти (или ссылок на хранящиеся в элементах значения, я не специалист в этих вопросах, извини) выполняется статически(абсолютно?), а для остальных переменных - динамически(относительно?). всё, теперь ушёл.
Отправлено 15 года(лет) назад # -
что мешает Гоше выложить тестовую обработочку? там, судя по сабжу, кодирования - на 20 строк...
Отправлено 15 года(лет) назад # -
От нефиг делать проверил... В общем, Гоша чего-то попутал
Отправлено 15 года(лет) назад # -
Может Gosha заглянет и скажет что я делаю не так?
Процедура Сформировать()
Перем К[1];
А = СоздатьОбъект("Таблица");
А.Область(1,1).Текст = "Метод Гоши работает!";
К[1] = А;
А.Область(1,1).Текст = "Метод Гоши НЕ работает.";
Сообщить(К[1].Область(1,1).Текст);
КонецПроцедурывыводит, что метод не работает.
Отправлено 15 года(лет) назад #
Отправить сообщение
Вы должны войти в систему, чтобы оставлять сообщения.