При переходе с конфигурации «Торговля и Склад 9.2» (1С 7.7) на «1С:Управление торговлей 11» разработчики часто сталкиваются с критической ошибкой нехватки оперативной памяти при попытке выгрузить большой объем справочников. При этом ошибка возникает даже на мощных серверах с десятками гигабайт физической памяти. Разберем причины такого поведения платформы 1С 7.7 и рассмотрим надежные способы успешного переноса данных.
Проанализируем технические факторы, которые приводят к сбою процесса переноса:
1cv7.exe и 1cv7s.exe) являются 32-битными приложениями. В операционных системах Windows 32-разрядному процессу по умолчанию выделяется максимум 2 ГБ виртуального адресного пространства, независимо от общего объема установленной на сервере оперативной памяти.MSXML или V7Plus.dll. В этой модели весь XML-документ целиком собирается в оперативной памяти в виде объектного дерева перед сохранением на диск. Если в базе десятки тысяч позиций номенклатуры с ценами, свойствами и контрагентами, лимит в 2 ГБ исчерпывается задолго до завершения выгрузки.Для корректного перехода с конфигураций 7.7 на 1С 8.3 предназначена специализированная внешняя обработка TRANSFER7783U.epf (и соответствующая ей обработка выгрузки для 7.7), входящая в дистрибутив поставки конфигурации «Управление торговлей 11». Она содержит оптимизированные алгоритмы сериализации данных.
Если объем базы очень велик, разберем по шагам, как выгрузить справочники без переполнения памяти:
Контрагенты отдельным файлом, при необходимости установив фильтр по группам или активности клиентов.Номенклатура порциями, накладывая условия по группам справочника или кодам.Рассмотрим аппаратный твик, позволяющий выделить 32-битному процессу 1С 7.7 до 4 ГБ виртуальной памяти в 64-разрядной операционной системе. Для этого необходимо установить в заголовок исполняемого файла флаг LARGEADDRESSAWARE.
Посмотрим на последовательность действий:
1cv7s.exe (или 1cv7.exe) в каталоге BIN платформы 1С 7.7.editbin из пакета Microsoft Visual Studio SDK или стороннюю утилиту модификации заголовков PE-файлов.
editbin /LARGEADDRESSAWARE "C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe"
После установки данного флага при запуске на 64-битной Windows процесс 1С 7.7 сможет адресовать до 4 ГБ памяти, что позволяет завершить выгрузку даже тяжелых массивов данных без дробления на мелкие части.
Если в конфигурации используется доработанная обработка выгрузки, проанализируем программную оптимизацию кода. Вместо накопления DOM-документа в памяти переходим на потоковую запись через текстовые объекты или Scripting.FileSystemObject.
Посмотрим на пример организации потоковой выгрузки узлов XML в файл:
ФС = СоздатьОбъект("Scripting.FileSystemObject");
ТекстовыйФайл = ФС.CreateTextFile("C:\Export\Data.xml", -1, 0);
ТекстовыйФайл.WriteLine("<?xml version=""1.0"" encoding=""windows-1251""?>");
ТекстовыйФайл.WriteLine("<Данные>");
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
Если СпрНом.ЭтоГруппа() = 0 Тогда
СтрокаУзла = "<Товар Код=""" + СокрЛП(СпрНом.Код) + """ Наименование=""" + СокрЛП(СпрНом.Наименование) + """ />";
ТекстовыйФайл.WriteLine(СтрокаУзла);
КонецЕсли;
КонецЦикла;
ТекстовыйФайл.WriteLine("</Данные>");
ТекстовыйФайл.Close();
При таком подходе память не расходуется на хранение дерева объектов, так как данные сразу сбрасываются в файл на диск.
Поскольку исходная база 1С 7.7 работает под управлением Microsoft SQL Server, наиболее стабильный и быстрый метод переноса — чтение таблиц базы напрямую из 1С:Предприятия 8.3 через COM-объект ADODB.Connection. В этом сценарии 32-битная платформа 7.7 вообще не участвует в обработке, а 64-битный клиент или сервер 1С 8.3 не ограничен лимитом памяти.
Рассмотрим пример подключения к SQL-базе 7.7 и выборки номенклатуры:
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=SQLOLEDB;Data Source=SQLSERVER_NAME;Initial Catalog=Base77_DB;User ID=sa;Password=SecretPassword;";
Соединение.Open(СтрокаПодключения);
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "SELECT SC84.CODE, SC84.DESCR FROM SC84 (NOLOCK) WHERE SC84.ISFOLDER = 2";
ВыборкаSQL = Команда.Execute();
Пока Не ВыборкаSQL.EOF Цикл
КодТовара = СокрЛП(ВыборкаSQL.Fields("CODE").Value);
НаимТовара = СокрЛП(ВыборкаSQL.Fields("DESCR").Value);
// Создание или обновление элемента в УТ 11
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = НаимТовара;
НовыйТовар.Артикул = КодТовара;
НовыйТовар.Записать();
ВыборкаSQL.MoveNext();
КонецЦикла;
Соединение.Close();
Этот способ обеспечивает максимальную скорость миграции и полностью исключает падения по памяти.
Если требуется сохранить типовые соответствия реквизитов и учетных параметров, разберем вариант поэтапного перехода: