Настройка обмена данными 1С

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

1. Запуск синхронизации производится в реальном режиме времени при записи (удалении) объекта (документа, справочника), но только если запись выполняется интерактивно. То есть, при пакетном перепроведении документов при восстановлении последовательности или из обработки “Групповая обработка справочников и документов” синхронизация не требуется (предполагается, что движения документов не переносятся, а формируются при проведении).

2. Предусмотрен механизм гарантированной доставки данных в базу приемник. Для этих целей, при запуске синхронизации, объект предварительно регистрируется в плане обмена. В случае сбоя синхронизации по ежеминутному регламентному заданию выполняется проверка наличия зарегистрированных объектов в плане обмена и производится повторная попытка передачи данных в базу приемник. Далее, в случае успешности передачи данных, регистрация объекта в плане обмена удаляется.

3. Для исключения задержек при записи объектов, синхронизация запускается асинхронно в фоновом задании. Если же требуется организовать отказ от проведения документа в текущей базе в зависимости от успешности проведения этого документа в базе приемнике, имеется возможность предусмотреть запуск синхронизации в основном потоке (по опыту, документ реализация товаров в УПП имеющий в табличной части до 10 строчек синхронизируется за 1-2 сек), в этом случае производится ожидание завершения синхронизации и в зависимости от успешности проведения выставляется отказ и дублируется сообщение о причине неуспешности, переданное из базы приемника.

4. Для универсальности данные передаются в базу приемник в формате XML, сформированными программно с помощью обработки “Универсальный обмен данными XML” по правилам обмена, подготовленными в конфигурации “Конвертация данных”. Соответственно, на стороне приемника производится загрузка этой же обработкой. Как правило, во всех типовых конфигурациях данная обработка присутствует, а для самописных можно загрузить из состава .cf данной публикации.

5. Пакет передаваемых данных должен иметь минимальный объем данных, Чтобы не загружать сетевые службы и Веб-сервер. Для этих целей, предусмотрено:

– за один раз производится выгрузка только одного объекта (с подчиненными объектами, выгруженными по ссылкам, если это справочник);

– при разработке правил обмена для всех документов устанавливается режим “Не выгружать объекты свойств источника по ссылкам”. В этом случае исключается избыточность передаваемых данных. Если же в реквизите встречается ссылка на элемент объекта, который не включен в состав регистрируемых объектов плана обмена (то есть данный вид объектов самостоятельно не синхронизируется) и эта ссылка не была найдена в базе приемнике (в терминах обработки это фиктивная ссылка), то формируется список фиктивных ссылок, который возвращается в базу источник и рекурсивно инициируется синхронизация для этих объектов.

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

Реализация

1. Для всех синхронизируемых объектов в форме элемента справочника (форме документа) в обработчике “При открытии” необходимо добавить следующий код: Процедура ПриОткрытии() ДополнительныеСвойства.Вставить(«СинхронизироватьПриЗаписи»); КонецПроцедуры 2. Добавляем подписки на события

3. Общий модуль “ЛУ_СинхронизацияКлиентСервер” (Сервер, Клиент Обычное приложение) – обработчики подписок Процедура ОбъектПриЗаписиСинхронизировать(Источник, Отказ) Экспорт ПланОбменаРегистрацияИзменений(ПланыОбмена.ЛУ_WebСервис, Источник, Отказ); КонецПроцедуры Процедура ОбъектПередУдалениемСинхронизировать(Источник, Отказ) Экспорт ПланОбменаРегистрацияИзменений(ПланыОбмена.ЛУ_WebСервис, Источник, Отказ, Истина); КонецПроцедуры Процедура ПланОбменаРегистрацияИзменений(ПланОбмена, Источник, Отказ, Удаление=Ложь) Экспорт #Если НЕ ТолстыйКлиентОбычноеПриложение Тогда Возврат; #КонецЕсли Если Отказ или Источник.ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; Если НЕ (Источник.ДополнительныеСвойства.Свойство(«СинхронизироватьПриЗаписи») или Удаление) Тогда Возврат; КонецЕсли; ПланОбменаМетаданные = ПланОбмена.ПустаяСсылка().Метаданные(); Если НЕ ПланОбменаМетаданные.Состав.Содержит(Источник.Метаданные()) Тогда Возврат; КонецЕсли; // Регистрация изменениий в плане обмена ВыборкаУзлов = ПланОбмена.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл ТекущийУзел = ВыборкаУзлов.Ссылка; Если ТекущийУзел = ПланОбмена.ЭтотУзел() Тогда Продолжить; КонецЕсли; Если НЕ ТекущийУзел.Синхронизировать Тогда Продолжить; КонецЕсли; ОбъектРегистрации = ?(Удаление, Новый УдалениеОбъекта(Источник.Ссылка), Источник.Ссылка); ПланыОбмена.ЗарегистрироватьИзменения(ТекущийУзел, ОбъектРегистрации); КонецЦикла; ЛУ_СинхронизацияВызовСервера.ПланОбменаСинхронизироватьАсинхронно(ПланОбменаМетаданные.Имя); КонецПроцедуры 4. План обмена ЛУ_WebСервис

Здесь:

  • Синхронизировать – булево,
  • Сервер, База, Пользователь, Пароль – Строка, 100, переменная
  • ПравилаКонвертации – ХранилищеЗначения (в форме узла реализована загрузка в этот реквизит правил обмена из файла XML)

5. Общий модуль “ЛУ_СинхронизацияВызовСервера” (Сервер, Вызов сервера) (для наглядности из листингов исключены все конструкции связанные с обработкой исключений, вывода ошибок, и вспомогательные методы) Процедура ПланОбменаСинхронизировать(ИмяПланаОбмена) Экспорт ПланОбмена = ПланыОбмена; ВыборкаУзлов = ПланОбмена.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл ТекущийУзел = ВыборкаУзлов.Ссылка; Если ТекущийУзел = ПланОбмена.ЭтотУзел() Тогда Продолжить; КонецЕсли; Если НЕ ТекущийУзел.Синхронизировать Тогда Продолжить; КонецЕсли; ИмяСобытияДляЖурнала = «ПланОбмена.» + ИмяПланаОбмена + » » + ПланОбмена.ЭтотУзел().Код + » -> » + ТекущийУзел.Код; ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщенияXML = Новый ЗаписьXML; ЗаписьСообщенияXML.УстановитьСтроку(); Попытка ЗаписьСообщения.НачатьЗапись(ЗаписьСообщенияXML, ТекущийУзел); Исключение // ТекущийУзел заблокирован, пока пропустим, следующая попытка будет по регламентному заданию через 60 сек Продолжить; КонецПопытки; НомерСообщения = ЗаписьСообщения.НомерСообщения; МетаданныеДокументы = Метаданные.Документы; МассивУдаляемыхОбъектов = Новый Массив; МассивОбъектов = Новый Массив; Выборка = ПланыОбмена.ВыбратьИзменения(ТекущийУзел, НомерСообщения); Пока Выборка.Следующий() Цикл // В этом цикле только подготовим массив объектов, содержащихся в сообщении плана обмена // Чтобы побыстрее освободить ЗаписьСообщения // (до вызова метода ЗакончитьЗапись() в плане обмена устанавливается исключительная блокировка) Объект = Выборка.Получить(); Если ТипЗнч(Объект) = Тип(«УдалениеОбъекта») Тогда МассивУдаляемыхОбъектов.Добавить(Объект); ИначеЕсли НЕ МетаданныеДокументы.Содержит(Объект.Ссылка.Метаданные()) Тогда МассивОбъектов.Вставить(0, Объект.Ссылка); // Документы сдвигаем в конец массива Иначе МассивОбъектов.Добавить(Объект.Ссылка); КонецЕсли; КонецЦикла; Если МассивОбъектов.Количество() = 0 и МассивУдаляемыхОбъектов.Количество() = 0 Тогда ЗаписьСообщения.ПрерватьЗапись(); // Освобождаем номер сообщения плана обмена Продолжить; КонецЕсли; ЗаписьСообщения.ЗакончитьЗапись(); // Фиксируем исходящее сообщение плана обмена данных // Полученный XML сообщения игнорируем. // Так как в базе приемнике фиксация номеров входящих сообщений плана обмена не предусмотрена // (В приемнике вообще может не быть корреспондирующего плана обмена при одностороннем обмене). ЗаписьСообщенияXML.Закрыть(); // Передача измененных объектов в базу приемник Отказ = Ложь; ОбработкаОбмена = ИнициализироватьОбработкуОбмена(ТекущийУзел, ИмяСобытияДляЖурнала, Отказ); ФайлОбмена = Новый Файл(ОбработкаОбмена.ИмяФайлаОбмена); // Подключение LuExchange = ПолучитьWSПрокси(ТекущийУзел, «LuExchange.1cws», «http://www.LuExchange.ru», «LuExchange»); // Удаляемые объекты // Поиск удаляемого объекта выполняется только по ссылке ВыгрузитьУдаляемыеОбъектыВБазуПриемник(ТекущийУзел, МассивУдаляемыхОбъектов, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала, Отказ); // Измененные объекты Для каждого ОбъектСсылка Из МассивОбъектов Цикл ОшибкаВыгрузкиОбъекта = Ложь; СтрокаЗагруженныеДокументы = «»; // Массив загруженных документов в базе приемнике (строка внутренняя) для инициации последующего проведения ВыгрузитьОбъектВБазуПриемник(ОбъектСсылка, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала, СтрокаЗагруженныеДокументы, ОшибкаВыгрузкиОбъекта); Если ОшибкаВыгрузкиОбъекта Тогда Отказ = Истина; Продолжить; КонецЕсли; // Для выгруженных документов необходимо выполнить команду проведения или, если документ был распроведен, удалить движения ОшибкаПроведенияДокумента = Ложь; ОбработкаПризнакаПроведенияДокумента(СтрокаЗагруженныеДокументы, LuExchange, ИмяСобытияДляЖурнала, ОшибкаПроведенияДокумента); // Фиксируем успешную синхронизацию в плане обмена для объекта ПланыОбмена.УдалитьРегистрациюИзменений(ТекущийУзел, ОбъектСсылка); КонецЦикла; УдалитьФайлы(ОбработкаОбмена.ИмяФайлаОбмена); Если НЕ Отказ Тогда // Фиксируем успешную синхронизацию в плане обмена для всего сообщения ПланыОбмена.УдалитьРегистрациюИзменений(ТекущийУзел, НомерСообщения); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ВыгрузитьОбъектВБазуПриемник(ОбъектСсылка, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала, СтрокаЗагруженныеДокументы=»», Отказ) // Получаем ДанныеXML ВыгруженоОбъектов = 0; ДанныеXML = ПолучитьДанныеXMLПоПравиламКонвертации(ОбработкаОбмена, ОбъектСсылка, ВыгруженоОбъектов, ИмяСобытияДляЖурнала); // ExecuteExchange ТекстОшибки = «»; ОшибкаВыгрузки = Ложь; СтрокаФиктивныеСсылки = «»; Данные = Новый ХранилищеЗначения(ДанныеXML, Новый СжатиеДанных(9)); ЗагруженоОбъектов = LuExchange.ExecuteExchange(Данные, ИмяСобытияДляЖурнала, СтрокаФиктивныеСсылки, СтрокаЗагруженныеДокументы, ТекстОшибки); // Фиктивные ссылки (выгружаем объекты по ссылкам) ОбработкаФиктивныхСсылок(СтрокаФиктивныеСсылки, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала, ОшибкаВыгрузки); КонецПроцедуры Процедура ОбработкаФиктивныхСсылок(СтрокаФиктивныеСсылки, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала, Отказ) Если ПустаяСтрока(СтрокаФиктивныеСсылки) Тогда Возврат; КонецЕсли; ФиктивныеСсылки = ЗначениеИзСтрокиВнутр(СтрокаФиктивныеСсылки); Для каждого ФиктивнаяСсылка Из ФиктивныеСсылки Цикл ФиктивнаяСсылка = СтрЗаменить(ФиктивнаяСсылка, «.», Символы.ПС); ВидПриемника = СтрПолучитьСтроку(ФиктивнаяСсылка, 1); ТипПриемника = СтрПолучитьСтроку(ФиктивнаяСсылка, 2); УИД = СтрПолучитьСтроку(ФиктивнаяСсылка, 3); // Здесь тип объекта соответствует метаданным базы приемника, // для обработки необходимо привести к соответствующему типу текущей базы // Найдем корреспондирующий тип по правилам обмена ПравилоКонвертации = ОбработкаОбмена.ТаблицаПравилКонвертации.Найти(ВидПриемника+»Ссылка.»+ТипПриемника, «Приемник»); Если ПравилоКонвертации = Неопределено Тогда Продолжить; КонецЕсли; TypeOf = СтрЗаменить(ПравилоКонвертации.ТипИсточника, «.», Символы.ПС); ВидИсточника = СтрПолучитьСтроку(TypeOf, 1); ТипИсточника = СтрПолучитьСтроку(TypeOf, 2); Если ВидИсточника = «ДокументСсылка» Тогда МенеджерОбъекта = Документы; ИначеЕсли ВидИсточника = «СправочникСсылка» Тогда МенеджерОбъекта = Справочники; Иначе Отказ = Истина; Продолжить; КонецЕсли; ОбъектСсылка = МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД)); НайденныйОбъект = ОбъектСсылка.ПолучитьОбъект(); Если НайденныйОбъект = Неопределено Тогда Отказ = Истина; Продолжить; КонецЕсли; ВыгрузитьОбъектВБазуПриемник(ОбъектСсылка, LuExchange, ОбработкаОбмена, ФайлОбмена, ИмяСобытияДляЖурнала,, Отказ); КонецЦикла; КонецПроцедуры Процедура ОбработкаПризнакаПроведенияДокумента(СтрокаЗагруженныеДокументы, LuExchange, ИмяСобытияДляЖурнала, Отказ) Если ПустаяСтрока(СтрокаЗагруженныеДокументы) Тогда Возврат; КонецЕсли; // PostingDocuments ТекстОшибки = «»; Отказ = LuExchange.PostingDocuments(СтрокаЗагруженныеДокументы, ТекстОшибки); КонецПроцедуры Функция ИнициализироватьОбработкуОбмена(ТекущийУзел, ИмяСобытияДляЖурнала, Отказ) // Инициализация ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать(); ОбработкаОбмена.РежимОбмена = «Выгрузка»; ОбработкаОбмена.ПостроительОтчета = Новый ПостроительОтчета; ОбработкаОбмена.НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина; // Загрузка правил ПравилаОбмена = ТекущийУзел.ПравилаКонвертации.Получить(); ОбработкаОбмена.ЗагрузитьПравилаОбмена(ПравилаОбмена, «Строка»); ОбработкаОбмена.ИмяФайлаПравилОбмена = «Неопределено»; // Обходим глюк обработки, иначе она считает, что правила не загружены // ИмяФайлаОбмена ОбработкаОбмена.ИмяФайлаОбмена = ПолучитьИмяВременногоФайла(«xml»); // Для всех правил конвертации справочников и документов рекомендуется по возможности устанавливать в ИСТИНА следующие свойства: // — Искать объект приемника по внутреннему идентификатору объекта источника; // — При переносе объкта по ссылке НЕ создавать новый объект, а только переносить ссылку; // Для правил конвертации документов дополнительно рекомендуется устанавливать в ИСТИНА следующее свойство: // — Не выгружать объекты свойств источника по ссылкам; // В этом случае файл данных XML для выгружаемого объекта не будет содержать объекты выгружаемые по ссылкам. // Это существенно уменьшит размер передаваемого файла и ускорит процесс синхронизации. // Выгрузка этих объектов при необходимости будет инициироваться автоматически. Возврат ОбработкаОбмена; КонецФункции Функция ПолучитьДанныеXMLПоПравиламКонвертации(ОбработкаОбмена, ОбъектСсылка, ВыгруженоОбъектов, ИмяСобытияДляЖурнала) МетаИмя = ОбъектСсылка.Метаданные().Имя; // Сначала все отключаем Для Каждого Строка из ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки Цикл Строка.Включить = 0; ОбработкаОбмена.УстановитьПометкиПодчиненных(Строка, «Включить»); КонецЦикла; // Включаем нужное правило СтрПравил = ОбработкаОбмена.ТаблицаПравилВыгрузки.Строки.Найти(МетаИмя, «Имя», Истина); Если СтрПравил = Неопределено Тогда Возврат Неопределено; КонецЕсли; Если НЕ ЗначениеЗаполнено(СтрПравил.ИмяОбъектаДляЗапроса) Тогда Возврат Неопределено; КонецЕсли; СтрПравил.Включить = 1; ОбработкаОбмена.УстановитьПометкиРодителей(СтрПравил, «Включить»); // Отбор ИмяОтбора = СтрЗаменить(СтрПравил.ИмяОбъектаДляЗапроса, «.», «_»); ПостроительОтчета = Новый ПостроительОтчета(«ВЫБРАТЬ ПЕРВЫЕ 1 _.* ИЗ » + СтрПравил.ИмяОбъектаДляЗапроса + » КАК _ {ГДЕ _.Ссылка.* КАК » + ИмяОтбора + «}»); Отбор = ПостроительОтчета.Отбор.Добавить(ИмяОтбора); Отбор.ВидСравнения = ВидСравнения.Равно; Отбор.Установить(ОбъектСсылка); СтрПравил.ИспользоватьОтбор = Истина; СтрПравил.НастройкиПостроителя = ПостроительОтчета.ПолучитьНастройки(); // Выгрузка ОбработкаОбмена.ВыполнитьВыгрузку(); ВыгруженоОбъектов = ОбработкаОбмена.мСчетчикВыгруженныхОбъектов; ЧтениеТекста = Новый ЧтениеТекста; ЧтениеТекста.Открыть(ОбработкаОбмена.ИмяФайлаОбмена, КодировкаТекста.UTF8); СтрокаXML = ЧтениеТекста.Прочитать(); ЧтениеТекста.Закрыть(); Возврат СтрокаXML; КонецФункции // ПолучитьДанныеXMLПоПравиламКонвертации() Функция ПолучитьWSПрокси(Параметры, ИмяФайлаПубликации, URIПространстваИменСервиса, ИмяСервиса) Определения = Новый WSОпределения(«http://»+Параметры.Сервер+»/»+Параметры.База+»/ws/»+ИмяФайлаПубликации+»?wsdl», Параметры.Пользователь, Параметры.Пароль); WSПрокси = Новый WSПрокси(Определения, URIПространстваИменСервиса, ИмяСервиса, ИмяСервиса+»Soap»); WSПрокси.Пользователь = Параметры.Пользователь; WSПрокси.Пароль = Параметры.Пароль; Возврат WSПрокси; КонецФункции 6. Настройка Веб-сервиса для базы приемника

7. Модуль Веб-сервиса Функция ExecuteExchange(DataXML, NameOfEvent, FictitiousObjects, UploadedDocuments, ErrorMessage) УстановитьПривилегированныйРежим(Истина); Попытка ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать(); ОбработкаОбмена.РежимОбмена = «Загрузка»; ОбработкаОбмена.НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина; ОбработкаОбмена.ЗагружатьДанныеВРежимеОбмена = Истина; ОбработкаОбмена.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина; ОбработкаОбмена.ОптимизированнаяЗаписьОбъектов = Истина; ОбработкаОбмена.ЗаписыватьРегистрыНаборамиЗаписей = Истина; РаботаВозможна = ОбработкаОбмена.ВыполнитьДействияПередЧтениемДанных(DataXML.Получить()); Если НЕ РаботаВозможна Тогда ErrorMessage = «ExecuteExchange(1). ОбработкаОбмена.ВыполнитьДействияПередЧтениемДанных — работа не возможна»; Возврат 0; КонецЕсли; ОбработкаОбмена.ПроизвестиЧтениеДанных(ErrorMessage); Если НЕ ПустаяСтрока(ErrorMessage) Тогда Возврат 0; КонецЕсли; ОбработкаОбмена.ВыполнитьДействияПослеЗавершенияЧтенияДанных(); // Подготовим для возврата в базу источник массивы Фиктивных ссылок и массив выгруженных документов МассивФиктивныхСсылок = Новый Массив; МассивЗагруженныхДокументов = Новый Массив; МетаданныеДокументы = Метаданные.Документы; Для каждого КлючИЗначение Из ОбработкаОбмена.ЗагруженныеОбъекты Цикл ОбъектСсылка = КлючИЗначение.Значение.СсылкаНаОбъект; ОбъектМетаданные = ОбъектСсылка.Метаданные(); Если КлючИЗначение.Значение.СсылкаФиктивная Тогда // Фиктивная ссылка — объект не найденный в базе приемнике и не выгруженный по ссылкам МассивФиктивныхСсылок.Добавить(ОбъектМетаданные.ПолноеИмя() + «.» + XMLСтрока(ОбъектСсылка.Ссылка)); ИначеЕсли МетаданныеДокументы.Содержит(ОбъектМетаданные) Тогда МассивЗагруженныхДокументов.Добавить(ОбъектСсылка.Ссылка); КонецЕсли; КонецЦикла; Если МассивФиктивныхСсылок.Количество() > 0 Тогда FictitiousObjects = ЗначениеВСтрокуВнутр(МассивФиктивныхСсылок); КонецЕсли; Если МассивЗагруженныхДокументов.Количество() > 0 Тогда UploadedDocuments = ЗначениеВСтрокуВнутр(МассивЗагруженныхДокументов); КонецЕсли; Исключение ErrorMessage = «ExecuteExchange(2). » + ОписаниеОшибки(); Возврат 0; КонецПопытки; Возврат ОбработкаОбмена.мСчетчикЗагруженныхОбъектов; КонецФункции Функция DeleteObject(TypeOf, UUID, ErrorMessage) УстановитьПривилегированныйРежим(Истина); Попытка TypeOf = СтрЗаменить(TypeOf, «.», Символы.ПС); ВидОбъекта = СтрПолучитьСтроку(TypeOf, 1); ТипОбъекта = СтрПолучитьСтроку(TypeOf, 2); Если ВидОбъекта = «ДокументСсылка» Тогда МенеджерОбъекта = Документы; ИначеЕсли ВидОбъекта = «СправочникСсылка» Тогда МенеджерОбъекта = Справочники; Иначе ErrorMessage = «DeleteObject(1). Ошибка получения менеджера объекта » + ВидОбъекта + «.» + ТипОбъекта + «!»; Возврат Истина; КонецЕсли; ОбъектСсылка = МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор(UUID)); НайденныйОбъект = ОбъектСсылка.ПолучитьОбъект(); Если НЕ НайденныйОбъект = Неопределено Тогда НайденныйОбъект.Удалить(); // В базе приемнике удаление происходит без проверки ссылочной целостности // В некоторых схемах целесообразнее отключать данный функционал // а удаление выполнять соответствующей обработкой // («ПометкаУдаления» синхронизируется обычным образом в ExecuteExchange) КонецЕсли; Исключение ErrorMessage = «DeleteObject(2). » + ОписаниеОшибки(); Возврат Истина; КонецПопытки; Возврат Ложь; КонецФункции Функция PostingDocuments(UploadedDocuments, ErrorMessage) УстановитьПривилегированныйРежим(Истина); Отказ = Ложь; Попытка МассивВыгруженныхДокументов = ЗначениеИзСтрокиВнутр(UploadedDocuments); Для каждого ДокументСсылка Из МассивВыгруженныхДокументов Цикл ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); Если ДокументОбъект = Неопределено Тогда Отказ = Истина; ErrorMessage = ErrorMessage + Символы.ПС + «PostingDocuments(1). Объект не найден: » + ДокументСсылка; Продолжить; КонецЕсли; // Проведение Если ДокументОбъект.Проведен Тогда Попытка ПолучитьСообщенияПользователю(Истина); // Очистим все предыдущие сообщения на момент проведения ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Исключение Сообщения = ПолучитьСообщенияПользователю(Истина); // Вернем в базу источник ошибки проведения ТекстСообщения = «»; Для каждого Сообщение Из Сообщения Цикл ТекстСообщения = ТекстСообщения + Символы.ПС + Сообщение.Текст; КонецЦикла; ErrorMessage = ErrorMessage + Символы.ПС + «PostingDocuments(2). » + ДокументСсылка + Символы.ПС + ОписаниеОшибки() + ТекстСообщения; Отказ = Истина; // Сбросим признак проведения ДокументОбъект.Проведен = Ложь; ДокументОбъект.ОбменДанными.Загрузка = Истина; ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); КонецПопытки; КонецЕсли; // Если снят с проведения, очистим движения Если НЕ ДокументОбъект.Проведен Тогда Для каждого НаборДвижений Из ДокументОбъект.Движения Цикл НаборДвижений.Прочитать(); Если НаборДвижений.Количество() > 0 Тогда НаборДвижений.Очистить(); НаборДвижений.Записать(); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Исключение ErrorMessage = «PostingDocuments(3). » + ОписаниеОшибки(); Отказ = Истина; КонецПопытки; Возврат Отказ; КонецФункции 8. Рекомендации При разработке правил конвертации очень сложно отлаживать правила в боевой схеме, поэтому для сложных конвертаций рекомендую сначало воспользоваться средствами отладки встроенными в обработку “Универсальный обмен данными XML”, в этом случае имеется возможность подключить алгоритмы из правил в виде модулей внешней обработки как при выгрузке, так и при загрузке данных. И только после успешной выгрузки – загрузки в интерактивном режиме через промежуточный файл – пробовать синхронизацию через Веб. 9. Опыт внедрения

Данная схема успешно реализована в реальных действующих системах:

  • связка УТ 10.3 и УПП 1.3. (УТ нетиповая, доработана под производство с вводом данных через тач-панели на конвейерной линии)
  • связка Самописная конфигурация и БП 3.0 (В самописной конфигурации ведется учет технологических операций на фабрике птицы)

10. Состав вложенных файлов

  • ОбменДаннымиОнлайнЧерезВебСервис.cf – содержит все описанные объекты для синхронизации (Источник + Приемник). Обычные формы. Клиент-серверный вариант. В файловом варианте тоже все будет работать, кроме регламентного задания. В этом случае необходимо предусмотреть периодический запуск синхронизации с помощью метода ПодключитьОбработчикОжидания(). При сравнении, объединении необходимо отметить по подсистемам файла: подсистема “ЛУ_СинхронизацияЧерезВебСервис”.
  • ОбменДаннымиОнлайнЧерезВебСервисУФ.cf – то же, но для управляемых форм (в процессе, будет выложен чуть позже)
  • ДемоБазы.zip – содержит выгрузки из двух баз (PR1.dt и PR2.dt) для демонстрации готовой настроенной схемы синхронизации. Базы содержат простенькие документы и справочники. Имена метаданных синхронизируемых объектов различаются. Правила конвертации загружены в базу. Необходимо восстановить базы из .dt. Выполнить публикацию на Веб-сервере под именами PR1 и PR2 с установленной галочкой Публиковать Веб-сервисы и LuExchange. В режиме Предприятия в настройках соответствующих узлов планов обмена необходимо прописать имя Веб-сервера на котором была выполнена публикация баз.
  • ОбменДаннымиОнлайнЧерезВебСервис.cfe – вариант доработки в виде расширения конфигурации для баз находящихся на поддержке без возможности редактирования. Ввиду ограниченного функционала расширений, не содержит объекты: План обмена и Регламентное задание. То есть синхронизация здесь реализована без квитирования успешности доставки данных, но полностью совместима с протоколом обмена основного .cf

11. Инструкция по внедрению (ОбменДаннымиОнлайнЧерезВебСервис.cf)

Скачиваем файл ОбменДаннымиОнлайнЧерезВебСервис.cf

Выполняем команду: Конфигурация – Сравнить, объединить с конфигурацией из файла… После вывода результатов сравнения конфигураций выполняем команду: Действия – Отметить по подсистемам файла – отмечаем подсистему “ЛУ_СинхронизацияЧерезВебСервис”. Далее – Выполнить. Обновляем конфигурацию базы данных. То же повторяем для корреспондирующей базы. Публикуем обе базы на Веб-сервере (Как? – это отдельная тема, поиск в помощь)
При публикации отмечаем галочками Публиковать Веб-сервисы и LuExchange. Настраиваем соответствующие узлы Планов обменов обеих баз В первой базе создаем узел с настройками подключения ко второй базе и наоборот. Здесь:

  • Сервер – имя веб-сервера, на котором выполнена публикация баз
  • База – имя, под которым выполнена публикация корреспондирующей базы на веб-сервере, как правило совпадает с именем базы на сервере 1С Предприятие
  • Логин – имя пользователя, которого необходимо создать в обеих базах с ролью WebСервисLuExchange (подключение веб-сервиса будет происходить под этим пользователем)
  • Пароль
  • Правила конвертации – сюда необходимо загрузить правила конвертации, созданные в конфигурации “Конвертация данных”

Создание правил конвертации – тоже отдельная большая тема. (Если не в курсе, можно поштудировать инет) Если Вы владеете этим мощным и универсальным инструментом, то для идентичных корреспондирующих баз, правила конвертации сможете создать полностью автоматически за несколько минут. Открываем состав плана обмена ЛУ_WebСервис и добавляем все объекты, для которых в правилах конвертации прописали ПВД (Правила выгрузки данных). Для всех объектов состава запрещаем авторегистрацию. При разработке правил конвертации придерживаемся следующих рекомендаций:

  • Для ПВД поддерживается только способ выборки: “Стандартная выборка”
  • Для всех ПКО справочников и документов рекомендуется устанавливать в ИСТИНА следующие свойства:
    • Искать объект приемника по внутреннему идентификатору объекта источника;
    • При переносе объкта по ссылке НЕ создавать новый объект, а только переносить ссылку;
  • Для ПКО документов дополнительно рекомендуется устанавливать в ИСТИНА следующее свойство:
    • Не выгружать объекты свойств источника по ссылкам;

В этом случае файл данных XML для выгружаемого объекта не будет содержать объекты выгружаемые по ссылкам. Это существенно уменьшит размер передаваемых данных и ускорит процесс синхронизации. Выгрузка этих объектов при необходимости будет инициироваться автоматически.

Если возникнут затруднения в настройке планов обменов
можно скачать вложение “ДемоБазы.zip” и посмотреть как это выполнено в них. 12. Инструкция по внедрению Расширения конфигурации (ОбменДаннымиОнлайнЧерезВебСервис.cfe) (в процессе, будет чуть позже) Если понравилось и желаешь порекомендовать другим коллегам, ставь плюс!

Тяпки, грабли и лопаты

Не очень большой магазин (номенклатура порядка 5000 товаров).
Обыкновенная, файловая 1С 8 УТ. Конфигурация стоит на полной поддержке, и снимать с поддержки нельзя.
База лежит на одной из десктопных машин, которая в свою очередь используется для работы одним из сотрудников.
Достаточно выгружать минимум информации: название, описание, фото, несколько видов цен.
Ломать уже устоявшуюся экосистему было так же крайне не желательно.
Под сайт выделен обыкновенный виртуальный хостинг, а значит нужно учесть ограниченность ресурсов такового.
Выгрузка может происходить не часто, достаточно 1 раза в 3 часа.
Впоследствии, стало необходимо добавить выгрузку прайс-листа в xls.
Скромный бюджет для реализации проекта.
Машина, выполняющая роль «сервера» была и без того не быстрой, а наличие постоянных подключений к базе 1С, только усугубляло ситуацию. Но, заказчика это устраивало, а значит, кучи денег на покупку отдельного сервера и перевооружение остального парка не было.

В связи с ограничениями бюджета, вариант с Битриксом и его типовой интеграцией отпал сразу. Да и интерес был скорее спортивный, реализовать всё самостоятельно. Было решено использовать уже использовавшийся ранее каркас для каталога товаров. Каркас был сделан на CodeIgniter, поэтому добавить небольшой модуль труда не составляло. Решено.

Лет’с старт

Первым делом стал вопрос о периодичности выгрузки информации, а руки так и потянулись к регламентным заданиям… но, стоп. Во-первых, конфигурацию с поддержки снимать нельзя, а значит, и вносить правки в саму конфигурацию мы не можем, а во-вторых, все копии 1С запускаются только при необходимости, а значит, будет ли в нужный момент запущена 1С или нет — неизвестно. Да, можно было бы обязать заказчика, при запуске «сервера» всегда запускать 1С и всегда держать её запущенной, но ведь это создаст лишние неудобства заказчику, а значит решение не самое удобное. Увы, регламентные задания сегодня нам не смогут помочь. Очевидно, что нам понадобится помощь стороннего приложения, для запуска процедуры выгрузки в определённый момент. Тут мы вспоминаем про то, что 1С позволяет запускать себя из командной строки, более того, мы можем сразу же выполнить нужную нам внешнюю обработку и при необходимости, есть даже возможность передать ей какой-нибудь параметр.
Вот основные ключи, которые будут использоваться:
«Путь к 1С» enterprise /F»Путь к базе» /N»Логин» /P»Пароль» /Execute»Внешняя обработка» /C»Параметр» /DisableStartupMessages
Теперь осталось настроить запуск этой конструкции по расписанию. Планировщик Windows? Настраиваем, проверяем… работает!
Но есть один серьёзный недочёт. Когда планировщик запускает по расписанию 1С, то, разумеется, она открывается сверху над всеми приложениями и если в это время работает кто-то за компьютером, то это, во-первых, будет его отвлекать, а во-вторых, он может и закрыть это новое окно. Не порядок… Что же делать? Начинаем копать в сторону запуска под другой учётной записью. Спасибо гуглу, достаточно быстро находим возможность пакетного запуска под другим пользователем. Создаём нового пользователя Windows, разрешаем в политиках безопасности пакетный запуск, перенастраиваем планировщик, проверяем… вуаля! Всё сработало, при этом мы не увидели никаких раздражающих окон! Отлично, значит, такой вариант нам подходит… теперь переходим к собственно выгрузке самих данных.

Выгрузка

Первым делом, конечно, я стал смотреть в сторону CommerceML, но ознакомившись с документацией, стало ясно, что для нашей, достаточно элементарной выгрузки городить весь этот огород — слишком долго, а бюджет не резиновый. Значит, будем искать альтернативный способ. Почему бы просто не выгружать текстовую информацию в xml, а картинки выгружать в отдельную директорию? Решено, так и делаем. Получаем достаточно простую структуру xml-файла: внутри сначала идут записи для групп, а потом сами номенклатурные единицы.
Так выглядят группы:
<group> <Code>код</Code> /*Код-элемента из 1С*/ <Name>наименование</Name> /* Собственно, наименование группы*/ <ParentCode>код родителя</ParentCode> /* Если не пусто, значит группа является вложенной*/ </group>
А так товары:
<item> <Code>код</Code> /* Код-элемента из 1С */ <ParentCode>код родителя</ParentCode> /* Код группы, к которой принадлежит товар */ <Name>наименование</Name> <Descr>Описание</Descr> <Article>Артикул</Article> <TypePrice>Тип цены</TypePrice> <Price>Цена</Price> <Сurrency>валюта</Сurrency> <Remains>Остатки</Remains> <Unit>шт/кг/литры</Unit> <Img>img_dae5eacd-7d88-11de-8856-0024213f1c89.jpg</Img> /* Все изображения содержат в названии уникальный идентификатор элемента в базе 1С */ </item>
Не хитрым запросом получаем информацию по всем товарным группам и товарам, далее формируем xml-ку. Также делаем отдельную выборку и вытаскиваем информацию для прайс-листа, а затем сохраняем полученную информацию в xls.
После этого переходим к выгрузке изображений. В связи с ограничениями хостинг-площадки, обрабатывать изображения на стороне хостинга показалось не самым рациональным, поэтому было решено делать обработку изображений + создание превью на этапе формирования выгрузки. 1С — это конечно комбайн, но вот возможности обработать пачку фотографий я не нашёл. Но ведь у нас есть ImageMagick? Отличный, кроссплатформенный набор всего необходимого нам для обработки изображений… качаем, распаковываем… осталось лишь написать bat’ник, который произведёт необходимые манипуляции:
cd c:\ set thePATH= Здесь указываем путь к изображениям FOR /R «%thePATH%» %%a IN (*.jpg) DO ImageMagick-6.7.0-10\convert.exe %%a -resize ШИРИНАxВЫСОТА^> -quality 70 %%a FOR /R «%thePATH%» %%a IN (*.jpg) DO ImageMagick-6.7.0-10\convert.exe %%a -resize ШИРИНАxВЫСОТА^> -gravity center -extent ШИРИНАxВЫСОТА -quality 70 %thePATH%mini\%%~nxa
Запускаем из нашей обработки этот bat’ник и получаем результат.
Вся информация выгружена, осталось всё аккуратно упаковать в zip и загрузить по фтп на сервер, с чем отлично справляется 1С штатными средствами.
На первый взгляд всё, но… Неужели мы каждый раз будем вытаскивать всю номенклатуру, со всеми картинками и всю эту махину грузить на сервер? Нет уж, это картина не для слабонервных… И что же делать? Делать флаги и отмечать, какая номенклатурная единица изменилась? Нет, мы же не можем править конфигурацию… Но ведь есть же планы обмена? Кто нам запрещал использовать их? Никто! Создаём план обмена, настраиваем. Дальше модифицируем нашу выгрузку, теперь во время выгрузки создаём новое сообщение в плане обмена, выгружаем только изменённые с момента последнего сообщения единицы… Отлично!

Соломка от сбоев

Если в процессе выгрузки информации, обработке изображений, архивировании, загрузке на удалённый фтп произойдут ошибки, то мы можем потерять часть обновлений, и в итоге информация на сайте и в базе 1С будет рассинхронизирована. Ниже я описал основные острые углы, для которых понадобилось подстелить соломки:
1. Итак, что же будет, если например, в момент загрузки по фтп, оборвётся связь?
Если мы уже записали сообщение в план обмена, то получается, что 1С, считает, что успешно выгрузила эти изменения и теперь уже собирает новые, но на сайт-то они не попали! Правильно, поэтому заканчиваем запись в план обмена только после успешного завершения всех этапов выгрузки, включая загрузку файлов по фтп! А если же в процессе выгрузки происходит исключительная ситуация, то мы прерываем запись сообщения в плане обмена и пишем ошибку в error-log.
2. А что, если наш скрипт на сервере начнёт обрабатывать ещё не догруженный архив?
Мы сначала даём ему одно имя (например, export.zip_), а лишь по завершении переименовываем его и даём имя, которое будет искать скрипт на сервере.
3. А что если на сервере будет сбой и скрипт не успеет обработать наш архив, 1С затрёт его новым?
Нет, для этого каждый архив содержит в названии номер сообщения из плана обмена (например, export_1.zip). Скрипт на сервере в свою очередь при обнаружении нескольких архивов обрабатывает их в порядке возрастания номеров.
4. А логи не переполнятся?
Т.к. при выгрузке в лог пишется подробно информация о результатах каждого действия, то логи достаточно быстро растут, поэтому не забываем при каждой выгрузке контролировать их размер и при необходимости удалять старые.
5. А что если 1С не успеет произвести выгрузку, а в это время стартует процесс для новой выгрузки?
В настройках планировщика настраиваем так, чтобы новое задание не выполнялось, если предыдущее не завершено.

Обмен данными в 1С

Преимущества РИБ

Недостатки РИБ

  • Простота в создании распределенной системы, без необходимости в дополнительном программировании;

  • Позволяет обмениваться не только данными, но и изменениями в структуре конфигурации базы данных;

  • Возможность задания условий (фильтров) на прием и передачу элементов данных при обмене;

  • Изменения в данные можно вносить в любой объект, участвующий в обмене данными;

  • Имеются способы настройки для разрешения проблемы при одновременном изменении данных в разных объектах распределенной системы.

  • Обмен данными осуществляется между абсолютно идентичными конфигурациями 1С

  • Структура представлена как древовидная с четким делением каждой пары связанных узлов на “главного” и “подчиненного”. Под узлом понимается объект распределенной системы, участвующий в обмене.

  • Изменения конфигурации передаются только от главного узла к подчиненному.

  • При выгрузке данных справочники, документы и прочие объекты блокируются для новых изменений. Поэтому обмен рекомендуется производить маленькими партиями или в нерабочее время.

Другие варианты обмена между одинаковыми конфигурациями

Если механизм РИБ не подходит для синхронизации данных между идентичными конфигурациями, можно использовать другие механизмы, например универсальный механизм обмена данными или веб-сервисы. Они дают больше возможностей для настройки обмена, но являются более трудоемкими.

Для обмена данными между идентичными конфигурациями существует много внешних обработок. Например, “Выгрузка и загрузка данных XML” является самой известной. Эта обработка позволяет обмениваться любыми данными между одинаковыми конфигурациями.

Разные версии данной обработки могут использоваться в обычном и в управляемом приложениях. Обработки можно найти на диске ИТС, или в шаблонах конфигурации “1С:Конвертация данных”. Рекомендуется использовать обработку из «Конвертации данных” версии 2.1.8.2.

Примеры реализации

На приведенной схеме РИБ представлен стандартный обмен между магазинами и кассами в организации розничной торговли. Такой обмен позволяет оперативно обмениваться данными между филиалами используя все преимущества РИБ.

Обмен между различными системами 1С

Универсальный обмен данными в 1С

Для синхронизации данных между различными конфигурациями в 1С есть универсальный механизм обмена.

При помощи универсального обмена данными в 1С можно решать множество задач обмена, например:

  1. В организации учет ведется в разных программах 1С: бухгалтерский и налоговый учет — в 1С:Бухгалтерия предприятия, управленческий — в 1С:Управление торговлей, расчет з/п в 1С:ЗУП. Необходимо организовать обмен данными между этими тремя системами. Ниже есть схема этого примера.

  2. В организации используется относительно старая, сильно измененная под нужды компании конфигурация Управление торговлей 10.3. Необходимо настроить обмен с конфигурацией последнего релиза (например, БП, КА, УПП).

Этот механизм позволяет создавать распределенные системы, но не требует чтобы они были идентичными. В нем используются уже описанные “планы обмена”.

Использую планы обмена, данные объектов (справочник, документ, регистр сведений и т.д.) представляются в формате XML. Универсальный обмен 1С позволяет организовать разовую и регулярную синхронизацию данных.

Достоинства:

  • Механизм универсального обмена 1С реализован на уровне конфигурации и разрешает обмен данными между объектами различной структуры. В нем в отличие от механизма РИБ нет деления на “главный” и “подчиненный” узлы в распределенной системе. Данный механизм можно реализовать самостоятельно в любой конфигурации, даже в случае разработки с нуля;

  • Формат обмена — XML-документы. В платформе 1С для обработки XML реализована возможность чтения и записи XML-документов.

  • Этот механизм обмена предоставляет большие возможности для настройки структуры передаваемых данных и их состава в различные узлы обмена. Если ни один из имеющихся планов обмена не подходит для обмена, можно создать свой на основе существующего.

Например, необходимо создать односторонний обмен между главной базой и базами филиалов на основе конфигурации УТ 11, причем должен выполниться обмен ограниченными данными, по определенным индивидуальным условиям. РИБ и другие существующие планы обмена для этого не подойдут. В таком случае лучше создать свой план обмена взяв за основу универсальный обмен в формате EnterpriseData.

Главным ограничением является то, что универсальный механизм обмена поддерживает только обмен данными. Изменения в конфигурации нельзя передавать между узлами обмена.

Обмен данными по расписанию в 1С

Часто необходимо сделать так, чтобы обмен данными выполнялся регулярно, в автоматическом режиме. Для автоматического обмена в 1С необходимо настроить регламентное задание и указать расписание его выполнения.

Обмен 1С с внешними программами

Помимо обмена между различными конфигурациями 1С, очень часто требуется организовать обмен данными с внешними программами, например обмен 1C с банком или логистической системой, интеграция с интернет-магазином или корпоративным порталом и т.д..

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

Рассмотрим несколько наиболее распространенных форматов для интеграции с различными приложениями.

Веб-сервисы в 1С (Web-сервисы)

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

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

Программисты могут создать свой необходимый веб-сервис для решения конкретной задачей.

При использовании веб-сервиса нет потребности в предоставлении внешнему приложению доступа к информационной базе, что очень хорошо с точки зрения обеспечения безопасности данных. Внешнее приложение получает доступ к набору функций 1С, которые сами обрабатывают данные и предоставляют “наружу” конечный результат.

Если 1С передает информацию, в конфигураторе создается новый объект “веб-сервис”, и программно описывается его функциональность, например, получение остатков на складах. После того как сервис будет опубликован, стороннее приложение сможет запрашивать и получать информацию о наличии требуемой номенклатуры на складах. Для публикации веб-сервиса на сервере должно быть установлено дополнительное программное обеспечение, веб-сервер. Например, это может быть бесплатный веб-сервер Apache.

Когда 1С получает информацию, в конфигурации создается ссылка, по которой приложение 1С обращается к внешнему веб-сервису, созданному в стороннем приложении. Получив по данной ссылке необходимые данные их обработка выполняется уже внутренними алгоритмами.

Использование HTTP-сервисов в 1С

Примеры применения HTTP-сервисов такие же как и для веб-сервисов. Например, двусторонний обмен данными 1С с интернет-магазином. Со стороны сайта в 1С передаются заказы, со стороны 1С на сайт — документы оплаты и документ, подтверждающий факт отгрузки товара.

Возможность создавать HTTP-сервисы появилась в платформе 1С:Предприятие с версии 8.3.5. Теперь 1С при помощи встроенного языка позволяет создавать запросы и сформировать ответ на запрос от внешнего приложения самостоятельно, используя возможности встроенного языка 1С.

HTTP-сервисы похожи на имеющиеся в платформе веб-сервисы, но обладают несколькими преимуществами:

  • более простое создание клиентского приложения;

  • уменьшенный объем передаваемых данных;

  • меньшая потребность в вычислительных мощностях;

  • большая нацеленность на работу в мобильных устройствах.

Между веб-сервисами и HTTP-сервисами существует разница в структуре запросов, которыми обмениваются приложения:: Веб-сервисы (SOAP) — POST запросы, HTTP-сервисы — GET запросы. В отличие от SOAP HTTP-сервисы поддерживают формат JSON.

Также как и при работе с веб-сервисами, для работы с HTTP-сервисами необходима установка веб-сервера (Apache или IIS).

Поддержка REST-интерфейса в 1С

Начиная с платформы 8.3.5 появилась возможность автоматически создавать REST-интерфейс для прикладного решения 1С. Благодаря кроссплатформенности и уникальности этого механизма, это наиболее удобное решение вопроса интеграции 1С с внешними системами. Механизм REST может использоваться и при обмене между информационными базами 1С, но для этого существуют более удобные решения.

REST-интерфейс позволяет создавать новые объекты, удалять их, читать и редактировать.

Наиболее часто REST-интерфейс применяется в следующих случаях:

  • интеграции с веб-приложениями (интернет-магазины, веб-порталы и т.д.);

  • обмена данными с внешним сторонним приложением;

  • необходимости расширения возможности приложения 1С сторонними средствами без доработки самой конфигурации.

Для публикации необходим веб-сервер.

Обмен в формате EnterpriseData

Формат обмена данными EnterpriseData разработан фирмой 1С для облегчения интеграции с программами 1С. Этот формат позволяет описать объект базы (справочник, документ и т.д.) и содержит информацию об изменении или удалении объекта. На данный момент этот формат поддерживается в следующих продуктах 1С: Управление торговлей 11, Бухгалтерия предприятия 3, Розница 2, ERP 2, ЗУП КОРП 3. Приложения 1С также могут использовать формат EnterpriseData для обмена со сторонними информационными системами.

Обмен в формате EnterpriseData осуществляется посредством обмена XML-файлов. В процессе обмена формируются файлы-запросы и файлы-ответы.

Основным преимуществом формата является то, что он ориентирован на логику 1С, является простым в использовании и не ограничен никакими требования к структуре систем, которые участвуют в обмене.

Применение формата XML в 1С

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

Формат широко используется при обмене с удаленными подразделениями и с интернет-сайтами, при загрузке выписок из банков и прайс-листов от поставщиков, при выгрузке данных в отчетные органы и т.д.

В 1С есть универсальные обработки для выгрузки данных в формате XML

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

Также в 1С XML-формат используется при сохранении настроек отчетов и печатных форм.

Поддержка JSON в 1С

Начиная с версии 8.3.6.1977 в платформе 1С реализована поддержка формата JSON. В более ранних версия платформы 1С с этим форматом тоже можно было работать, но теперь в 1С появились удобные стандартные средства для работы с JSON. Этот формат широко применяется в веб-приложениях и поддерживается всеми браузерами. По сравнению с XML, текстовый формат обмена JSON является более лаконичным.

Основное применение данного формате в 1С это интеграция с внешними приложениями, особенно с веб-приложениями. Формат JSON можно использовать при обмене файлами между разными приложениями 1С:Предприятие.

Этот формат используется в нашей разработке “Обмен счетами между Битрикс24 и 1С:Бухгалтерия предприятия”

Все описанные выше форматы обмена данными в 1С предназначены для того чтобы подготовить запрашиваемые данные и передать их стороннему приложению. Или запросить необходимые данные у внешнего приложения, получить их и передать для обработки на основании внутренних алгоритмов приложения 1С.

Давайте обмениваться данными!

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

Компания ИНТЕРВОЛГА регулярно сталкивается с задачами интеграции 1С с интернет-магазинами и корпоративными порталами, и успешно решает эти задачи.

На нашем сайте есть ряд статей, посвященных обмену между Битрикс и 1С:

  • Обмен счетами между Битрикс24 и 1С-Бухгалтерия

  • Как работает обмен товарами 1С УТ и Битрикс24

  • Интеграция Битрикс24 и 1С-Бухгалтерия — Модуль 1С:Синхронизация

  • и другие

В типовых модулях обмена с сайтами и в наших разработках широко используются технологии, описанные в статье: HTTP-сервисы, веб-сервисы, форматы XML и JSON.

У нашей компании есть большой опыт в интеграционных проектах не только между 1С и сайтами. Вообще все, что касается обмена 1С с чего-либо, нам интересно, в большинстве случаев знакомо, и мы готовы помочь Вам в решении Ваших задач по интеграции 1С.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *