При работе с устаревшими, но все еще актуальными системами на базе 1С:Предприятие 7.7, разработчики часто сталкиваются с ограничениями типовых механизмов обмена. Одной из таких задач является модификация процесса выгрузки данных через стандартную обработку PTr92_Tr.ert (типовой обмен для конфигурации «Торговля и Склад 9.2»). Рассмотрим ситуацию, когда вместо стандартных реквизитов документа (дата, номер, контрагент) необходимо выгрузить его фактические движения по регистрам (остатки, продажи и т.д.).
Такая задача часто возникает при реализации схем «свертки» данных или при передаче управленческих итогов в другую базу без детальной расшифровки первичных документов. Проанализируем основные способы решения этой задачи, опираясь на опыт ведущих разработчиков и возможности платформы 7.7.
Типовой обмен PTr92_Tr.ert работает на базе правил, созданных в конфигурации «Конвертация данных 1.0». В отличие от современной версии 2.1, первая версия КД имеет гораздо меньше событийных обработчиков и более жесткую структуру. Однако подмена источника данных возможна и здесь.
Рассмотрим алгоритм действий в КД 1.0:
Перед выгрузкой объекта.В платформе 7.7 движения документа не являются частью самого объекта Документ в том смысле, как это реализовано в 8.х (через коллекции). Чтобы получить доступ к движениям, необходимо программно инициализировать объект Регистр. Разберем пример кода, который можно адаптировать для обработчика:
// Создаем объект регистра для чтения движений
Рег = СоздатьОбъект("Регистр.ОстаткиТоваров");
// Выбираем движения текущего документа (Источник)
Рег.ВыбратьДвиженияДокумента(Источник);
Пока Рег.ПолучитьДвижение() = 1 Цикл
// Здесь мы можем формировать структуру данных для передачи
// В КД 1.0 часто приходится подменять Источник на Таблицу Значений
// или вызывать вспомогательные правила выгрузки
Сообщить("Выгружаем движение по товару: " + Рег.Товар);
КонецЦикла;
Важный нюанс: КД 1.0 плохо работает с выгрузкой произвольных коллекций, не привязанных к метаданным. Одним из эффективных приемов является создание «виртуального» справочника в правилах, реквизиты которого соответствуют полям регистра. В цикле по движениям мы программно вызываем функцию ВыгрузитьПоПравилу, передавая туда данные регистра.
Как отмечают опытные специалисты, для платформы 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-файла и правилами конвертации. Мы можем выполнять сложные проверки на лету, например, контролировать остатки в базе-приемнике перед записью движений.
Если стандартная PTr92_Tr.ert не справляется, стоит обратить внимание на альтернативные разработки. Существуют универсальные обработки выгрузки/загрузки данных для 7.7, которые позволяют использовать произвольные алгоритмы на языке 1С для формирования выгружаемого пакета.
В таких инструментах процедура выгрузки выглядит следующим образом:
ТаблицаЗначений, куда записываются все необходимые данные из регистров.Выясним причину, почему это удобнее: типизация данных. В 1С 7.7 регистры хранят ссылки на объекты (Справочники, Документы). При выгрузке таблицы значений, сформированной из движений, механизм обмена автоматически обработает эти ссылки и выгрузит связанные объекты (например, Номенклатуру), чего сложно добиться при ручной генерации XML-текста.
При реализации любого из перечисленных методов важно помнить о специфике работы с метаданными в 7.7. Рассмотрим основные функции, которые помогут нам при работе с регистрами:
ВыбратьДвижения() — позволяет отобрать движения за период.ВыбратьДвиженияДокумента(Док) — идеальный метод для нашей задачи, ограничивает выборку рамками одного регистратора.Регистр.ИмяРегистра.ТекущийДокумент() — позволяет получить ссылку на документ, создавший запись.Если ваша база работает на SQL версии 7.7, для ускорения процесса выгрузки (особенно при больших объемах данных) можно использовать прямые SQL-запросы через ADO или компоненту 1С++. Это позволит миновать объектную модель 1С и получить данные движений (таблицы RA*) в десятки раз быстрее.
Подведем итог. Для решения задачи по преобразованию источника перед выгрузкой в 1С 7.7 наиболее «чистым» с точки зрения архитектуры решением будет использование произвольных алгоритмов в КД 1.0 с перебором движений через ВыбратьДвиженияДокумента(). Если же штатные средства вызывают затруднения, переход на OLE-обмен даст вам полный контроль над процессом, хотя и потребует написания большего объема кода «с нуля».