Как перенести присоединенные файлы из одной базы в другую 1с
Перейти к содержимому

Как перенести присоединенные файлы из одной базы в другую 1с

  • автор:

 

Перенос данных из одной ИБ в другую

В 1С:Предприятии нет возможности передавать объекты между базами по ссылкам. Другими словами, ссылка на объект из одной информационной базы не может быть распознана в другой информационной базе. Но это не значит, что нельзя передать данные из одной базы в другую.

Любой объект информационной базы — это структурированные данные примитивных типов (строка, число).

Таким образом, для того чтобы организовать обмен между базами, необходимо передавать структурированные данные примитивных типов. Этот процесс можно реализовать подключившись из одной базы к другой через COM-соединение или выгрузить данные из базы источника в промежуточное хранилище(например xml файл), а потом загрузить в базу приемник.

Обмен данными через COM

Если базы 1С расположены на одном компьютере или доступны по локальной сети, то значит данные можно передавать и получать по COM-соединению. Это соединение позволяет обращаться к объектам, создавать объекты, выполнять запросы к другой базе. При получении данных через COM-соединение объекты приходят в виде COM-объектов у которых значения свойств доступны через "точку".

Обмен данными через XML-файл

Из 1С данные можно выгрузить в файл любого типа. Формат-XML позволяет записывать структурированные объекты любой сложности. XML-файл является универсальным передаточным механизмом. Для реализации этого метода потребуется написать две обработки одна для выгрузки из первой базы в XML-файл, другая для загрузки из XML-файла во вторую базу. При работе через COM-соединение, обмен можно организовать с помощью одной внешней обработки. Таким образом передача через XML-файл актуальна когда нет прямого соединения между базами.

Стандартные обмены данными

Во моногих типовых конфигурациях присутствуют стандартные обмены. Например в типовых конфигурациях УТ(Управление торговлей 11) и БП(Бухгалтерия предприятия 3.0) может быть настроен стандартный обмен данными между УТ-11 и БП-3.0. В зависимости от настроек, обмен может работать как через XML-файл так и через COM-соединение.

Обработка "Универсальный обмен данными в формате XML"

Комментарии (0)

Для того чтобы добавить сообщение, необходимо Войти или Зарегистрироваться

Конвертация Данных. Перенос Изображения Номенклатуры

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

(13)
Функция ДобавитьФайл(
Знач ВладелецФайлов,
Знач ИмяБезРасширения,
Знач РасширениеБезТочки = Неопределено,
Знач ВремяИзменения = Неопределено,
Знач ВремяИзмененияУниверсальное = Неопределено,
Знач АдресФайлаВоВременномХранилище,
Знач АдресВременногоХранилищаТекста = "",
Знач Описание = "",
Знач НоваяСсылкаНаФайл = Неопределено) Экспорт

Вот в эту функцию ?

(19)
У меня нет под рукой УНФ, и я не помню, как именно там привязывается изображение к номенклатуре. Т.е. там именно реквизит с типом СправочникСсылка.Файлы или просто список файлов привязанных в элементу справочника Номенклатуры через владельца.
Исходя из этого будет понятно как искать этот присоединенный файл в справочнике УНФ (т.к. никакого GUIDа при выгрузке у вас нет).

Далее необходимо создать ПКО для конвертации из хранилища значений в СправочникСсылка.Файлы. В это правило добавляем параметр [Base64] и ставим галку [Получать из входящих данных].Далее перед выгрузкой пишем:
//Получение данных
Попытка
мДв = Источник.Хранилище.Получить().ПолучитьДвоичныеДанные();
мСтрока64 = Base64Строка(мДв);

ВходящиеДанные.Вставить("Base64" , мСтрока64);
Исключение
Отказ = Истина;
//ВызватьИсключение "Ошибка определения двоичных данных картинки контактного лица ";
КонецПопытки;

Таким образом, мы получим при загрузке сам файл в виде строки.
Далее надо настроить поиск этого самого файла в справочнике Файлы.
После этого при загрузке возможны 2 варианта:
— нашли файл и его надо обновить
— файл к номенклатуре не привязан и надо его добавить

Чтобы не гадать. Я запустил бы мониторинг производительности и сделал бы обе эти операции в УНФ "руками". Протом проанализировал какие функции используются в том или ином случае.
Результат анализа написал бы в После загрузки ПКО.
Как пример вот кусок кода в ПКО для переноса УТ => РАРУС CRM (писал напарник):

//Просто помещение картинки, определение реквизитов
//мBase64 = ПараметрыОбъекта.Получить("Base64");
//мДв = Base64Значение(мBase64);//Двоичные данные
//мКартинка = Новый Картинка(мДв);
//мИзвлеченныйТекст = "";
//СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
////—>
//Объект.Расширение = ПараметрыОбъекта.Получить("РасширениеФайла");
//Объект.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста;
//Объект.ТекстХранилище = Новый ХранилищеЗначения(мИзвлеченныйТекст);

//мТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
//Объект.ФайлХранилище = Новый ХранилищеЗначения(мКартинка, Новый СжатиеДанных(9));
//Объект.ДатаСоздания = ТекущаяДата();
//Запись в объект

мЕстьФайлы = Ложь;
Фильтр = НСтр("ru = ‘Все картинки (*.bmp;*.gif;*.png;*.jpeg;*.dib;*.rle;*.tif;*.jpg;*.ico;*.wmf;*.emf)|*.bmp;*.gif;*.png;*.jpeg;*.dib;*.rle;*.tif;*.jpg;*.ico;*.wmf;*.emf"
+ "|Формат bmp(*.bmp*;*.dib;*.rle)|*.bmp;*.dib;*.rle"
+ "|Формат GIF(*.gif*)|*.gif"
+ "|Формат JPEG(*.jpeg;*.jpg)|*.jpeg;*.jpg"
+ "|Формат PNG(*.png*)|*.png"
+ "|Формат TIFF(*.tif)|*.tif"
+ "|Формат icon(*.ico)|*.ico"
+ "|Формат метафайл(*.wmf;*.emf)|*.wmf;*.emf’");
Если ЗначениеЗаполнено(Объект.ВладелецФайла) Тогда
мЕстьФайлы = ПрисоединенныеФайлы.CRM_ОбъектИмеетФайлыСФильтромПоРасширению(Объект.ВладелецФайла.Ссылка, Фильтр);
КонецЕсли;
мОшибка = Ложь;
мТекстОшибки = "";
Если Не мЕстьФайлы Тогда
Попытка
Если ЗначениеЗаполнено(Объект.ВладелецФайла) Тогда
//Добавим файл и пропишем его путь
мBase64 = ПараметрыОбъекта.Получить("Base64");
мРасширениеФайла = ПараметрыОбъекта.Получить("РасширениеФайла");
мДв = Base64Значение(мBase64);//Двоичные данные
мВремяИзменения = ТекущаяДата();
СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
ИзвлеченныйТекст = "";

//0. Поместим файл во временное хранилище
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(мДв);

//I. Добавление файла
мПрисоединенныйФайл = ПрисоединенныеФайлы.ДобавитьФайл(
Объект.ВладелецФайла.Ссылка,
Объект.Наименование,
мРасширениеФайла,
мВремяИзменения,
Неопределено,
АдресФайлаВоВременномХранилище,
"");
//todo непонятно как в этом всем фигурируют наши двоичные данные
Если мПрисоединенныйФайл = Неопределено Тогда
Иначе
//II. Заполнение информации о файле
Объект.ПутьКФайлу = мПрисоединенныйФайл.ПутьКФайлу;
Объект.Том = мПрисоединенныйФайл.Том;
Объект.Размер = мПрисоединенныйФайл.Размер;
Объект.Расширение = мПрисоединенныйФайл.Расширение;
Объект.ТипХраненияФайла = мПрисоединенныйФайл.ТипХраненияФайла;
Объект.СтатусИзвлеченияТекста = СтатусИзвлеченияТекста;
Объект.ТекстХранилище = Новый ХранилищеЗначения(ИзвлеченныйТекст);
КонецЕсли;
КонецЕсли;
Исключение
ВызватьИсключение "Ошибка обработки загруженной фотографии контактного лица"+ОписаниеОшибки();
КонецПопытки;
КонецЕсли;

Итак в ПКО Номенклатуры в обработчике После выгрузки пишу:
Если ПараметрыОбъекта <> Неопределено Тогда
мBase64 = ПараметрыОбъекта.Получить("Base64");
мДв = Base64Значение(мBase64);//Двоичные данные
ВладелецФайла = Ссылка;
АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(мДв);
ИмяБезРасширения = "ФотоНоменклатуры";
РасширениеБезТочки = "jpg";
ВремяИзменения = ТекущаяДата();
ВремяИзмененияУниверсальное = ТекущаяДата();
Размер = 100;
АдресВременногоХранилищаТекста = "";

ЭтоВебКлиент = Ложь;
Пользователь = Неопределено;
Комментарий = "";
ЗаписатьВИсторию = Ложь;
Кодировка = Неопределено;
///////////////////////////////////Функция из БСП
ЭлементФайл = FileOperationsServerCall.CreateFileWithVersion(
ВладелецФайла,
ИмяБезРасширения,
РасширениеБезТочки,
ВремяИзменения,
ВремяИзмененияУниверсальное,
Размер,
АдресВременногоХранилищаФайла,
АдресВременногоХранилищаТекста,
False); // this is not web client
КонецЕсли;
Отказ = Истина;

Вся номенклатура сначала загружена без картинок, то есть она существует в базе. При попытке загрузить её уже с картинками выскакивает ошибка при записи номенклатуры как бы объект(номенклатура) несоответвует (изменен)("операция не может быть выполнена из-за несоответствия версии") , оно ясно что он изменен в той функции из бсп, но я же в конце пишу отказ . почему все равно производится попытка записи.

(26) Я "Перед выгрузкой" сделал как вы говорили. И на "Перед загрузкой" получил двоичные данные все как положено.

В общем с задачей справился, благодаря Вам! Создал с помощью конвертации элементы справочника "файлы", и отделно обработкой привязал их к номенклатуре! Все получилось! Еще раз спасибо Вам большое, без Вас я б к этому решению не пришол бы сам..

XmlDataExchange

При ведении нескольких рабочих баз 1С порой возникает необходимость обмена данными между ними. Существует 2 способа переноса данных:

  1. Перенос данных с использованием правил обмена и обработки «Обмен данными XML». Правила обмена создаются с помощью конфигурации 1С:Конвертация данных.
  2. Перенос данных между похожими информационными базами обработкой «Выгрузка и загрузка данных XML».

Рассмотрим второй вариант, т.е. выгрузку и загрузку данных из/в конфигураций, в которых имеются одни и те же (идентичные), нужные нам объекты. Для этого воспользуемся внешней обработкой «Выгрузка и загрузка данных XML», которую можно скачать здесь.

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

Рассмотрим пример с переносом данных этой обработкой. Предположим, нужно перенести документы «Платёжное поручение входящее» и «Платёжное поручение исходящее». Решение этой задачи будет следующим.

Открываем внешнюю обработку «Выгрузка и загрузка данных XML» через главное меню: Файл ? Открыть… На вкладке «Выгрузка» указываем файл XML, в который мы будем сохранять данные.

image001

Затем нужно указать период, за который будем выгружать объекты данных из базы 1С и сами объекты. Нужные нам для выгрузки документы помечаем галочкой в поле структуры объектов конфигурации в столбце «Данные для выгрузки». Если в выгружаемых документах есть ссылки на элементы справочников, которых нет в другой конфигурации, то имеет смысл проставить галочки в столбце «При необходимости», чтобы эти элементы тоже выгрузились вместе с документами.

image003

Теперь на данном шаге нужно решить, выгружать ли вместе с документами их движения по регистрам или перепровести эти документы уже в другой базе? Для перепроведения выгружаемых документов уже в другой базе можно воспользоваться обработкой «Групповая обработка справочников и документов». Если алгоритмы проведения в данных информационных базах чем-то отличаются, то галочку напротив «Выгружать с документом все его движения» ставить не следует.

image005

 

Вот и всё, настройка выгрузки закончена, здесь всё просто! Нажимаем кнопку «Выгрузить данные» и ждём пока данные сохраняться в файл XML. Для более сложных выгрузок можно задавать отбор на выгружаемые объекты не только по периоду.

После выгрузки переходим во вторую базу 1С и открываем там эту же обработку. Переходим на вкладку «Загрузка» и указываем здесь тот же файл XML, в который мы выгрузили данные.

image007

На этой вкладке ставим одну единственную галочку напротив «Продолжить загрузку объектов в случае возникновения ошибки» и нажимаем на кнопку «Загрузить данные». Остальные функции, например, использование итогов мы не рассматриваем, хотя эта функция может значительно ускорить загрузку объектов (записей по регистрам).

Обработку «Выгрузка и загрузка данных XML» (версия 2.1.8) для платформы 1С:Предприятие v8.3 (тонкий клиент) можно скачать здесь.

Обработку «Выгрузка и загрузка данных XML» (версия 2.1.6) для платформы 1С:Предприятие v8.2 (толстый клиент) можно скачать здесь.

Перенос данных между 1С 8.3 Бухгалтерия на примере справочников

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

Так же данные можно переносить при помощи загрузки из Excel и табличных документов. Во многих конфигурациях 1С 8.3 есть типовой функционал для настройки синхронизации данных между различными конфигурациями и бесшовная интеграция с 1С Документооборот.

Но когда данные необходимо перенести данные между абсолютно идентичными конфигурациями, можно упростить себе задачу и воспользоваться стандартной обработкой выгрузки и загрузки через XML. Обратите внимание, что такой способ, как и конвертация данных сопоставляет между собой объекты по уникальному идентификатору (GUID), а не по наименованию.

Скачать данную обработку можно на диске ИТС, либо по ссылкам:

Она является универсальной и подойдёт для любой конфигурации.

Рассмотрим пример выгрузки справочника «Номенклатура» из одной информационной базы 1С 8.3 Бухгалтерия 3.0 в другую. Обязательным условием будет отбор по родителю (группе) «Деревообработка».

Выгрузка данных из 1С в XML

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

Откройте обработку выгрузки и загрузки данных XML (Ctrl+O).

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

выгрузка в файл

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

Получите понятные самоучители по 1С бесплатно:

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

Колонка «Выгружать при необходимости» означает, необходимо ли перегружать данный объект, если на него ссылается реквизит перегружаемого нами справочника. Например, позиция перегружаемой вами номенклатуры имеет такую единицу измерения, которой нет в базе – приемнике. Если напротив справочника с единицами измерения будет установлен флаг в колонке «Выгружать при необходимости», создастся новая позиция. В противном случае в качестве значения реквизита будет надпись «<Объект не найден>» и его уникальный идентификатор.

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

выгрузка только номенклатуры без отбора

В данном примере нужно отобрать только ту номенклатуру, которая находится в папке «Деревообработка».

Аналогичная обработка для 8.2 позволяет в удобной форме устанавливать отборы для каждого объекта конфигурации. В 8.3, к сожалению, такого функционала нет. Одним из вариантов выхода в данной ситуации будет отбор необходимых позиций на вкладке «Дополнительные объекты для выгрузки».

Добавить объекты здесь можно как вручную (кнопка «Добавить»), так и запросом («Добавить запросом…»). При большом их количестве предпочтительнее второй вариант.

выгрузка из 1С с помощью запроса

В данном случае запрос будет следующим. Заполните параметры, выполните запрос, проверив данные, и нажмите на кнопку «Выбрать результат».

просмотр результат запроса

После того, как вы указали все необходимые объекты и дополнительные элементы для выгрузки, нажмите на кнопку «Выгрузить данные». Они попадут в XML файл, имя и путь нахождения которого указывали ранее. Результаты данной операции отобразятся в сообщениях.

выгрузка данных

В данном примере необходимо было выгрузить только 3 позиции, но выгрузилось пять. Всё потому, что напротив справочника «Номенклатура» в колонке «Выгружать при необходимости» был установлен флаг. Вместе с нужными позициями перегрузились их родители.

Загрузка справочника из XML

После успешной выгрузки данных из конфигурации – источника в XML файл, откройте базу – приемник. Структура объектов и их реквизитов должны совпадать между собой. В данном случае перенос осуществляется между двумя типовыми конфигурациями 1С:Бухгалтерия 3.0.

Откройте обработку в базе – приемнике. Данная обработка используется как для выгрузки, так и для загрузки данных. Перейдите на вкладку «Загрузить» и укажите путь к XML файлу, в который ранее были выгружены данные. После этого нажмите на кнопку «Загрузить данные».

выбор файла для загрузки

Результат загрузки отобразится в сообщениях. В нашем случае всё прошло успешно.

успешная загрузка справочника

Справочник «Номенклатура» в базе – приемнике не был заполнен. Теперь в нем пять элементов: три номенклатурных позиции и две группы.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *