Копирование таблиц 1С средствами SQL + копирование настроек пользователей (отчетов и форм) для старых версий 1С

Обработки - Универсальные обработки

Быстрое копирование данных из одной базы в другую. Структура копируемой таблицы в источнике и приемнике должна быть идентичной. Копирование настроек пользователей (отчетов и форм) для версий 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 вида: первые уже делают бэкапы, а вторые будут делать.

Обработки

Наименование Файл Версия Размер
Копирование таблиц 1С средствами SQL + копирование настроек пользователей (отчетов и форм) для старых версий 1С:
.epf 24,63Kb
01.06.18
4
.epf 2.0 24,63Kb 4 Скачать

См. также

Комментарии
3. pavel ev (pavelyar) 02.06.18 17:35 Сейчас в теме
Интересно,стоит подумать!
4. Дмитрий Алиулов (freezetron) 04.06.18 23:45 Сейчас в теме
ТекущаяДатаСервера() - нет такой функции
5. Сергей Каберов (Foxes82) 15 05.06.18 13:14 Сейчас в теме
(4) Простите, забыл поменять, это внутренняя функция у нас. Исправлю. Можно заменить на просто "ТекущаяДата()".
6. Сергей Каберов (Foxes82) 15 08.06.18 17:15 Сейчас в теме
Оставьте свое сообщение