Перенос данных между двумя одинаковыми конфигурациями 1С часто кажется тривиальной задачей. Мы ожидаем, что выгрузка через стандартную обработку Выгрузка и загрузка данных XML решит все проблемы в один клик. Однако на практике разработчики сталкиваются с неочевидным поведением платформы и прикладных решений: «пропадают» пользователи, очищаются пароли, перенесенные документы не отображаются в журналах, а попытка свернуть базу стандартными средствами приводит к падению СУБД из-за нехватки памяти.
В этой статье мы подробно разберем три ключевые проблемы, возникшие при частичном переносе данных в конфигурации «1С:Управление торговлей 11» (на платформе 1С:Предприятие 8.3), проанализируем причины их возникновения и найдем оптимальные технические решения.
Выясним причину происходящего. При использовании обработки Выгрузка и загрузка данных XML переносятся только элементы справочника Пользователи. Но в платформе 1С:Предприятие учетные записи пользователей разделены на две сущности:
v8users) или в специальном файле базы данных. Доступ к ним осуществляется только через платформенные методы.Когда мы переносим справочник XML-выгрузкой, элементы справочника успешно загружаются в новую базу. Однако на уровне платформы новые пользователи ИБ автоматически не создаются. Из-за этого при открытии карточки пользователя флаг «Вход в программу разрешен» оказывается снят, а пароли «слетают», поскольку физически отсутствуют хэши паролей в системной таблице.
Когда вы вручную ставите галочку разрешения входа и записываете карточку, срабатывают механизмы Библиотеки стандартных подсистем (БСП). Система программно создает пользователя ИБ и связывает его с элементом справочника Пользователи.
Решение проблемы:
Для корректного переноса пользователей вместе с паролями стандартная XML-выгрузка не подходит. Рассмотрим два альтернативных варианта решения этой задачи:
ПользовательИнформационнойБазы.Проанализируем ситуацию. В современных конфигурациях 1С (УТ 11, Комплексная автоматизация, ERP) для оптимизации работы динамических списков используется специальный механизм. Вместо того чтобы при открытии общего журнала документов (например, «Внутренние документы все») делать тяжелые запросы к множеству таблиц различных документов, система обращается к одному вспомогательному регистру сведений — «Реестр документов».
Именно этот регистр выступает в роли единого хранилища облегченных данных для отображения списков. Когда мы записываем или проводим документ в обычном режиме, подсистема БСП автоматически делает запись в регистр Реестр документов.
Однако при переносе данных через обработку Выгрузка и загрузка данных XML запись объектов происходит в специальном режиме: Загрузка = Истина. В этом режиме платформа отключает выполнение всех стандартных обработчиков событий (таких как ПриЗаписи, ПередЗаписью, ОбработкаПроведения), чтобы обеспечить максимальную скорость загрузки и избежать конфликтов ссылочной целостности. Как результат — документы физически перенесены в базу данных, но записи в регистре Реестр документов для них отсутствуют. Из-за этого документы видны в списке «Все функции» (где отображается прямая таблица документа), но полностью отсутствуют в стандартных журналах.
Решение проблемы:
Перепроводить все документы вручную или программно — это неэффективный путь, который на больших базах может занять десятки часов, а также изменить движения документов в регистрах накопления и бухгалтерии. Нам нужно заполнить исключительно регистр Реестр документов.
Рассмотрим оптимальный программный способ восстановления видимости документов без их фактического перепроведения. Для этого мы напишем простую обработку, которая выберет документы определенного типа за нужный период и вызовет встроенный метод БСП для их регистрации в реестре.
Разберем пример кода для заполнения реестра:
Процедура ЗаполнитьРеестрДокументовНаСервере()
// Выберем все документы "Перемещение товаров" за нужный период
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПеремещениеТоваров.Ссылка КАК Ссылка
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| ПеремещениеТоваров.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(Объект.ПериодРегистрации.ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(Объект.ПериодРегистрации.ДатаОкончания));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Используем встроенный метод менеджера регистра сведений "РеестрДокументов"
// Этот метод сформирует записи в регистре без изменения самого документа
Отказ = Ложь;
ДополнительныеСвойства = Новый Структура;
РегистрыСведений.РеестрДокументов.ЗаписатьДанныеДокумента(
ВыборкаДетальныеЗаписи.Ссылка,
ДополнительныеСвойства,
Отказ
);
КонецЦикла;
КонецПроцедуры
Этот способ позволяет мгновенно «вернуть» перенесенные документы в журналы без изменения их движений и перезаписи самих объектов.
Выясним причину проблемы. При попытке свернуть базу размером около 7 Гб стандартными механизмами и последующем удалении помеченных объектов система 1С начинает проверять ссылочную целостность для сотен тысяч документов. SQL-сервер пытается удержать в оперативной памяти гигантские таблицы блокировок и временные данные транзакций, что приводит к переполнению памяти СУБД и падению процесса с ошибкой Нехватка памяти.
Вместо долгого удаления старых документов стандартными методами или написания сложных обработок очистки, мы можем применить альтернативный, гораздо более быстрый и изящный метод свертки — использование распределенной информационной базы (РИБ).
Разберем этот метод по шагам:
Для отключения базы от РИБ запустим базу-приемник в режиме 1С:Предприятие под правами администратора и выполним следующий код:
Процедура ОтвязатьБазуОтРИБ()
// Сбрасываем связь с главным узлом
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
// В базах на БСП необходимо также очистить служебные константы,
// чтобы система не считала себя автономным рабочим местом
ОбновлениеИнформационнойБазы.ЗаписатьКонстанту("НастройкаПодчиненногоУзлаРИБЗавершена", Ложь);
ОбновлениеИнформационнойБазы.ЗаписатьКонстанту("ЭтоАвтономноеРабочееМесто", Ложь);
ВызватьИсключение "База успешно отвязана от РИБ. Перезапустите сеанс!";
КонецПроцедуры
Также отвязать базу от главного узла можно через командную строку, запустив Конфигуратор базы-приемника с параметром /ResetMasterNode.
Важное примечание: После отвязки базы зайдите в справочник Планы обмена, найдите запись, которая соответствовала вашей главной базе, и удалите ее, чтобы полностью очистить систему от следов синхронизации.
Мы детально рассмотрели процесс частичного переноса данных и выявили ключевые особенности работы платформы 1С:Предприятие 8.3:
Пользователи стандартным XML-обменом всегда требуется повторная программная или ручная инициализация пользователей информационной базы на уровне СУБД.Загрузка = Истина требует обязательного последующего обновления вспомогательного регистра Реестр документов для восстановления их видимости в динамических списках.