Последнее обновление: 21.03.2017
В прошлой теме мы рассмотрели сохранение и чтение файлов из каталога приложения. По умолчанию такие файлы доступны только самому приложения. Однако мы можем помещать и работать с файлами из внешнего хранилища. Это также позволит другим программам открывать данные файлы и при необходимости изменять.
Весь механизм работы с файлами будет таким же, как и при работе с хранилищем приложения. Ключевым отличием здесь будет получение и использование пути к внешнему хранилищу через метод Environment.getExternalStorageDirectory()
Итак, пусть в файле activity_main.xml будет такая же разметка интерфейса:
А код класса MainActivity будет выглядеть следующим образом:
Package com.example.eugene.filesapp; import android.Manifest; import android.content.pm.PackageManager; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { private final static String FILE_NAME = "content.txt"; private static final int REQUEST_PERMISSION_WRITE = 1001; private boolean permissionGranted; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private File getExternalPath() { return(new File(Environment.getExternalStorageDirectory(), FILE_NAME)); } // сохранение файла public void saveText(View view){ if(!permissionGranted){ checkPermissions(); return; } FileOutputStream fos = null; try { EditText textBox = (EditText) findViewById(R.id.save_text); String text = textBox.getText().toString(); fos = new FileOutputStream(getExternalPath()); fos.write(text.getBytes()); Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show(); } catch(IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } finally{ try{ if(fos!=null) fos.close(); } catch(IOException ex){ Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } } } // открытие файла public void openText(View view){ if(!permissionGranted){ checkPermissions(); return; } FileInputStream fin = null; TextView textView = (TextView) findViewById(R.id.open_text); File file = getExternalPath(); // если файл не существует, выход из метода if(!file.exists()) return; try { fin = new FileInputStream(file); byte bytes = new byte; fin.read(bytes); String text = new String (bytes); textView.setText(text); } catch(IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } finally{ try{ if(fin!=null) fin.close(); } catch(IOException ex){ Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } } } // проверяем, доступно ли внешнее хранилище для чтения и записи public boolean isExternalStorageWriteable(){ String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state); } // проверяем, доступно ли внешнее хранилище хотя бы только для чтения public boolean isExternalStorageReadable(){ String state = Environment.getExternalStorageState(); return (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)); } private boolean checkPermissions(){ if(!isExternalStorageReadable() || !isExternalStorageWriteable()){ Toast.makeText(this, "Внешнее хранилище не доступно", Toast.LENGTH_LONG).show(); return false; } int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if(permissionCheck!= PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_WRITE); return false; } return true; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions, @NonNull int grantResults){ switch (requestCode){ case REQUEST_PERMISSION_WRITE: if(grantResults.length > 0 && grantResults == PackageManager.PERMISSION_GRANTED){ permissionGranted = true; Toast.makeText(this, "Разрешения получены", Toast.LENGTH_LONG).show(); } else{ Toast.makeText(this, "Необходимо дать разрешения", Toast.LENGTH_LONG).show(); } break; } } }
С помощью выражения Environment.getExternalStorageDirectory() получаем доступ к папке приложения во внешнем хранилище и устанавливаем объект файла:
Private File getExternalPath() { return(new File(Environment.getExternalStorageDirectory(), FILE_NAME)); }
Поскольку для чтения/записи во внешнее хранилище необходимы разрешения, то перед операциями сохранения и записи файла необходимо проверить наличие разрешений. Для этого определен метод checkPermissions() . При установке разрешений срабатывает метод onRequestPermissionsResult() , в котором в случае удачной установки разрешений для переменной permissionGranted задается значение true .
Чтобы использовать внешнее хранилище, также надо установить разрешения в файле манифеста AndroidManifest.xml:
Предположим, что у вас на компьютере хранятся файлы и папки, к которым хорошо бы иметь доступ всегда и везде, т.е. – открыть и посмотреть, а также иметь возможность скачать и отредактировать их с любого устройства (планшет, смартфон, другой компьютер) и из любой точки, где вы можете выйти в интернет.
Всё это очень удобно когда вы регулярно обращаетесь к каким-то заметкам, таблицам, текстам. Находитесь вы, например, в дороге или в любом месте, где не можете сесть за свой компьютер. А доступ к некоторым файлам вам нужен прямо сейчас чтобы просто посмотреть какую-то информацию или возможно внести срочно небольшие изменения, пока вы про это не забыли. В таких случаях вы сможете всегда иметь доступ к нужным вам файлам если загрузите их на специальные бесплатные онлайн-хранилища (диски). Основные из них: Яндекс-Диск, Облако Mail, Google-Диск, Microsoft OneDrive и Mega. Файлы будут храниться в интернете в защищённом пространстве под вашим паролем, и открыть их можно с любого устройства и из любой точки при помощи бесплатных приложений! Нужна лишь возможность выхода в интернет. Да, и ещё один важный момент. Хранение файлов в онлайн-хранилищах защитит вас от потери данных, в случае если с вашим компьютером что-то случится.
К примеру – сломался жёсткий диск, украли и так далее. Ведь все важные данные будут храниться одновременно в защищённых хранилищах в интернете, откуда вы сможете их беспрепятственно восстановить.
В предыдущей статье я рассказывал о полноценном удалённом доступе к компьютеру с любого другого устройства и возможно кто-то подумает: «А почему бы не воспользоваться тогда просто удалённым доступом?». В таком случае данный вариант не эффективен и гораздо менее удобен по следующим причинам:
Во-первых, ваш компьютер, к которому вы хотите подключиться должен быть всегда включён, либо иметь возможность включения по сети;
Во-вторых, нам ведь нужно всего лишь посмотреть / отредактировать несколько файлов, а не иметь доступ ко сразу ко всем программам на компьютере.
В третьих, полный удалённый доступ к компьютеру с нужными вам данными будет потреблять больше интернет-трафика и требовать достаточно высокой скорости Интернет-соединения.
Удалённый доступ к компьютеру нужен не для таких целей, а тогда, когда вам может понадобиться вход в какую-то программу на компьютере, произвести какие-то настройки.
По сравнению с удалённым доступом, для работы с файлами в онлайн-хранилищах вам понадобится пройти лишь несколько простых шагов:
Зарегистрироваться в нужных онлайн-хранилищах (лучше во всех основных), ведь это бесплатно!
Загрузить туда необходимые файлы, к которым вы хотели бы иметь доступ всегда и везде;
Подключиться к хранилищу удалённо с любого устройства при помощи специального приложения для смартфона, планшета или компьютера. Вот и всё! Вы уже будете иметь доступ к загруженным документам.
Подключиться к хранилищу можно и вовсе без приложения, просто войдя в нужный сервис по ссылке через браузер.
Но не всё же так идеально... Есть, конечно же, одно важное ограничение. Заключается оно в максимальном объёме хранимой информации на каждом из онлайн-дисков. Оно, понятное дело, не бесконечное и, как правило, рассчитано на хранение самых основных данных. Если нужно больше – нужно платить за дополнительное свободное место, либо воспользоваться различными акциями или реферальной программой, если таковые вообще имеются в нужном сервисе.
Рассмотрим основные сервисы для удалённого хранения файлов и сравним их
Яндекс-Диск
.
Объём диска, доступный по умолчанию при бесплатной регистрации – 10 Гб. Также возможно получить 10 Гб за приглашение друзей (реферальная программа): 512 Мб за каждого приглашённого.
Также возможно получить дополнительное место по текущим акциям, например – 50 Гб тем, кто купит смартфон / планшет / ноутбук определённой модели. За акциями нужно следить, поскольку одни заканчиваются, другие начинаются:)
Ну и последний вариант расширения дискового пространства на Яндексе – это покупка нужного объёма.
Вот возможные варианты расширения свободного места на Яндекс-Диске:
Для сравнения цен на покупку дополнительного свободного места, возьмём объём, равный 1 терабайту (1 Тб = 1024 Гб).
Цена 1 Тб на Яндексе, как видим из изображения выше, равна 900 рублей в месяц.
Яндекс-Диск
Google-Диск
.
Объём диска по умолчанию – 15 Гб. Расширение объёма за счёт различных акций и партнёрской программы не предусмотрено.
Расширить диск возможно только заплатив за месяц или год, выбрав нужный объём.
Вот какие условия нам предлагает Google-Диск:
Цена за 1 Тб равна 9.99$. Если переведём в рубли (возьмём курс доллара на 15.10.2014 = 40.5 рублей), то видим сразу что на Google цена значительно выгоднее, чем на Яндексе. 9.99 x 40.5 = примерно 404.6 рублей, вместо 900 руб.
Google-Диск
Mail-Диск
.
Объём диска по умолчанию – целых 100 Гб. Разница по сравнению с Яндекс и Google приличная, как видите:) Тут всё просто и о каких-либо возможностях бесплатного и даже платного расширения дискового пространства речи на официальном сайте не идёт. Я думаю, 100 Гб халявного места никому не помешает, даже если больше заказать нельзя:)
Но есть один минус – сервис Мэйла не всегда стабилен. Вот вам, как пример:
Буквально на днях, при попытке зайти в свой аккаунт Mail в районе 1:00 по МСК, он ни в какую не принимал мой логин и пароль, говоря, что я ввожу неверные данные. Логины и пароли у меня автоматически сохраняются в программе RoboForm (прочитать о ней можно ), а также через неё автоматом заполняются и формы авторизации. И поэтому забыть их я никак не мог и ошибиться при вводе тоже. После нескольких безуспешных попыток войти, я попробовал восстановить пароль, и что вы думаете? :) Прислали новый пароль и с ним мне тоже войти не удалось. Немного разозлился и бросил это дело. Попробовал снова не следующий день и успешно вошёл с первого раза. Хотя бы даже поэтому сервисы Мэйла нельзя назвать очень стабильными:)
Облако Mail
Microsoft OneDrive
.
Объём бесплатного свободного пространства после регистрации составляет 15 Гб. Как и в Яндексе, имеется возможность бесплатно расширить объём до 23 Гб. 3 Гб сервис даст за создание резервной копии фотографий с камеры и ещё +0.5 Гб за каждого приглашённого участника по реферальной программе. Максимум – 10 приглашённых, что увеличит ваш объём ещё на 5 Гб:
Что касается приобретения свободного места за плату, то тут Microsoft предлагает вот такие варианты:
Т.е. стоимость 1 Тб свободного места + офисный пакет (Office 365) для всех устройств обойдутся нам всего в 199 рублей. Правда, вероятно, такое предложение ограниченно каким-то промежутком времени.
onedrive
Mega
.
Объём свободного пространства, предоставляемого бесплатно равен 50 Гб. Расширить свободное место можно только за деньги.
На сайте указана цена за 2 Тб = 19.99 евро. Рассчитаем по сегодняшнему курсу: 1 евро = 51.5 руб. Итого за 2 Тб с нас берут около 1029.5 рублей. Делим на 2 и получаем для сравнения примерную стоимость 1 Тб равную 515 руб.
Это чуть дороже, чем на Google и всё равно значительно меньше, чем на дорогом Яндексе, где берут 900 рублей за терабайт:)
Да и тем более при оплате сразу за год получаем скидки.
При всём этом сервис стабилен и удобен, замечаний у меня лично к нему пока не было…
Mega
Эти 5 перечисленных выше онлайн-сервисов для хранения данных я, пожалуй, подчеркну как основные. Для каждого из них есть специальная программа для компьютера и мобильные приложения для Androind, iOS. При помощи этих программ работать с онлайн-дисками очень удобно, где бы вы ни находились.
Как видно, основное и главное отличие всех этих сервисов – доступный объём диска после регистрации.
Почему выделил именно эти сервисы? Главная причина как раз – объём свободного места, который предоставляется бесплатно. В них он вполне хороший. Даже на Яндексе, где бесплатно даётся объём в 10 Гб, можно его расширить до 20 Гб бесплатно, приглашая участников. Ну а в оставшихся трёх начальный объём итак выше:) У Мэйла он самый большой, но стабильность хромает…
Есть, конечно, ещё и другие облачные хранилища, но объём свободного места, предоставляемого бесплатно в них совсем невелик. Например, в Dropbox предоставляют всего 2 Гб бесплатно. Зачем нам такой объём маленький объём, если можно воспользоваться сразу 5-ю сервисами, о которых я выше писал, не так ли? Причём можно сделать в некоторых случаях и по 2 и более аккаунта в нужном облачном сервисе.
Я рекомендую регистрироваться во всех перечисленных сервисах, ведь это бесплатно! Свободного пространства для хранения данных никогда не бывает много. Не умещается всё на одном, распределяете ещё на другие и, думаю, объёма по умолчанию, если просуммировать все 5 сервисов, хватит всем вполне:)
А о том, как пользоваться рассмотренными выше облачными сервисами для хранения данных пойдёт речь в моей следующей серии статей, которая уже сейчас в процессе написания. Просто информации по рассматриваемому вопросу очень много...
Ну а сейчас на этом всё… Прощаюсь с Вами на неделю;) Пока!
Облачные сервисы хранения данных стали настоящей панацеей для всех, кто хотел получать доступ к своим данным с любого устройства из любой точки пространства. Мы с радостью переместили свои данные в облака и успешно пользуемся ими, лишь иногда с опаской читая очередную новость о хаках iCloud и Dropbox. Кому-то изначально не даёт покоя тот факт, что облако контролирует «кто-то», но не сам пользователь. Именно такие энтузиасты сделали OwnCloud.
Что это такое
«Собственное облако» представляет собой не что иное, как персональное хранилище, работающее на собственном веб-сервере или сайте. Главная фишка OwnCloud в том, что он бесплатный и опенсорсный. В целом при наличии вышеупомянутой площадки для размещения пользователю потребуется примерно 5 минут на разворачивание собственного Dropbox-like хранилища, и без хитроумного кодинга - каких-либо специфических знаний не нужно. В довесок пользователь получает доступ к приложениям (текстовые редакторы, списки задач и прочие полезные штуки), которые создают другие участники проекта для собственных нужд.
Хотя ресурсы прекрасно подходят для хранения изображений и звуков нашего приложения, иногда необходимо сохранять информацию и позже загружать ее вновь. Простой пример – работа с таблицей лучших результатов.
Android предлагает различные способы для реализации этого; вы можете использовать общие настройки приложения, маленькую базу данных SQLite и т. д. У всех этих возможностей есть общая черта – они не обрабатывают большие двоичные файлы. Для чего нам это может понадобиться? Хотя мы можем указать системе, чтобы она устанавливала приложение во внешнее хранилище (и таким образом не тратить память внутреннего хранилища), это будет работать только в версиях Android начиная с 2.2. В более старых версиях ОС все данные приложения будут храниться во внутренней памяти устройства. Теоретически мы могли бы включить код нашего приложения в АРК-файл и загружать все ресурсы с сервера на карту памяти SD при первом запуске программы. Многие известные игры для Android так и делают.
Существуют и другие сценарии, в которых нам необходим доступ к карте памяти (которая, в общем-то, является синонимом термина внешнее хранилище для современных устройств). Мы могли бы позволить нашим пользователям создавать собственные уровни во внутреннем редакторе. После создания нам будет необходимо их где-то хранить, и SD-карта прекрасно для этого подходит. Итак, мы не будем использовать необычные механизмы, предлагаемые Android для хранения настроек приложения, и рассмотрим вместо этого механизм реализации чтения и записи файлов на карте SD.
Первое, что нам необходимо сделать, – запросить разрешение на доступ к внешнему хранилищу. Это делается в файле манифеста с помощью уже рассмотренного нами элемента
Далее нужно проверить, доступно ли нам в данный момент внешнее хранилище. Например, при работе с AVD у вас есть возможность обойтись без эмулирования наличия карты памяти – тогда приложение ничего не сможет туда записывать. Другая причина не получать доступ к SD-карте – его занятость другим процессом (например, просмотра его пользователем через USB). Вот так мы проверяем состояние карты памяти;
В результате мы получаем строку. Класс Environment определяет набор констант, одна из которых называется Environment. MEDI AMOUNTED (ее значение – тоже строка). Если вышеуказанный метод возвращает именно эту константу, это значит, что мы имеем полный доступ (чтение и запись) к внешнему хранилищу. Обратите внимание – на самом деле вам необходимо использовать метод equals для сравнения двух строк; оператор равенства в таких случаях не всегда дает верные результаты.
Итак, мы узнали, что обладаем полным доступом к внешнему хранилищу, и теперь нам необходимо получить название его корневой директории. Если нам нужен доступ к определенному файлу, путь к нему необходимо определять относительно корневого каталога. Для этого мы применим другой статический метод класса Environment:
С этого момента мы можем использовать стандартные Java-классы для чтения и записи файлов. Создадим небольшой пример, реализующий запись файла на карту памяти, его чтение, демонстрацию его содержимого в TextView и удаление его с карты. В листинге 4.8 показан исходный код для этого.
Листинг 4.8. Активность ExternalStorageTest package com.bad.ogi с.androi dgames;
Сначала мы проверяем физическую доступность SD-карты (если проверка не удалась, на этом все и заканчивается). Далее получаем корневой каталог хранилища и создаем новый экземпляр объекта File, указывающий на файл, который мы создадим в следующем выражении. Метод writeTextFi 1е использует стандартные Java-классы ввода-вывода для реализации наших целей. Если файл еще не существует, метод создаст его; в ином случае он перепишет существующий. После успешной записи текста в файл на карте мы вновь его считываем оттуда и устанавливаем в качестве содержимого TextVi ew. Финальный шаг – удаление файла из внешнего хранилища. Все действия совершаются с соблюдением необходимых мер предосторожности, благодаря которым сообщения о проблемах также выводятся в TextView. Рисунок 4.11 демонстрирует вывод активности.
Из этого урока необходимо извлечь следующие моменты.
Не работайте с файлами, которые вам не принадлежат. Пользователи очень рассердятся, если вы удалите фотографии с их последней вечеринки.
Всегда проверяйте доступность внешнего хранилища.
Не связывайтесь со служебными файлами во внешнем хранилище. Я серьезно.
Рис. 4.11. Послание от веселого Роджера
Увидев, как легко удалить все файлы из внешнего хранилища, вы должны подумать дважды, создавая и размещая на Android Market приложение, запрашивающее доступ к карте SD, – ведь после инсталляции оно будет иметь полный доступ ко всем файлам.
Обработка звука
Android предлагает простые в применении API для воспроизведения звуковых эффектов и музыкальных файлов – как раз то, что нам нужно для написания игры. Рассмотрим их.
Nafa 647 14.01.10 02:27 Сейчас в теме
Статья полезная.
В работе хранилища действительно очень много неочевидных вещей, поэтому мои дополнения:
1. Если работают несколько программистов, то как вариант,
рабочий день обычно начинается со следущего:
запускаем свою базу в конфигураторе, на корне конфигурации правой кнопкой мышки - получить из хранилища, включаем галочку "рекурсивно", жмем ОК. После этого в конфигурацию получаем все, что наработали другие из хранилища. САМУ БД НЕ ОБНОВЛЯЕМ!!!
Далее желаем "сравнить конфигурацию с конфигурацией БД" - и видим список все изменений сделанных другими программистами группы за предыдущий день. Если есть вопросы по изменениям- обращаемся к тому, кто их делал.
После того, как все разобрали - сохраняем в БД.
Почему не сравнить с конфигурацией хранилища - во-первых чтобы не показывались те объекты, над которым сам работаешь, во-вторых это работает быстрее.
2. В середине дня: срочные изменения (для динамического обновления) отправляем в хранилище сразу. Не срочные - после того, как изменим все связанные объекты. (см. пояснение ниже)
3. В конце дня (а если надо делать полное обновление базы - то перед ним) сдаем в хранилище все что можно.
Это не обязательный порядок, но весьма удобный.
4. Почему не помещаем сразу:
потому что целостность изменений контролируется 1С только там где есть ссылка. То есть если например вы сделали справочник "Автомобили клиентов" и добавили ссылку на него в "расходную накладную", то поместить "Расходную накладную" в хранилище Вы сможете только после (или одновременно) со справочником "Автомобили клиентов". Но если Вы например использовали этот справочник в процедуре общего модуле, которая вызывается при проведении расходной накладной, то этот общий модуль в хранилище спокойно поместиться без помещения справочника. Если после этого другой программист получит этот модуль из хранилища, то в его базе расходные накладные проводиться перестанут. (А если обновить основную базу - то и там перестанут).
И то еще хороший случай - так как возникает просто ошибка. А вот если Вы например изменили тип реквизита в документе со строки на текст и в процедуре общего модуля была проверка Если Реквизит = "1" а стала Если Реквизит = 1 и модуль в хранилище поместили а документ - нет, то ошибки не будет (привет отсутствию контроля типов), а значит у тех кто такой модуль получит документы будет неправильно проводиться, (и хорошо если это будет не основная база). Поэтому изменения лучше сдавать в хранилище "полным пакетом" (все измененные по одной теме объекты), если что-то нужно Вам для другой задачи - можно сразу же захватить по новой или просто, помещая в хранилище, "оставить захваченным".
В этом плане я не совсем понял:
Если программистов много - то изменения каждого нужно отправлять в Хранилище поочереди, ПРЕДВАРИТЕЛЬНО выгрузив у всех работу во внешние файлы с конфигурацией локальной БД и (если объединение делается с разных рабочих мест), не забывая перед каждым объединением ОБНОВЛЯТЬ локальные БД из Хранилища - до последней версии, с присутствующим там изменениями ранее подключенных товарищей..
Странно, не было никаких проблем когда несколько человек сразу изменения помещали, разве что подтормаживало малость. На то захват объектов и предусмотрен, чтобы 2 человека сразу одно и то же не исправили. Причем было замечено, что: если 1 разработчик изменил документ, скажем "Авансовый отчет", а затем второй "получения" не делал, а сразу его захватывает (например, объект только что помещен в хранилище), то 1С это отследит и сама даст ему уже новую - измененную версию. (Так прикольно бывает - смотришь на документ - 5 реквизитов, захватываешь - уже 15).
И зачем работу во внешние файлы выгружать тоже не понял.
4. Создание копий базы для программистов проще делать не 1Совской загрузкой-выгрузкой (т.к. она требует монопольного режима и не шибко шустрая), а восстановлением скульного бекапа или просто копированием базе на скуле.
5. Если нужно добавить новый объект (документ, справочник и пр), то захватите корень конфигурации, добавьте его, добавьте минимум реквизитов (совсем "пустые" объекты не всегда сохраняется), сдайте корень в хранилище (этот объект тоже сдастся при этом) и заберите объект опять. (Чтобы не держать корень долго захваченным - он и другим нужен).
6. Если Вы хотите исправить права доступа на объект, захватили его - а права доступа по прежнему недоступны - захватите соответствующую роль.
7. Поскольку отладку лучше всего вести на максимально свежих данных, то рабочие базы нуждаются в обновлении. Для этого: поместите все изменения в хранилище, отключите базу от хранилища, перепишите в нее на скуле основную базу (из бекапа или просто скопируйте), подключите по-новой.
8. Когда делаем "получить все из хранилища" (п. 1) бывает, что 1с выдает кучу сообщений а потом пишет, что "не удалось" (список объектов при этом меняется). Значит давно не получали изменения. Ничего страшного, жмем ОК по новой и так до тех пор, пока не сработает, как надо.
9. Иногда 1С отказывается сохранять полученные из хранилища изменения, причем сообщение выдает абсолютно невнятное. Виновниками обычно являются "регистры сведений". Выясняем, у какого регистра сведений менялась структура, удаляем из него в своей базе все записи, после этого все обновится как надо.
10. Поскольку рабочие базы делаются из основной, то названия конфигураций совпадают и их легко перепутать и потом начинаются непонятки, когда пользователе говорит что у него в отчете 100 руб, а у Вас - 100,000 руб. Как вариант, добавляем в модуль приложения строчку, проверяющую при запуске программы что это за база и если не основная - выводящую это в заголовке программы 1С (например "РАБОЧАЯ БАЗА ПРОГРАММИСТА ИВАНОВА")
11. Когда база подключена к хранилищу, но при запуске не удалось к нему подключиться по любым причинам, то может выдаться сообщение "Не удалось подключиться, выполнить отключение от хранилища" (а у Вас есть захваченные объекты) - тут ОТВЕЧАЙТЕ "НЕТ". Но если случайно ответить "да" то - не пытайтесь подключиться по новой!!! Сначала сохраните конфигурацию в файл!!! Так как когда подключаемся к хранилищу, то вся конфигурация базы заменяется на конфигурацию хранилища. После этого загружаем изменения из сохраненного файла и работаем дальше.