Хочу предложить пример создания создания сайта на классических JS и PHP, работающего с информацией из 1С. В коде PHP формируются скрипты 1С, которые передаются на выполнение в HTTP сервис конфигурации. Сервис возвращает сайту запрошенную информацию для вывода в браузер. Предложенная разработка была первым шагом в разработке реально действующего сайта.
Сначала необходимо распаковать приложенный архив в папку корня апача. Имя папки надо записать в файл config.php.
Далее создать HTTP сервис и загрузить в его метод следующий код:
// Выполняет запрос к базе данных из тела POST запроса на
// http://localhost/<base>/hs/<Корневой URL>
Функция ЗапросGet(Запрос)
Контент = НРег(Запрос.Заголовки.Получить("Content-Type"));
ВозвращатьСтруктуру = НРег(Запрос.Заголовки.Получить("Structure"));
Метод = Запрос.HTTPМетод;
HTTPОтвет = Новый HTTPСервисОтвет(400);
Если Контент = Неопределено ИЛИ СтрНайти(Контент, "charset=windows-1251") > 0 Тогда
ТекстЗапроса = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
ИначеЕсли СтрНайти(Контент, "charset=utf-8") > 0 Тогда
ТекстЗапроса = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Иначе
ТекстЗапроса = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI); //
КонецЕсли;
Результат = ПростойЗапрос(ТекстЗапроса, HTTPОтвет, ВозвращатьСтруктуру);
Возврат Результат;
КонецФункции
Функция ПростойЗапрос(ТекстЗапроса, HTTPОтвет, ВозвращатьСтруктуру)
Попытка
Если ВРег(Лев(ТекстЗапроса, 7)) = "ВЫБРАТЬ" Тогда
ЗапросСКЛ = Новый Запрос;
ЗапросСКЛ.Текст = ТекстЗапроса;
Рез = ЗапросСКЛ.Выполнить();
Колонки = Рез.Колонки;
ТЗ = Рез.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Итог = Новый Массив;
Пока ТЗ.Следующий() Цикл
Если ЗначениеЗаполнено(ТЗ.Группировка()) Тогда
ИмяГруппы = Строка(ТЗ[ТЗ.Группировка()]);
МассивГруппировок = Новый Массив;
МассивГруппировок.Добавить(ТЗ.Группировка());
Рез = ВыдатьДочерниеЗаписи(ТЗ.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам), Колонки, МассивГруппировок);
Соответствие = Новый Соответствие;
Соответствие.Вставить(ИмяГруппы, Рез);
Итог.Добавить(Соответствие);
ИначеЕсли ВозвращатьСтруктуру = "true" Тогда
СтруктураСтрока = Новый Структура;
Для ИндексТЗ = 0 по Колонки.Количество() - 1 Цикл
СтруктураСтрока.Вставить(Колонки[ИндексТЗ].Имя, ТЗ[ИндексТЗ])
КонецЦикла;
Итог.Добавить(СтруктураСтрока);
Иначе
МассивСтрока = Новый Массив;
Для ИндексТЗ = 0 по Колонки.Количество() - 1 Цикл
МассивСтрока.Добавить(ТЗ[ИндексТЗ])
КонецЦикла;
Итог.Добавить(МассивСтрока);
КонецЕсли;
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Итог);
Результат = ЗаписьJSON.Закрыть();
Иначе
Результат = "";
Выполнить(ТекстЗапроса);
КонецЕсли;
HTTPОтвет.КодСостояния = 200;
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Ошибка HTTP-сервиса", УровеньЖурналаРегистрации.Ошибка,,
Инфо.Описание, ПодробноеПредставлениеОшибки(Инфо) + Символы.ПС + Символы.ПС + ТекстЗапроса);
Результат = КраткоеПредставлениеОшибки(Инфо);
HTTPОтвет.КодСостояния = 500;
КонецПопытки;
HTTPОтвет.УстановитьТелоИзСтроки(Результат);
Возврат HTTPОтвет;
КонецФункции
Функция ВыдатьДочерниеЗаписи(ТЗ, Колонки, МассивГруппировок)
МассивГруппы = Новый Массив;
Пока ТЗ.Следующий() Цикл
ИмяГруппы = Строка(ТЗ[ТЗ.Группировка()]);
Если ЗначениеЗаполнено(ТЗ.Группировка()) Тогда
МассивГруппировок.Добавить(ТЗ.Группировка());
Рез = ВыдатьДочерниеЗаписи(ТЗ.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам), Колонки, МассивГруппировок);
Соответствие = Новый Соответствие;
Соответствие.Вставить(ИмяГруппы, Рез);
МассивГруппы.Добавить(Соответствие);
Иначе
МассивСтрока = Новый Массив;
Для ИндексТЗ = 0 по Колонки.Количество() - 1 Цикл
Если МассивГруппировок.Найти(Колонки[ИндексТЗ].Имя) = Неопределено Тогда
МассивСтрока.Добавить(ТЗ[ИндексТЗ])
КонецЕсли;
КонецЦикла;
МассивГруппы.Добавить(МассивСтрока);
КонецЕсли;
КонецЦикла;
Возврат МассивГруппы;
КонецФункции
Корневой URL этого метода прописать в файл config.php.
Функция принимает POST запрос, в теле которого передаётся скрипт 1С. Запрос формируется следующей php функцией:
private function query1C($query, $toJSON = true, $Structure = false)
{
if ($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, HTTP_1C);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, USERPWD_1C);
curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type: text/plain; charset=utf-8", "Structure: ".($Structure ? 'true' : 'false')]);
curl_setopt($curl, CURLOPT_POSTFIELDS, $query);
$result = $toJSON ? json_decode(curl_exec($curl), JSON_UNESCAPED_UNICODE) : curl_exec($curl);
curl_close($curl);
} else {
$result = false;
}
return $result;
}
И, например, получение списка касс:
$json = $this->query1C("ВЫБРАТЬ
Кассы.Код КАК code,
Кассы.Наименование КАК name
ИЗ
Справочник.Кассы КАК Кассы
ГДЕ
НЕ Кассы.ПометкаУдаления", false, true);
Создать пользователя с административными правами и правами на работу с кассовыми документами. Логин и пароль этого пользователя записать в config.php.
Опубликовать базу.
Вызвать сайт по адресу http://<адрес>/<папка>/index.php. Ввести логин и пароль какого-нибудь пользователя 1С. Здесь следует учесть, что работа с базой 1С будет вестись с правами пользователя указанного в config.php. Пользователь, указанный на странице авторизации, может не обладать правами работы с кассой.
Разработка тестировалась на Windows Server 2012 R2 Standard Edition
1С:Предприятие 8.3 (8.3.16.1063)
Управление нашей фирмой, редакция 1.6.
PHP Version 7.1.5
Apache/2.4.37