Ошибка при вызове метода контекста получитьизвременногохранилища 1с

Получить Из Временного Хранилища

Я
   hasan-rusel

02.12.14 — 11:10

Подскажите в чем ошибка пожалуйста:

{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

//////////////////////////////////////////////////////////

Перем Адрес;

&НаКлиенте

Процедура ПриОткрытии(Отказ)

    ДБФ = Новый XBase(«D:Kontr.dbf»);

    ДБФ.Кодировка = КодировкаXBase.OEM;

    Адрес = Неопределено;

    ВХ = ПоместитьВоВременноеХранилище(ДБФ,Адрес);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Адрес)

    Сообщить(Адрес);

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

        Если НЕ ДанныеСтроки.ЗаписьУдалена() Тогда

            Контр     = Справочники.Корреспонденты.НайтиПоНаименованию(СокрЛП(ДанныеСтроки.Name));

            Если Контр    = Справочники.Корреспонденты.ПустаяСсылка() тогда

                Контр=Справочники.Корреспонденты.СоздатьЭлемент();

                Контр.Наименование=СокрЛП(ДанныеСтроки.Name);

…………………………………………………………………………………………………

                Контр.Записать();

            КонецЕсли;

        КонецЕсли;

        ДанныеСтроки.Следующая();

    КонецЦикла;

КонецПроцедуры

Заранее спасибо !

   Wobland

1 — 02.12.14 — 11:12

Неопределено — так себе адрес

   Легат

2 — 02.12.14 — 11:13

=»»;

   Maxus43

3 — 02.12.14 — 11:13

Адрес = ПоместитьВоВременноеХранилище(ДБФ);

   hasan-rusel

4 — 02.12.14 — 11:16

(2) не помогло.

(3) не помогло.

{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

   Любопытная

5 — 02.12.14 — 11:17

(4) а Сообщить(Адрес) что сообщает?

   Maxus43

6 — 02.12.14 — 11:19

Адрес = ПоместитьВоВременноеХранилище(ДБФ);

ЗагрузкаДБФ(Адрес);

не работает? да ладно. Код в студию

   Легат

7 — 02.12.14 — 11:21

Возвращаемое значение:

Тип: Строка.

Адрес во временном хранилище.

Должно было прокатить..

   hasan-rusel

8 — 02.12.14 — 11:21

(6) Перем Адрес;

&НаКлиенте

Процедура ПриОткрытии(Отказ)

    ДБФ = Новый XBase(«D:Kontr.dbf»);

    
    ДБФ.Кодировка = КодировкаXBase.OEM;

    //    УникальныйИдентификатор = Новый УникальныйИдентификатор;

    Адрес = «»;

    Адрес = ПоместитьВоВременноеХранилище(ДБФ);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Адрес)

    Сообщить(Адрес);

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

        Если НЕ ДанныеСтроки.ЗаписьУдалена() Тогда

            Контр     = Справочники.Корреспонденты.НайтиПоНаименованию(СокрЛП(ДанныеСтроки.Name));

            Если Контр    = Справочники.Корреспонденты.ПустаяСсылка() тогда

                Контр=Справочн

   Любопытная

9 — 02.12.14 — 11:23

(8) Убери объявление переменной, оно тебе всю картину маслом портит

   Maxus43

10 — 02.12.14 — 11:24

Адрес = «»;

выкинь, чо за привычка так писать

   hasan-rusel

11 — 02.12.14 — 11:26

(10)

теперь новая ошибка:

{Форма.Форма.Форма(20)}: Значение не является значением объектного типа (Первая)

    ДанныеСтроки.Первая();

   Любопытная

12 — 02.12.14 — 11:26

(8) Написавши

Перем Адрес;

без директивы компиляции, ты определил определил переменную Адрес на сервере. Поэтому, когда ты приходишь на сервер, у тебя в ней уже не то, что ты с клиента передал, а очень даже Неопределено.

   Maxus43

13 — 02.12.14 — 11:28

(11) ты сначала файл в двоичные данные, двоичные данные во врем хранилище, из врем хранилища в двоичные данные, двоичные данный сохрани на винт во врем каталог как дбф. И только потом Новый XBase (путь к временному файлу);

   hasan-rusel

14 — 02.12.14 — 11:31

(13) О_О

А можно строчкой кода ?

   Любопытная

15 — 02.12.14 — 11:32

ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);

   hasan-rusel

16 — 02.12.14 — 11:36

(15) а как ?

«двоичные данный сохрани на винт во врем каталог как дбф. И только потом Новый XBase (путь к временному файлу);»

   Любопытная

17 — 02.12.14 — 11:40

ох, блин…

ИмяВременногоФайла = КаталогИБ()+»TmpDBF.dbf»;

ДвоичныеДанные.Записать(ИмяВременногоФайла);



Ну и далее по тексту.

И вообще, читайте СП, там все написано

   Maxus43

18 — 02.12.14 — 11:47

(17) ну с КаталогИБ() перебор имхо, лучше КаталогВременныхФайлов, да ещё и удалить потом тоже на всякий не забыть бы

   Любопытная

19 — 02.12.14 — 11:48

(18) первое, что в голову пришло) Не помню я их, я их в СП читаю обычно

   hasan-rusel

20 — 03.12.14 — 12:22

(19)

&НаКлиенте

Процедура ПриОткрытии(Отказ)

//    ДБФ = Новый XBase(«D:Kontr.dbf»);

    ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);

    Времянка = КаталогВременныхФайлов() + «TmpDBF.dbf»;

    ДвоичныеДанные.Записать(Времянка);

//    ДБФ.Кодировка = КодировкаXBase.OEM;

    //    УникальныйИдентификатор = Новый УникальныйИдентификатор;

//    Адрес = «»;

    Адрес = ПоместитьВоВременноеХранилище(Времянка);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Времянка)

    
    ДанныеСтроки1 = ПолучитьИзВременногоХранилища(Времянка);

    ДанныеСтроки = Новый XBase(ДанныеСтроки1);

    ДанныеСтроки.Кодировка = КодировкаXBase.OEM;

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

ЧЯДНТ ?

   hasan-rusel

21 — 03.12.14 — 12:23

{Форма.Форма.Форма(25)}: Ошибка при вызове метода контекста (Первая)

    ДанныеСтроки.Первая();

по причине:

Перед выполнением операции нужно открыть базу

   Wobland

22 — 03.12.14 — 12:24

(21) это ты так XBase на основе двоичных данных формируешь?

   Wobland

23 — 03.12.14 — 12:25

(22) а, не. на основе какого-то левого пути

   Любопытная

24 — 03.12.14 — 12:26

(21)

Синтаксис:

Новый XBase(<ПутьКБазе>, <ПутьКИндексу>, <ТолькоЧтение>)

Параметры:

<ПутьКБазе> (необязательный)

Тип: Строка.

Полное имя файла таблицы базы данных в формате DBF.

<ПутьКИндексу> (необязательный)

Тип: Строка.

Путь к индексному файлу таблицы.

<ТолькоЧтение> (необязательный)

Тип: Булево.

Истина — открывать файл только для чтения, Ложь — открывать файл для чтения и записи.

Значение по умолчанию: Ложь.

Описание:

Создает объект XBase. При создании могут быть сразу открыты файлы таблицы и индекса.

И еще раз:

<ПутьКИндексу> (необязательный)

Тип: Строка.

Путь к индексному файлу таблицы.

<ТолькоЧтение> (необязательный)

Тип: Булево.

Истина — открывать файл только для чтения, Ложь — открывать файл для чтения и записи.

Значение по умолчанию: Ложь.

   Любопытная

25 — 03.12.14 — 12:26

И вообще, ты чего-то не то делаешь

   hasan-rusel

26 — 03.12.14 — 12:27

(23) да я хз как, впервые с УФ сталкиваюсь, обычно то проще)

    ДБФ = Новый XBase(«\ServbdFormaDok_UL.dbf»);

    

    ДБФ.Кодировка = КодировкаXBase.OEM;

    ДБФ.Первая();

    Симв = Символ(160);

    Пока Не ДБф.ВКонце() Цикл

и т.д.

   Любопытная

27 — 03.12.14 — 12:27

Ты из временного хранилища получаешь двоичные данные. А XBase на основании пути к файлу поднимается. Так что ты свои ДвоичныеДанные сохрани на сервере в файл и этот файл уже делай

   Wobland

28 — 03.12.14 — 12:28

(26) обычно в управляемом режиме файловые системы разные у клиента и сервера

   Wobland

29 — 03.12.14 — 12:28

(27) Времянка. он туда строку отдаёт

   Любопытная

30 — 03.12.14 — 12:29

(26) ну не сталкивайся тогда. Забей, отдай работу тому, кто сталкивался.

Чего вы все ноете про эти упр формы? Не нравится вам инструмент, не работайте с ним. Работайте с тем, что вам нравится.

Нитики

   Любопытная

31 — 03.12.14 — 12:29

*Нытики.

Извините

   hasan-rusel

32 — 03.12.14 — 12:30

(28) вот это и вызывает затруднения.

   hasan-rusel

33 — 03.12.14 — 12:32

(30) Ну не обижайся, помощи же прошу)

Если бы можно было как-то обойти эти УФ, не сталкивался бы… А тут такое… И отдать тут некому.

   hasan-rusel

34 — 03.12.14 — 12:46

хелп…

   Wobland

35 — 03.12.14 — 12:49

то есть, сделайте за меня?

   hasan-rusel

36 — 03.12.14 — 12:50

(35) не, направьте на путь истинный с (20)

   Wobland

37 — 03.12.14 — 12:53

(36) -> (24)(30)

   DrZombi

38 — 03.12.14 — 13:09

(34) Бросай передавай в хранилище «XBase» объект.

Передай сперва на сервер сам файл, в виде двоичного коду.

А потом запиши его во временную папочку, открой, как XBase :)

И работак

   МишельЛагранж

39 — 03.12.14 — 13:23

(30)>>Не нравится вам инструмент, не работайте с ним.

— типичные «аргументы» УФ-маньяков.

Они и в автобусе на билет через электронный банк передают. И их «не аргументет», что у водилы нет банковского терминала…

   МишельЛагранж

40 — 03.12.14 — 13:24

+ да и вообще, водите управлять автобусом надо, а не изысками заниматься с пассажирами…

   МишельЛагранж

41 — 03.12.14 — 13:24

*водиле

   ramir

42 — 03.12.14 — 15:29

(0) Измени

ПоместитьВоВременноеХранилище(ДБФ,Адрес);

На

ПоместитьВоВременноеХранилище(ДБФ, ЭтаФорма.УникальныйИдентификатор);

   hasan-rusel

43 — 04.12.14 — 07:02

Всем спасибо, вот так получилось)

/////////////////

//Перем Адрес;

&НаКлиенте

Процедура ПриОткрытии(Отказ)

//    ДБФ = Новый XBase(«D:Kontr.dbf»);

    ////ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);

    ////Времянка = КаталогВременныхФайлов() + «TmpDBF.dbf»;

    ////ДвоичныеДанные.Записать(Времянка);

    
    
    Файл = Новый Файл(«D:Kontr.dbf»);

    ФайлИсточник = Файл.ПолноеИмя;

    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ФайлИсточник));

    
    
    
//    ДБФ.Кодировка = КодировкаXBase.OEM;

    //    УникальныйИдентификатор = Новый УникальныйИдентификатор;

//    Адрес = «»;

    ////    Адрес = ПоместитьВоВременноеХранилище(Времянка);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Адрес)

    ФайлПриемник = КаталогВременныхФайлов() + «temp_v82.dbf»;

    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);

    ДанныеХранилища.Записать(ФайлПриемник);

    ДанныеСтроки = Новый XBase(ФайлПриемник);

    ДанныеСтроки.Кодировка = КодировкаXBase.OEM;

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

   Wobland

44 — 04.12.14 — 07:19

можешь на досуге почитать про ПолучитьИмяВременногоФайла

  

hasan-rusel

45 — 04.12.14 — 07:20

(44) ок.

Получить Из Временного Хранилища

Я

  

hasan-rusel

02.12.14 — 11:10

Подскажите в чем ошибка пожалуйста:

{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

//////////////////////////////////////////////////////////

Перем Адрес;

&НаКлиенте

Процедура ПриОткрытии(Отказ)

    ДБФ = Новый XBase(«D:Kontr.dbf»);

    ДБФ.Кодировка = КодировкаXBase.OEM;

    Адрес = Неопределено;

    ВХ = ПоместитьВоВременноеХранилище(ДБФ,Адрес);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Адрес)

    Сообщить(Адрес);

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

        Если НЕ ДанныеСтроки.ЗаписьУдалена() Тогда

            Контр     = Справочники.Корреспонденты.НайтиПоНаименованию(СокрЛП(ДанныеСтроки.Name));

            Если Контр    = Справочники.Корреспонденты.ПустаяСсылка() тогда

                Контр=Справочники.Корреспонденты.СоздатьЭлемент();

                Контр.Наименование=СокрЛП(ДанныеСтроки.Name);

…………………………………………………………………………………………………

                Контр.Записать();

            КонецЕсли;

        КонецЕсли;

        ДанныеСтроки.Следующая();

    КонецЦикла;

КонецПроцедуры

Заранее спасибо !

  

Wobland

1 — 02.12.14 — 11:12

Неопределено — так себе адрес

  

Легат

2 — 02.12.14 — 11:13

=»»;

  

Maxus43

3 — 02.12.14 — 11:13

Адрес = ПоместитьВоВременноеХранилище(ДБФ);

  

hasan-rusel

4 — 02.12.14 — 11:16

(2) не помогло.

(3) не помогло.

{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

  

Любопытная

5 — 02.12.14 — 11:17

(4) а Сообщить(Адрес) что сообщает?

  

Maxus43

6 — 02.12.14 — 11:19

Адрес = ПоместитьВоВременноеХранилище(ДБФ);

ЗагрузкаДБФ(Адрес);

не работает? да ладно. Код в студию

  

Легат

7 — 02.12.14 — 11:21

Возвращаемое значение:

Тип: Строка.

Адрес во временном хранилище.

Должно было прокатить..

  

hasan-rusel

8 — 02.12.14 — 11:21

(6) Перем Адрес;

&НаКлиенте

Процедура ПриОткрытии(Отказ)

    ДБФ = Новый XBase(«D:Kontr.dbf»);

    

    ДБФ.Кодировка = КодировкаXBase.OEM;

    //    УникальныйИдентификатор = Новый УникальныйИдентификатор;

    Адрес = «»;

    Адрес = ПоместитьВоВременноеХранилище(ДБФ);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Адрес)

    Сообщить(Адрес);

    ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

        Если НЕ ДанныеСтроки.ЗаписьУдалена() Тогда

            Контр     = Справочники.Корреспонденты.НайтиПоНаименованию(СокрЛП(ДанныеСтроки.Name));

            Если Контр    = Справочники.Корреспонденты.ПустаяСсылка() тогда

                Контр=Справочн

  

Любопытная

9 — 02.12.14 — 11:23

(8) Убери объявление переменной, оно тебе всю картину маслом портит

  

Maxus43

10 — 02.12.14 — 11:24

Адрес = «»;

выкинь, чо за привычка так писать

  

hasan-rusel

11 — 02.12.14 — 11:26

(10)

теперь новая ошибка:

{Форма.Форма.Форма(20)}: Значение не является значением объектного типа (Первая)

    ДанныеСтроки.Первая();

  

Любопытная

12 — 02.12.14 — 11:26

(8) Написавши

Перем Адрес;

без директивы компиляции, ты определил определил переменную Адрес на сервере. Поэтому, когда ты приходишь на сервер, у тебя в ней уже не то, что ты с клиента передал, а очень даже Неопределено.

  

Maxus43

13 — 02.12.14 — 11:28

(11) ты сначала файл в двоичные данные, двоичные данные во врем хранилище, из врем хранилища в двоичные данные, двоичные данный сохрани на винт во врем каталог как дбф. И только потом Новый XBase (путь к временному файлу);

  

hasan-rusel

14 — 02.12.14 — 11:31

(13) О_О

А можно строчкой кода ?

  

Любопытная

15 — 02.12.14 — 11:32

ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);

  

hasan-rusel

16 — 02.12.14 — 11:36

(15) а как ?

«двоичные данный сохрани на винт во врем каталог как дбф. И только потом Новый XBase (путь к временному файлу);»

  

Любопытная

17 — 02.12.14 — 11:40

ох, блин…

ИмяВременногоФайла = КаталогИБ()+»TmpDBF.dbf»;

ДвоичныеДанные.Записать(ИмяВременногоФайла);

Ну и далее по тексту.

И вообще, читайте СП, там все написано

  

Maxus43

18 — 02.12.14 — 11:47

(17) ну с КаталогИБ() перебор имхо, лучше КаталогВременныхФайлов, да ещё и удалить потом тоже на всякий не забыть бы

  

Любопытная

19 — 02.12.14 — 11:48

(18) первое, что в голову пришло) Не помню я их, я их в СП читаю обычно

  

hasan-rusel

20 — 03.12.14 — 12:22

(19)

&НаКлиенте

Процедура ПриОткрытии(Отказ)

//    ДБФ = Новый XBase(«D:Kontr.dbf»);

    ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);

    Времянка = КаталогВременныхФайлов() + «TmpDBF.dbf»;

    ДвоичныеДанные.Записать(Времянка);

//    ДБФ.Кодировка = КодировкаXBase.OEM;

    //    УникальныйИдентификатор = Новый УникальныйИдентификатор;

//    Адрес = «»;

    Адрес = ПоместитьВоВременноеХранилище(Времянка);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Времянка)

    

    ДанныеСтроки1 = ПолучитьИзВременногоХранилища(Времянка);

    ДанныеСтроки = Новый XBase(ДанныеСтроки1);

    ДанныеСтроки.Кодировка = КодировкаXBase.OEM;

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

ЧЯДНТ ?

  

hasan-rusel

21 — 03.12.14 — 12:23

{Форма.Форма.Форма(25)}: Ошибка при вызове метода контекста (Первая)

    ДанныеСтроки.Первая();

по причине:

Перед выполнением операции нужно открыть базу

  

Wobland

22 — 03.12.14 — 12:24

(21) это ты так XBase на основе двоичных данных формируешь?

  

Wobland

23 — 03.12.14 — 12:25

(22) а, не. на основе какого-то левого пути

  

Любопытная

24 — 03.12.14 — 12:26

Новый XBase(<ПутьКБазе>, <ПутьКИндексу>, <ТолькоЧтение>)

Параметры:

<ПутьКБазе> (необязательный)

Тип: Строка.

Полное имя файла таблицы базы данных в формате DBF.

<ПутьКИндексу> (необязательный)

Тип: Строка.

Путь к индексному файлу таблицы.

<ТолькоЧтение> (необязательный)

Тип: Булево.

Истина — открывать файл только для чтения, Ложь — открывать файл для чтения и записи.

Значение по умолчанию: Ложь.

Описание:

Создает объект XBase. При создании могут быть сразу открыты файлы таблицы и индекса.

И еще раз:

<ПутьКИндексу> (необязательный)

Тип: Строка.

Путь к индексному файлу таблицы.

<ТолькоЧтение> (необязательный)

Тип: Булево.

Истина — открывать файл только для чтения, Ложь — открывать файл для чтения и записи.

Значение по умолчанию: Ложь.

  

Любопытная

25 — 03.12.14 — 12:26

И вообще, ты чего-то не то делаешь

  

hasan-rusel

26 — 03.12.14 — 12:27

(23) да я хз как, впервые с УФ сталкиваюсь, обычно то проще)

    ДБФ = Новый XBase(«ServbdFormaDok_UL.dbf»);

    ДБФ.Кодировка = КодировкаXBase.OEM;

    ДБФ.Первая();

    Симв = Символ(160);

    Пока Не ДБф.ВКонце() Цикл

и т.д.

  

Любопытная

27 — 03.12.14 — 12:27

Ты из временного хранилища получаешь двоичные данные. А XBase на основании пути к файлу поднимается. Так что ты свои ДвоичныеДанные сохрани на сервере в файл и этот файл уже делай

  

Wobland

28 — 03.12.14 — 12:28

(26) обычно в управляемом режиме файловые системы разные у клиента и сервера

  

Wobland

29 — 03.12.14 — 12:28

(27) Времянка. он туда строку отдаёт

  

Любопытная

30 — 03.12.14 — 12:29

(26) ну не сталкивайся тогда. Забей, отдай работу тому, кто сталкивался.

Чего вы все ноете про эти упр формы? Не нравится вам инструмент, не работайте с ним. Работайте с тем, что вам нравится.

Нитики

  

Любопытная

31 — 03.12.14 — 12:29

  

hasan-rusel

32 — 03.12.14 — 12:30

(28) вот это и вызывает затруднения.

  

hasan-rusel

33 — 03.12.14 — 12:32

(30) Ну не обижайся, помощи же прошу)

Если бы можно было как-то обойти эти УФ, не сталкивался бы… А тут такое… И отдать тут некому.

  

hasan-rusel

34 — 03.12.14 — 12:46

хелп…

  

Wobland

35 — 03.12.14 — 12:49

то есть, сделайте за меня?

  

hasan-rusel

36 — 03.12.14 — 12:50

(35) не, направьте на путь истинный с (20)

  

Wobland

37 — 03.12.14 — 12:53

(36) -> (24)(30)

  

DrZombi

38 — 03.12.14 — 13:09

(34) Бросай передавай в хранилище «XBase» объект.

Передай сперва на сервер сам файл, в виде двоичного коду.

А потом запиши его во временную папочку, открой, как XBase :)

И работак

  

МишельЛагранж

39 — 03.12.14 — 13:23

(30)>>Не нравится вам инструмент, не работайте с ним.

— типичные «аргументы» УФ-маньяков.

Они и в автобусе на билет через электронный банк передают. И их «не аргументет», что у водилы нет банковского терминала…

  

МишельЛагранж

40 — 03.12.14 — 13:24

+ да и вообще, водите управлять автобусом надо, а не изысками заниматься с пассажирами…

  

МишельЛагранж

41 — 03.12.14 — 13:24

*водиле

  

ramir

42 — 03.12.14 — 15:29

(0) Измени

ПоместитьВоВременноеХранилище(ДБФ,Адрес);

На

ПоместитьВоВременноеХранилище(ДБФ, ЭтаФорма.УникальныйИдентификатор);

  

hasan-rusel

43 — 04.12.14 — 07:02

Всем спасибо, вот так получилось)

/////////////////

//Перем Адрес;

&НаКлиенте

Процедура ПриОткрытии(Отказ)

//    ДБФ = Новый XBase(«D:Kontr.dbf»);

    ////ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);

    ////Времянка = КаталогВременныхФайлов() + «TmpDBF.dbf»;

    ////ДвоичныеДанные.Записать(Времянка);

    

         Файл = Новый Файл(«D:Kontr.dbf»);

    ФайлИсточник = Файл.ПолноеИмя;

    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ФайлИсточник));

    

          //    ДБФ.Кодировка = КодировкаXBase.OEM;

    //    УникальныйИдентификатор = Новый УникальныйИдентификатор;

//    Адрес = «»;

    ////    Адрес = ПоместитьВоВременноеХранилище(Времянка);

    ЗагрузкаДБФ(Адрес);

    
КонецПроцедуры

&НаСервере

Процедура ЗагрузкаДБФ(Адрес)

    ФайлПриемник = КаталогВременныхФайлов() + «temp_v82.dbf»;

    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);

    ДанныеХранилища.Записать(ФайлПриемник);

    ДанныеСтроки = Новый XBase(ФайлПриемник);

    ДанныеСтроки.Кодировка = КодировкаXBase.OEM;

    ДанныеСтроки.Первая();

    Пока Не ДанныеСтроки.ВКонце() Цикл

  

Wobland

44 — 04.12.14 — 07:19

можешь на досуге почитать про ПолучитьИмяВременногоФайла

  

hasan-rusel

45 — 04.12.14 — 07:20

(44) ок.

ОсновнаяФорма:


&НаКлиенте
Процедура ОткрытьФормуПодбора(Команда)
ОткрытьФорму("Обработка.ПередачаПараметровВФормах.Форма.ФормаПобдора",,ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьПодбор(АдресВХ) Экспорт
А = ОбработатьПодборНаСервере(АдресВХ);
КонецПроцедуры

&НаСервере
Функция ОбработатьПодборНаСервере(АдресВХ)
Возврат ПолучитьИзВременногоХранилища(АдресВХ);
КонецФункции

Форма подбора:


&НаКлиенте
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформу(Команда)
АдресВХ = Неопределено;
ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ);
ВладелецФормы.ОбработатьПодбор(АдресВХ);
Закрыть();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ)
АдресВХ = ПоместитьВоВременноеХранилище("Данные для передачи", Новый УникальныйИдентификатор);
КонецПроцедуры

Добавлено: 28 июн 2018, 01:20


Добавил вариант с оповещением.
Основная форма:


&НаКлиенте
Процедура ОткрытьФормуПодбора(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПриЗавершенииПодбора", ЭтотОбъект);
ОткрытьФорму("Обработка.ПередачаПараметровВФормах.Форма.ФормаПобдора",,ЭтаФорма,,,,ОповещениеОЗакрытии,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьПодбор(АдресВХ) Экспорт
А = ОбработатьПодборНаСервере(АдресВХ);
КонецПроцедуры

&НаСервере
Функция ОбработатьПодборНаСервере(АдресВХ)
Возврат ПолучитьИзВременногоХранилища(АдресВХ);
КонецФункции

&НаКлиенте
Процедура ПриЗавершенииПодбора(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
А = ПолучитьИзВременногоХранилища(Результат.ОповещениеАдресВХ);
КонецЕсли;
КонецПроцедуры


Форма подбора:


&НаКлиенте
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформу(Команда)
АдресВХ = Неопределено;
ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ);
ВладелецФормы.ОбработатьПодбор(АдресВХ);

ПараметрыПриЗакрытии = Новый Структура;
ПараметрыПриЗакрытии.Вставить("ОповещениеАдресВХ",АдресВХ);
Закрыть(ПараметрыПриЗакрытии);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ)
АдресВХ = ПоместитьВоВременноеХранилище("Данные для передачи", Новый УникальныйИдентификатор);
КонецПроцедуры

Добрый день всем! Я не очень в УФ, подскажите, пожалуйста такую задачу как решить: Есть документ с ТЧ Товары. ОНИ хотят, чтобы при изменении количества какого-либо товара все изменения записывались и потом в отчёт выводились сколько раз и на какое количество менялся товар. Я подумала,что можно при открытии формы документа запоминать во временное хранилище ТЧ товары, а его адрес — в реквизит формы. А потом при перепроведении сравнивать старую и новую ТЧ. Вообщем выходит ошибка: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)     ТЗ = ПолучитьИзВременногоХранилища(Адрес); по причине:Ошибка получения значения из временного хранилища

Я уже думала от безысходности создать реквизит объекта и в него записывать старую ТЧ. Но как-то не хочется такое делать.

Ну поместилось во временное хранилище значение на долгое хранение (минут 20), ну вернула функция уникальный идентификатор формы. По этому идентификатору значение не достать. Тут скорее надо возвращать полученный адрес:

Что-то «потом в отчёт» и «при перепроведении сравнивать» не вяжется…

так надо при изменении количества записывать или при записи документа?

Эпитафия на могиле программиста: «Они хотели.» :) Включите версионирование документа (если оно есть в Вашей конфигурации).

при записи документа записывать, если количество менялось. ну это я в регистр буду записывать. мне сначала надо сравнить таблицы,чтоб понять, менялось или нет.

Из справки: ПоместитьВоВременноеХранилище  — Возвращаемое значение: Тип: Строка. Адрес во временном хранилище. У мадмуазели: ???

+ И свой отчет (или внешнюю печатную форму документа) по регистру ВерсииОбъектов.

ТЧ в состоянии на момент открытия формы можно получить по ссылке в модуле документа в ПередЗаписью и передать в обработку проведения через ДополнительныеСвойства.

Попробую в модуль объекта написать: …

сравни передЗаписью в ДокОбъект и в ДокСсылка

Через год будете писать как почистить самолично созданный регистр версионирования , а того что база распухнет.

дак версионирование будет больше съедать места, чем мой маленький регистрик. Еще вдруг и затормозит всё из-за него..

Смотря как «ОНИ» вашу тему потом разовьют и попросят по натыкать это куда попало, и этот маленький регистрик разовьется в большой — проходили уже, и не раз. Хотелки начинаются с малого.

в передЗаписью прочитай запросом табличную часть из БД и сравни с той, что в ЭтотОбъект.ТвояТабличнаяЧасть. Это можно даже одним запросом.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Здравствуйте!

1С:Предприятие 8.3 (8.3.5.1383)
Бухгалтерия предприятия, редакция 3.0 (3.0.38.54)
УСН Доходы-Расходы

Формирую отчет Анализ состояния налогового учета по УСН.
При попытке расшифровки пункта, например, товары и материалы вываливается ошибка:

{Отчет.АнализСостоянияНалоговогоУчетаПоУСН.МодульМенеджера(405)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
        ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ПромежуточныйРезультатВыполнения.ДанныеРасшифровки);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)

В сообщениях пишет следующее внизу:

Отчет не сформирован:
Деление на 0 значения типа Numeric

Подскажите, пожалуйста, в какую сторону копать? Почему такая ерунда?

Добрый день!
Нормальный ответ, отчего такая ерунда, сложно дать. 🤔

Да, есть такое… Особенно при том, что конфигурация требует обновления релиза платформы.
Попробуйте обновить и релиз конфигурации, и платформу.

Заполнить и подать уведомление об исчисленных суммах налогов и взносов

Я всё, конечно, обновила, только «воз и ныне там» 🙁

1С:Предприятие 8.3 (8.3.5.1517)
Бухгалтерия предприятия, редакция 3.0 (3.0.39.56)

Сама эта ситуация уже не первый далеко месяц, так что вряд ли в обновлении дело.
Не очень хотелось лезть внутрь отчета и разбираться с кодом, но, видимо, придется🙁

Скорее всего неправильное указание счетов и субконто в документах.
Это нужно смотреть отладчиком.

В чем оказалась проблема:
в документах «Списание с расчетного счета» стоял много где нулевой курс и нулевая кратность.
Еще возможные документы с ошибкой: РКО, Корректировка долга, Авансовый отчет (оплата поставщикам).

Заполняйте платежки с актуальными на сегодня КБК, кодами дохода и другими обязательными реквизитами

Дарья92

0 / 0 / 0

Регистрация: 13.10.2013

Сообщений: 7

1

1C 8.x

Работа с временным хранилищем

13.10.2013, 22:32. Показов 11280. Ответов 12

Метки нет (Все метки)


Здравствуйте, у меня есть 2 обработки. Я передаю данные с формы одной на форму второй, через ВременноеХранилищеДанных.
Код обработки отправителя

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
&НаКлиенте
Процедура Получить(Команда)
    
    Форма = ПолучитьФорму("Обработки.Получатель.Форма",, ЭтаФорма);
    Форма.АдресВременногоХранилища = ПолучитьТЗ();
    Форма.Открыть();
    Форма= Обработки.Получатель.ПолучитьФорму(ЭтаФорма
КонецПроцедуры
 
 
&НаСервере
Функция ПолучитьТЗ()
    
     Возврат ПоместитьВоВременноеХранилище(ТабЗнач.Выгрузить(), Новый УникальныйИдентификатор);
    
КонецФункции
 
Код обработки получателя
 
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПриОткрытииНаСервере();
КонецПроцедуры
 
 
&НаСервере
Процедура ПриОткрытииНаСервере()
    
     ТабИзменений = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    
    ТЗ.Загрузить(ТабИзменений);
    
КонецПроцедуры

Пишет ошибку: {Форма.Форма.Форма(5)}: Ошибка при вызове метода контекста (ПолучитьФорму)
Форма = ПолучитьФорму(«Обработки.Получатель.Форма»,, ЭтаФорма);
по причине:
Неизвестное имя формы. Имя: «Обработки.Получатель.Форма»

Помогите, пожалуйста.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

13.10.2013, 22:32

Ответы с готовыми решениями:

Работа с хранилищем
Всем добрый день!

Такой вопрос — есть два хранилища: основное и моё, рабочее. Я вношу свои…

работа с хранилищем
Помогите, пожалуйста. Необходимо вывести различные данные из 2х HashTabel
Т.Е. если в одном…

Работа с облачным хранилищем
Всем привет. Возник вопрос, над которым я бьюсь уже не первый день.
Представим, что у меня есть…

Работа с локальным хранилищем
Как я могу получить и записать в переменную, id кого-либо элемента?

12

duk337

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

14.10.2013, 00:35

2

Можыд

1C
1
Форма = Обработки.Получатель.ПолучитьФорму("Форма");

вообще-то, синт.пом имеется

0

Модератор

Эксперт 1С

3697 / 2897 / 569

Регистрация: 10.03.2011

Сообщений: 11,398

Записей в блоге: 1

14.10.2013, 03:00

3

«Обработка.Получатель.Форма.Форма»

1

Дарья92

0 / 0 / 0

Регистрация: 13.10.2013

Сообщений: 7

14.10.2013, 17:05

 [ТС]

4

Спасибо большое, не доглядела. Теперь другая проблема:

Создала элемент формы. с типом поле ввода, установила свойство кнопка списка выбора = истина. Хочу сделать выпадающий список. Список значения формируется из реквизитов переданной формы. Перечитала уже весь интернет. Вроде делаю правильно, а не работает.

Код получения данных из временного хранилища:

1C
1
2
3
ТабИзм = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    
ТаблЗнач.Загрузить(ТабИзм);

Код создания поля ввода:

1C
1
2
3
4
5
ПолеВыбора = Элементы.Добавить("ИзменяемыйРеквизит", Тип("ПолеФормы"), ЭтаФорма);
ПолеВыбора.Вид = ВидПоляФормы.ПолеВвода;
ПолеВыбора.КнопкаСпискаВыбора = Истина;
ПолеВыбора.ПутьКДанным  = "ИзменяемыйРеквизит";
ПолеВыбора.РедактированиеТекста = Ложь;

Код процедуры выпадающего списка:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 &НаКлиенте
Процедура ПолеВыбораНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
        СтандартнаяОбработка = Ложь;
        
Если ДанныеВыбора <> Неопределено Тогда
    
         СЗ = Новый СписокЗначений;
         
    Для Каждого Колонка Из ТаблЗнач.Колонки Цикл
        
         
        СЗ.Добавить(Колонка.Имя);
        
    КонецЦикла;
    
    ИзменяемыйРеквизит = ВыбратьИзСписка(СЗ, Элементы.ПолеВыбора);
    
КонецЕсли;
 
 
КонецПроцедуры

0

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

14.10.2013, 17:23

5

Цитата
Сообщение от Дарья92
Посмотреть сообщение

Код процедуры выпадающего списка:

не надо. Почитайте синт.пом СписокВыбора. Если у поля есть кнопка выбора, то достаточно заполнить его список выбора.

0

0 / 0 / 0

Регистрация: 13.10.2013

Сообщений: 7

14.10.2013, 18:54

 [ТС]

6

Заполнять то понятно как, а как связать СписокВыбора и Поле?

Не так?

ИзменяемыйРеквизит =СписокВыбора(СписокВыбор, Элементы.ПолеВыбора);

0

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

14.10.2013, 19:33

7

Элементы(Формы).Поле.СписокВыбора=ВашСписок;

0

Дарья92

0 / 0 / 0

Регистрация: 13.10.2013

Сообщений: 7

14.10.2013, 20:49

 [ТС]

8

Я туплю. Сделала, как Вы говорите, все равно не выходит.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
&НаКлиенте 
Процедура ПолеВыбораНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
     
     СтандартнаяОбработка = Ложь;
     
     
     Если ДанныеВыбора <> Неопределено Тогда
     
            Список = Новый СписокЗначений;
 
         
         Для Каждого Колонка Из ТаблЗнач.Колонки Цикл
             
                     
            Список.Добавить(Колонка.Имя); 
        
                 
        КонецЦикла;
        
        Элементы.ПолеВыбора.СписокВыбора = Список;
 
КонецЕсли;
 
КонецПроцедуры

0

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

15.10.2013, 01:06

9

ТаблЗнач — это что? И где она? Тут Dethmontt с ТЗ на клиент-сервере такое завернул… я просто в ужасе: начну работать с УФ — никаких ТЗ… Но вообще, Вы отрабатываете событие по кнопке Выбора, чтобы эмулировать нажатие кнопки списка. А надо заполнить список выбора ПЕРЕД активизацией поля. При открытии формы, при изменении другого реква и т.п. Список заработает сам по кнопке выбора из списка.

0

0 / 0 / 0

Регистрация: 13.10.2013

Сообщений: 7

15.10.2013, 07:47

 [ТС]

10

ТаблЗнач — это ТЗ в которую я записываю значения полученные с ВременногоХранилища. ПриОткрытииНасервере или на Клиенте?

P.S.Лично мое мнение, чтобы делать УФ, надо думать, как УФ.

0

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

15.10.2013, 16:30

11

0

0 / 0 / 0

Регистрация: 13.10.2013

Сообщений: 7

15.10.2013, 18:26

 [ТС]

12

Спасибо большое, получилось!

А не подскажете, я в начале писала, что мне нужно передать грубо говоря одну форму. с заполненными данными, на другую — пустую. Сейчас у меня на форме Получатель создана такая же ТЗ, что и на первой, а если я ее удалю с формы ничего передаваться и отображаться не будет. как сделать чтобы форма сама по себе формировалась.
по нажатию кнопки грубо говоря копировалась и открывалась вторая, точно такая же.

0

duk337

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

15.10.2013, 20:38

13

Попробуйте создавать не форму, а обработку.

1C
1
2
3
4
Обр1=Обработки.ОБР.Создать();
Обр1.ПолучитьФорму().Открыть();
Обр2=Обработки.ОБР.Создать();
Обр2.ПолучитьФорму().Открыть();

0

  1. Добрый день.
    Не понимаю почему метод получить() возвращает неопределено?
    2016-08-13_00-15-23.png

    Что за подстава? Платформа 8.3.6.2363

  2. Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Причины не скажу, возможно как-то связано с неявным вызовом сервер после того, как структура сформировалась.
    В общем сделай через временное хранилище.

  3. Не получилось. С хранилищем значения, результат ровно тот же.
    А вот в толстом клиенте оба варианта (и мой, и с хранилищем значения) отрабатывают. Не пойму в чем дело.

  4. Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    А как делал через временное хранилище?

  5. Привет.
    Код ниже. Я во временное хранилище помещаю структуру, в которую входят двоичные данные. Так вот остальные элементы структуры (дата, строка) получаются из хранилища корректно. А двоичные данные — нет.

    &НаКлиенте
    Процедура ОткрытьФайлОписания()
    
        ТекСтрока = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;
        Если ТекСтрока=Неопределено Тогда Возврат; КонецЕсли;
    
        Адрес = Новый УникальныйИдентификатор;
    
        ПолучитьФайлОписанияВХранилищеСервер(ТекСтрока.ПрикрепленныйФайл, Адрес);
    
        ДанныеФайлаОписания = ПолучитьИзВременногоХранилища(Адрес);
    
        ВременныйФайл = ПолучитьИмяВременногоФайла(ДанныеФайлаОписания.РасширениеФайла);
        ДвоичныеДанные = ДанныеФайлаОписания.ДвоичныеДанные.Получить();
        ДвоичныеДанные.Записать(ВременныйФайл);
    
        НачатьЗапускПриложения(
            Новый ОписаниеОповещения("ВыполнитьОткрытиеФайлаОписания", ЭтотОбъект),
            ВременныйФайл,
            ,
            Истина
        );
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура ПолучитьФайлОписанияВХранилищеСервер(ПрикрепленныйФайл, Адрес=Неопределено)
    
        Запрос = Новый Запрос("ВЫБРАТЬ
                              |    ПрикрепленныеФайлы.Наименование,
                              |    ПрикрепленныеФайлы.ХранилищеЗначения КАК ДвоичныеДанные,
                              |    ПрикрепленныеФайлы.РасширениеФайла,
                              |    ПрикрепленныеФайлы.РазмерФайла
                              |ИЗ
                              |    Справочник.ПрикрепленныеФайлы КАК ПрикрепленныеФайлы
                              |ГДЕ
                              |    ПрикрепленныеФайлы.Ссылка = &ПрикрепленныйФайл");
        Запрос.УстановитьПараметр("ПрикрепленныйФайл", ПрикрепленныйФайл);
        ДанныеФайла = Запрос.Выполнить().Выбрать();
        ДанныеФайла.Следующий();
        Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла");
        ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла);
    
        Адрес = ПоместитьВоВременноеХранилище(Результат, Адрес);
    
    КонецПроцедуры
    
  6. Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    А так?

    ........
    Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла");
    
    ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла, , "ДвоичныеДанные");
    
    Результат.Вставить("ДвоичныеДанные". ДанныеФайла.ДвоичныеДанные.Получить());
    .............
    
  7. Вот же ж! Работает, спасибо!

  8. Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    Сделал все по аналогии. Но все равно
    ДанныеФайла.ДвоичныеДанные.Получить() принимает значение НЕОПРЕДЕЛЕНО, хотя
    ДанныеФайла.ДвоичныеДанные имеет значение ХранилищеЗначения

    это платформа выделывается?

  9. Offline

    AlexeyKh
    Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    148
    Симпатии:
    19
    Баллы:
    29

    блин, ну СП кто читать будет?

    ХранилищеЗначения.Получить() — Сервер и толстый клиент, … !

    1.получите на сервере значение
    2.сохраните во временный файл
    3.передайте его на клиент

    ХранилищеЗначения (ValueStorage)
    Получить (Get)
    Синтаксис:
    Получить()
    Возвращаемое значение:
    Тип: Произвольный.
    Значение, содержащееся в хранилище.
    Описание:
    Получает из хранилища сохраненное в нем значение.
    Доступность:
    Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
    Пример:
    МояКартинка = ХранилищеКартинки.Получить

  10. Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    А если я на сервере получаю запросом список прикрепленных файлов к номенклатуре и на клиент мне не нужно его передавать, а сохранить на диск с определенным наименованием по маске?
    ХранилищеЗначения.Получить().Записать([ПутьСохраненияФайла]) — так не корректно?

  11. Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204
  12. Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    Застрял и все тут. Вот мой код:

    &НаСервере
    Процедура ЗаполнитьНаСервере()
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла КАК Номенклатура,
        |    НоменклатураПрисоединенныеФайлы.Ссылка КАК ПрисоединенныйФайл,
        |    "" "" КАК ИмяФайла,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Код КАК Код,
        |    НоменклатураПрисоединенныеФайлы.Расширение КАК РасширениеФайла,
        |    НоменклатураПрисоединенныеФайлы.Размер КАК РазмерФайла
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
        |ГДЕ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.ПометкаУдаления = ЛОЖЬ
        |
        |УПОРЯДОЧИТЬ ПО
        |    Номенклатура,
        |    ПрисоединенныйФайл
        |АВТОУПОРЯДОЧИВАНИЕ";
       
        ДанныеФайла = Запрос.Выполнить().Выбрать();
       
        ИндексФайла = 1;
        ПредыдущаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка();
       
        Пока ДанныеФайла.Следующий() Цикл
           
           
            Если ДанныеФайла.Номенклатура = ПредыдущаяНоменклатура Тогда
               
                ИндексФайла = ИндексФайла+1;
               
                ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура;
                ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"") + ДанныеФайла.Код +"-" +Строка(ИндексФайла) + ".jpg";
               
            Иначе
               
                ИндексФайла = 1;
               
                ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура;
                ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"") + ДанныеФайла.Код + ".jpg";
               
            КонецЕсли;
           
            ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить().Записать(ИмяФайла);
           
        КонецЦикла;
       
    КонецПроцедуры
    

    ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище имеет значение:
    [​IMG]
    а ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить() возвращает Неопределено
    [​IMG]
    ну и, соответственно, дальше ошибка «значение не является значением объектного типа…»

    Ткните, пожалуйста, в каком моменте туплю.

  13. Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Если возвращает неопределено, значит нет ничего в хранилище.

  14. Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    Действительно. Оказалось, изображения хранятся в РегистрыСведений.ПрисоединенныеФайлы — там все заработало. Спасибо всем)

Содержание

  1. Помещение в хранилище
  2. Чтение из хранилища
  3. Метод асинхронной передачи файла на сервер
  4. Неинтерактивная передача файла на сервер
  5. Интерактивная передача файла на сервер
  6. Передача файла на сервер средствами БСП
  7. Работа с файловой системой в языке 1С 8.3, 8.2 (в примерах)

В связи с новым подходом в программировании на платформе 8.2 возникла необходимость передачи данных между клиентом и сервером при этом прямая передача в виде параметров имеет ряд ограничений. И тогда был введен объект «Временное хранилище».

Чем полезно временное хранилище:

  • Не надо создавать объекты в конфигурации
  • Доступно и с сервера и с клиента
  • Можно записать любой объект

Временное хранилище это не объект конфигурации, а объект платформы поэтому для разработчика он выглядит как черный ящик. Можно туда положить что-то получив псевдоним(адрес) и получить из него что-то указав псевдоним(адрес). Но узнать что находится во временном хранилище и сколько нельзя. В ниже рассмотренных примерах помещение в хранилище происходит на клиенте, а чтение на сервере. Хотя можно передавать данные и в обратном направлении.

Синтаксис работы с хранилищем простой:

Передав параметром, данные которые хотим поместить(Посылка) и УникальныйИдентификатор получаем Адрес, по которому потом можно будет обратиться. Причем передаваемый идентификатор не является получаемым в последствии адресом. Вместо идентификатора можно передать строку Адреса, по которому и будет помещено наше значение, но это не любая строка! Строка Адреса выглядит примерно вот так «e1cib/tempstorage/ae5c5472-0266-4892-9073-20392dd5a6a6» .

УникальныйИдентификатор может быть как новый так и существующей формы, в последнем случае значение в хранилище будет храниться пока существует форма. Если не передать уникальный идентификатор, то при следующем серверном вызове значение уже будет удалено.

Чтобы получить из хранилища нужно только указать адрес:

Также можно удалить помещенный объект, используя адрес

Если помещаемые данные не являются объектами конфигурации, то для того чтобы их поместить нужно перевести в доступный тип — «ДвоичныеДанные»

Помещение в хранилище

Здесь мы сначала преобразуем файл в формат двоичных данных и только потом помещаем их в хранилище

Чтение из хранилища

В интернете есть множество примеров как на сервере записать полученные данные в базу, поэтому ниже приводится другой пример, когда файл полученный на сервере открывается для работы. В качестве такого файла используется XML.

Если мы имеем дело с файлами, то может оказаться удобным метод ПоместитьФайл. Он преобразует файл в двоичные данные и записывает их во ВременноеХранилище. При этом параметром можно настроить открытие диалогового окна для выбора файла. Сделаю оговорку, этот метод нельзя использовать на сервере.

В параметре Адрес, можно указать Адрес в который нужно записать файл, если нужен новый адрес, то нужно передать пустую строку.

Истина – открывает окно для выбора папки и имени файла, при значении Истина есть возможность открыть файл.»КопияФайла.xml» – Имя файла под которым будет сохранен файл.Адрес – это адрес в хранилище,ПолучитьФайл(Адрес,»Копияфайла.xml» , Истина);Чтобы сохранить файл из временного хранилища на Клиенте можно использовать метод

В общем случае клиент и сервер 1С — это разные компьютеры с различной файловой системой. Рассмотрим как правильно передать файл с компьютера клиента на компьютер сервера.

Метод асинхронной передачи файла на сервер

Обмен файлом между клиентом и сервером осуществляется через временное хранилище. Для помещения данных во временное хранилище правильно воспользоваться методом

НачатьПомещениеФайла ( ОписаниеОповещенияОЗавершении >, Адрес >, ПомещаемыйФайл >, Интерактивно >, УникальныйИдентификаторФормы >, ОписаниеОповещенияПередНачаломПомещенияФайла >)

Метод работает в асинхронном режиме. Возможны два варианта выбора файла для передачи на сервер:

  • интерактивной режим, при котором пользователю будет выдан диалог выбора файла;
  • неинтерактивный режим, при котором уже известен путь к требуемому файлу на компьютере клиента. Такое возможно, например, когда пользователь в отдельном поле ввода выбрал путь к обрабатываемому файлу. Такой сценарий описан в этой статье.

Параметр ОписаниеОповещенияОЗавершении содержит описание процедуры (тип ОписаниеОповещения), которая будет вызвана после завершения помещения файла во временное хранилище. Эта процедура должна иметь ключевое слово Экспорт и 4 параметра:

  • Результат — для интерактивного режима возвращает результат работы пользователя с окном выбора файла. Истина — пользователь выбрал файл; Ложь — пользователь отказался от выбора;
  • Адрес — адрес временного хранилища;
  • ПомещаемыйФайл — путь к файлу;
  • ДополнительныеПараметры — значение, указанное при создании объекта ОписаниеОповещения.

Следует обратить внимание на параметр УникальныйИдентификаторФормы. В него рекомендуется передавать идентификатор текущей формы для сохранения данных во временном хранилище между несколькими серверными вызовами. При закрытии формы данные из временного хранилища будут автоматически удалены.

Неинтерактивная передача файла на сервер

Рассмотрим пример неинтерактивной передачи файла на сервер, без вызова окна выбора файла:

&НаКлиенте
Процедура ЗагрузитьФайл ( Команда )

ИмяФайлаДляОбработки = «C:ДанныеДляЗагрузки.xml» ;
// Описание процедуры, которая будет вызвана помещения файла во временное хранилище
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , ИмяФайлаДляОбработки , Ложь, УникальныйИдентификатор );

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение ( Результат , Адрес , ВыбранноеИмяФайла , ДополнительныеПараметры ) Экспорт

&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере ( Адрес )

// Получение данных из временного хранилища
Данные = ПолучитьИзВременногоХранилища ( Адрес );
// Получение имени временного файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла ( «xml» );
// Сохранение данных во временный файл
Данные.Записать ( ИмяВременногоФайла );

// Хорошим тоном будет удалить временный файл
Попытка

При интерактивном выборе файла дополнительно необходимо предусмотреть два момента:

  • указать настройки диалога выбора файла (если требуется);
  • проверять, что пользователь действительно выбрал файл.

Интерактивная передача файла на сервер

Рассмотрим, пример интерактивной передачи файла на сервер:

&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )

// Описание процедуры, которая будет вызвана после закрытия окна выбора файла
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Описание диалога выбора файла
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие );
Диалог . Фильтр = НСтр ( «ru=’Файл XML (*.xml)|*.xml’» );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , Диалог , Истина, УникальныйИдентификатор );

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры ) Экспорт

// Файл выбран
ВыполнитьЗагрузкуНаСервере ( Адрес );

// Пользователь отказался от выбора файла
Сообщить ( «Файл не был выбран» );

Процедура ВыполнитьЗагрузкуНаСервере при интерактивном и неинтерактивном режимах одинаковая.

Передача файла на сервер средствами БСП

В конфигурациях со встроенной Библиотекой стандартных подсистем для передачи файлов с клиента на сервер можно использовать процедуры

ЗагрузитьФайл ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ИмяФайла = «» , АдресВоВременномХранилище = «» ) Экспорт

ЗагрузитьФайлы ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ЗагружаемыеФайлы = Неопределено) Экспорт

общего модуля ФайловаяСистемаКлиент или

ВыбратьИПередатьФайлНаСервер ( ОповещениеЗавершения , Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт

общего модуля ОбменДаннымиКлиент.

Пример интерактивной загрузки файла на сервер средствами БСП:

&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )

ПараметрыДиалога = Новый Структура ;
ПараметрыДиалога . Вставить ( «Заголовок» , НСтр ( «ru = ‘Выберите файл XML’» ));
ПараметрыДиалога . Вставить ( «Фильтр» , НСтр ( «ru=’Файл XML (*.xml)|*.xml’» ));

Оповещение = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
ОбменДаннымиКлиент . ВыбратьИПередатьФайлНаСервер ( Оповещение , ПараметрыДиалога , УникальныйИдентификатор );

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение (Знач РезультатПомещенияФайлов , Знач ДополнительныеПараметры ) Экспорт

Адрес = РезультатПомещенияФайлов . Хранение ;
ТекстОшибки = РезультатПомещенияФайлов . ОписаниеОшибки ;
ИмяВыбранногоФайла = РезультатПомещенияФайлов . Имя ;

Если ПустаяСтрока ( ТекстОшибки ) И ПустаяСтрока ( Адрес ) Тогда

ТекстОшибки = НСтр ( «ru = ‘Ошибка передачи файла на сервер’» );

Если НЕ ПустаяСтрока ( ТекстОшибки ) Тогда

ОбщегоНазначенияКлиентСервер . СообщитьПользователю ( ТекстОшибки );
Возврат;

Остались вопросы?
Спросите в комментариях к статье.

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Работа с файловой системой в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(1 голос, среднее: 5 из 5)

Поделитесь с друзьями!

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник

Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Приветствую! Создаю обработку, хочу передать данные с сервера на клиент, но говорит следующее: {Обработка.ЗаписьФайла.Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)          Выборка = ПолучитьИзВременногоХранилища(ВыборкаВХ); по причине: Ошибка получения значения из временного хранилища по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: НачалоСвойства: {    Форма: Элемент    Тип: { по причине: Ошибка отображения типов: Отсутствует отображение для типа ‘{‘ &НаСервере

Таблицу значений нельзя передавать на клиент

охрень, чуть мозг не вывехнул от кода

А чего бы на сервере все не сделать?

Да можно и на сервере, это просто эксперимент и больше всего интересно почему не удается получить из ВХ.

Потому-что . ТЗ не модет существовать на клиенте, ТЗ на клиенте — это сконвертированные в данные формы записи.

Вот чувак предлагает решение:

Вот это полная бредятина. Еще можно массив многомерный сделать. А зачем? Зачем передавать на клиент данные, которые там нафиг ненужны?

Программист должен сам решать, какие данные нужны на клиенте, а какие- на сервере. Без всяких контекстных вызовов по каждому чиху — которые шарашаться в большинстве методичек от «именнитых авторов» УФ.

Мы сами знаем что вам нужно, а что нет (с) 1С

Ну давайте на старенький планшет ТЗ передадим с овер 9000 строк и колонок. Ну-ну… Это нам так надо.

Хреновый пример. Точно также на планшет можно передать 9000 строк и колонок в составе ДанныеФормыКоллекция

ДанныеФормы целиком на клиент не передаются.

Причем где-то на 10-12 пользователе, работающем с такой таблицей, сервер 1С двинет кони.

Это не помешает пользователю отскроллить таблицу, поимев ее полностью на клиенте + нехилые тормоза сервера 1С

Точно также можно зашарашить в ДанныеФормы 100000 строк и  дождаться 1-ого скролла около минуты.

Типа такого на клиенте нет

Это я к чему, , говорю. Это я говорю к тому, что не всегда правило работает, и иногда надо мыслить головой, а не наборами правил и идеи типа — отлично работают, когда данных мало и большое количество не предвидется. Вот и в своей методичке ты отработал по шаблонам, не умудрившись подумать. Рекомендую поправить:

Вместо временного хранилища используй ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр

И что на клиенте появится ТЗ?

На кллиенте нет такого метода (((

Не все клиенты одинаково полезны. Клиент должен быть толстым)

Вот тебе методика по шаблонам с объяснениями: специально еще раз написал.

В первой статье первый запрос говорит о том, что вы не понимаете механизьма регистра остатков. Правильный запрос выглядит примерно так:     Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары     Товары.Номенклатура,

Конечно, на экзамене по Спецу любой получит двойку.

несущественное улучшение.

Пфф. Улучшение, которое убирает 1- внешний цикл. Улучшение, которое позволяет сократить на порядок обращение к таблице остатков. По шаблону количество обращений будет n^2, где n-число строк ТЧ товары. По варианту — всего n обращений.

Ну если это где-то документировано, то я признаю что полный даун в запросах.

Ты какой метод соединения предполагешь?

Это он про план запроса на sql-сервере в который мутирует запрос 1С.

Единственное что на вложенной выборке нет индекса, но если меньше 100 записей то ваще не влияет

Только вот перед соединением, не на оперативный момент, нужно еще остатки как бы рассчитать.

А где неоперативный то момент? в этом то и суть хоть и несущественная

Шта? У тебя — на оперативный. Счаст вся типовота считает остатки на оперативный, насколько я помню (могу и ошибаться)

Счаст ради «Высшей справедливости» найду док с 1000 строк

И чего, мне в методической статье описывать все варианты с точки зрения оптимальности на сервере sql? Тема — не эксперт по технологическим вопросам.

сделай замер. эти выигрышные микросекунды не суть

Это как разбирать механизм сцепления у автомобиля и доказывать всем, что припаять намертво было бы быстрее, надежнее и дешевле!

По твоим стопам пойдут тысячи юнных программистов, которые будут мыслить щаблонами и не пытаться «подергать».

Казалось бы,, элементарный вопрос… Но нет… Пришёл Ёжик и всё свёл к нестед лупам и прочей нечисти…

Нестед луп — это вложенный цикл. Что в нём такого нечестивого?

Я был бы рад, если тысячи мыслили по рекомендациям 1С, а де делали запросы в циклах, получение представления отдельно и предупреждений при проведении.

На 1021 строке nestep loops превращается в mergejoin По шаблону — 2 mergejoin-а, у меня — один. Да, вот теперь выигрыш не такой критичный.

Ты мне лучше скажи, почему условие (А,Б) в (ВЫБРАТЬ А,Б Из Х) выполняется медленнее чем А = Х.А и Б = Х.Б? Я понимаю что медленнее, но почему?!

это особенности самой СУБД. Оператор in — вообще довольно медленная штука. К тому же, по сути, оптимизатор запросов превращает in в join. А по поводу холивара с тов. Ежовым — я не гуру, но у вас, имхо, у обоих неоптимально. Надо бы сначала поместить выборку из виртуальной таблицы во временную и потом по соединяться с ней. Полностью согласен с книжкой «эксперт по технологическим вопросам, цитирую «виртуальные таблицы…. могут разворачиваться в подзапросы при трансляции в язык СУБД….»

На опыте во многих сценариях Left Join  предочтительнее EXISTS и In

это потому что при джойне вместо нестед лупс может и мердж использоваться, а для В (…) наверняка всегда только циклы, хотя могу ошибаться

Сделай текстовый документ на сервере, а не на клиенте и передавай на клиент его.

Весьма вероятно и оптимизатор берет неправильный план. Вот один из примеров которых огромное множество

Когда 1С наконец-таки прикрутит в язык запросов инструкцию для того КАК соединять (аналог ключевых слов sql) — это будет радость и веселье

Ну это будет в версии 10.3.12.5987375.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

  1. Добрый день.
    Не понимаю почему метод получить() возвращает неопределено?
    2016-08-13_00-15-23.png

    Что за подстава? Платформа 8.3.6.2363


  2. nomad_irk

    Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Причины не скажу, возможно как-то связано с неявным вызовом сервер после того, как структура сформировалась.
    В общем сделай через временное хранилище.

  3. Не получилось. С хранилищем значения, результат ровно тот же.
    А вот в толстом клиенте оба варианта (и мой, и с хранилищем значения) отрабатывают. Не пойму в чем дело.


  4. nomad_irk

    Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    А как делал через временное хранилище?

  5. Привет.
    Код ниже. Я во временное хранилище помещаю структуру, в которую входят двоичные данные. Так вот остальные элементы структуры (дата, строка) получаются из хранилища корректно. А двоичные данные — нет.

    &НаКлиенте
    Процедура ОткрытьФайлОписания()
    
        ТекСтрока = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;
        Если ТекСтрока=Неопределено Тогда Возврат; КонецЕсли;
    
        Адрес = Новый УникальныйИдентификатор;
    
        ПолучитьФайлОписанияВХранилищеСервер(ТекСтрока.ПрикрепленныйФайл, Адрес);
    
        ДанныеФайлаОписания = ПолучитьИзВременногоХранилища(Адрес);
    
        ВременныйФайл = ПолучитьИмяВременногоФайла(ДанныеФайлаОписания.РасширениеФайла);
        ДвоичныеДанные = ДанныеФайлаОписания.ДвоичныеДанные.Получить();
        ДвоичныеДанные.Записать(ВременныйФайл);
    
        НачатьЗапускПриложения(
            Новый ОписаниеОповещения("ВыполнитьОткрытиеФайлаОписания", ЭтотОбъект),
            ВременныйФайл,
            ,
            Истина
        );
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Процедура ПолучитьФайлОписанияВХранилищеСервер(ПрикрепленныйФайл, Адрес=Неопределено)
    
        Запрос = Новый Запрос("ВЫБРАТЬ
                              |    ПрикрепленныеФайлы.Наименование,
                              |    ПрикрепленныеФайлы.ХранилищеЗначения КАК ДвоичныеДанные,
                              |    ПрикрепленныеФайлы.РасширениеФайла,
                              |    ПрикрепленныеФайлы.РазмерФайла
                              |ИЗ
                              |    Справочник.ПрикрепленныеФайлы КАК ПрикрепленныеФайлы
                              |ГДЕ
                              |    ПрикрепленныеФайлы.Ссылка = &ПрикрепленныйФайл");
        Запрос.УстановитьПараметр("ПрикрепленныйФайл", ПрикрепленныйФайл);
        ДанныеФайла = Запрос.Выполнить().Выбрать();
        ДанныеФайла.Следующий();
        Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла");
        ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла);
    
        Адрес = ПоместитьВоВременноеХранилище(Результат, Адрес);
    
    КонецПроцедуры
    

  6. nomad_irk

    Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    А так?

    ........
    Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла");
    
    ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла, , "ДвоичныеДанные");
    
    Результат.Вставить("ДвоичныеДанные". ДанныеФайла.ДвоичныеДанные.Получить());
    .............
    
  7. Вот же ж! Работает, спасибо!


  8. pihy

    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    Сделал все по аналогии. Но все равно
    ДанныеФайла.ДвоичныеДанные.Получить() принимает значение НЕОПРЕДЕЛЕНО, хотя
    ДанныеФайла.ДвоичныеДанные имеет значение ХранилищеЗначения

    это платформа выделывается?


  9. AlexeyKh

    Offline

    AlexeyKh
    Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    148
    Симпатии:
    19
    Баллы:
    29

    блин, ну СП кто читать будет?

    ХранилищеЗначения.Получить() — Сервер и толстый клиент, … !

    1.получите на сервере значение
    2.сохраните во временный файл
    3.передайте его на клиент

    ХранилищеЗначения (ValueStorage)
    Получить (Get)
    Синтаксис:
    Получить()
    Возвращаемое значение:
    Тип: Произвольный.
    Значение, содержащееся в хранилище.
    Описание:
    Получает из хранилища сохраненное в нем значение.
    Доступность:
    Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
    Пример:
    МояКартинка = ХранилищеКартинки.Получить


  10. pihy

    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    А если я на сервере получаю запросом список прикрепленных файлов к номенклатуре и на клиент мне не нужно его передавать, а сохранить на диск с определенным наименованием по маске?
    ХранилищеЗначения.Получить().Записать([ПутьСохраненияФайла]) — так не корректно?


  11. nomad_irk

    Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204


  12. pihy

    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    Застрял и все тут. Вот мой код:

    &НаСервере
    Процедура ЗаполнитьНаСервере()
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла КАК Номенклатура,
        |    НоменклатураПрисоединенныеФайлы.Ссылка КАК ПрисоединенныйФайл,
        |    "" "" КАК ИмяФайла,
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.Код КАК Код,
        |    НоменклатураПрисоединенныеФайлы.Расширение КАК РасширениеФайла,
        |    НоменклатураПрисоединенныеФайлы.Размер КАК РазмерФайла
        |ИЗ
        |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
        |ГДЕ
        |    НоменклатураПрисоединенныеФайлы.ВладелецФайла.ПометкаУдаления = ЛОЖЬ
        |
        |УПОРЯДОЧИТЬ ПО
        |    Номенклатура,
        |    ПрисоединенныйФайл
        |АВТОУПОРЯДОЧИВАНИЕ";
       
        ДанныеФайла = Запрос.Выполнить().Выбрать();
       
        ИндексФайла = 1;
        ПредыдущаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка();
       
        Пока ДанныеФайла.Следующий() Цикл
           
           
            Если ДанныеФайла.Номенклатура = ПредыдущаяНоменклатура Тогда
               
                ИндексФайла = ИндексФайла+1;
               
                ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура;
                ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"") + ДанныеФайла.Код +"-" +Строка(ИндексФайла) + ".jpg";
               
            Иначе
               
                ИндексФайла = 1;
               
                ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура;
                ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"") + ДанныеФайла.Код + ".jpg";
               
            КонецЕсли;
           
            ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить().Записать(ИмяФайла);
           
        КонецЦикла;
       
    КонецПроцедуры
    

    ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище имеет значение:
    [​IMG]
    а ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить() возвращает Неопределено
    [​IMG]
    ну и, соответственно, дальше ошибка «значение не является значением объектного типа…»

    Ткните, пожалуйста, в каком моменте туплю.


  13. nomad_irk

    Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Если возвращает неопределено, значит нет ничего в хранилище.


  14. pihy

    Offline

    pihy

    Регистрация:
    14 сен 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1

    Действительно. Оказалось, изображения хранятся в РегистрыСведений.ПрисоединенныеФайлы — там все заработало. Спасибо всем)


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

  • Ошибка при вызове метода контекста получитьcomобъект
  • Ошибка при вызове метода контекста произвестичтениеданных
  • Ошибка при вызове метода контекста получить ссылку
  • Ошибка при вызове метода контекста проверить строку
  • Ошибка при вызове метода контекста получить регистр сведений