Как в 1С 7.7 при обмене данными выгружать движения регистров вместо реквизитов документа

Программист 1С v7.7 Управленческий учет IT и автоматизация бизнеса
← На главную

При работе с устаревшими, но все еще актуальными системами на базе 1С:Предприятие 7.7, разработчики часто сталкиваются с ограничениями типовых механизмов обмена. Одной из таких задач является модификация процесса выгрузки данных через стандартную обработку PTr92_Tr.ert (типовой обмен для конфигурации «Торговля и Склад 9.2»). Рассмотрим ситуацию, когда вместо стандартных реквизитов документа (дата, номер, контрагент) необходимо выгрузить его фактические движения по регистрам (остатки, продажи и т.д.).

Такая задача часто возникает при реализации схем «свертки» данных или при передаче управленческих итогов в другую базу без детальной расшифровки первичных документов. Проанализируем основные способы решения этой задачи, опираясь на опыт ведущих разработчиков и возможности платформы 7.7.

Метод 1: Использование Конвертации данных 1.0 (КД 1.0)

Типовой обмен PTr92_Tr.ert работает на базе правил, созданных в конфигурации «Конвертация данных 1.0». В отличие от современной версии 2.1, первая версия КД имеет гораздо меньше событийных обработчиков и более жесткую структуру. Однако подмена источника данных возможна и здесь.

Рассмотрим алгоритм действий в КД 1.0:

  1. Откроем правила обмена в конфигурации КД 1.0.
  2. Найдем необходимое ПКО (Правило Конвертации Объекта) для документа-источника.
  3. Для реализации выгрузки движений нам потребуется использовать обработчик Перед выгрузкой объекта.

В платформе 7.7 движения документа не являются частью самого объекта Документ в том смысле, как это реализовано в 8.х (через коллекции). Чтобы получить доступ к движениям, необходимо программно инициализировать объект Регистр. Разберем пример кода, который можно адаптировать для обработчика:


// Создаем объект регистра для чтения движений
Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
// Выбираем движения текущего документа (Источник)
Рег.ВыбратьДвиженияДокумента(Источник);
Пока Рег.ПолучитьДвижение() = 1 Цикл
    // Здесь мы можем формировать структуру данных для передачи
    // В КД 1.0 часто приходится подменять Источник на Таблицу Значений
    // или вызывать вспомогательные правила выгрузки
    Сообщить("Выгружаем движение по товару: " + Рег.Товар);
КонецЦикла;

Важный нюанс: КД 1.0 плохо работает с выгрузкой произвольных коллекций, не привязанных к метаданным. Одним из эффективных приемов является создание «виртуального» справочника в правилах, реквизиты которого соответствуют полям регистра. В цикле по движениям мы программно вызываем функцию ВыгрузитьПоПравилу, передавая туда данные регистра.

Метод 2: Прямое использование OLE-соединения

Как отмечают опытные специалисты, для платформы 7.7 использование COM/OLE соединения часто оказывается более надежным и гибким инструментом, чем попытки «скрестить» КД 1.0 с нетиповыми задачами. При обмене «7.7 — 7.7» мы можем напрямую подключиться к базе-приемнику и записывать движения.

Рассмотрим по шагам, как организовать такой процесс:

1. Инициализируем соединение с базой данных:


БазаОЛЕ = СоздатьОбъект("V77.Application");
КаталогБазы = "C:\DB\TradeBase\";
Пользователь = "Admin";
Пароль = "123";
КомандаЗапуска = "/d" + КаталогБазы + " /n" + Пользователь + " /p" + Пароль;
Если БазаОЛЕ.Initialize(БазаОЛЕ.RMTrade, КомандаЗапуска, "NO_SPLASH_SHOW") = 0 Тогда
    Предупреждение("Ошибка подключения к базе!");
КонецЕсли;

2. Читаем движения в текущей базе и создаем аналогичные объекты или записи в приемнике:


РегИсточник = СоздатьОбъект("Регистр.Продажи");
РегИсточник.ВыбратьДвиженияДокумента(ДокИсточник);
Пока РегИсточник.ПолучитьДвижение() = 1 Цикл
    // Создаем или находим документ-объект в базе OLE
    ДокПриемник = БазаОЛЕ.СоздатьОбъект("Документ.Операция");
    // Переносим данные из регистра источника в реквизиты приемника
    // ... логика сопоставления ...
КонецЦикла;

Проанализируем преимущества этого подхода: мы не ограничены структурой XML-файла и правилами конвертации. Мы можем выполнять сложные проверки на лету, например, контролировать остатки в базе-приемнике перед записью движений.

Метод 3: Использование внешних обработок для универсального обмена

Если стандартная PTr92_Tr.ert не справляется, стоит обратить внимание на альтернативные разработки. Существуют универсальные обработки выгрузки/загрузки данных для 7.7, которые позволяют использовать произвольные алгоритмы на языке 1С для формирования выгружаемого пакета.

В таких инструментах процедура выгрузки выглядит следующим образом:

  1. В правилах выгрузки данных (ПВД) указывается произвольный алгоритм.
  2. Внутри алгоритма формируется ТаблицаЗначений, куда записываются все необходимые данные из регистров.
  3. Эта таблица передается в ПКО, где в качестве источника выступает уже не сам документ, а строки данной таблицы.

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

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

При реализации любого из перечисленных методов важно помнить о специфике работы с метаданными в 7.7. Рассмотрим основные функции, которые помогут нам при работе с регистрами:

Если ваша база работает на SQL версии 7.7, для ускорения процесса выгрузки (особенно при больших объемах данных) можно использовать прямые SQL-запросы через ADO или компоненту 1С++. Это позволит миновать объектную модель 1С и получить данные движений (таблицы RA*) в десятки раз быстрее.

Подведем итог. Для решения задачи по преобразованию источника перед выгрузкой в 1С 7.7 наиболее «чистым» с точки зрения архитектуры решением будет использование произвольных алгоритмов в КД 1.0 с перебором движений через ВыбратьДвиженияДокумента(). Если же штатные средства вызывают затруднения, переход на OLE-обмен даст вам полный контроль над процессом, хотя и потребует написания большего объема кода «с нуля».

← На главную