Имя: Пароль:
1C
1C 7.7
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
В общем сделал так: ночью на задании создает мою большую ТЗ, затем функций в файл ЗначениеВФайл(). А при открытии обработки ЗначениеИзФайла(). Шустро получается. Пользователи довольны, всем спасибо.
Тему можно закрывать.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн