Сверку данных между двумя информационными базами 1С часто называют «головной болью» системного администратора или программиста, особенно когда одна из баз находится в облачном сервисе 1С:Фреш. В такой ситуации стандартный и привычный многим метод COM-соединения недоступен по соображениям безопасности облачной платформы. Рассмотрим ситуацию, когда нам необходимо сопоставить документы (касса, банк, взаиморасчеты, товары) между 1С:Управлением нашей фирмой (УНФ) и 1С:Бухгалтерией предприятия (БП 3.0). Проанализируем доступные методы, их преимущества и технические нюансы реализации.
Если мы не можем подключиться к базе напрямую, мы всегда можем обмениваться данными через файлы (например, XML, JSON или обычные таблицы Excel). Разберем по шагам алгоритм создания такой системы сверки:
Дата + Номер + Сумма + Контрагент.Рассмотрим пример кода, который позволяет подготовить данные для сопоставления в виде таблицы значений. Проанализируем, как можно собрать данные для последующей выгрузки в файл:
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("УИД", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(36)));
ТаблицаДанных.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДанных.Колонки.Добавить("Номер", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(20)));
ТаблицаДанных.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Выборка = Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаОкончания);
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.УИД = Строка(Выборка.Ссылка.УникальныйИдентификатор());
НоваяСтрока.Дата = Выборка.Дата;
НоваяСтрока.Номер = Выборка.Номер;
НоваяСтрока.Сумма = Выборка.СуммаДокумента;
КонецЦикла;
Основная идея этого подхода — использование правил сопоставления в табличном документе. Выясним причину, почему это удобно: программисту не нужно переписывать код при изменении структуры метаданных. Достаточно в пользовательском режиме указать, что поле СуммаДокумента в УНФ соответствует полю Сумма в БП.
В 1С:Фреш стандартно поддерживается протокол OData. Это позволяет одной базе «постучаться» в другую через HTTP-запрос и получить данные в формате JSON или XML без использования COM. Посмотрим на пример реализации HTTP-запроса к облачной базе:
Соединение = Новый HTTPСоединение("1cfresh.com", 443, Логин, Пароль, , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/a/pb/12345/odata/standard.odata/Document_РеализацияТоваровУслуг?$format=json&$select=Date,Number,Amount");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеБП = ПрочитатьJSON(ЧтениеJSON);
// Далее выполняем сопоставление с локальной таблицей
КонецЕсли;
Важный момент при работе с OData: в облаке должен быть создан пользователь с правами Удаленный доступ (OData). Этот метод позволяет выполнять сверку «на лету» без промежуточных файлов, что значительно ускоряет процесс, если объем документов составляет около 1000 в месяц.
Если бюджет на разработку ограничен, проанализируем ситуацию использования внешних инструментов. В обеих базах формируются стандартные отчеты Реестр документов. Далее эти реестры загружаются в Excel.
Использование инструмента Power Query позволяет автоматизировать процесс:
Рассмотрим более сложный, но производительный вариант. Данные из локальной УНФ и облачной БП выгружаются во внешнюю базу данных (например, PostgreSQL или MS SQL). Выясним преимущества этого подхода:
Во-первых, это позволяет хранить историю изменений и отслеживать, когда именно возникло расхождение. Во-вторых, SQL-запросы позволяют мгновенно сопоставлять миллионы записей. Однако для 1000 документов в месяц этот метод может быть избыточным («стрельба из пушки по воробьям»).
При сверке данных мы часто сталкиваемся с проблемой «разных» номеров (префиксы баз, ведущие нули). Чтобы сверка была точной, рекомендуем придерживаться следующих правил:
UUID остается неизменным.ОбщегоНазначенияКлиентСервер.ПолучитьНомерНаПечать(Номер) или собственные алгоритмы удаления префиксов.НачалоДня(Дата).В завершение разберем, как реализовать простейший алгоритм сравнения двух таблиц значений (ТЗ_УНФ и ТЗ_БП) непосредственно в коде 1С:
Для Каждого СтрокаУНФ Из ТЗ_УНФ Цикл
ПараметрыОтбора = Новый Структура("Номер, Дата, Сумма", СтрокаУНФ.Номер, СтрокаУНФ.Дата, СтрокаУНФ.Сумма);
НайденныеСтроки = ТЗ_БП.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
Сообщить("Документ " + СтрокаУНФ.Номер + " не найден в БП или суммы различаются!");
КонецЕсли;
КонецЦикла;
Резюмируя: наиболее перспективным и современным методом для работы с облаком 1С:Фреш является использование OData в сочетании с JSON. Если же требуется максимально простое решение, которое может поддерживать сам пользователь, — выбирайте вариант с загрузкой данных из файлов реестров с гибкой настройкой правил сопоставления в табличном документе.