Имя: Пароль:
1C
1С v8
Есть ли метод запустить дополнительную обработку без временного файла и сервера?
0 smaharbA
 
15.10.13
19:09
Есть ли метод запустить программно дополнительную обработку без временного файла в файловом варианте ?
1 Fragster
 
модератор
15.10.13
19:26
лично я про такой способ не знаю.
А отчего возникла необходимость?
2 smaharbA
 
15.10.13
19:27
(1) жалко систему ввода/вывода и диск
часть дополнительных обработок будут стартовать при начале работы системы, стать Обработками в составе конфигурации они не могут.
3 Fragster
 
модератор
15.10.13
19:31
ну сохрани их куда-нибудь на диск 1 раз и при запуске - проверяй (допустим какую-нибудь версию в имя файла). если версия совпадает - не перезаписывай, а сразу из того файла создавай. правда дыра в безопасности.
4 smaharbA
 
15.10.13
19:32
Есть конечно вариант, создавать временный файл с соответствующим флагом (может тогда часть успешно в памяти загрузится и после открытия удалится), но это крайний вариант, требующий наличия либо вк либо COM-обертки на winapi. Конечно сделаю так, если есть соответствующая COM-обертка, будет создавать с флагом, если нет попытается ее выгрузить из макета и зарегистрировать в усерском пространстве и далее использовать, если и это не выйдет - будет через обычные временные файлы.
Вот думал может существует какой финт ушами в самой 1с.
5 Fragster
 
модератор
15.10.13
19:32
хотя ввод-вывод... пусть программа хоть 5 минут запускается, но работает быстро...
6 Лоботряс
 
15.10.13
19:36
Справочник внешних обработок, не?
7 Fragster
 
модератор
15.10.13
19:38
(6) а ты смотрел, как он работает?
8 Defender aka LINN
 
15.10.13
19:39
Смонтировать какой-нить виртуальный диск, не?
9 Лоботряс
 
15.10.13
19:41
(7)Че правда временные файлы созlает? Oo
10 Лоботряс
 
15.10.13
19:43
Жуть какая...
11 smaharbA
 
15.10.13
19:53
(8) вариант, но для него нужны права либо заранее создан.
Ладно, тогда попутно - есть ли метод получить переменные окружения или shell:xxx в восьмерке встроенными функциями, без com и/или парсиния вывода set ?
12 Лефмихалыч
 
15.10.13
20:17
(0) а цель-то какая? пролить жизнь ССД накопителю или сэкономить дисковое просранство?
13 smaharbA
 
15.10.13
21:18
(12) продлить жизнь НЖМД и немного ускорить загрузку
Конечно это уже маразм, тем не менее.
14 smaharbA
 
15.10.13
21:20
И еще - в 1с8 работает ленивая булева алгебра ?
15 Лефмихалыч
 
15.10.13
21:36
(13) один раз куда-нить сложи и оттель запускай
(14) работает
16 ilkoder
 
15.10.13
21:47
хотя в системе столько временных файлов открыто, что одним больше, одним меньше...
17 H A D G E H O G s
 
15.10.13
22:42
(13) Согласен насчет маразма.
18 Зойч
 
15.10.13
23:24
1с открвывает стопицот миллионов времееных файлов для своих нужд
19 smaharbA
 
15.10.13
23:26
И еще, как из объекта получить доступ к глобальному контексту или хотя бы к методам ?
20 H A D G E H O G s
 
15.10.13
23:26
(19) Тоесть?
21 Asmody
 
15.10.13
23:30
(0) нахрена? 1Ска всё равно куски локально накеширует
22 smaharbA
 
15.10.13
23:34
(20) т.е.

ТЗ=Новый ТаблицаЗначений;
ГК=ТЗ.Приложение;
23 smaharbA
 
15.10.13
23:37
+(22)
есть староновый метод обмена между открытыми приложениями 1с в одном сеансе пользователя, хорошо бы передать нетолько объекты с их свойствами/методами, а целиком глобальный контекст
24 H A D G E H O G s
 
15.10.13
23:46
(22) (23) няня я у них поел

Что ты хочешь?
Отвечу тебе потоком сознания.

Вернуть AppDispatch из ВК?
Зарегистрировать 1 сеанс 1С в ROT и получить его из другого сеанса?
Обмениваться через объектами через XDTO (транспорт - файл, именованный канал, сокет)?
25 smaharbA
 
15.10.13
23:48
(24) не то, кроме первого

ссуть метода проста

                    Шел=Новый COMОбъект("shell.application");
                    Для Сч=1 По 10 Цикл
                        Вопрос("Ждем",РежимДиалогаВопрос.ОК,1);
                        Для Каждого Окно Из Шел.Windows() Цикл
                            Сообщить(Окно);
                            Если Окно.GetProperty("id")=1 Тогда
                                ОкноИЕ=Окно;
                                //Сообщить(ОкноИЕ);
                                ТЗ=ОкноИЕ.GetProperty("ТаблицаЗначений");
                                Сообщить(ТипЗнч(ТЗ));
                                Попытка
                                    Для Каждого Строка Из ТЗ Цикл
                                        Сообщить(Строка.Документ.Номер);
                                    КонецЦикла;
                                Исключение
                                КонецПопытки;
                                Если ТипЗнч(ТЗ)=Тип("ТаблицаЗначений") Тогда
                                    //ТЗ.ВыбратьСтроку();
                                КонецЕсли;
                                Сч=12;
                                Прервать;
                            КонецЕсли;
                        КонецЦикла;
                    КонецЦикла;
                    ТаблицаЗначений=Новый ТаблицаЗначений;
                    ТаблицаЗначений.Колонки.Добавить("Документ");
                    Выбор=Документы.ЗаказПокупателя.Выбрать();
                    Сч=0;
                    Пока (Выбор.Следующий()) и (Сч<10) Цикл
                        ТаблицаЗначений.Добавить().Документ=Выбор.Ссылка;
                        Сч=Сч+1;
                    КонецЦикла;
                    
                    ОкноИЕ.PutProperty("ТаблицаЗначений",ТаблицаЗначений);
26 H A D G E H O G s
 
15.10.13
23:51
(25) Мне твои танцы вокруг shell напоминают шаманические напевы. Это не должно работать!
27 Torquader
 
16.10.13
00:04
Конечно, приляпать объект к Ослу - много ума не надо.
Но, нужно понимать, как это корявое решение работает:
Так как "осёл" - это отдельный процесс, то когда мы ему чего-то приляпываем, что не является простым объектом, то в памяти осла создаётся заглушка, связанная по "указателю" (moniker) с основным объектом, который у нас живёт в памяти 1С.
Потом, когда мы "забираем" у "осла" этот чудо-указатель в третий процесс, то система создаёт указатель на указатель.
И передача взаимодействия будет идти опять же таки через "осла", что достаточно сильно снизит скорость.

Что касается глобального контекста, то у 1С его просто нет. Все глобальные объекты стыкуются с указанными в коде в момент его компиляции, то есть перед выполнением, а не в момент выполнения.

Ну, а если очень чего-то хочется, то внешняя функция любого объекта и в ней Вычислить - должно спасти.

Если же хочется, чтобы обработка запускалась без создания образа в файле, то самым простым решением будет использование виртуального файлового пространства - но для этого придётся писать драйвер или файловой системы или диска - как вариант - посмотреть примеры zip-folder.
28 Asmody
 
16.10.13
00:28
эх, а у нормальных людей такое делается вот так http://www.hazelcast.com/whatishazelcast.jsp
29 Asmody
 
16.10.13
00:29
а в 1С элементарно сокет поднять целая проблема
30 H A D G E H O G s
 
16.10.13
00:34
(29) Нету никаких проблем.
31 Asmody
 
16.10.13
00:36
(30) нативно без ВК?
32 smaharbA
 
16.10.13
00:36
(26) в одном экземпляре жмем "Отправить", в другом "Получить" (в одном сеансе пользователя)

Перем Идентификатор;

Функция ПолучитьОкноОбмена(ИД)
    Перем Шел,Сч,Окно;
    Шел=Новый COMОбъект("shell.application");
    Для Сч=1 По 10 Цикл
        Вопрос("Ждем",РежимДиалогаВопрос.ОК,1);
        Для Каждого Окно Из Шел.Windows() Цикл
            Если Окно.GetProperty("Идентификатор")=ИД Тогда
                Возврат Окно;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецФункции

Процедура ОсновныеДействияФормыОтправить(Кнопка)
    // Вставить содержимое обработчика.
    Перем ОкноОбмена;
    ЗапуститьПриложение("mshta ""about:<hta:application windowstate=minimize /><script>window.onload=function(){new ActiveXObject('internetexplorer.application').PutProperty('Идентификатор','"+Идентификатор+"')}</script>""");
    ОкноОбмена=ПолучитьОкноОбмена(Идентификатор);
    Если Не ОкноОбмена=Неопределено Тогда
        ОкноОбмена.PutProperty("КомпонентаСклоненияФИО",глЗначениеПеременной("глКомпонентаСклоненияФИО"));
        ОкноОбмена.PutProperty("УниверсальныеМеханизмы",УниверсальныеМеханизмы);
    КонецЕсли;
КонецПроцедуры

Процедура ОсновныеДействияФормыПолучить(Кнопка)
    // Вставить содержимое обработчика.
    Перем ОкноОбмена,КомпонентаСклоненияФИОДругая,УниверсальныеМеханизмыДругие;
    Перем Фамилия,Имя,Отчество,Результат;
    ОкноОбмена=ПолучитьОкноОбмена(Идентификатор);
    Если Не ОкноОбмена=Неопределено Тогда
        КомпонентаСклоненияФИОДругая=ОкноОбмена.GetProperty("КомпонентаСклоненияФИО");
        УниверсальныеМеханизмыДругие=ОкноОбмена.GetProperty("УниверсальныеМеханизмы");
        Фамилия="Иванов";
        Имя="Иван";
        Отчество="Иванович";
        Попытка
            Результат="";
            Если УниверсальныеМеханизмыДругие.ПросклонятьФамилиюИмяОтчество(КомпонентаСклоненияФИОДругая,Фамилия,Имя,Отчество,4,,Результат) Тогда
                Сообщить(Результат);
            КонецЕсли;
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
    Идентификатор=Формат(ТекущаяДата(),"Л=ru_RU; ДФ=ггггММддчч");
КонецПроцедуры
33 H A D G E H O G s
 
16.10.13
00:37
(31) Куда мы без ВК то.
34 smaharbA
 
16.10.13
00:37
Общие модули можно передавать и объекты, все - можно издеваться выполнив активскрипт в сеансе
35 H A D G E H O G s
 
16.10.13
00:38
(32) Что за механизм свойств окон у винды?
Где это описано в winApi?
36 smaharbA
 
16.10.13
00:39
(35) PutProperty и GetProperty
37 smaharbA
 
16.10.13
00:41
38 Asmody
 
16.10.13
00:41
(35) не у винды. это окна того же осла, со всеми вытекающими
39 H A D G E H O G s
 
16.10.13
00:42
Понятно. Я уж насторожилсо.
40 Asmody
 
16.10.13
00:45
а можно же окно десктопа выловить и к нему цепануться. чтоб окон не плодить.
41 Asmody
 
16.10.13
00:46
только с приходом УФ все эти пляски с бубном нафик не сдались
42 Torquader
 
16.10.13
00:56
(36) У окон в Windows тоже есть свойства, только под них нужно заранее выделять память.
А "осёл" - это сердце винды, так как без него в ней ничего и не сделаешь.
43 smaharbA
 
16.10.13
01:24
Упрощаем, по сути в коде вызов ИЕ из-за работы в рдп  с альтернативным шелом, в обычном сеансе можно использовать уже открытый как оболочка проводник, а так.

Функция ПолучитьОкноОбмена(ИД,Установить=Ложь)
    Перем Шел,Сч,Окно;
    Шел=Новый COMОбъект("shell.application");
    Для Сч=1 По 10 Цикл
        Вопрос("Ждем",РежимДиалогаВопрос.ОК,1);
        Для Каждого Окно Из Шел.Windows() Цикл
            Сообщить(Окно);
            Если (Установить=Истина) или (Окно.GetProperty("Идентификатор")=ИД) Тогда
                Окно.PutProperty("Идентификатор",ИД);
                Возврат Окно;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецФункции

Процедура ОсновныеДействияФормыОтправить(Кнопка)
    Перем ОкноОбмена;
    ЗапуститьПриложение(ЭтотОбъект.ИспользуемоеИмяФайла+"\..\");//старый, еще семерочный финт
    ОкноОбмена=ПолучитьОкноОбмена(Идентификатор,Истина);
    Если Не ОкноОбмена=Неопределено Тогда
        ОкноОбмена.PutProperty("КомпонентаСклоненияФИО",глЗначениеПеременной("глКомпонентаСклоненияФИО"));
        ОкноОбмена.PutProperty("УниверсальныеМеханизмы",УниверсальныеМеханизмы);
    КонецЕсли;
КонецПроцедуры