Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Глобальное хранение Таблицы Значения

Ø [Злопчинский, 18.04.17 - 12:04]
Я
   Slypower
 
14.04.17 - 19:45
Добрый вечер. Вопрос вот в чем.
Есть ли возможность хранить ТЗ в глобальнике постоянно? Сейчас так: открыл обработку, считал данные из файла, записал в ТЗ в глобальной переменной. Она хранит данные пока не закрыть сеанс пользователя.

1)Сильно ли подгружается и страдает 1С7.7 ТиС sql 2003 при хранении ТЗ данным случаем?
2)Сильно ли замедляется снятие отчетов при таком хранении ТЗ?
3)Как можно хранить ТЗ всегда, чтобы завтра открыл 1С и уже ТЗ там есть?

Пользователи работают через RDP на серваке 2008.
 
 
   HawkEye
 
1 - 14.04.17 - 19:46
(0) во внешнем файле, в служебном документе - выбирай
   Slypower
 
2 - 14.04.17 - 19:49
(1) данные и так хранятся во внешнем файле. Это тоже самое получается. Я ТЗ создаю из внешнего файла mxl
   Slypower
 
3 - 14.04.17 - 19:53
считывание файла происходит 10 секунд. А вот ТЗ количеством колонок около 800 и одна из колонок имеет еще Npy с разным количеством строк создается минут 5-7. Так вот, неужели всегда нужно сперва это делать, а уже потом работать с ТЗ в глобальке? Или есть еще метод какой? Или такое могут только Реквизиты справочников, документов?
Клюшка, никаких 1с++ нет
   МимохожийОднако
 
4 - 14.04.17 - 20:00
(3) Чем справочник не устроил?
   HawkEye
 
5 - 14.04.17 - 20:02
(1) ну заведи служебный документ и храни в нем...

(2) 5-7 минут, 800 строк?! чего же ты там такого создаешь?
и как читаешь/записываешь?
   Zamestas
 
6 - 14.04.17 - 20:03
(5) Там колонок 800. Нах такая информация нужна в базе - я даже представить не могу.
   HawkEye
 
7 - 14.04.17 - 20:04
(6) аааа колонок.... )))
тогда тоже не понятно))
   HawkEye
 
8 - 14.04.17 - 20:05
(3) скуль есть?
   Остап Сулейманович
 
9 - 14.04.17 - 20:09
(3) "Или есть еще метод какой? Или такое могут только Реквизиты справочников, документов?"

Еще есть СохранитьЗначение, ВосстановитьЗначение, ЗначениеВФайл, ЗначениеИзФайла ...
   palpetrovich
 
11 - 14.04.17 - 20:59
(0) база sql -  создавай табличку в темп-дб и пользуйся ею ...хотя, 800 полей?! странненько :)
   mehfk
 
12 - 14.04.17 - 22:44
(0) К черту mxl, ЗначениеВФайл, ЗначениеИзФайла (или как оно там зовется) в помощь.
   Slypower
 
13 - 17.04.17 - 09:47
(5) колонок 4))) считывание из файла происходит всего 10 секунд, это не проблема же. А вот в файле более 5000 строк. И на основании этих строк в базе уже формируется таблица значений, которая из этих 5к строк группирует и раскидывает в новые строки ТЗ. При этом эта новая ТЗ в базе имеет в каждой строке по своей ТЗстрока, в которой различное количество строк. Вопроса со считыванием из файла не стоит, стоит в формировании ТЗ в базе или хранении где ее.
(12) А какой файл создавать, чтобы он содержал ТЗ?
   HawkEye
 
14 - 17.04.17 - 09:54
(13) показывай уже код.....
   Pahomich
 
15 - 17.04.17 - 09:58
(13) Не создавать, а будет создан самой программой, текстовый. От тебя требуется только имя файла!
   VladZ
 
16 - 17.04.17 - 09:59
(0) Давай задачу целиком. Есть подозрение, что какую-то чушь делаете.
   1dvd
 
17 - 17.04.17 - 10:01
Вроде там из регистра оборотов можно было сделать аналог регистра сведений
   Slypower
 
18 - 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 файла, т.к. это быстро. Стоит вопрос на то, как хранить мою ТЗ, чтобы в дальнейшем на ее создания не тратить время?
   1dvd
 
19 - 17.04.17 - 10:21
(18) это не задача. Это твоё видение решения
   HawkEye
 
20 - 17.04.17 - 10:23
(18) ну например... еси ты сам формируешь файл, почему сразу не писать туда колонку Общ? зачем еще два лишних цикла по таблицам?
   Slypower
 
21 - 17.04.17 - 10:26
(20) файл сформирован из другой базы. Считывание происходит всего фала, а только нужных столбцов и затем поиск по коду в 1С справочников.
Лишние циклы: сравнение 2х таблиц, т.к. могут быть различные нужные строки. Может перебарщиваю и одного обхода достаточно.
   HawkEye
 
22 - 17.04.17 - 10:27
(18) если новая и старая ТЗ по колонкам совпадает, объедени из, потом сверни с итоговым флагом, отсортируй по флагу и получишь то что надо, вместо 4 циклов...
   mishaPH
 
Модератор
23 - 17.04.17 - 10:27
(0) чтение из файла  ЗначениеИзФайла() и запись в файл действительно не быстрое. зависит от ФС = у меня были глюки. когда файл не давали антифирусники или еще чего читать.
Самое простое это служебный справочник или док
   HawkEye
 
24 - 17.04.17 - 10:28
(21) сложно гадать... что в СформироватьТаблицуИзСтаройБазы 0/1 происходит?
   HawkEye
 
25 - 17.04.17 - 10:28
+24 в СформироватьТаблицуИзСтаройБазы, есть ТЗ.НОваяСтрока?
   Slypower
 
26 - 17.04.17 - 10:29
(24) ничего не обычного
Функция СформироватьТаблицуИзСтаройБазы()//рабочая

    Перем стр;
    
    Состояние("Считывание файла");
    
    Если ПустоеЗначение(ВыбКонтрагент)=0 Тогда
        СписокКонтрагентов=ПолучитьСписокКонтрагентов();
    Иначе
        СписокКонтрагентов=СоздатьОбъект("ТаблицаЗначений");
    КонецЕсли;
    
    ТаблЗнач=СоздатьОбъект("ТаблицаЗначений");
    ТаблЗнач.НоваяКолонка("Контрагент","Справочник.Контрагенты");
    ТаблЗнач.НоваяКолонка("Номенклатура","Справочник.Номенклатура");
    
    СпрКонтр=СоздатьОбъект("Справочник.Контрагенты");
    СпрНом=СоздатьОбъект("Справочник.Номенклатура");
    
    ТабДок=СоздатьОбъект("Таблица");
    ТабДок.ИсходнаяТаблица(ФайлEXEL);
    ТабДок.Открыть(ФайлEXEL);

    Для х=2 по ТабДок.ВысотаТаблицы() Цикл 
        
        стр="";    
        КодКонтрагента=ТабДок.Область("R"+х+"C3:R"+х+"C3").Текст;
        КодНоменклатууры=ТабДок.Область("R"+х+"C5:R"+х+"C5").Текст;
        
        Если СпрКонтр.НайтиПоКоду(КодКонтрагента)=0 Тогда
            Продолжить;
        КонецЕсли;
        Контрагент = СпрКонтр.ТекущийЭлемент();
        //Если СписокКонтрагентов.КоличествоСтрок() > 0 Тогда

        //    Если СписокКонтрагентов.НайтиЗначение(Контрагент,стр,"Контрагент") <> 1 Тогда

        //        Продолжить;

        //    КонецЕсли;

        //КонецЕсли;

        
        Если СпрНом.НайтиПоКоду(КодНоменклатууры)=0 Тогда
            Продолжить;
        КонецЕсли;
        Номенклатура = СпрНом.ТекущийЭлемент();
        
        ТаблЗнач.НоваяСтрока();
        ТаблЗнач.Контрагент = Контрагент;
        ТаблЗнач.Номенклатура = Номенклатура;
        
    КонецЦикла;

    ТаблЗнач.Свернуть("Контрагент,Номенклатура",);

    Возврат ТаблЗнач;
КонецФункции// СформироватьТаблицу
   Slypower
 
27 - 17.04.17 - 10:31
+(26) файл тут MXL, просто изначально считывал иэ экселя, потом переделал
   mishaPH
 
Модератор
28 - 17.04.17 - 10:32
автор. а этими данными (ТЗ) пользуется 1 клиент или несколько
   HawkEye
 
29 - 17.04.17 - 10:34
(26) а что мешает в этой процедура колонку ОБщ добавить?
что мешает после формирования одной ТЗ, вторую формировать уже с учетом первой?
   Slypower
 
30 - 17.04.17 - 10:34
(23)  служебный справочник или док, думал об этом. Не хотелось захламлять базу. Самое верное решение тут - это перенос данных из старой базы в новую. А это повесить в регистр продажи, как и должно быть. Но не хочется добавлять более 5к строк в регистр.

(28) 1-2, но не одновременно. Он к этому фалй обращается раз 50 в день, и нужно это оперативно, т.к. работа горит
   Slypower
 
31 - 17.04.17 - 10:38
(29) да, при считывании из 2х фалов я сэкономлю 5с времени. Это с учетом, если из 2х файлов.
Но опять же, времени за считывание я трачу 10-15 секунд, по 5-7 с. на файл. Это нормально, тут я хочу узнать, как мне хранить готовую тяжелую и муторную ТЗ
   HawkEye
 
32 - 17.04.17 - 10:42
(31) если оптимизировать считывание - на него будет уходить несколько секунд и тогда можно будет заполнять ее приСтратеСистемы...
в противном случае - документ, справочник, регистр - сам выбирай, что тебе ближе....
   mishaPH
 
Модератор
33 - 17.04.17 - 10:48
(30) 2. У меня много подобного из разных систем + для быстроты чтобы не ждать УРБД какие-то данные.

У меня на спец серваке который крутит обмены. еще и всякий подобный хлам обрабатывает.
т.е. он что-то рассчитал а уже готовые денные выгружает в ТЗ который либо записывается в файл а их видят клиенты. но в последнее время много гемора со скоростью файлов и проблем с ФС когда блокирует чтение и запись. я временны данные выкидываю в постгри таблички. А клиенты уже забирают
 
  Рекламное место пустует
   mishaPH
 
Модератор
34 - 17.04.17 - 10:49
(30) а в чем ( захламление то базы доком или справочником. глупо это. база и есть для того. чтобы работать с данными
   GreyK
 
35 - 17.04.17 - 10:52
(0) А чем ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() не подходят?
   Slypower
 
36 - 17.04.17 - 10:53
(35)  вот посмотрел на это, за 3с в сумме сохраняет и считывает мою ТЗ. Буду думать над этом
   Slypower
 
37 - 18.04.17 - 10:21
В общем сделал так: ночью на задании создает мою большую ТЗ, затем функций в файл ЗначениеВФайл(). А при открытии обработки ЗначениеИзФайла(). Шустро получается. Пользователи довольны, всем спасибо.
Тему можно закрывать.



Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует