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


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

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

Ø [Злопчинский, 18.04.17 - 12:04]
v7: Глобальное хранение Таблицы Значения
Я
   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 человек.
Рекламное место пустует