Приветствую.
Вопрос - есть внешняя обработка, она что то там делает. Какие есть способы сохранения каких либо данных во внешнюю обработку таким образом, что бы эти данные сохранялись в обработке и были доступны всегда, даже с другой базы. (Скинул на флешку, запустил обработку. Пошел к другой базе, а данные с первого раза доступны в самой обработке).
---
На практике оказалось проще использовать Маркер. Вот практический пример:
Обработка дописывает в тело собственного файла картинку. По кнопке "Прочитать данные", картинка выводится на форму из epf файла. Маркер нужен, чтобы найти позицию начала картинки. Если обработку пересохранить в конфигураторе, дописанные данные, разумеется, потеряются.

```1c
    &НаКлиенте
    Перем Маркер;

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

    &НаКлиенте
    Процедура ЗаписатьДанные(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Фильтр = "Файлы JPG|*.jpg;*.jpeg|(*.gif)|*.gif|(*.png)|*.png|(*.bmp)|*.bmp|Все файлы|*.*";
    Если Не Диалог.Выбрать() Тогда
    Возврат
    КонецЕсли;

    ЧтениеДанных = Новый ЧтениеДанных(Диалог.ВыбранныеФайлы[0]);
    РезультатЧтения = ЧтениеДанных.Прочитать();
    РазмерФайла = РезультатЧтения.Размер;
    БуферДанныхФайла = РезультатЧтения.ПолучитьБуферДвоичныхДанных();
    ЧтениеДанных.Закрыть();

    ЧтениеДанных = Новый ЧтениеДанных(ИспользуемоеИмяФайла);
    РазмерОбработки = ЧтениеДанных.ПрочитатьДо(Маркер).Размер;
    ЧтениеДанных.Закрыть();

    ФайловыйПоток = Новый ФайловыйПоток(ИспользуемоеИмяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Запись);
    ФайловыйПоток.Перейти(РазмерОбработки, ПозицияВПотоке.Начало);
    ФайловыйПоток.Записать(Маркер, 0, 4);
    ФайловыйПоток.Записать(БуферДанныхФайла, 0, РазмерФайла);
    ФайловыйПоток.Закрыть();

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

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

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    Маркер = Новый БуферДвоичныхДанных(4);
    Маркер.ЗаписатьЦелое32(0, 777777777);
    КонецПроцедуры
```
---
Скинул на флешку, запустил обработку
тут без вариантов ключевое флэшка-файл на ней(формат любой самый читаемый) ну и по факту немного хардкода )
---
обработка не хранит данные. Сохраняйте в файл...
---
В таком случае - как например выгрузить один элемент справочника со всеми штуками (идентификатор итд.) а потом как то их использовать.
---
Если в базах одинаковые данные то тебе хватит УИД и тип выгружать, а потом по ним искать объекты
---
как уже писали использовать файл, только писать его в облако. Например, яндекс диск https://infostart.ru/public/536090/.
Тогда можно как вы уже сказали вставить флешку обработать результат загрузить его в облако.
Пойти домой запустить обработку и прочитать результат с облака и работать дальше!

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

Другие варианты либо не будут гибкими, либо будут привязаны к базе!

А в общем случае задача не решается, т.к. обработка сама по себе не сохраняет данные, хранить данные могут другие объекты!
---
Обработка не предполагает хранения данных. Если нужно хранить данные, то можешь сохранить с обработкой файл.
---
Прям совсем ?
---
Такого точно нет :)
---
В теории сделать можно, но это более трудоемко и не правильно. Намного проще сделать с файлом.
---
" каких либо данных"- это параметры или результат?
---
Результат. Например, обработка что считала в базе. Получила результат. Допустим цифру. Надо чтобы эта цифра сохранилась в обработке. Это просто пример.
---
файл. а формат на любителя- txt, xml. да хоть в dbf
---
http://howknow1c.ru/programmirovanie-1c/kak-zapisat-v-tekstovyj-fajl-iz-1s.html
---
Штатно - никак.
В голову приходят только безумные варианты автоматической пересборки этой обработки с текстовым (скажем) макетом, куда эти данные будут запихиваться. Но это слишком нетривиально, чтобы это можно было использовать прозрачно.
ЗЫ. Хотя, заменить данные в файле обработки для ее макета можно без пересборки - простым парсиногом и работой с файлом напрямую. Остается проблема, что не получится сохранить данные в открытую обработку, только в новую копию. Ну и сомнительный вопрос использования этого в качестве штатной возможности, плюс возможное нарушение лицензионного соглашения.
---
это все внутри одной базы только будет доступно. в другой их не увидишь
---
Это да , но заявлять то что обработка не может хранить данные - не совсем корректно
---
Только если закрывать глаза на контекст вопроса.
---
точнее это ответ на первую часть вопроса - может ли обработка хранить данные
Какие есть способы сохранения каких либо данных во внешнюю обработку таким образо

а вот что бы были доступны всегда и везде - это только иметь внешний носитель
---
Раз уж мы занялись буквоедством, то начиная с названия самой темы речь не о способе "сохранения данных обработкой (где-либо)", а об инкапсуляции этих данных в самой обработке. Разбив целое и законченное предложение в самой теме на якобы два отдельных вопроса, вы полностью исказили смысл изначального вопроса.
ЗЫ. Хотя признаю, название самой темы можно интерпретировать двояко.
---
так я и не заявлял))
---
(20) Все, все - молчу
---
Ну а если серьезно нужно решить данную задачу, то публикуйте какой-нибудь FTP, выгружайте/загружайте результат с него/на него. Это самый простой вариант.
---
Тогда уж лучше сразу - через http-сервис. Будет "облачная" обработка. И лицензировать легко :)
"В платной версии вы сможете переносить данные между разными базами - был бы интернет".
---
лучше, но сложнее
---
Если начнет плюшками обрастать (типа лицензирования), то наоборот проще.
---
Думаю сначала нужно понять, какую именно задачу вы пытаетесь решить.
---
Дописать двоичные данные в конец epf файла, дописать в конец объём дописанных данных, благо функционал работы с потоками двоичных данных расширили. Но это в теории.
---
На практике оказалось проще использовать Маркер. Вот практический пример:
Обработка дописывает в тело собственного файла картинку. По кнопке "Прочитать данные", картинка выводится на форму из epf файла. Маркер нужен, чтобы найти позицию начала картинки. Если обработку пересохранить в конфигураторе, дописанные данные, разумеется, потеряются.

```1c
    &НаКлиенте
    Перем Маркер;

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

    &НаКлиенте
    Процедура ЗаписатьДанные(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Фильтр = "Файлы JPG|*.jpg;*.jpeg|(*.gif)|*.gif|(*.png)|*.png|(*.bmp)|*.bmp|Все файлы|*.*";
    Если Не Диалог.Выбрать() Тогда
    Возврат
    КонецЕсли;

    ЧтениеДанных = Новый ЧтениеДанных(Диалог.ВыбранныеФайлы[0]);
    РезультатЧтения = ЧтениеДанных.Прочитать();
    РазмерФайла = РезультатЧтения.Размер;
    БуферДанныхФайла = РезультатЧтения.ПолучитьБуферДвоичныхДанных();
    ЧтениеДанных.Закрыть();

    ЧтениеДанных = Новый ЧтениеДанных(ИспользуемоеИмяФайла);
    РазмерОбработки = ЧтениеДанных.ПрочитатьДо(Маркер).Размер;
    ЧтениеДанных.Закрыть();

    ФайловыйПоток = Новый ФайловыйПоток(ИспользуемоеИмяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Запись);
    ФайловыйПоток.Перейти(РазмерОбработки, ПозицияВПотоке.Начало);
    ФайловыйПоток.Записать(Маркер, 0, 4);
    ФайловыйПоток.Записать(БуферДанныхФайла, 0, РазмерФайла);
    ФайловыйПоток.Закрыть();

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

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

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    Маркер = Новый БуферДвоичныхДанных(4);
    Маркер.ЗаписатьЦелое32(0, 777777777);
    КонецПроцедуры
```
---
Прикольно. Попробую.
---
Прикольная картинка)) Это вы записали ?
---
Ошибка - Использование синхронных методов на клиенте запрещено. Появилось когда я заменил картинку и попробовал открыть в другой базе.

UPD: Файл нормально открылся если конфигурацию закрыть/открыть.
---
Использование синхронных методов на клиенте запрещено.
Синхронные методы объектов работы с данными также имеют асинхронную версию. Асинхронные методы обычно начинаются со слова "Начать". Но там придётся создавать дополнительные обработчики, которые будут вызываться после выполнения метода.
---
Скажите - такой фокус пройдет и с таблицой значений, и со строкой и т.д. ?
---
Если с двоичными данными сработало, то можно и с любыми другими. Ту же таблицу значений можно перегнать в двоичные данные:

```1c
    ХранилищеЗначения = Новый ХранилищеЗначения(ТаблицаЗначений);
    ДвоичныеДанные = Base64Значение(XMLСтрока(ХранилищеЗначения));
```
---
вы мне очень помогли.
---
А что бы обратно получить таблицу значений ? Base64Строка ? Как там полный синтаксис выглядит?
---
Теоретически
```1c
    XMLЗначение(Тип("ХранилищеЗначения"), Base64Строка(ДвоичныеДанные)).Получить()
```

Возможно, получение двоичных данных ТЗ проще организовать через ЗначениеВФайл / ЗначениеИзФайла.
---
В обработку добавить макет, тип к примеру текстовый или двоичный, сохранять настройки ЗначениеВФайл, и содержимое макета в обработке заменять и т.д. Мысль интересная