Перейти к содержимому

Ручная загрузка файла обмена - когда 1С не достучится до сайта

Разбираем схему без прямой связи: учётная система выгружает файлы, а сайт забирает и разбирает их сам. Так работают закрытые сети и разовые загрузки.

Решение

Кладём файлы в каталог обмена:

Окно терминала
ls -l /home/bitrix/www/upload/1c_catalog/
chown bitrix:bitrix /home/bitrix/www/upload/1c_catalog/*.xml
file -i /home/bitrix/www/upload/1c_catalog/import.xml # кодировка файла
# файл от чужого владельца сайт прочитает, но не сможет переместить или удалить

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

Запускаем разбор вручную:

Окно терминала
curl -sS -u 'exchange:пароль' \
'https://example.com/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=import.xml'
# тот же адрес, что и при обычном обмене, только вызываем его сами

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

Соблюдаем порядок частей:

Окно терминала
# сначала товары и разделы, затем предложения, затем цены и остатки
for f in import.xml offers.xml; do
curl -sS -u 'exchange:пароль' \
"https://example.com/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=$f"
done

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

Автоматизируем забор файла:

Окно терминала
30 3 * * * /usr/bin/rsync -a exchange@10.0.0.7:/out/*.xml /home/bitrix/www/upload/1c_catalog/
40 3 * * * /usr/bin/php /home/bitrix/www/local/tools/import.php
# файл появляется в хранилище, сайт забирает его и разбирает по расписанию
# между забором файла и разбором оставляют запас на копирование

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

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

Всю схему стоит описать в двух-трёх строчках рядом с самим расписанием. Через полгода никто не помнит, кто кладёт файл, кто его забирает и что делать, если он не появился к утру.

Размер файла упирается ровно в те же пределы, что и обычный обмен. Выгрузка на несколько гигабайтов не разберётся за один запрос, и её делят на части на стороне учётной системы, а не на сайте.

Типичные проблемы

Файл разобран, но остался в каталоге.

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

Предложения приехали без привязки к товарам.

Части выгрузки разобраны в неверном порядке. Товары обрабатывают раньше предложений и цен на них.

Разбор обрывается на большом файле.

Файл не укладывается в отведённое время и память процесса. Его делят на части на стороне учётной системы.

Каталог обмена разросся.

Разобранные файлы из него никто не убирает. Их переносят в архив либо удаляют после успешного разбора.

Запуск отвечает формой входа.

Учётная запись обмена не передана в запросе либо не имеет нужных прав. Запрос отправляют с теми же данными доступа, что и обычный сеанс.

Частые вопросы

Чем ручная загрузка хуже обычного обмена?

Ничем по результату, но требует своей обвязки: забор файла, порядок частей, чистка. Обычный обмен делает это сам.

Можно ли так загрузить разовую выгрузку?

Да, это самый простой способ принять каталог от партнёра. Регулярную схему всё равно стоит автоматизировать.

Как проверить, что разбор прошёл?

По журналу обмена и сверке чисел в каталоге. Ответ команды запуска говорит только о завершении запроса.

Нужен ли доступ 1С к сайту в этой схеме?

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

Смежное

Первоисточник