Как скопировать регистр сведений из одной базы в другую 1с
При ведении нескольких рабочих баз 1С порой возникает необходимость обмена данными между ними. Существует 2 способа переноса данных:
- Перенос данных с использованием правил обмена и обработки «Обмен данными XML». Правила обмена создаются с помощью конфигурации 1С:Конвертация данных.
- Перенос данных между похожими информационными базами обработкой «Выгрузка и загрузка данных XML».
Рассмотрим второй вариант, т.е. выгрузку и загрузку данных из/в конфигураций, в которых имеются одни и те же (идентичные), нужные нам объекты. Для этого воспользуемся внешней обработкой «Выгрузка и загрузка данных XML», которую можно скачать здесь.
Условие использования этой обработки следующее: В информационной базе, из которой выгружаются данные, должны присутствовать такие же объекты и с такими же реквизитами (наименование и тип данных), как и в базе, в которую производится загрузка данных.
Рассмотрим пример с переносом данных этой обработкой. Предположим, нужно перенести документы «Платёжное поручение входящее» и «Платёжное поручение исходящее». Решение этой задачи будет следующим.
Открываем внешнюю обработку «Выгрузка и загрузка данных XML» через главное меню: Файл ? Открыть… На вкладке «Выгрузка» указываем файл XML, в который мы будем сохранять данные.
Затем нужно указать период, за который будем выгружать объекты данных из базы 1С и сами объекты. Нужные нам для выгрузки документы помечаем галочкой в поле структуры объектов конфигурации в столбце «Данные для выгрузки». Если в выгружаемых документах есть ссылки на элементы справочников, которых нет в другой конфигурации, то имеет смысл проставить галочки в столбце «При необходимости», чтобы эти элементы тоже выгрузились вместе с документами.
Теперь на данном шаге нужно решить, выгружать ли вместе с документами их движения по регистрам или перепровести эти документы уже в другой базе? Для перепроведения выгружаемых документов уже в другой базе можно воспользоваться обработкой «Групповая обработка справочников и документов». Если алгоритмы проведения в данных информационных базах чем-то отличаются, то галочку напротив «Выгружать с документом все его движения» ставить не следует.
Вот и всё, настройка выгрузки закончена, здесь всё просто! Нажимаем кнопку «Выгрузить данные» и ждём пока данные сохраняться в файл XML. Для более сложных выгрузок можно задавать отбор на выгружаемые объекты не только по периоду.
После выгрузки переходим во вторую базу 1С и открываем там эту же обработку. Переходим на вкладку «Загрузка» и указываем здесь тот же файл XML, в который мы выгрузили данные.
На этой вкладке ставим одну единственную галочку напротив «Продолжить загрузку объектов в случае возникновения ошибки» и нажимаем на кнопку «Загрузить данные». Остальные функции, например, использование итогов мы не рассматриваем, хотя эта функция может значительно ускорить загрузку объектов (записей по регистрам).
Обработку «Выгрузка и загрузка данных XML» (версия 2.1.8) для платформы 1С:Предприятие v8.3 (тонкий клиент) можно скачать здесь.
Обработку «Выгрузка и загрузка данных XML» (версия 2.1.6) для платформы 1С:Предприятие v8.2 (толстый клиент) можно скачать здесь.
Хочу перенести справочники (сотрудников, физлиц и др.) из БП 1.6 в УПП 1.2 (релизы последние на сегодня). Захожу в УПП, открываю обработку и пытаюсь подключиться к БП. Путь к базе, юзера, пароль (его нет) задаю по примеру, но подключения нет. Хорошо было бы не вписывать путь к базе, а выбирать в диалоге файл базы.
Просто. Элегантно. Универсально. И главное - РАБОТАЕТ. Интерфейс понятен даже для особо одаренных (это я о себе).
Ошибка соединения: : Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса
Форма.Форма(16)>Спасибо огромное, громадное. Управление авторанспортом и Бух на ура! Громадное спасибо. И Код отрыт. Просто класс.
Ребяты. Внимание. При перегрузке элементов не устанавливается GUID такой-же, как в базе источнике. НЕ КУЛЬНО. Если в дальнейшем захотите грузануть через универсальную обработку ВыгрузкаЗагрузкаДанныхXML получите задвоения или ошибку. Надеюсь разработчики учтут и доработают. За идею спасибо. скоро свою штучку выложу.
: Ошибка при вызове метода контекста (Записать): Запись с такими ключевыми полями существует! : (Регистр сведений: Соответствие объектов для обмена; Номер строки: 2)
НаборЗаписей.Записать();
по причине:
Запись с такими ключевыми полями существует! : (Регистр сведений: Соответствие объектов для обмена; Номер строки: 2)
если в процедуру СкопироватьCOMРеквизит
добавить в попытку код
ИначеЕсли Строка(ТипЗначения) ="ПланВидовХарактеристик.СвойстваОбъектов" Тогда
РеквизитПолучатель = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду(РеквизитИсточник.Ссылка.Code);
а в процедуру ЗагрузитьПростойСправочник
в блок Если ЕстьВладелец
добавить код
Если Строка(ТипЗначения_) ="ПланВидовХарактеристик.СвойстваОбъектов" Тогда
ТекущийЭлементСправочника.Владелец = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду(Элемент.Ссылка.Владелец.Code);
КонецЕсли;
то можно будет перебросать Значения свойств объектов (как справочник, так и затем регистр)
(конечно, если предварительно эти самые свойства в Плане видов характеристик с правильными кодами создать)
если перекинуть справочник "Категории объектов", то надо предварительно зайти в него и выставить правильное "Назначение", иначе не перебросится регистр сведений "Категории объектов".
+ не отрабатывает отжать все флаги - приходится их отжимать руцями
+ не сохраняет историю полей подключения
+ доработать под использование реквизитов План счетов
а так большой респект! при начале внедрения пришлось менять экстремально валюту учета в УТП как раз после сверки справочников контрагентов и договоров + заполнения базовых регистров. Сэкономила кучу времени! и не пришлось ваять правила обмена для универсальной xml обменялки.
Быстрое копирование данных из одной базы в другую. Структура копируемой таблицы в источнике и приемнике должна быть идентичной. Копирование настроек пользователей (отчетов и форм) для версий 1С, у которых эти данные хранятся в старой таблице [Files].
Изначально задумывалась, как обработка для копирования настроек пользователей. Иногда они пропадают и требовалось восстановить их из копии или от другого пользователя, иногда просто требуется одному пользователю скопировать настройки другого (варианты отчетов). База старая УТ 10.2, движок эволюционировал от 8.0 до 8.2, большинство обработок для копирования не подходит, потому что данные настроек хранятся в таблице [Files], а не в таблицах [_SystemSettings] и [_RepSettings]. Данной обработкой они копируются нормально.
ВАЖНО: перед копированием или восстановлением настроек все сеансы 1С под пользователем, которому копируете настройки, должны быть ЗАКРЫТЫ. Т.к. настройки сохраняются в таблицу при закрытии программы. Т.е. вы копируете нужные настройки, а при закрытии они будут снова затерты текущими настройками пользователя.
После появилась идея сделать обработку для быстрого копирования вообще любых таблиц, которая и была воплощена здесь. Копирование возможно полное (если поставить галку "Очищать таблицу приемник") и частичное (без этой галки). Частичное копирование происходит по следующим правилам:
- Справочники, документы и другие "ссылочные" типы данных проверяются по ссылке. Если ссылка на объект в базе приемнике есть, то ни сам элемент ни его табличные части перенесены не будут.
- Регистры накопления и сведений, подчиненные регистратору, примерно по такому же принципу. Если регистратор уже есть в таблице приемнике, то он не выгружается.
- Регистры сведений независимые связываются по измерениям и периоду, если он участвует в ключах.
- Журналы документов переносятся вместе с документом, если он в них регистрируется.
ВАЖНО: после копирования регистров необходимо запускать пересчет итогов, да и реиндексацию желательно тоже. Т.к. перенос выполняется непосредственно SQL-ем и никакие сервисные алгоритмы 1С не выполняются.
Структура копируемой таблицы в источнике и приемнике должна быть идентичной. Т.е. называться так же в конфигураторе (например справочник "Номенклатура"), иметь такое же количество полей с такими же типами данных и то же самое касается табличных частей.
Тестировалась на SQL 2008 SP3, на других версиях не знаю взлетит или нет.
Создана обработка на платформе 1С 8.2.19.106, в другие можно конвертировать.
Скорость переноса примерно такая: 6,5 млн. строк за 10 мин., переносился регистр сведений независимый с 3-мя измерениями и 3-мя ресурсами, с одного сервера SQL на другой, связанных между собой сетью 1 Гбит/с.
v2.0
1. Добавил копирование записей журналов документов.
2. Копирование одного объекта метаданных выполняется в транзакции, чтоб перенести по нему все или ничего.
3. При переносе независимых регистров сведений кое-что поправил, связь по периоду не всегда использовалась, когда надо.
4. При копировании регистров, подчиненных регистратору, с большим количеством записей кое-что оптимизировал. Выбираю отдельную таблицу с ключами сгруппированную и левым соединением с ней проверяю надо копировать или нет.
5. Если копирование не удалось показывать текст запроса, который выполнялся, для отладки через консоль SQL.
6. Убрал OPENQUERY, на связанном сервере можно напрямую обращаться.
P.S. Код в обработке открыт. В написании запросов непосредственно к SQL я новичок, так что если у гуру в этом вопросе есть дельные советы, как ускорить или сделать что-то более надежным - прошу в комментарии.
Для тех, кто тоже начинающий в этом деле, можно посмотреть как реализованы те или иные моменты. Можно доработать под себя, вплоть до указания отдельных элементов для копирования или прикрутить отборы.
P.S.S. Все действия с базами 1С не через стандартные механизмы работы платформы Вы выполняете на свой страх и риск, учтите это. Помните, что программисты делятся на 2 вида: первые уже делают бэкапы, а вторые будут делать.
В данной публикации приведен пример создания простого правила переноса/конвертации объектов. Пример демонстрирует один из вариантов переноса хозрасчетного регистра из бухгалтерии 2 в управление торговлей 11 с созданием в последней документов "Ввод остатков" по каждому виду операции с разбивкой по счетам.
Задача этого правила обмена перенести остатки по взаиморасчетам из БП 2 в УТ11.
Поэтапное создание правила обмена с помощью конфигурации "Конвертация данных"(метаданные должны быть загружены ):
1) Создаем правило выгрузки объекта для этого переходим на закладку "Правила выгрузки данных", жмем добавить. В появившемся окне выбираем объект выборки у нас это будет хозрасчетный регистр. Способ выборки меняем на произвольный алгоритм.
2) Переходим к написанию самого кода т.к. в УТ нет хозрасчетного регистра то мы должны его преобразовать. Сначала нам нужен запрос который по нашим параметрам будет возвращать остатки по взаиморасчетам. В обработчике события "Перед обработкой" пишем следующий запрос:
ТекстЗапроса = " ВЫБРАТЬ
| ХозрасчетныйОстатки.Счет,
| ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
| ЕСТЬNULL(СУММА(ХозрасчетныйОстатки.СуммаОстатокДт),0) КАК СуммаОстатокДт,
| ЕСТЬNULL(СУММА(ХозрасчетныйОстатки.СуммаОстатокКт),0) КАК СуммаОстатокКт,
| МАКСИМУМ(ХозрасчетныйОстатки.Субконто2.Дата) КАК ДатаРасчетногоДокумента,
| МАКСИМУМ(ХозрасчетныйОстатки.Субконто2.Номер) КАК НомерРасчетногоДокумента
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = &счет, ,) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Субконто1.Родитель <> &группа и
| ХозрасчетныйОстатки.Субконто1.Родитель <> &группа1
|СГРУППИРОВАТЬ ПО
| ХозрасчетныйОстатки.Счет,
| ХозрасчетныйОстатки.Субконто1,
| ХозрасчетныйОстатки.Субконто2
|УПОРЯДОЧИТЬ ПО
| Субконто1
|АВТОУПОРЯДОЧИВАНИЕ";
В моей задача стояли ограничения на группы контрагентов по которым выгружаются взаиморасчеты.
Определяем значения переменных которые будут использоваться в дальнейшем.
НаДату = дата('20130101');
ТД = ТекущаяДата();
группа = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели");
группа1 = Справочники.Контрагенты.НайтиПоНаименованию("Возвраты от ФИЗЛИЦ");
Создаем таблицу которую в последствии будем передавать в правило конвертации значений.
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Контрагент");
ТЗ.Колонки.Добавить("Сумма");
ТЗ.Колонки.Добавить("СуммаРЕГЛ");
ТЗ.Колонки.Добавить("РасчетныйДокумент");
ТЗ.Колонки.Добавить("ДатаРасчетногоДокумента");
ТЗ.Колонки.Добавить("НомерРасчетногоДокумента");
ТЗ.Колонки.Добавить("Партнер");
ТЗ.Колонки.Добавить("ВалютаВзаиморасчетов");
ТЗ.Колонки.Добавить("ДатаПлатежа");
Устанавливаем параметры, вызываем запрос, заполняем таблицу вызываем правило конвертации.
запрос = новый запрос(ТекстЗапроса);
запрос.УстановитьПараметр("группа",группа);запрос.УстановитьПараметр("группа1",группа1);
запрос.УстановитьПараметр("НаДату",НаДату);
запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);//76.05
Выборка = запрос.Выполнить().Выбрать();
ТЗ.очистить();
Пока Выборка.Следующий() Цикл
если Выборка.СуммаОстатокКТ = 0 или Выборка.СуммаОстатокКТ = "" тогда
продолжить;
конецесли;
если Выборка.СуммаОстатокКТ < 0тогда
сообщить(""+Выборка.Субконто1+" отрицательное значение "+Выборка.СуммаОстатокКТ);
конецесли;
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Контрагент = Выборка.Субконто1;
СтрокаТЗ.сумма = Выборка.СуммаОстатокКТ;//Выборка.СуммаОстатокКт;
СтрокаТЗ.суммаРегл = Выборка.СуммаОстатокКТ;//Выборка.СуммаОстатокКт;
СтрокаТЗ.ДатаРасчетногоДокумента =Выборка.ДатаРасчетногоДокумента;
СтрокаТЗ.НомерРасчетногоДокумента = Выборка.НомерРасчетногоДокумента;
СтрокаТЗ.ДатаПлатежа = ТД;
КонецЦикла;
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Дата", ТекущаяДата());
ИсходящиеДанные.Вставить("РасчетыСПартнерами", ТЗ);
ИсходящиеДанные.Вставить("ТипОперации", "ОстаткиЗадолженностиПередПоставщиками");
ИсходящиеДанные.Вставить("Комментарий", "Сформировано по кредиту счета 76.05");
сообщить("76.05 КРЕДИТ начало");
ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "ВводОстатковПоВзаиморасчетам_7605Кредит");
Аналогично проделываем ту же операцию и для остальных необходимых счетов(их описание как и готовое правило имеется во вложении).
3) Переходим к созданию правил конвертации объектов, для этого открываем закладку "Правила конвертации объектов". Добавим туда новое правило с именем "ВводОстатковПоВзаиморасчетам_7605Кредит" , объект источник оставим пустым, объект приемник установим документ "Ввод остатков", на вкладке настройки уберем флаг "Искать объект приемника по внутреннему идентификатору объекта источника".
В обработчике события "Перед загрузкой" напишем следующий код:
В обработчике события "После загрузки" напишем:
он выполнит алгоритм со следующим содержанием:
валюта = Константы.ВалютаРегламентированногоУчета.Получить();
объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
объект.организация=параметры.порганизация;
для каждого стр из объект.расчетыспартнерами цикл
Стр.РасчетныйДокумент = Справочники.ДоговорыКонтрагентов.пустаяссылка();
Стр.ВалютаВзаиморасчетов = валюта;
если ЗначениеЗаполнено(стр.контрагент.партнер) тогда
стр.партнер = стр.контрагент.партнер;
иначе
парт = Справочники.Партнеры.НайтиПоНаименованию(стр.контрагент.Наименование);
если парт <> Неопределено и парт <> Справочники.Партнеры.пустаяссылка() тогда
стр.партнер = парт;
контрагент = Справочники.Контрагенты.НайтиПоНаименованию(стр.контрагент.Наименование);
объект2 = контрагент.ПолучитьОбъект();
объект2.Партнер = парт;
объект2.Записать();
иначе
выполнить(алгоритмы.ДобавитьПартнера);
конецесли;
Этот алгоритм будет исполнен на стороне приемника(БП). Кроме переноса остатков по взаиморасчетам стоит задача переноса контрагентов, но в УТ используются партнеры поэтому после формирования документа мы проверяем все ли контрагенты и партнеры имеются в базе приемнике, если по какой то причине их нет то мы их добавляем.
Добавление контрагентов осуществит правило конвертации справочника "Контрагенты" его можно создать точно также как и предыдущее правило, но разрешить системе самой сопоставить необходимые поля.
Для партнеров был создан алгоритм который выполняется на стороне приемника.
Для того чтобы выполнить алгоритм на стороне приемника, надо в правом верхнем углу окна алгоритма(при его редактировании) проставить флаг "Используется при загрузке".
Ниже приведен код алгоритма "Добавить партнера":
нПартнер = Справочники.Партнеры.СоздатьЭлемент();
нПартнер.Наименование =стр.контрагент.наименование;
нПартнер.Комментарий = "Создан при загрузке из БП";
нПартнер.НаименованиеПолное =стр.контрагент.НаименованиеПолное;
нПартнер.Поставщик = ?(найти(стр.контрагент.ДополнительнаяИнформация,"Поставщик")>0,истина,ложь);
нПартнер.Клиент = ?(найти(стр.контрагент.ДополнительнаяИнформация,"Клиент")>0,истина,ложь);
ПрочиеОтношения = ?(найти(стр.контрагент.ДополнительнаяИнформация,"Прочее")>0,истина,ложь);
нпартнер.Записать();
стр.партнер = нпартнер.ссылка;
контрагент = Справочники.Контрагенты.НайтиПоНаименованию(стр.контрагент.Наименование);
объект2 = контрагент.ПолучитьОбъект();
объект2.Партнер = нпартнер.ссылка;
объект2.Записать();
Возвращаемся обратно к правилу конвертации объекта. Теперь нам надо установить соответствия полей источника и приемника, это можно было сделать непосредственно перед написанием кода. Для того чтобы сопоставить поля в нижней табличной части имеется кнопка вызова мастера "Синхронизация свойств". В этом мастере мы можем либо сопоставить поля, либо оставить как без источника, так и без приемника. В нашем случае все поля и ТЧ мы оставляем без источника.
Ранее я уже приводил пример обработки переноса бухгалтерских проводок из одной базы в другую. Теперь выкладываю обработку для полного переноса данных - кому-нибудь да пригодится.
Основной плюс обработки - ее универсальность, т.е. работать будет на любой конфигурации, никаких правил переноса создавать не надо. 1С сама знает, по каким правилам записывать объекты и, соответственно, считывать.
- Константы
- Справочники
- Документы
- Регистры сведений
- Регистры накопления
- Регистры бухгалтерии
- Регистры расчета
- Планы видов характеристик
- Планы видов расчета
- Планы счетов
т.е. практически все, что нужно для нормальной работы. Перенос происходит через промежуточные xml-файлы, для каждого типа объекта - свой файл. Это сделано для того, чтобы не произошло переполнения оперативной памяти при переносе больших баз.
(В частности у меня при переносе данных в бухгалтерии память "наелась" на регистре сведений "Адресный классификатор", поэтому я отключил его перенос. Слава богу, его можно заполнить в любое время).
При выгрузке данных помечаем объекты, которые хотим перенести, указываем каталог выгрузки:
При загрузке в базу-приемник (должна иметь идентичную конфигурацию с базой-источником) также выбираем каталог загрузки и после обновления видим загружаемые файлы, из которых можем выбрать нужные:
Для того, чтобы объекты записывались в базу в любом случае, используется конструкция:
соответственно в модулях таких объектов в процедуре ПередЗаписью() должно быть что-то типа:
чтобы пропустить возможные механизмы проверки на заполненность и/или корректность реквизитов объекта и т.п. В стандартных процедурах это уже, как правило, предусмотрено (это обеспечивает запись объектов при переносе из распределенных баз), для "своих" объектов это необходимо учесть.
Проверено на Бухгалтерии 2.0 последнего релиза (2.0.49.15).
05.09.2013 - перезалил файл, поскольку при переносе данных в УТ 10 произошла ошибка, связанная с тем, что одно из измерений (или реквизитов) в одном из регистров сведений называлось "Регистр".
Читайте также: