При работе с несколькими информационными базами 1С часто возникает необходимость в регулярном или автоматическом обмене данными. Например, перенос справочников, документов или остатков из одной конфигурации в другую. Стандартные инструменты 1С предоставляют мощную обработку «Универсальный обмен данными в формате XML», но ее ручное использование не всегда удобно для автоматизированных сценариев — для этого подойдёт регулярный обмен по правилам Конвертации 2.0. Мы с вами рассмотрим, как программно управлять этим процессом, чтобы сделать его полностью автоматическим и эффективным. Весь этот путь, от создания правил до настройки регламентного задания, можно пройти, следуя четкому алгоритму.
Прежде чем погружаться в код, давайте уясним важность двух ключевых составляющих успешного обмена: саму обработку «Универсальный обмен данными в формате XML» и, что еще более критично, правильно настроенные правила обмена.
Обработка «Универсальный обмен данными в формате XML» (часто упоминаемая как УОД) — это штатный механизм платформы 1С, предназначенный для обмена данными между различными конфигурациями 1С, а также для выгрузки данных в сторонние системы или загрузки из них. Она позволяет гибко настраивать, какие объекты и по каким правилам должны быть выгружены или загружены. На базе этого механизма существуют и дополненные версии обработки, расширяющие ее стандартные возможности.
Правила обмена — это сердце любого обмена данными в 1С. Без них обработка УОД не знает, какие объекты нужно переносить, как их сопоставлять, трансформировать и что делать с несоответствиями. Правила обмена создаются в отдельной конфигурации — «Конвертация данных» (версии 2.0 или 3.0).
При создании правил мы указываем:
Источники и приемники: Какие объекты из исходной базы соответствуют каким объектам в базе-приемнике (например, справочник «Номенклатура» в одной базе может быть сопоставлен с таким же справочником в другой).
Правила выгрузки: Как данные должны быть выгружены из источника. Мы можем задавать отборы, фильтры, условия выгрузки.
Правила загрузки: Как данные должны быть загружены в приемник. Здесь определяются алгоритмы поиска существующих объектов, создания новых, обновления реквизитов, обработки ссылочных данных.
Дополнительные алгоритмы: Мы можем использовать встроенный язык 1С для написания сложных алгоритмов конвертации данных, например, для изменения значений реквизитов, формирования новых полей или сложной логики сопоставления.
Ключевой момент: имена параметров, которые мы планируем передавать программно (например, для отбора по периоду), должны быть четко определены в этих правилах обмена. Без этого программная передача параметров будет бесполезна. Изучение продвинутых техник параметризации правил является критически важным аспектом для создания по-настоящему гибких и управляемых обменов.
После создания правила сохраняются в виде XML-файла. Именно этот файл мы и будем использовать в нашем программном решении.
Для программной работы с обработкой «Универсальный обмен данными в формате XML» мы не используем напрямую объект УниверсальныйОбменДанными как системный объект платформы. Вместо этого мы должны получить экземпляр этой обработки и работать с ее методами и свойствами. Это достигается через создание объекта типа Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать().
После получения объекта обработки, процесс программного обмена состоит из нескольких шагов:
Создание экземпляра обработки: Получаем объект, представляющий нашу обработку.
Загрузка правил обмена: Указываем путь к XML-файлу с правилами.
Настройка параметров: Устанавливаем режим обмена (выгрузка или загрузка), пути к файлам выгрузки/загрузки, а также любые дополнительные параметры, определенные в правилах обмена (например, период выгрузки).
Выполнение обмена: Запускаем процесс обмена данных.
Рассмотрим пошагово, как осуществить программную выгрузку данных из вашей базы 1С. Мы будем использовать функцию, которая будет принимать путь к файлу правил обмена, путь, куда будет сохранен файл выгрузки, и необязательные параметры для отбора по периоду.
Первым делом, нам нужно создать экземпляр обработки и загрузить в нее заранее подготовленные правила обмена. Без правил обработка не будет знать, что выгружать и как.
Функция ВыгрузитьДанные(ИмяФайлаПравил, ИмяФайлаВыгрузки, НачалоПериода = Неопределено, КонецПериода = Неопределено) Экспорт
// Создаем экземпляр стандартной обработки для обмена данными.
// Это позволяет нам получить доступ к ее методам и свойствам.
ОбработкаОбъект = Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать();
// Пытаемся загрузить правила обмена из указанного файла.
// Если файл не найден или имеет некорректный формат, метод вернет Ложь.
Если Не ОбработкаОбъект.ЗагрузитьПравилаОбменаИзФайла(ИмяФайлаПравил) Тогда
// В случае ошибки загрузки правил, сообщаем об этом и прекращаем выполнение.
Сообщить("Ошибка: Не удалось загрузить правила обмена из файла: " + ИмяФайлаПравил);
Возврат Ложь;
КонецЕсли;
Мы используем Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать() для получения объекта обработки. Затем методом ЗагрузитьПравилаОбменаИзФайла() мы указываем путь к XML-файлу с правилами. Важно убедиться, что путь к файлу правил корректен и файл доступен для чтения сервером 1С или клиентским приложением, в зависимости от контекста вызова.
Далее мы указываем, куда сохранить выгруженные данные, и явно обозначаем, что это будет выгрузка по правилам.
// Устанавливаем имя файла, в который будут выгружены данные.
ОбработкаОбъект.ИмяФайлаВыгрузки = ИмяФайлаВыгрузки;
// Указываем, что обмен будет производиться по ранее загруженным правилам.
// Это ключевое свойство, определяющее логику работы обмена.
ОбработкаОбъект.ВыгружатьПоПравилам = Истина;
// Явно указываем режим обмена - "Выгрузка".
ОбработкаОбъект.РежимОбмена = "Выгрузка";
ИмяФайлаВыгрузки определяет полный путь к XML-файлу, который будет создан в результате выгрузки. Для обеспечения конфиденциальности передаваемых данных существуют решения, позволяющие производить универсальную выгрузку с возможностью шифрования — например, универсальная выгрузка через файл, HTTP и COM. ВыгружатьПоПравилам = Истина — это критически важное свойство, которое указывает обработке использовать загруженные правила. РежимОбмена = "Выгрузка" явно устанавливает направление операции.
Если в наших правилах обмена (созданных в «Конвертации данных») были предусмотрены параметры для отбора, например, по началу и концу периода, мы можем передать их программно. имена параметров здесь должны полностью совпадать с теми, что заданы в «Конвертации данных»!
// Проверяем, были ли переданы параметры периода.
Если НачалоПериода <> Неопределено И КонецПериода <> Неопределено Тогда
// Предполагаем, что в правилах обмена есть параметры
// с именами "НачалоПериодаВыгрузки" и "КонецПериодаВыгрузки".
// Эти имена должны ТОЧНО совпадать с именами параметров, заданных в Конвертации Данных!
ОбработкаОбъект.ПараметрыВыгрузки.Вставить("НачалоПериодаВыгрузки", НачалоПериода);
ОбработкаОбъект.ПараметрыВыгрузки.Вставить("КонецПериодаВыгрузки", КонецПериода);
КонецЕсли;
Свойство ПараметрыВыгрузки представляет собой коллекцию, в которую мы можем добавлять пары «ИмяПараметра» – «ЗначениеПараметра». Важно еще раз подчеркнуть, что если вы ошибетесь в названии параметра, обработка его не распознает, и отбор не сработает!
После всех настроек мы запускаем сам процесс выгрузки:
// Запускаем процесс обмена данными.
// В зависимости от режима (Выгрузка) и настроенных параметров,
// данные будут выгружены в указанный файл.
ОбработкаОбъект.ВыполнитьОбмен();
// Если выполнение дошло до этой строки без исключений, считаем, что выгрузка успешна.
Возврат Истина;
КонецФункции // ВыгрузитьДанные
Метод ВыполнитьОбмен() инициирует процесс обмена. Он будет читать правила, выполнять запросы, формировать XML-файл и сохранять его. В случае возникновения ошибок в процессе обмена, 1С обычно генерирует исключения, которые можно отловить блоком Попытка...Исключение для более надежной работы.
Чтобы использовать нашу функцию, нам нужно определить пути к файлам и, возможно, период:
// Определяем период для выгрузки - например, прошлый месяц.
Начало = НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1));
Конец = КонецМесяца(ДобавитьМесяц(ТекущаяДата(), -1));
// Определяем пути к файлам правил и выгрузки.
// Убедитесь, что эти пути доступны для записи/чтения.
ИмяФайлаПравилОбмена = "C:\МоиПравилаУТ11.xml";
ИмяФайлаДляВыгрузки = "C:\ВыгрузкаУТ11_ПрошлыйМесяц.xml";
// Вызываем нашу функцию для выполнения выгрузки.
Если ВыгрузитьДанные(ИмяФайлаПравилОбмена, ИмяФайлаДляВыгрузки, Начало, Конец) Тогда
Сообщить("Данные успешно выгружены в файл: " + ИмяФайлаДляВыгрузки);
Иначе
Сообщить("Ошибка при выгрузке данных.");
КонецЕсли;
Процесс программной загрузки данных очень похож на выгрузку, но с некоторыми отличиями в настройке параметров обработки.
Начало функции для загрузки данных идентично: нам нужен экземпляр обработки и загруженные правила обмена. Правила обмена для загрузки могут быть теми же самыми, если они двусторонние, или отдельными, предназначенными специально для загрузки.
Функция ЗагрузитьДанные(ИмяФайлаПравил, ИмяФайлаЗагрузки) Экспорт
ОбработкаОбъект = Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать();
Если Не ОбработкаОбъект.ЗагрузитьПравилаОбменаИзФайла(ИмяФайлаПравил) Тогда
Сообщить("Ошибка: Не удалось загрузить правила обмена из файла: " + ИмяФайлаПравил);
Возврат Ложь;
КонецЕсли;
Здесь мы указываем файл, из которого будут загружаться данные, и устанавливаем режим обмена на «Загрузка».
// Устанавливаем имя файла, из которого будут загружаться данные.
ОбработкаОбъект.ИмяФайлаЗагрузки = ИмяФайлаЗагрузки;
// Для загрузки также указываем, что используем правила.
// Хотя свойство называется "ВыгружатьПоПравилам", оно общее для использования правил.
ОбработкаОбъект.ВыгружатьПоПравилам = Истина;
// Явно устанавливаем режим обмена - "Загрузка". Это критически важно.
ОбработкаОбъект.РежимОбмена = "Загрузка";
Обратите внимание на ВыгружатьПоПравилам = Истина. Это свойство не является индикатором только выгрузки, а указывает на то, что обработка должна ориентироваться на загруженные правила обмена. Главное отличие здесь — это РежимОбмена = "Загрузка" и свойство ИмяФайлаЗагрузки.
Запуск процесса загрузки осуществляется тем же методом, что и для выгрузки.
// Запускаем процесс обмена данными.
// В зависимости от режима (Загрузка), данные будут загружены из указанного файла.
ОбработкаОбъект.ВыполнитьОбмен();
Возврат Истина;
КонецФункции // ЗагрузитьДанные
Для загрузки нам понадобится путь к файлу правил и путь к файлу с выгруженными данными:
// Определяем пути к файлам правил и ранее выгруженных данных.
ИмяФайлаПравилОбмена = "C:\МоиПравилаУТ11.xml";
ИмяФайлаДляЗагрузки = "C:\ВыгрузкаУТ11_ПрошлыйМесяц.xml";
// Вызываем нашу функцию для выполнения загрузки.
Если ЗагрузитьДанные(ИмяФайлаПравилОбмена, ИмяФайлаДляЗагрузки) Тогда
Сообщить("Данные успешно загружены из файла: " + ИмяФайлаДляЗагрузки);
Иначе
Сообщить("Ошибка при загрузке данных.");
КонецЕсли;
Автоматизация обмена данными открывает множество возможностей, но также требует внимательности к деталям и учета потенциальных проблем. Давайте рассмотрим некоторые дополнительные аспекты, которые помогут вам создать более надежное и гибкое решение.
Помимо периода, вы можете передавать любые другие параметры, которые были настроены в ваших правилах обмена в «Конвертации данных». Это могут быть параметры, определяющие конкретные организации, склады, контрагентов или любые другие условия для выгрузки/загрузки данных. Например, если в правилах есть параметр КодОрганизации, вы можете передать его так:
// ...
ОбработкаОбъект.ПараметрыВыгрузки.Вставить("КодОрганизации", "001");
// ...
Это делает ваши правила и код обмена значительно более гибкими, позволяя одному набору правил обслуживать различные сценарии обмена без их модификации.
В реальных условиях обмен данными может завершиться ошибкой. Причины могут быть разными: некорректные данные, нарушение ссылочной целостности, проблемы с доступом к файлам, ошибки в правилах обмена и т.д. Крайне важно предусмотреть механизм обработки ошибок и логирования. Более детально вопросы отладки и логирования программных обменов разбираются в специализированных материалах, которые помогут вам найти и устранить любые «узкие места».
Мы можем обернуть вызов ВыполнитьОбмен() в блок Попытка...Исключение:
Попытка
ОбработкаОбъект.ВыполнитьОбмен();
Возврат Истина;
Исключение
ЗаголовокОшибки = "Ошибка при выполнении обмена: ";
ОписаниеОшибки = ИнформацияОбОшибке().Описание;
Сообщить(ЗаголовокОшибки + ОписаниеОшибки, СтатусСообщения.Важное);
// Дополнительно можно записать ошибку в журнал регистрации
ЗаписьЖурналаРегистрации(ЗаголовокОшибки, УровеньВажностиЖурналаСобытий.Ошибка, , , ОписаниеОшибки);
Возврат Ложь;
КонецПопытки;
Такой подход позволит не просто сообщить об ошибке пользователю, но и зафиксировать ее в Журнале регистрации 1С, что очень полезно для последующего анализа и отладки, особенно при фоновом выполнении обмена.
Для полноценной автоматизации обмена данные, как правило, выгружаются и загружаются по расписанию. Для этого в 1С используются Регламентные задания. Вы можете создать новое регламентное задание, которое будет вызывать вашу функцию ВыгрузитьДанные() или ЗагрузитьДанные() с заданной периодичностью. Кроме того, можно воспользоваться универсальным планировщиком обменов для настройки расписания без дополнительного программирования. Это позволит обмениваться данными, например, каждый час, раз в сутки или в определенное время без участия пользователя.
При настройке регламентного задания важно учитывать следующие моменты:
Права пользователя: Пользователь, от имени которого выполняется регламентное задание, должен иметь достаточные права для создания/изменения объектов, чтения/записи файлов и работы с обработкой обмена.
Пути к файлам: Пути к файлам правил и обмена должны быть доступны для сервера 1С. Обычно это сетевые пути или папки на диске сервера.
Режим блокировки: При интенсивном обмене или больших объемах данных стоит рассмотреть вопрос о блокировках и их влиянии на работу пользователей. Возможно, обмен стоит запускать в часы наименьшей активности.
Если ваша база данных часто перемещается или разворачивается в разных окружениях, использование абсолютных путей (например, "C:\...") может быть неудобным. Рассмотрим возможность использования относительных путей или путей, зависящих от параметров системы (например, через каталог временных файлов или каталог хранения файлов конфигурации):
// Пример использования относительного пути относительно каталога информационной базы
// Предполагаем, что файл правил находится в подкаталоге "Обмен" относительно каталога ИБ
КаталогБазы = КаталогБазыДанных();
ИмяФайлаПравилОбмена = КаталогБазы + "Обмен\МоиПравилаУТ11.xml";
ИмяФайлаДляВыгрузки = КаталогБазы + "Обмен\ВыгрузкаУТ11_ПрошлыйМесяц.xml";
Такой подход делает ваше решение более переносимым.
При обмене очень большими объемами данных процесс может занимать значительное время и потреблять много ресурсов. В таких случаях мы можем рассмотреть:
Разбиение обмена на части: Вместо однократной выгрузки всех данных за большой период, можно настроить обмен по небольшим временным интервалам или по частям справочников.
Оптимизация правил обмена: В «Конвертации данных» можно оптимизировать запросы и алгоритмы, используемые для выборки и обработки данных.
Использование фоновых заданий: Запуск обмена как фонового задания позволяет не блокировать работу пользователей в клиентском приложении.
Каждый из этих подходов, от оптимизации запросов до разбиения обмена на части, подробно раскрыт в руководстве по оптимизации производительности обменов на больших объемах данных.
Мы с вами подробно рассмотрели, как программно автоматизировать процесс обмена данными между базами 1С 8.3 с использованием универсального обмена в формате XML. Мы выяснили, что ключ к успеху лежит в грамотном создании правил обмена в «Конвертации данных» и последующем программном управлении стандартной обработкой.
Используя представленные примеры кода для выгрузки и загрузки, а также рекомендации по обработке ошибок, использованию регламентных заданий и оптимизации, вы сможете создать надежные и эффективные механизмы обмена данными, значительно повысив автоматизацию ваших бизнес-процессов. В качестве практического примера такого готового решения можно рассмотреть автоматическую синхронизацию между УТ 11.5 и БП 3.0 — есть синхронизация документов из УТ 11 в БП.
Помните, что каждый сценарий обмена уникален, и вам может потребоваться дополнительная доработка правил и кода для полного соответствия вашим требованиям. Если стандартный обмен через XML-файлы не подходит, например, при работе с не полностью идентичными базами, стоит рассмотреть адаптивные инструменты выгрузки или даже универсальный перенос данных по технологии COM+HTTP. Однако, основы, которые мы разобрали, станут отличной отправной точкой для решения большинства задач по автоматизированному обмену данными в 1С.