|
v7: Глобальное хранение Таблицы Значения Ø (Злопчинский 18.04.2017 12:04) | ☑ | ||
---|---|---|---|---|
0
Slypower
14.04.17
✎
19:45
|
Добрый вечер. Вопрос вот в чем.
Есть ли возможность хранить ТЗ в глобальнике постоянно? Сейчас так: открыл обработку, считал данные из файла, записал в ТЗ в глобальной переменной. Она хранит данные пока не закрыть сеанс пользователя. 1)Сильно ли подгружается и страдает 1С7.7 ТиС sql 2003 при хранении ТЗ данным случаем? 2)Сильно ли замедляется снятие отчетов при таком хранении ТЗ? 3)Как можно хранить ТЗ всегда, чтобы завтра открыл 1С и уже ТЗ там есть? Пользователи работают через RDP на серваке 2008. |
|||
1
HawkEye
14.04.17
✎
19:46
|
(0) во внешнем файле, в служебном документе - выбирай
|
|||
2
Slypower
14.04.17
✎
19:49
|
(1) данные и так хранятся во внешнем файле. Это тоже самое получается. Я ТЗ создаю из внешнего файла mxl
|
|||
3
Slypower
14.04.17
✎
19:53
|
считывание файла происходит 10 секунд. А вот ТЗ количеством колонок около 800 и одна из колонок имеет еще Npy с разным количеством строк создается минут 5-7. Так вот, неужели всегда нужно сперва это делать, а уже потом работать с ТЗ в глобальке? Или есть еще метод какой? Или такое могут только Реквизиты справочников, документов?
Клюшка, никаких 1с++ нет |
|||
4
Мимохожий Однако
14.04.17
✎
20:00
|
(3) Чем справочник не устроил?
|
|||
5
HawkEye
14.04.17
✎
20:02
|
(1) ну заведи служебный документ и храни в нем...
(2) 5-7 минут, 800 строк?! чего же ты там такого создаешь? и как читаешь/записываешь? |
|||
6
Zamestas
14.04.17
✎
20:03
|
(5) Там колонок 800. Нах такая информация нужна в базе - я даже представить не могу.
|
|||
7
HawkEye
14.04.17
✎
20:04
|
(6) аааа колонок.... )))
тогда тоже не понятно)) |
|||
8
HawkEye
14.04.17
✎
20:05
|
(3) скуль есть?
|
|||
9
Остап Сулейманович
14.04.17
✎
20:09
|
(3) "Или есть еще метод какой? Или такое могут только Реквизиты справочников, документов?"
Еще есть СохранитьЗначение, ВосстановитьЗначение, ЗначениеВФайл, ЗначениеИзФайла ... |
|||
11
palpetrovich
14.04.17
✎
20:59
|
(0) база sql - создавай табличку в темп-дб и пользуйся ею ...хотя, 800 полей?! странненько :)
|
|||
12
mehfk
14.04.17
✎
22:44
|
(0) К черту mxl, ЗначениеВФайл, ЗначениеИзФайла (или как оно там зовется) в помощь.
|
|||
13
Slypower
17.04.17
✎
09:47
|
(5) колонок 4))) считывание из файла происходит всего 10 секунд, это не проблема же. А вот в файле более 5000 строк. И на основании этих строк в базе уже формируется таблица значений, которая из этих 5к строк группирует и раскидывает в новые строки ТЗ. При этом эта новая ТЗ в базе имеет в каждой строке по своей ТЗстрока, в которой различное количество строк. Вопроса со считыванием из файла не стоит, стоит в формировании ТЗ в базе или хранении где ее.
(12) А какой файл создавать, чтобы он содержал ТЗ? |
|||
14
HawkEye
17.04.17
✎
09:54
|
(13) показывай уже код.....
|
|||
15
Pahomich
17.04.17
✎
09:58
|
(13) Не создавать, а будет создан самой программой, текстовый. От тебя требуется только имя файла!
|
|||
16
VladZ
17.04.17
✎
09:59
|
(0) Давай задачу целиком. Есть подозрение, что какую-то чушь делаете.
|
|||
17
1dvd
17.04.17
✎
10:01
|
Вроде там из регистра оборотов можно было сделать аналог регистра сведений
|
|||
18
Slypower
17.04.17
✎
10:15
|
(14) Не знаю, зачем вам код)))
//====================================================================== Процедура Сравнить() перем стр, СтрСтар; // 1.Фунцкии для считывания данных из Файлов mxl и ТаблИзФайлаСтрая=СформироватьТаблицуИзСтаройБазы(); ТаблИзФайлаНовая=СформироватьТаблицуИзСтаройБазы1(); // 2.Создания 3 колонки для сравнения 2х таблиц для объединения их ТаблИзФайлаСтрая.НоваяКолонка("Общ","Строка"); ТаблИзФайлаНовая.НоваяКолонка("Общ","Строка"); ТаблИзФайлаСтрая.ВыбратьСтроки(); Пока ТаблИзФайлаСтрая.ПолучитьСтроку() = 1 Цикл ТаблИзФайлаСтрая.Общ=СокрЛП(ТаблИзФайлаСтрая.Контрагент.Код)+"|"+СокрЛП(ТаблИзФайлаСтрая.Номенклатура.Код); Состояние("Идет обобщение 1 "+Окр(ТаблИзФайлаСтрая.НомерСтроки/(0.01*ТаблИзФайлаСтрая.КоличествоСтрок()))+"%"); КонецЦикла; ТаблИзФайлаНовая.ВыбратьСтроки(); Пока ТаблИзФайлаНовая.ПолучитьСтроку() = 1 Цикл ТаблИзФайлаНовая.Общ=СокрЛП(ТаблИзФайлаНовая.Контрагент.Код)+"|"+СокрЛП(ТаблИзФайлаНовая.Номенклатура.Код); Состояние("Идет обобщение 2 "+Окр(ТаблИзФайлаНовая.НомерСтроки/(0.01*ТаблИзФайлаНовая.КоличествоСтрок()))+"%"); КонецЦикла; //3. Сравнение таблиц поочередно СписокСтрокСтар=СоздатьОбъект("СписокЗначений"); ТаблИзФайлаСтрая.ВыбратьСтроки(); Пока ТаблИзФайлаСтрая.ПолучитьСтроку() = 1 Цикл Если ТаблИзФайлаНовая.НайтиЗначение(ТаблИзФайлаСтрая.Общ,Стр,"Общ")=1 Тогда ТаблИзФайлаНовая.УдалитьСтроку(Стр); КонецЕсли; Состояние("Идет создание списка стар "+Окр(ТаблИзФайлаСтрая.НомерСтроки/(0.01*ТаблИзФайлаСтрая.КоличествоСтрок()))+"%"); КонецЦикла; СписокСтрокНов=СоздатьОбъект("СписокЗначений"); ТаблИзФайлаНовая.ВыбратьСтроки(); Пока ТаблИзФайлаНовая.ПолучитьСтроку() = 1 Цикл Если ТаблИзФайлаСтрая.НайтиЗначение(ТаблИзФайлаСтрая.Общ,СтрСтар,"Общ")=1 Тогда ТаблИзФайлаСтрая.УдалитьСтроку(СтрСтар); КонецЕсли; Состояние("Идет создание списка нов "+Окр(ТаблИзФайлаНовая.НомерСтроки/(0.01*ТаблИзФайлаНовая.КоличествоСтрок()))+"%"); КонецЦикла; // 4.Объединение таблиц Если ТаблИзФайлаНовая.КоличествоСтрок()=0 Тогда ТаблИзФайлаНовая=ТаблИзФайлаСтрая; КонецЕсли; Если ТаблИзФайлаСтрая.КоличествоСтрок()>0 Тогда ТаблИзФайлаНовая.КоличествоСтрок(ТаблИзФайлаНовая.КоличествоСтрок()+ТаблИзФайлаСтрая.КоличествоСтрок()); ТаблИзФайлаНовая.Заполнить(ТаблИзФайлаСтрая,ТаблИзФайлаНовая.КоличествоСтрок()-ТаблИзФайлаСтрая.КоличествоСтрок()+1,ТаблИзФайлаНовая.КоличествоСтрок()); ТаблИзФайлаНовая.Свернуть("Контрагент,Номенклатура",); КонецЕсли; // 5.Создание ТЗ для использования из ТЗ, созданно из файлов mxl ТаблицаСертификатов=СоздатьОбъект("ТаблицаЗначений"); ТаблицаСертификатов.НоваяКолонка("Номер","Число",4,0,"Номер строки",3); ТаблицаСертификатов.НоваяКолонка("Документ","Строка",,,"Документ",15); ТаблицаСертификатов.НоваяКолонка("Контрагент","Справочник.Контрагенты",,,"Контрагент",25); ТаблицаСертификатов.НоваяКолонка("ТаблНоменклатура","ТаблицаЗначений"); ТаблицаСертификатов.ВидимостьКолонки("ТаблНоменклатура",0); //ТаблицаСертификатов.УдалитьСтроки(); ТЗКонтр=СоздатьОбъект("ТаблицаЗначений"); ТаблИзФайлаНовая.Выгрузить(ТЗКонтр,,,"Контрагент"); ТЗКонтр.Свернуть("Контрагент",); // ТЗНоменклатура=СоздатьОбъект("ТаблицаЗначений"); ТЗНоменклатура.НоваяКолонка("Номенклатура","Справочник.Номенклатура"); // Номер=1; // ТЗКонтр.ВыбратьСтроки(); Пока ТЗКонтр.ПолучитьСтроку() = 1 Цикл Состояние("Идет заполнение таблицы: "+Окр(ТЗКонтр.НомерСтроки/(0.01*ТЗКонтр.КоличествоСтрок()))+"%"); ТЗНоменклатура.УдалитьСтроки(); ТаблицаСертификатов.НоваяСтрока(); ТаблицаСертификатов.Номер=Номер; ТаблицаСертификатов.Документ = "Реализация (Купля-Продажа)"; ТаблицаСертификатов.Контрагент = ТЗКонтр.Контрагент; ТаблИзФайлаНовая.ВыбратьСтроки(); Пока ТаблИзФайлаНовая.ПолучитьСтроку()=1 Цикл Если ТЗКонтр.Контрагент=ТаблИзФайлаНовая.Контрагент Тогда кол=кол+1; ТЗНоменклатура.НоваяСтрока(); ТЗНоменклатура.Номенклатура = ТаблИзФайлаНовая.Номенклатура; КонецЕсли; КонецЦикла; // // тзвр=СоздатьОбъект("ТаблицаЗначений"); тзвр.Загрузить(ТЗНоменклатура); ТаблицаСертификатов.ТаблНоменклатура = тзвр; // Номер=Номер+1; КонецЦикла; // 6.Выгрузка ТЗ в глобальную таблицу значений ТаблицаСертификатов.Выгрузить(глТаблицаСертификатов); //глТаблица КонецПроцедуры // Сравнить (16) Задача: Прочитать данные из файла и из Регистра (либо из 2 файлов), сравнить и вывести данные сгруппированы, если повторяются. Самый долгий процесс - это 5 пункт. Так вот, вопрос не стоит, как считывать мне из xml файла, т.к. это быстро. Стоит вопрос на то, как хранить мою ТЗ, чтобы в дальнейшем на ее создания не тратить время? |
|||
19
1dvd
17.04.17
✎
10:21
|
(18) это не задача. Это твоё видение решения
|
|||
20
HawkEye
17.04.17
✎
10:23
|
(18) ну например... еси ты сам формируешь файл, почему сразу не писать туда колонку Общ? зачем еще два лишних цикла по таблицам?
|
|||
21
Slypower
17.04.17
✎
10:26
|
(20) файл сформирован из другой базы. Считывание происходит всего фала, а только нужных столбцов и затем поиск по коду в 1С справочников.
Лишние циклы: сравнение 2х таблиц, т.к. могут быть различные нужные строки. Может перебарщиваю и одного обхода достаточно. |
|||
22
HawkEye
17.04.17
✎
10:27
|
(18) если новая и старая ТЗ по колонкам совпадает, объедени из, потом сверни с итоговым флагом, отсортируй по флагу и получишь то что надо, вместо 4 циклов...
|
|||
23
mishaPH
модератор
17.04.17
✎
10:27
|
(0) чтение из файла ЗначениеИзФайла() и запись в файл действительно не быстрое. зависит от ФС = у меня были глюки. когда файл не давали антифирусники или еще чего читать.
Самое простое это служебный справочник или док |
|||
24
HawkEye
17.04.17
✎
10:28
|
(21) сложно гадать... что в СформироватьТаблицуИзСтаройБазы 0/1 происходит?
|
|||
25
HawkEye
17.04.17
✎
10:28
|
+24 в СформироватьТаблицуИзСтаройБазы, есть ТЗ.НОваяСтрока?
|
|||
26
Slypower
17.04.17
✎
10:29
|
(24) ничего не обычного
Функция СформироватьТаблицуИзСтаройБазы() //рабочая Перем стр; Состояние("Считывание файла"); Если ПустоеЗначение(ВыбКонтрагент)=0 Тогда СписокКонтрагентов=ПолучитьСписокКонтрагентов(); Иначе СписокКонтрагентов=СоздатьОбъект("ТаблицаЗначений"); КонецЕсли; ТаблЗнач=СоздатьОбъект("ТаблицаЗначений"); ТаблЗнач.НоваяКолонка("Контрагент","Справочник.Контрагенты"); ТаблЗнач.НоваяКолонка("Номенклатура","Справочник.Номенклатура"); СпрКонтр=СоздатьОбъект("Справочник.Контрагенты"); СпрНом=СоздатьОбъект("Справочник.Номенклатура"); ТабДок=СоздатьОбъект("Таблица"); ТабДок.ИсходнаяТаблица(ФайлEXEL); ТабДок.Открыть(ФайлEXEL); Для х=2 по ТабДок.ВысотаТаблицы() Цикл стр=""; КодКонтрагента=ТабДок.Область("R"+х+"C3:R"+х+"C3").Текст; КодНоменклатууры=ТабДок.Область("R"+х+"C5:R"+х+"C5").Текст; Если СпрКонтр.НайтиПоКоду(КодКонтрагента)=0 Тогда Продолжить; КонецЕсли; Контрагент = СпрКонтр.ТекущийЭлемент(); //Если СписокКонтрагентов.КоличествоСтрок() > 0 Тогда // Если СписокКонтрагентов.НайтиЗначение(Контрагент,стр,"Контрагент") <> 1 Тогда // Продолжить; // КонецЕсли; //КонецЕсли; Если СпрНом.НайтиПоКоду(КодНоменклатууры)=0 Тогда Продолжить; КонецЕсли; Номенклатура = СпрНом.ТекущийЭлемент(); ТаблЗнач.НоваяСтрока(); ТаблЗнач.Контрагент = Контрагент; ТаблЗнач.Номенклатура = Номенклатура; КонецЦикла; ТаблЗнач.Свернуть("Контрагент,Номенклатура",); Возврат ТаблЗнач; КонецФункции // СформироватьТаблицу |
|||
27
Slypower
17.04.17
✎
10:31
|
+(26) файл тут MXL, просто изначально считывал иэ экселя, потом переделал
|
|||
28
mishaPH
модератор
17.04.17
✎
10:32
|
автор. а этими данными (ТЗ) пользуется 1 клиент или несколько
|
|||
29
HawkEye
17.04.17
✎
10:34
|
(26) а что мешает в этой процедура колонку ОБщ добавить?
что мешает после формирования одной ТЗ, вторую формировать уже с учетом первой? |
|||
30
Slypower
17.04.17
✎
10:34
|
(23) служебный справочник или док, думал об этом. Не хотелось захламлять базу. Самое верное решение тут - это перенос данных из старой базы в новую. А это повесить в регистр продажи, как и должно быть. Но не хочется добавлять более 5к строк в регистр.
(28) 1-2, но не одновременно. Он к этому фалй обращается раз 50 в день, и нужно это оперативно, т.к. работа горит |
|||
31
Slypower
17.04.17
✎
10:38
|
(29) да, при считывании из 2х фалов я сэкономлю 5с времени. Это с учетом, если из 2х файлов.
Но опять же, времени за считывание я трачу 10-15 секунд, по 5-7 с. на файл. Это нормально, тут я хочу узнать, как мне хранить готовую тяжелую и муторную ТЗ |
|||
32
HawkEye
17.04.17
✎
10:42
|
(31) если оптимизировать считывание - на него будет уходить несколько секунд и тогда можно будет заполнять ее приСтратеСистемы...
в противном случае - документ, справочник, регистр - сам выбирай, что тебе ближе.... |
|||
33
mishaPH
модератор
17.04.17
✎
10:48
|
(30) 2. У меня много подобного из разных систем + для быстроты чтобы не ждать УРБД какие-то данные.
У меня на спец серваке который крутит обмены. еще и всякий подобный хлам обрабатывает. т.е. он что-то рассчитал а уже готовые денные выгружает в ТЗ который либо записывается в файл а их видят клиенты. но в последнее время много гемора со скоростью файлов и проблем с ФС когда блокирует чтение и запись. я временны данные выкидываю в постгри таблички. А клиенты уже забирают |
|||
34
mishaPH
модератор
17.04.17
✎
10:49
|
(30) а в чем ( захламление то базы доком или справочником. глупо это. база и есть для того. чтобы работать с данными
|
|||
35
GreyK
17.04.17
✎
10:52
|
(0) А чем ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() не подходят?
|
|||
36
Slypower
17.04.17
✎
10:53
|
(35) вот посмотрел на это, за 3с в сумме сохраняет и считывает мою ТЗ. Буду думать над этом
|
|||
37
Slypower
18.04.17
✎
10:21
|
В общем сделал так: ночью на задании создает мою большую ТЗ, затем функций в файл ЗначениеВФайл(). А при открытии обработки ЗначениеИзФайла(). Шустро получается. Пользователи довольны, всем спасибо.
Тему можно закрывать. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |