Получить Из Временного Хранилища |
Я |
02.12.14 — 11:10
Подскажите в чем ошибка пожалуйста:
{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
//////////////////////////////////////////////////////////
Перем Адрес;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ДБФ = Новый XBase(«D:Kontr.dbf»);
ДБФ.Кодировка = КодировкаXBase.OEM;
Адрес = Неопределено;
ВХ = ПоместитьВоВременноеХранилище(ДБФ,Адрес);
ЗагрузкаДБФ(Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузкаДБФ(Адрес)
Сообщить(Адрес);
ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);
ДанныеСтроки.Первая();
Пока Не ДанныеСтроки.ВКонце() Цикл
Если НЕ ДанныеСтроки.ЗаписьУдалена() Тогда
Контр = Справочники.Корреспонденты.НайтиПоНаименованию(СокрЛП(ДанныеСтроки.Name));
Если Контр = Справочники.Корреспонденты.ПустаяСсылка() тогда
Контр=Справочники.Корреспонденты.СоздатьЭлемент();
Контр.Наименование=СокрЛП(ДанныеСтроки.Name);
…………………………………………………………………………………………………
Контр.Записать();
КонецЕсли;
КонецЕсли;
ДанныеСтроки.Следующая();
КонецЦикла;
КонецПроцедуры
Заранее спасибо !
1 — 02.12.14 — 11:12
Неопределено — так себе адрес
2 — 02.12.14 — 11:13
=»»;
3 — 02.12.14 — 11:13
Адрес = ПоместитьВоВременноеХранилище(ДБФ);
4 — 02.12.14 — 11:16
(2) не помогло.
(3) не помогло.
{Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
5 — 02.12.14 — 11:17
(4) а Сообщить(Адрес) что сообщает?
6 — 02.12.14 — 11:19
Адрес = ПоместитьВоВременноеХранилище(ДБФ);
ЗагрузкаДБФ(Адрес);
не работает? да ладно. Код в студию
7 — 02.12.14 — 11:21
Возвращаемое значение:
Тип: Строка.
Адрес во временном хранилище.
Должно было прокатить..
8 — 02.12.14 — 11:21
(6) Перем Адрес;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ДБФ = Новый XBase(«D:Kontr.dbf»);
ДБФ.Кодировка = КодировкаXBase.OEM;
// УникальныйИдентификатор = Новый УникальныйИдентификатор;
Адрес = «»;
Адрес = ПоместитьВоВременноеХранилище(ДБФ);
ЗагрузкаДБФ(Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузкаДБФ(Адрес)
Сообщить(Адрес);
ДанныеСтроки = ПолучитьИзВременногоХранилища(Адрес);
ДанныеСтроки.Первая();
Пока Не ДанныеСтроки.ВКонце() Цикл
Если НЕ ДанныеСтроки.ЗаписьУдалена() Тогда
Контр = Справочники.Корреспонденты.НайтиПоНаименованию(СокрЛП(ДанныеСтроки.Name));
Если Контр = Справочники.Корреспонденты.ПустаяСсылка() тогда
Контр=Справочн
9 — 02.12.14 — 11:23
(8) Убери объявление переменной, оно тебе всю картину маслом портит
10 — 02.12.14 — 11:24
Адрес = «»;
выкинь, чо за привычка так писать
11 — 02.12.14 — 11:26
(10)
теперь новая ошибка:
{Форма.Форма.Форма(20)}: Значение не является значением объектного типа (Первая)
ДанныеСтроки.Первая();
12 — 02.12.14 — 11:26
(8) Написавши
Перем Адрес;
без директивы компиляции, ты определил определил переменную Адрес на сервере. Поэтому, когда ты приходишь на сервер, у тебя в ней уже не то, что ты с клиента передал, а очень даже Неопределено.
13 — 02.12.14 — 11:28
(11) ты сначала файл в двоичные данные, двоичные данные во врем хранилище, из врем хранилища в двоичные данные, двоичные данный сохрани на винт во врем каталог как дбф. И только потом Новый XBase (путь к временному файлу);
14 — 02.12.14 — 11:31
(13) О_О
А можно строчкой кода ?
15 — 02.12.14 — 11:32
ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);
16 — 02.12.14 — 11:36
(15) а как ?
«двоичные данный сохрани на винт во врем каталог как дбф. И только потом Новый XBase (путь к временному файлу);»
17 — 02.12.14 — 11:40
ох, блин…
ИмяВременногоФайла = КаталогИБ()+»TmpDBF.dbf»;
ДвоичныеДанные.Записать(ИмяВременногоФайла);
…
Ну и далее по тексту.
И вообще, читайте СП, там все написано
18 — 02.12.14 — 11:47
(17) ну с КаталогИБ() перебор имхо, лучше КаталогВременныхФайлов, да ещё и удалить потом тоже на всякий не забыть бы
19 — 02.12.14 — 11:48
(18) первое, что в голову пришло) Не помню я их, я их в СП читаю обычно
20 — 03.12.14 — 12:22
(19)
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// ДБФ = Новый XBase(«D:Kontr.dbf»);
ДвоичныеДанные = Новый ДвоичныеДанные(«D:Kontr.dbf»);
Времянка = КаталогВременныхФайлов() + «TmpDBF.dbf»;
ДвоичныеДанные.Записать(Времянка);
// ДБФ.Кодировка = КодировкаXBase.OEM;
// УникальныйИдентификатор = Новый УникальныйИдентификатор;
// Адрес = «»;
Адрес = ПоместитьВоВременноеХранилище(Времянка);
ЗагрузкаДБФ(Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузкаДБФ(Времянка)
ДанныеСтроки1 = ПолучитьИзВременногоХранилища(Времянка);
ДанныеСтроки = Новый XBase(ДанныеСтроки1);
ДанныеСтроки.Кодировка = КодировкаXBase.OEM;
ДанныеСтроки.Первая();
Пока Не ДанныеСтроки.ВКонце() Цикл
ЧЯДНТ ?
21 — 03.12.14 — 12:23
{Форма.Форма.Форма(25)}: Ошибка при вызове метода контекста (Первая)
ДанныеСтроки.Первая();
по причине:
Перед выполнением операции нужно открыть базу
22 — 03.12.14 — 12:24
(21) это ты так XBase на основе двоичных данных формируешь?
23 — 03.12.14 — 12:25
(22) а, не. на основе какого-то левого пути
24 — 03.12.14 — 12:26
(21)
Синтаксис:
Новый XBase(<ПутьКБазе>, <ПутьКИндексу>, <ТолькоЧтение>)
Параметры:
<ПутьКБазе> (необязательный)
Тип: Строка.
Полное имя файла таблицы базы данных в формате DBF.
<ПутьКИндексу> (необязательный)
Тип: Строка.
Путь к индексному файлу таблицы.
<ТолькоЧтение> (необязательный)
Тип: Булево.
Истина — открывать файл только для чтения, Ложь — открывать файл для чтения и записи.
Значение по умолчанию: Ложь.
Описание:
Создает объект XBase. При создании могут быть сразу открыты файлы таблицы и индекса.
И еще раз:
<ПутьКИндексу> (необязательный)
Тип: Строка.
Путь к индексному файлу таблицы.
<ТолькоЧтение> (необязательный)
Тип: Булево.
Истина — открывать файл только для чтения, Ложь — открывать файл для чтения и записи.
Значение по умолчанию: Ложь.
25 — 03.12.14 — 12:26
И вообще, ты чего-то не то делаешь
26 — 03.12.14 — 12:27
(23) да я хз как, впервые с УФ сталкиваюсь, обычно то проще)
ДБФ = Новый XBase(«\ServbdFormaDok_UL.dbf»);
ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.Первая();
Симв = Символ(160);
Пока Не ДБф.ВКонце() Цикл
и т.д.
27 — 03.12.14 — 12:27
Ты из временного хранилища получаешь двоичные данные. А XBase на основании пути к файлу поднимается. Так что ты свои ДвоичныеДанные сохрани на сервере в файл и этот файл уже делай
28 — 03.12.14 — 12:28
(26) обычно в управляемом режиме файловые системы разные у клиента и сервера
29 — 03.12.14 — 12:28
(27) Времянка. он туда строку отдаёт
30 — 03.12.14 — 12:29
(26) ну не сталкивайся тогда. Забей, отдай работу тому, кто сталкивался.
Чего вы все ноете про эти упр формы? Не нравится вам инструмент, не работайте с ним. Работайте с тем, что вам нравится.
Нитики
31 — 03.12.14 — 12:29
*Нытики.
Извините
32 — 03.12.14 — 12:30
(28) вот это и вызывает затруднения.
33 — 03.12.14 — 12:32
(30) Ну не обижайся, помощи же прошу)
Если бы можно было как-то обойти эти УФ, не сталкивался бы… А тут такое… И отдать тут некому.
34 — 03.12.14 — 12:46
хелп…
35 — 03.12.14 — 12:49
то есть, сделайте за меня?
36 — 03.12.14 — 12:50
(35) не, направьте на путь истинный с (20)
37 — 03.12.14 — 12:53
(36) -> (24)(30)
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
*водиле
42 — 03.12.14 — 15:29
(0) Измени
ПоместитьВоВременноеХранилище(ДБФ,Адрес);
На
ПоместитьВоВременноеХранилище(ДБФ, ЭтаФорма.УникальныйИдентификатор);
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;
ДанныеСтроки.Первая();
Пока Не ДанныеСтроки.ВКонце() Цикл
44 — 04.12.14 — 07:19
можешь на досуге почитать про ПолучитьИмяВременногоФайла
hasan-rusel
45 — 04.12.14 — 07:20
(44) ок.
ОсновнаяФорма:
&НаКлиенте
Процедура ОткрытьФормуПодбора(Команда)
ОткрытьФорму("Обработка.ПередачаПараметровВФормах.Форма.ФормаПобдора",,ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПодбор(АдресВХ) Экспорт
А = ОбработатьПодборНаСервере(АдресВХ);
КонецПроцедуры
&НаСервере
Функция ОбработатьПодборНаСервере(АдресВХ)
Возврат ПолучитьИзВременногоХранилища(АдресВХ);
КонецФункции
Форма подбора:
&НаКлиенте
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформу(Команда)
АдресВХ = Неопределено;
ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ);
ВладелецФормы.ОбработатьПодбор(АдресВХ);
Закрыть();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ)
АдресВХ = ПоместитьВоВременноеХранилище("Данные для передачи", Новый УникальныйИдентификатор);
КонецПроцедуры
Добавлено: 28 июн 2018, 01:20
Добавил вариант с оповещением.
Основная форма:
&НаКлиенте
Процедура ОткрытьФормуПодбора(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПриЗавершенииПодбора", ЭтотОбъект);
ОткрытьФорму("Обработка.ПередачаПараметровВФормах.Форма.ФормаПобдора",,ЭтаФорма,,,,ОповещениеОЗакрытии,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПодбор(АдресВХ) Экспорт
А = ОбработатьПодборНаСервере(АдресВХ);
КонецПроцедуры
&НаСервере
Функция ОбработатьПодборНаСервере(АдресВХ)
Возврат ПолучитьИзВременногоХранилища(АдресВХ);
КонецФункции
&НаКлиенте
Процедура ПриЗавершенииПодбора(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
А = ПолучитьИзВременногоХранилища(Результат.ОповещениеАдресВХ);
КонецЕсли;
КонецПроцедуры
Форма подбора:
&НаКлиенте
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформу(Команда)
АдресВХ = Неопределено;
ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ);
ВладелецФормы.ОбработатьПодбор(АдресВХ);
ПараметрыПриЗакрытии = Новый Структура;
ПараметрыПриЗакрытии.Вставить("ОповещениеАдресВХ",АдресВХ);
Закрыть(ПараметрыПриЗакрытии);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗавершитьПодборИПередатьДанныеВОсновнуюформуНаСервере(АдресВХ)
АдресВХ = ПоместитьВоВременноеХранилище("Данные для передачи", Новый УникальныйИдентификатор);
КонецПроцедуры
Добрый день всем! Я не очень в УФ, подскажите, пожалуйста такую задачу как решить: Есть документ с ТЧ Товары. ОНИ хотят, чтобы при изменении количества какого-либо товара все изменения записывались и потом в отчёт выводились сколько раз и на какое количество менялся товар. Я подумала,что можно при открытии формы документа запоминать во временное хранилище ТЧ товары, а его адрес — в реквизит формы. А потом при перепроведении сравнивать старую и новую ТЧ. Вообщем выходит ошибка: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища) ТЗ = ПолучитьИзВременногоХранилища(Адрес); по причине:Ошибка получения значения из временного хранилища
Я уже думала от безысходности создать реквизит объекта и в него записывать старую ТЧ. Но как-то не хочется такое делать.
Ну поместилось во временное хранилище значение на долгое хранение (минут 20), ну вернула функция уникальный идентификатор формы. По этому идентификатору значение не достать. Тут скорее надо возвращать полученный адрес:
Что-то «потом в отчёт» и «при перепроведении сравнивать» не вяжется…
так надо при изменении количества записывать или при записи документа?
Эпитафия на могиле программиста: «Они хотели.» Включите версионирование документа (если оно есть в Вашей конфигурации).
при записи документа записывать, если количество менялось. ну это я в регистр буду записывать. мне сначала надо сравнить таблицы,чтоб понять, менялось или нет.
Из справки: ПоместитьВоВременноеХранилище — Возвращаемое значение: Тип: Строка. Адрес во временном хранилище. У мадмуазели: ???
+ И свой отчет (или внешнюю печатную форму документа) по регистру ВерсииОбъектов.
ТЧ в состоянии на момент открытия формы можно получить по ссылке в модуле документа в ПередЗаписью и передать в обработку проведения через ДополнительныеСвойства.
Попробую в модуль объекта написать: …
сравни передЗаписью в ДокОбъект и в ДокСсылка
Через год будете писать как почистить самолично созданный регистр версионирования , а того что база распухнет.
дак версионирование будет больше съедать места, чем мой маленький регистрик. Еще вдруг и затормозит всё из-за него..
Смотря как «ОНИ» вашу тему потом разовьют и попросят по натыкать это куда попало, и этот маленький регистрик разовьется в большой — проходили уже, и не раз. Хотелки начинаются с малого.
в передЗаписью прочитай запросом табличную часть из БД и сравни с той, что в ЭтотОбъект.ТвояТабличнаяЧасть. Это можно даже одним запросом.
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Дарья92 0 / 0 / 0 Регистрация: 13.10.2013 Сообщений: 7 |
||||
1 |
||||
1C 8.x Работа с временным хранилищем13.10.2013, 22:32. Показов 11339. Ответов 12 Метки нет (Все метки)
Здравствуйте, у меня есть 2 обработки. Я передаю данные с формы одной на форму второй, через ВременноеХранилищеДанных.
Пишет ошибку: {Форма.Форма.Форма(5)}: Ошибка при вызове метода контекста (ПолучитьФорму) Помогите, пожалуйста.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
13.10.2013, 22:32 |
Ответы с готовыми решениями: Работа с хранилищем Такой вопрос — есть два хранилища: основное и моё, рабочее. Я вношу свои… работа с хранилищем Работа с облачным хранилищем Работа с локальным хранилищем 12 |
duk337 2954 / 1766 / 82 Регистрация: 03.11.2011 Сообщений: 8,280 |
||||
14.10.2013, 00:35 |
2 |
|||
Можыд
вообще-то, синт.пом имеется
0 |
Модератор 3700 / 2899 / 570 Регистрация: 10.03.2011 Сообщений: 11,414 Записей в блоге: 1 |
|
14.10.2013, 03:00 |
3 |
«Обработка.Получатель.Форма.Форма»
1 |
Дарья92 0 / 0 / 0 Регистрация: 13.10.2013 Сообщений: 7 |
||||||||||||
14.10.2013, 17:05 [ТС] |
4 |
|||||||||||
Спасибо большое, не доглядела. Теперь другая проблема: Создала элемент формы. с типом поле ввода, установила свойство кнопка списка выбора = истина. Хочу сделать выпадающий список. Список значения формируется из реквизитов переданной формы. Перечитала уже весь интернет. Вроде делаю правильно, а не работает. Код получения данных из временного хранилища:
Код создания поля ввода:
Код процедуры выпадающего списка:
0 |
2954 / 1766 / 82 Регистрация: 03.11.2011 Сообщений: 8,280 |
|
14.10.2013, 17:23 |
5 |
Код процедуры выпадающего списка: не надо. Почитайте синт.пом СписокВыбора. Если у поля есть кнопка выбора, то достаточно заполнить его список выбора.
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 |
|||
Я туплю. Сделала, как Вы говорите, все равно не выходит.
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 |
|||
Попробуйте создавать не форму, а обработку.
0 |
-
Добрый день.
Не понимаю почему метод получить() возвращает неопределено?
Что за подстава? Платформа 8.3.6.2363 -
Online
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Причины не скажу, возможно как-то связано с неявным вызовом сервер после того, как структура сформировалась.
В общем сделай через временное хранилище. -
Не получилось. С хранилищем значения, результат ровно тот же.
А вот в толстом клиенте оба варианта (и мой, и с хранилищем значения) отрабатывают. Не пойму в чем дело. -
Online
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
А как делал через временное хранилище?
-
Привет.
Код ниже. Я во временное хранилище помещаю структуру, в которую входят двоичные данные. Так вот остальные элементы структуры (дата, строка) получаются из хранилища корректно. А двоичные данные — нет.&НаКлиенте Процедура ОткрытьФайлОписания() ТекСтрока = Элементы.ПрикрепленныеФайлы.ТекущиеДанные; Если ТекСтрока=Неопределено Тогда Возврат; КонецЕсли; Адрес = Новый УникальныйИдентификатор; ПолучитьФайлОписанияВХранилищеСервер(ТекСтрока.ПрикрепленныйФайл, Адрес); ДанныеФайлаОписания = ПолучитьИзВременногоХранилища(Адрес); ВременныйФайл = ПолучитьИмяВременногоФайла(ДанныеФайлаОписания.РасширениеФайла); ДвоичныеДанные = ДанныеФайлаОписания.ДвоичныеДанные.Получить(); ДвоичныеДанные.Записать(ВременныйФайл); НачатьЗапускПриложения( Новый ОписаниеОповещения("ВыполнитьОткрытиеФайлаОписания", ЭтотОбъект), ВременныйФайл, , Истина ); КонецПроцедуры &НаСервереБезКонтекста Процедура ПолучитьФайлОписанияВХранилищеСервер(ПрикрепленныйФайл, Адрес=Неопределено) Запрос = Новый Запрос("ВЫБРАТЬ | ПрикрепленныеФайлы.Наименование, | ПрикрепленныеФайлы.ХранилищеЗначения КАК ДвоичныеДанные, | ПрикрепленныеФайлы.РасширениеФайла, | ПрикрепленныеФайлы.РазмерФайла |ИЗ | Справочник.ПрикрепленныеФайлы КАК ПрикрепленныеФайлы |ГДЕ | ПрикрепленныеФайлы.Ссылка = &ПрикрепленныйФайл"); Запрос.УстановитьПараметр("ПрикрепленныйФайл", ПрикрепленныйФайл); ДанныеФайла = Запрос.Выполнить().Выбрать(); ДанныеФайла.Следующий(); Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла"); ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла); Адрес = ПоместитьВоВременноеХранилище(Результат, Адрес); КонецПроцедуры
-
Online
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
А так?
........ Результат = Новый Структура("Наименование, ДвоичныеДанные, РасширениеФайла, РазмерФайла"); ЗаполнитьЗначенияСвойств(Результат, ДанныеФайла, , "ДвоичныеДанные"); Результат.Вставить("ДвоичныеДанные". ДанныеФайла.ДвоичныеДанные.Получить()); .............
-
Вот же ж! Работает, спасибо!
-
Offline
pihy
- Регистрация:
- 14 сен 2012
- Сообщения:
- 4
- Симпатии:
- 0
- Баллы:
- 1
Сделал все по аналогии. Но все равно
ДанныеФайла.ДвоичныеДанные.Получить() принимает значение НЕОПРЕДЕЛЕНО, хотя
ДанныеФайла.ДвоичныеДанные имеет значение ХранилищеЗначенияэто платформа выделывается?
-
Offline
AlexeyKh
Опытный в 1С- Регистрация:
- 27 июл 2012
- Сообщения:
- 148
- Симпатии:
- 19
- Баллы:
- 29
блин, ну СП кто читать будет?
ХранилищеЗначения.Получить() — Сервер и толстый клиент, … !
1.получите на сервере значение
2.сохраните во временный файл
3.передайте его на клиентХранилищеЗначения (ValueStorage)
Получить (Get)
Синтаксис:
Получить()
Возвращаемое значение:
Тип: Произвольный.
Значение, содержащееся в хранилище.
Описание:
Получает из хранилища сохраненное в нем значение.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:
МояКартинка = ХранилищеКартинки.Получить -
Offline
pihy
- Регистрация:
- 14 сен 2012
- Сообщения:
- 4
- Симпатии:
- 0
- Баллы:
- 1
А если я на сервере получаю запросом список прикрепленных файлов к номенклатуре и на клиент мне не нужно его передавать, а сохранить на диск с определенным наименованием по маске?
ХранилищеЗначения.Получить().Записать([ПутьСохраненияФайла]) — так не корректно? -
Online
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
-
Offline
pihy
- Регистрация:
- 14 сен 2012
- Сообщения:
- 4
- Симпатии:
- 0
- Баллы:
- 1
Застрял и все тут. Вот мой код:
&НаСервере Процедура ЗаполнитьНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НоменклатураПрисоединенныеФайлы.ВладелецФайла КАК Номенклатура, | НоменклатураПрисоединенныеФайлы.Ссылка КАК ПрисоединенныйФайл, | "" "" КАК ИмяФайла, | НоменклатураПрисоединенныеФайлы.ВладелецФайла.Код КАК Код, | НоменклатураПрисоединенныеФайлы.Расширение КАК РасширениеФайла, | НоменклатураПрисоединенныеФайлы.Размер КАК РазмерФайла |ИЗ | Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы |ГДЕ | НоменклатураПрисоединенныеФайлы.ВладелецФайла.ПометкаУдаления = ЛОЖЬ | |УПОРЯДОЧИТЬ ПО | Номенклатура, | ПрисоединенныйФайл |АВТОУПОРЯДОЧИВАНИЕ"; ДанныеФайла = Запрос.Выполнить().Выбрать(); ИндексФайла = 1; ПредыдущаяНоменклатура = Справочники.Номенклатура.ПустаяСсылка(); Пока ДанныеФайла.Следующий() Цикл Если ДанныеФайла.Номенклатура = ПредыдущаяНоменклатура Тогда ИндексФайла = ИндексФайла+1; ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура; ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"") + ДанныеФайла.Код +"-" +Строка(ИндексФайла) + ".jpg"; Иначе ИндексФайла = 1; ПредыдущаяНоменклатура = ДанныеФайла.Номенклатура; ИмяФайла = ?(Прав(Объект.ПутьККаталогу,1)="",Объект.ПутьККаталогу,Объект.ПутьККаталогу+"") + ДанныеФайла.Код + ".jpg"; КонецЕсли; ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить().Записать(ИмяФайла); КонецЦикла; КонецПроцедуры
ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище имеет значение:
а ДанныеФайла.ПрисоединенныйФайл.ФайлХранилище.Получить() возвращает Неопределено
ну и, соответственно, дальше ошибка «значение не является значением объектного типа…»Ткните, пожалуйста, в каком моменте туплю.
-
Online
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Если возвращает неопределено, значит нет ничего в хранилище.
-
Offline
pihy
- Регистрация:
- 14 сен 2012
- Сообщения:
- 4
- Симпатии:
- 0
- Баллы:
- 1
Действительно. Оказалось, изображения хранятся в РегистрыСведений.ПрисоединенныеФайлы — там все заработало. Спасибо всем)
Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно.
Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.
Итак, пойдем по порядку. Подобная информация уже есть в сети, но для полноты картины кратко разъясню регистрацию обработки в системе:
1. Открываем модуль объекта обработки и создаем там Функцию СведенияОВнешнейОбработке() (естественно экспортную):
СведенияОВнешнейОбработке()
Как мы видим, использовать будем ВызовКлиентскогоМетода, по скольку открыть файл нужно будет на компьютере пользователя.
Далее понадобится создать еще две процедуры здесь же:
2. Функция добавления команды, которую мы вызываем ранее(просто, чтобы все было визуально разделено и не награмождалось скопом в одной функции):
ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = «»)
3. И функция по созданию этой самой таблицы команд:
(Из комментариев можно подробней понять, для чего используется тот или иной параметр-поле данной таблицы)
На этом настройка регистрации внешней обработки в нужной вам конфигурации закончена.
Далее. Самое интересное: создание, заполнение и вывод макета клиенту.
Первое, что нам необходимо сделать, это создать макет нашего документа(Изображение 3). Макет понадобится двоичный, т.к. обычный мы на клиент не передадим(как я и говорил ранее). Заменяем нужные данные в шаблоне, перед загрузкой в обработку, «Параметрами», у меня они выглядят так, на примере: «{Сотрудник}»(кавычки не учитывать), после чего загружаем в Обработку-Макет.
Теперь в модуле формы создаем процедуру, которая будет вызвана при обращении к печати именно в таком виде(за исключением содержимого, заполнять можете как вам угодно), процедура так же должна быть экспортной и на клиенте, так как вызывается из конфигурации и выполнение назначено на клиентской стороне:
Печать(ИдентификаторКоманды, МассивОбъектов)
Макет я собираю и вызываю в отдельной процедуре, обязательно на клиенте.
СобратьМакет(СсылкаНаОбъект)
Для сбора макета нам понадобится получить этот самый макет уже с сервера. Передаю я его через временное хранилище:
ПолучитьМакетСервер(ИмяМакета)
Далее нужно получить данные для заполнения макета, естественно на сервере, по скольку может понадобиться обратиться к сторонним регистрам и справочникам, если нет, то можно выполнить и на клиенте, получив ссылку на интересующий нас объект:
ПолучитьДанные(СсылкаНаОбъект)
Данные складываем в структуру,где ключ — имя параметра в макете(без фигурных скобок), а значение — собственно значение, которое необходимо подставить.
На этом завершается наше создание. Вы можете скачать обработку в готовом виде, в ней также реализован запуск через форму обработки, то есть с помощью открытия обработки без регистрации ее в конфигурации. Надеюсь, моя статья многим поможет и окажется полезной. Спасибо большое за внимание!