Интеграция 1С с Google Таблицами — крайне популярная задача. Зачастую клиентам или менеджерам удобнее вести оперативный учет, собирать заявки или формировать прайс-листы в совместном онлайн-доступе, а в 1С требуется периодически загружать эти данные для формирования документов или проведения анализа. Существует несколько кардинально различающихся способов реализации этой задачи: от самых простых и надежных "ручных" методов до полностью автоматизированных фоновых процессов.
В этой статье мы подробно разберем все основные варианты интеграции, проанализируем их сильные и слабые стороны, а также рассмотрим технические нюансы реализации каждого метода в коде 1С.
---
Это самый простой, надежный и отказоустойчивый метод, который не зависит от стабильности внешнего API Google, изменений в протоколах безопасности или блокировок контролирующих органов (РКН). Как справедливо отмечают специалисты на форумах, если у клиента нет жесткого требования к ежеминутному обновлению данных, лучшим решением будет выгрузка таблицы в файл Excel (.xlsx) и его последующий импорт в 1С. Для такой задачи можно использовать универсальную обработку для загрузки данных из Excel в справочники 1С.
Для реализации этого способа мы напишем простую обработку. Нам не потребуется установленный Microsoft Excel на сервере 1С — платформа умеет читать такие файлы напрямую с помощью встроенного объекта ТабличныйДокумент.
Разберем по шагам пример кода, выполняющего чтение локального файла на стороне сервера:
Процедура ПрочитатьФайлExcelНаСервере(ПутьКФайлу) Экспорт
ТабДок = Новый ТабличныйДокумент;
Попытка
// Читаем файл напрямую в табличный документ
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
ВызватьИсключение "Не удалось прочитать файл. Возможно, он поврежден или открыт в другой программе. Ошибка: " + ОписаниеОшибки();
КонецПопытки;
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
// Обходим строки таблицы, начиная со второй (предполагая, что первая строка — шапка)
Для НомерСтроки = 2 По КоличествоСтрок Цикл
КодТовара = СокрЛП(ТабДок.ПолучитьОбласть(НомерСтроки, 1, НомерСтроки, 1).ТекущийОбъект.Текст);
Наименование = СокрЛП(ТабДок.ПолучитьОбласть(НомерСтроки, 2, НомерСтроки, 2).ТекущийОбъект.Текст);
Количество = Число(ТабДок.ПолучитьОбласть(НомерСтроки, 3, НомерСтроки, 3).ТекущийОбъект.Текст);
Цена = Число(ТабДок.ПолучитьОбласть(НомерСтроки, 4, НомерСтроки, 4).ТекущийОбъект.Текст);
Если ПустаяСтрока(КодТовара) Тогда
Продолжить; // Пропускаем пустые строки
КонецЕсли;
// Здесь мы можем выполнять поиск номенклатуры и заполнение документов
// Например: ЗаписатьДанныеВДокумент(КодТовара, Количество, Цена);
КонецЦикла;
КонецПроцедуры
Преимущества: Абсолютная независимость от внешних сервисов в момент загрузки, отсутствие необходимости настраивать авторизацию Google API, простота отладки кода.
Недостатки: Требует участия человека для ручного экспорта файла из веб-интерфейса Google Таблиц.
---
Если мы хотим автоматизировать процесс, но не желаем связываться со сложной авторизацией OAuth 2.0 и регистрацией приложений в Google Cloud, мы можем опубликовать документ "для всех, у кого есть ссылка" (в режиме чтения) и скачивать его программно. Google позволяет выгружать документы по прямой ссылке, сформированной особым образом.
Для этого нам понадобится уникальный идентификатор нашей таблицы (он находится в адресной строке браузера между /d/ и /edit).
Адрес для скачивания в формате Excel выглядит так:
https://docs.google.com/spreadsheets/d/[ИДЕНТИФИКАТОР_ТАБЛИЦЫ]/export?format=xlsx
Напишем код 1С, который автоматически скачивает этот файл во временный каталог на сервере и передает его для обработки:
Функция СкачатьТаблицуGoogle(Знач ИдентификаторТаблицы)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
// Настраиваем защищенное соединение SSL
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
HTTPСоединение = Новый HTTPСоединение("docs.google.com", 443,,,,, ЗащищенноеСоединение);
// Формируем относительный путь запроса для экспорта в xlsx
ПутьЗапроса = "/spreadsheets/d/" + ИдентификаторТаблицы + "/export?format=xlsx";
HTTPЗапрос = Новый HTTPЗапрос(ПутьЗапроса);
// Отправляем запрос и сохраняем результат сразу в файл
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос, ИмяВременногоФайла);
Если HTTPОтвет.КодСостояния = 200 Тогда
Возврат ИмяВременногоФайла;
Иначе
ВызватьИсключение "Ошибка скачивания файла. Код состояния: " + HTTPОтвет.КодСостояния;
КонецЕсли;
Исключение
ЗафиксироватьОшибку(ОписаниеОшибки());
Возврат "";
КонецПопытки;
EndФункция
Полученный файл мы можем передать в процедуру чтения из первого способа. Это полностью исключает ручной труд пользователя по скачиванию файлов.
---
Если требуется не просто читать файлы, а осуществлять двусторонний обмен (например, записывать статус обработки обратно в Google Таблицу, менять цвета ячеек, добавлять новые строки программно), необходимо использовать официальный Google Sheets API.
Для облегчения этой задачи существует замечательная отечественная библиотека с открытым исходным кодом — OPI (Open Integrations). Она берет на себя всю рутину по формированию заголовков, разбору JSON и работе с авторизацией. Для работы с ней программисту достаточно вызвать готовую функцию платформы.
Пример использования библиотеки OPI для получения значений ячеек выглядит следующим образом:
// Пример получения данных ячеек через OPI
Токен = "Ваш_Полученный_OAuth_Токен";
Книга = "Идентификатор_Вашей_Таблицы_Google";
Лист = "Лист1";
Диапазон = "A1:D10";
ДанныеЯчеек = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, Диапазон, Лист);
// Перебираем полученные данные
Если ДанныеЯчеек.Свойство("values") Тогда
Для Каждого СтрокаДанных Из ДанныеЯчеек.values Цикл
// Каждая строка представляет собой массив значений колонок
Код = СтрокаДанных[0];
Наименование = СтрокаДанных[1];
// Выполняем логику обработки данных...
КонецЦикла;
КонецЕсли;
Для регулярных фоновых процессов рекомендуется использовать авторизацию через Сервисный аккаунт (Service Account) Google. Вместо интерактивного подтверждения в браузере вы генерируете JSON-ключ в консоли разработчика Google, предоставляете доступ этому сервисному e-mail к вашей таблице и используете его для генерации токенов в фоновых заданиях 1С без какого-либо участия пользователя. Для решения этой задачи подойдёт готовая обработка для интеграции 1С с Google Таблицами через сервисный аккаунт.
---
Интересный альтернативный подход — перенос логики парсинга данных на сторону Google. В самой таблице во встроенном редакторе скриптов (Google Apps Script) пишется простой JavaScript-код, собирающий нужные данные и отдающий их по запросу в формате JSON. Скрипт публикуется как веб-приложение, доступное по уникальной ссылке.
Со стороны 1С отправляется стандартный GET-запрос к этой веб-ссылке. В ответ приходит чистый JSON-массив, который парсится в 1С одной строкой кода:
// Чтение JSON в структуру 1С
СтруктураДанных = ПолучитьДанныеИзGoogleAppsScript(СсылкаНаВебПриложение);
ТаблицаЗначений = УслугиСервера.ПрочитатьJSON(СтруктураДанных);
Этот способ избавляет разработчика 1С от необходимости поддерживать сложные библиотеки интеграции и разбираться в дебрях авторизации OAuth 2.0.
---
В современных реалиях работа с облачными сервисами Google из России может быть нестабильной из-за сетевых блокировок. Как упоминают участники форума, сервисы Google могут периодически "не отвечать" на запросы со стороны серверов 1С без использования специальных средств обхода ограничений.
Если системные администраторы компании не могут настроить VPN-туннель на уровне всей операционной системы сервера, разработчик 1С может решить эту проблему непосредственно в программном коде с помощью объекта ИнтернетПрокси.
Проанализируем пример создания HTTP-соединения через внешний прокси-сервер:
Функция СоздатьСоединениеЧерезПрокси()
// Создаем объект прокси-сервера (например, купленный приватный SOCKS5 или HTTP прокси)
Прокси = Новый ИнтернетПрокси;
// Задаем настройки прокси-сервера
Прокси.Установить("https", "194.226.112.45", 8080, "myProxyUser", "myProxyPassword");
Прокси.НеИспользоватьПроксиДляАдресов.Добавить("*.1c.ru");
Прокси.НеИспользоватьПроксиДляАдресов.Добавить("localhost");
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Передаем объект прокси в конструктор HTTP-соединения
HTTPСоединение = Новый HTTPСоединение("docs.google.com", 443,,,,, ЗащищенноеСоединение, Прокси);
Возврат HTTPСоединение;
КонецФункции
При таком подходе весь локальный трафик 1С идет привычным образом, и только обращения к доменам Google безопасно туннелируются через внешний прокси-сервер, гарантируя стабильную работу обмена без сбоев.
---
Выбор конкретного метода загрузки из Google Таблиц в 1С зависит от требований бизнеса к актуальности данных и технического ландшафта: