При частичной модернизации учетных систем часто встает задача переноса документов из устаревшей платформы 1С:Предприятие 7.7 в конфигурацию на платформе 1С:Предприятие 8.3. Нередко разработчики выбирают прямое подключение через OLE (COM-соединение), запуская обработку на стороне новой базы «восьмерки». При переходе с языка 7.7 на 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 Цикл
// Обработка документа
КонецЦикла;
Одна из распространенных ошибок разработчиков, привыкших к версии 7.7, связана с вычитанием дней из даты. Выясним причину различий:
Дата - Число трактует число как количество дней. Выражение ТекущаяДата() - 13 вернет дату на 13 дней раньше.Поэтому, если требуется вычесть 13 дней в среде 1С 8, необходимо умножить количество дней на количество секунд в сутках (86 400):
КоличествоДней = 13;
ДатаНачала = ДатаКонца - (КоличествоДней * 86400);
В платформе 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:
Если нужное свойство не отображается в палитре свойств, обратите внимание на командную панель окна свойств: проверьте, не включена ли кнопка «Показывать только важные». Нажатие этой кнопки разворачивает полный список доступных настроек элемента.
При использовании прямого OLE-соединения между 7.7 и 8.3 важно учитывать архитектурные ограничения:
V77.Application не может быть загружен напрямую в 64-битный процесс сервера 1С 8 или 64-битного клиента. Запуск обработки должен производиться исключительно в 32-разрядном клиенте 1С 8, либо настраиваться через отдельное COM+ приложение Windows.олеДок = Неопределено;, БазаИсточник = Неопределено;.