Как перенести документы из 1С 7.7 в 1С 8.3 через COM-соединение

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При частичной модернизации учетных систем часто встает задача переноса документов из устаревшей платформы 1С:Предприятие 7.7 в конфигурацию на платформе 1С:Предприятие 8.3. Нередко разработчики выбирают прямое подключение через OLE (COM-соединение), запуская обработку на стороне новой базы «восьмерки». При переходе с языка 7.7 на 8.3 возникает ряд тонкостей: синтаксис поиска объектов, особенности арифметики дат, а также нюансы заполнения реквизитов и счетов учета. Разберем по шагам, как правильно реализовать подобную обработку, избежать частых ошибок и грамотно организовать перенос.

Особенности вызова методов 7.7 из среды 1С 8.3

Когда мы создаем COM-объект подключения к 7.7 внутри кода 1С 8.3, важно помнить следующее правило: к полученным внешним объектам применяются методы именно той платформы, в которой они физически созданы. Если переменная указывает на объект внешней базы 7.7, мы вызываем для нее методы встроенного языка 7.7.

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


// В коде 1С 8.3 создаем OLE-объект базы 7.7
БазаИсточник = Новый COMОбъект("V77.Application");
// Здесь выполняется инициализация и подключение к базе 7.7...

// Инициализируем выборку конкретного вида документа
олеДок = БазаИсточник.CreateObject("Документ.ПриходнаяНакладная");

// Вычисляем период выборки
ДатаОтчета = НачалоДня(ТекущаяДата());
ДатаНач = ДатаОтчета - (13 * 86400); // 13 дней назад

// Запускаем выборку по правилам 1С 7.7
олеДок.ВыбратьДокументы(ДатаНач, ДатаОтчета);
Пока олеДок.ПолучитьДокумент() = 1 Цикл
    // Обработка документа
КонецЦикла;

Арифметика дат в 1С 8.3: секунды вместо дней

Одна из распространенных ошибок разработчиков, привыкших к версии 7.7, связана с вычитанием дней из даты. Выясним причину различий:

  1. В платформе 1С 7.7 операция Дата - Число трактует число как количество дней. Выражение ТекущаяДата() - 13 вернет дату на 13 дней раньше.
  2. В платформе 1С 8.3 даты хранятся с точностью до секунды. Любая арифметическая операция сложения или вычитания числа с датой работает с секундами.

Поэтому, если требуется вычесть 13 дней в среде 1С 8, необходимо умножить количество дней на количество секунд в сутках (86 400):


КоличествоДней = 13;
ДатаНачала = ДатаКонца - (КоличествоДней * 86400);

Поиск существующего документа в базе 1С 8.3

В платформе 1С 7.7 метод поиска НайтиПоНомеру принимал третьим параметром вид документа (например, Док.НайтиПоНомеру(Номер, Дата, "ПриходнаяНакладная")). В 1С 8.3 архитектура метаданных объектно-ориентированная, и поиск выполняется через менеджер конкретного документа.

Рассмотрим синтаксис поиска документа в 1С 8:


НомерДокумента77 = олеДок.НомерДок;
ДатаДокумента77 = олеДок.ДатаДок;

// Ищем документ через менеджер конкретного документа 1С 8
СсылкаНаДокумент = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(НомерДокумента77, ДатаДокумента77);

Если Не СсылкаНаДокумент.Пустая() Тогда
    // Документ уже существует в 1С 8, получаем объект для редактирования
    Объект8 = СсылкаНаДокумент.ПолучитьОбъект();
Иначе
    // Документ не найден, создаем новый
    Объект8 = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
    Объект8.Дата = ДатаДокумента77;
    Объект8.Номер = НомерДокумента77;
КонецЕсли;

Обратите внимание на проверку: метод СсылкаНаДокумент.Пустая() в 1С 8 возвращает значение типа Булево (Истина или Ложь), в отличие от целочисленного результата (1 или 0) в 7.7. Поэтому правильно писать: Если Не СсылкаНаДокумент.Пустая() Тогда.

Заполнение табличной части и счетов учета

После позиционирования на документе выполняется перебор строк из источника 7.7 и заполнение табличной части документа в 1С 8.3. Разберем заполнение реквизитов и счетов бухгалтерского учета:


олеДок.ВыбратьСтроки();
Объект8.Товары.Очистить();

Пока олеДок.ПолучитьСтроку() = 1 Цикл
    НоваяСтрока = Объект8.Товары.Добавить();
    
    // Поиск номенклатуры по коду
    КодНоменклатуры = СокрЛП(олеДок.Товар.Код);
    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(КодНоменклатуры);
    
    НоваяСтрока.Количество = олеДок.Количество;
    НоваяСтрока.Цена = олеДок.Цена;
    НоваяСтрока.Сумма = олеДок.Сумма;
    
    // Заполнение счета учета
    // Вариант 1: прямое указание предопределенного счета или поиск по коду
    НоваяСтрока.СчетУчетаБУ = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; 
    // Либо: ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
КонецЦикла;

// Обязательно сохраняем изменения в базе данных
Объект8.Записать(РежимЗаписиДокумента.Запись);

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

Скрытие вводимых символов в поле ввода (Режим пароля)

При организации подключения к внешней базе обработка часто требует ввода пароля пользователя 7.7. Чтобы символы заменялись звездочками при вводе в обычном приложении 1С 8:

  1. Откройте свойства элемента управления ПолеВвода.
  2. Найдите свойство РежимПароля.
  3. Установите значение свойства в Истина.

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

Технические ограничения и альтернативы OLE-обмену

При использовании прямого OLE-соединения между 7.7 и 8.3 важно учитывать архитектурные ограничения:

  1. Разрядность платформы: 1С 7.7 является строго 32-разрядным приложением. COM-объект V77.Application не может быть загружен напрямую в 64-битный процесс сервера 1С 8 или 64-битного клиента. Запуск обработки должен производиться исключительно в 32-разрядном клиенте 1С 8, либо настраиваться через отдельное COM+ приложение Windows.
  2. Освобождение памяти: COM-соединение с 7.7 склонно накапливать память при больших объемах выборок. По завершении работы с объектами рекомендуется явно обнулять переменные: олеДок = Неопределено;, БазаИсточник = Неопределено;.
  3. Альтернативные подходы: Для регулярных и объемных обменов надежнее использовать выгрузку данных из 7.7 в промежуточные файлы формата XML через правила конвертации (обработка «1С:Конвертация данных 2.1») или обмен через формат JSON/DBF. Это полностью снимает зависимость от разрядности операционной системы и блокировок COM-серверов.
← На главную