Выгрузка самописных пользовательских справочников из 1С на сайт Битрикс
Данная статья является следствием многочасовых поисков в интернете. Были найдены отдельные статьи как настроить выгрузку. Отдельные как должен выглядеть выгружаемый файл. Отдельные статьи по каждой ошибке, где так и не обнаружены ответы на интересующие вопросы.
Так как в результате не было обнаружено толкового описания как настроить выгрузку пользовательского справочника на сайт Битрикс, чтобы она заработала, пришла мысль поделиться собранной информацией с братьями по оружию.
Была поставлена с виду простая задача — настроить выгрузку пользовательских справочников на сайт под управлением CMS Битрикс. Сразу скажем, что модуль Битрикс не самый последний, но думаю, в данном случае это не принципиально. В обучающем видео от производителя все очень просто: настроили справочники, записали, нажали выгрузить, увидели на сайте.
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=131&LESSON_ID=10201
Прекрасно, подумали мы, сейчас мы эту задачу решим за пять минут.
Мы открыли обработку, выбрали справочники, поля для выгрузки, нажали «Выгрузить» и получили ошибку: «Ошибка при создании справочника. Название сущности должно начинаться с заглавной буквы и состоять только из латинских букв и цифр».
Интересно, ведь наш справочник называется по-русски. Откуда же должны взяться латинские символы? Попросили прислать наименования на сайте, они действительно английские. Родилась мысль, что на сайте должно прописываться русское соответствие, но нет. Подставили принудительно в код выгрузки наименования с сайта, результат не изменился. Сайт продолжал присылать такую же ошибку.
С этого момента пришлось отложить кодирование и заняться штудированием сайтов.
Самые главные вопросы были:
1. Каким образом русское название в выгрузке Битрикс должно стать английским
Был найден следующий очень полезный скриншот. Из которого пришло понимание, что из 1С действительно данные должны уходить в русском варианте. А при загрузке на сайт происходит автоматический перевод русского названия на английский. И к тому же к названию таблицы система сама добавит префикс «b_ “ (какая умная система).
Казалось бы задача решена, но опять же не все так просто. Наш справочник — самописный. И его название не имеет ничего общего с названием таблиц на сайте. Такова текущая действительно и повлиять на нее уже нельзя.
Дальше еще веселее, как видно на скриншоте, наименования вставляются без пробелов, и для одного справочника идут два названия. Откуда они берутся?
Первый — название справочника в конфигураторе, а второй — это синоним справочника — тот, который мы показываем пользователю. И что же предлагает Битрикс — всем пользователям писать названия справочников без пробелов? По принципу — и так сойдет, главное, чтобы нам было удобно? Нас такое решение не устроило. Поэтому была дописана мини-функция, которая выдает два параметра для выгрузки по наименованию справочника.
Справочник в конфигурации называется “т_Авторы», на сайте таблица называется «AVTORY”. Соответственно при выгрузке подставляются ИД — Авторы, Наименование — Авторы.
При загрузке на сайт они автоматически превращаются в ИД — “b_avtory” и наименование — «AVTORY”.
2. Почему система не понимает предоставленное ей «в лоб» английское название
Ответ на этот вопрос является скорее догадкой, но видимо при попытке транслитирировать английский в английский, что-то у сервера не срастается, и он предпочитает выругаться, и ничего не грузить.
Ну теперь то точно победа, решили мы, и тут же словили следующий сюрприз от программы:
«Произошла ошибка на стороне сервера. Получен неизвестный статус импорта.<pre>[Bitrix\Main\SystemException] Unknown field definition `UF_VERSION` (UF_VERSION) for AVTORY Entity. (100)» и далее следует непереводимая игра слов.
Изучение кода показало, что ошибку «Получен неизвестный статус импорта» программа выдает во всех случаях, когда что-то пошло не так, то есть искать по ней в интернете смысла нет.
Поиск по «Unknown field definition» выдал много интересных результатов, в результате которых пришлось снова обратиться к человеку, отвечающему за загрузку на сайт с просьбой прислать поля данного справочника.
И тут обнаружилось, что поля UF_VERSION , на которое ругается сервер там просто нет.
Заодно пришло понимание, что для полей есть возможность прописать русское соответствие (хоть на этом спасибо!). В результате, добавили на сайте недостающее поле. Прописали для несовпадающих (после транслитерации) полей русское соответствие, и только в результате всех плясок с бубнами получилось решить задачу выгрузки на сайт.
Проблема решения таких падений состоит в том, что происходит стык границ зон ответственности — программист 1С и администратор сайта. Естественно, каждый пытается переложить ответственность на другую сторону.
Решить нашу задачу помогла только командная работа. Небольшая подсказка для программистов: если система вам выдает в логах следующее сообщение: «Найден или создан справочник. Код справочника: 28»., значит с вашей стороны все работает верно. Дальше смело отправляйте сообщения ошибки администратору сайта.
Резюмируем, что нужно сделать, чтобы выгрузить самописный справочник на сайт, когда там уже есть своя структура данных.
1. Получить от администратора сайта таблицу с наименованием и ID справочников.
2. Написать функцию, где будут по названию справочников подставляться РУССКИЕ названия таким образом, чтобы после транслитерации они соответствовали названиям на сайте. Если название идет с разделением слов нижним подчеркиванием, то передавать нужно аналогично. Например справочник «Книжные_переплеты».
Рассмотрим передачу такого справочника на сайт:
Таблицы сайта: ИД — «b_knizhnye_pereplety”, Наименование — «KnizhnyePereplety».
Функция будет выглядеть примерно так:
СтруктураЗаголовка = Новый Структура(«Ид,Наименование», «», «»);
Если НазваниеСправочника = «тКнижныеПереплеты» Тогда
СтруктураЗаголовка.Вставить(«ИД», “Книжные_переплеты»);
СтруктураЗаголовка.Вставить(«Наименование», “КнижныеПереплеты»);
Иначе //следующий справочник
КонецЕсли;
Возврат СтруктураЗаголовка;
Так как у нас все справочники самописные, то пришлось прописать правила для каждого справочника.
3. Получить от администратора сайта таблицу с наименованием полей выгружаемых справочников. Проверить, если после транслитерации выгружаемое поле не совпадет с названием, то прописать явное соответствие в Highload-блоке на сайте в поле XML_ID.
Удачи вам!