Online телефонный справочник из 1С: Зарплата и управление персоналом

Публикация № 595832 10.03.17

Управление - Управление персоналом (HRM)

http-сервис телефонный справочник зарплата и управление персоналом web html javascript

В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.

Во многих организациях используются телефонные справочники сотрудников. Сначала у нас был красивый бумажный вариант, разработанный в редакторе векторной графики. Но постепенно мне стало надоедать, что приходится его распечатать, затем вырезать и скрепить, а таких справочников варировалось от 10 до 25 штук. В общем, занимало много времени, и особого желания заниматься этим не было. Далее справочник эволюционировал в электронную версию в Excel. Для меня это был идеальный вариант: работает поиск, простота заполнения. Но акктуализировать информацию приходилось мне, возможно из-за сложности формы, а возможно из-за нежелания сотрудника заниматься изучением справочника. В общем со временем мне надоел и этот вариант.  Поспрашивав друзей из других компаний,  я выяснил, что online телефонный справочник у них реализован с использованием LDAP или PHP+MySQL. Мне не понравились данные реализации по ряду причин:

  • при использовании LDAP пришлось бы забивать в базу контакты людей, которые не пользуются корпоративной сетью вообще;
  • при использовании LDAP для поддержания акктуальной информации пришлось кому-то из сотрудников давать доступ к серверу, а точнее к редактированию данных LDAP;
  • при использовании PHP+MySQL необходимо было бы писать и серверную, и клиентскую часть с нуля, либо модифицировать наработки товарищей под свои нужды. Поскольку, я не силен в PHP, то рассматривать данный вариант не стал.

В итоге я решил использовать в качестве хранения и обработки данных 1C, а для удобного вывода HTML и JavaScript. 

Задача разделилась на 3 этапа:

1. Разработка серверной части, т.е.  разработать HTTP-сервис для конфигурации 1С: ЗУП

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

3. Публикация на web-сервере. Об этом я в статье писать не буду, поскольку информации в интернете, да и на infostart.ru много по этому вопросу.

В результате получилась система отображающая контактыне данные о сотрудниках и их ближайшие дни рождения. Итак начнем.

Разработка серверной части

Для начала давайте разберемся, как работать с  HTTP-сервисами в 1С. HTTP-сервисы представляют обработчики HTTP-запросов по определенному URL. URL HTTP-сервиса используется специальный, например:

http://<адрес сервера>/<имя базы>/hs/<корневой URL>/<относительный URL>

где

  • адрес сервера - это адрес серевера публикации базы 1С;
  • имя базы - это название базы данных конфигурации 1С;
  • hs - указывает на то, что мы обращаемся к HTTP-сервису;
  • корневой URL - это группа запросов, объеденных общим смыслом. Указывается в свойствах HTTP-запроса;
  • относительный URL - это сам запрос, который может использоваться по шаблону и указывается в объекте Шаблон URL.

Для телефонного справочника используем корневой URL - person, а относительные URL следующие (рисунок 1):

  1. personList - получение списка сотрудников;
  2. personInfo - получение контактной информации по сотруднику;
  3. birthdayList - получение списка дней рождения и дней оставшихся до него.
Для написания HTTP-сервиса используем методы в шаблонах URL, которые связываются в модуле HTTP-сервиса с функциями. В модуле HTTP-сервиса будут 3 функции getPersonList, getPersonInfo, getBirthdayList.
Конфигуратор 1С: ЗУП
Рисунок 1. HTTP-сервис и шаблоны URL
Алгоритмы трех функций очень схожи и сводятся к одному:
  1. Проверяем парметры HTTP-запроса;
  2. Составляем запрос к базе данных
  3. Обрабатываем результаты базы данных в объекты массив и структуры
  4. Формируем из полученных объектов сериализированную строку JSON
  5. Формируем ответ и отправляем обратно клиенту

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

Для начала создадим объект HTTPСервисОтвет с числовым параметром, соответствующий коду HTTP-состояния и укажем тип возвращаемых данных (javascript). Более подробнее про коды HTTP состояния можно почитать тут.

Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type","application/javascript");

Пока работа с объектом HTTPСервисОтвет закончена. Для того, чтобы получить параметры от клиента мы обрабатываем Запрос методом Получить, аргументом которого идет название параметра:

ПараметрСостояния = ?(Запрос.ПараметрыЗапроса.Получить("fired") = "0", Перечисления.СостоянияСотрудника.Увольнение, Неопределено);

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

Дальше мы производим запрос к базе данных с параметром:

ЗапросКБазе = Новый Запрос;
	ЗапросКБазе.Параметры.Вставить("Состояние",ПараметрСостояния);
	ЗапросКБазе.Текст = "ВЫБРАТЬ
	                    |	ДанныеДляПодбораСотрудников.Сотрудник.Код КАК КодСотрудника,
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Наименование КАК Подразделение,
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Код КАК КодПодразделения,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Фамилия КАК Фамилия,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Имя КАК Имя,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Отчество КАК Отчество
	                    |ИЗ
	                    |	РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
	                    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСотрудников.СрезПоследних КАК СостоянияСотрудниковСрезПоследних
	                    |		ПО ДанныеДляПодбораСотрудников.Сотрудник.Ссылка = СостоянияСотрудниковСрезПоследних.Сотрудник.Ссылка
	                    |ГДЕ
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Наименование <> """"
	                    |	И СостоянияСотрудниковСрезПоследних.Состояние.Ссылка <> &Состояние
	                    |
	                    |СГРУППИРОВАТЬ ПО
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Наименование,
	                    |	ДанныеДляПодбораСотрудников.Сотрудник.Код,
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Код,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Фамилия,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Имя,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Отчество
	                    |
	                    |УПОРЯДОЧИТЬ ПО
	                    |	Подразделение,
	                    |	Фамилия
	                    |ИТОГИ
	                    |	МАКСИМУМ(КодСотрудника),
	                    |	МАКСИМУМ(Подразделение)
	                    |ПО
	                    |	КодПодразделения";
	Результат = ЗапросКБазе.Выполнить();

Заострять внимание на зпросе не будем, поскольку я писать запросы не умею, тема публикации меньше отностися к запросам и поэтому перейду к обработке результатов запроса:

ВыборкаПодразделений = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"КодПодразделения");
СписокПодразделений = Новый Массив;
Пока ВыборкаПодразделений.Следующий() Цикл
	Подразделение = Новый Структура;
	Подразделение.Вставить("id",Строка(ВыборкаПодразделений.КодПодразделения));
	Подразделение.Вставить("open","true");	
	Подразделение.Вставить("value",Строка(ВыборкаПодразделений.Подразделение));
	СписокСотрудников = Новый Массив;
	ВыборкаСотрудники = ВыборкаПодразделений.Выбрать();
	Пока ВыборкаСотрудники.Следующий() Цикл
		Сотрудник = Новый Структура;
		ФИО = ВыборкаСотрудники.Фамилия + " " + Лев( ВыборкаСотрудники.Имя, 1) + ". " + Лев( ВыборкаСотрудники.Отчество, 1) + ".";
		Сотрудник.Вставить("id",Строка(ВыборкаСотрудники.КодСотрудника));
		Сотрудник.Вставить("value",Строка(ФИО));
		СписокСотрудников.Добавить(Сотрудник);		
	КонецЦикла; 	
	Подразделение.Вставить("data",СписокСотрудников);
	СписокПодразделений.Добавить(Подразделение);
КонецЦикла; 

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

Джсон = Новый ЗаписьJSON;
Джсон.УстановитьСтроку();
Настройка = Новый НастройкиСериализацииJSON;
ЗаписатьJSON(Джсон, СписокПодразделений,Настройка);
РезультатСтрока = Джсон.Закрыть(); 	
Ответ.УстановитьТелоИзСтроки(РезультатСтрока,КодировкаТекста.UTF8);
Возврат Ответ;

При формировании JSON использовал пример с its.1c.ru

Код функции GetPersonsList
Функция GetPersonsList(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-type","application/javascript");
	ПараметрСостояния = ?(Запрос.ПараметрыЗапроса.Получить("fired") = "0", Перечисления.СостоянияСотрудника.Увольнение, Неопределено); 

	ЗапросКБазе = Новый Запрос;
	ЗапросКБазе.Параметры.Вставить("Состояние",ПараметрСостояния);
	ЗапросКБазе.Текст = "ВЫБРАТЬ
	                    |	ДанныеДляПодбораСотрудников.Сотрудник.Код КАК КодСотрудника,
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Наименование КАК Подразделение,
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Код КАК КодПодразделения,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Фамилия КАК Фамилия,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Имя КАК Имя,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Отчество КАК Отчество
	                    |ИЗ
	                    |	РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
	                    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСотрудников.СрезПоследних КАК СостоянияСотрудниковСрезПоследних
	                    |		ПО ДанныеДляПодбораСотрудников.Сотрудник.Ссылка = СостоянияСотрудниковСрезПоследних.Сотрудник.Ссылка
	                    |ГДЕ
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Наименование <> """"
	                    |	И СостоянияСотрудниковСрезПоследних.Состояние.Ссылка <> &Состояние
	                    |
	                    |СГРУППИРОВАТЬ ПО
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Наименование,
	                    |	ДанныеДляПодбораСотрудников.Сотрудник.Код,
	                    |	ДанныеДляПодбораСотрудников.Подразделение.Код,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Фамилия,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Имя,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Отчество
	                    |
	                    |УПОРЯДОЧИТЬ ПО
	                    |	Подразделение,
	                    |	Фамилия
	                    |ИТОГИ
	                    |	МАКСИМУМ(КодСотрудника),
	                    |	МАКСИМУМ(Подразделение)
	                    |ПО
	                    |	КодПодразделения";
	Результат = ЗапросКБазе.Выполнить();
	ВыборкаПодразделений = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"КодПодразделения");
	СписокПодразделений = Новый Массив;
	Пока ВыборкаПодразделений.Следующий() Цикл
		Подразделение = Новый Структура;
		Подразделение.Вставить("id",Строка(ВыборкаПодразделений.КодПодразделения));
		Подразделение.Вставить("open","true");	
		Подразделение.Вставить("value",Строка(ВыборкаПодразделений.Подразделение));
		СписокСотрудников = Новый Массив;
		ВыборкаСотрудники = ВыборкаПодразделений.Выбрать();
		Пока ВыборкаСотрудники.Следующий() Цикл
			Сотрудник = Новый Структура;
			ФИО = ВыборкаСотрудники.Фамилия + " " + Лев( ВыборкаСотрудники.Имя, 1) + ". " + Лев( ВыборкаСотрудники.Отчество, 1) + ".";
			Сотрудник.Вставить("id",Строка(ВыборкаСотрудники.КодСотрудника));
			Сотрудник.Вставить("value",Строка(ФИО));
			СписокСотрудников.Добавить(Сотрудник);		
		КонецЦикла; 	
		Подразделение.Вставить("data",СписокСотрудников);
		СписокПодразделений.Добавить(Подразделение);
	КонецЦикла; 
	Джсон = Новый ЗаписьJSON;
	Джсон.УстановитьСтроку();
	Настройка = Новый НастройкиСериализацииJSON;
	ЗаписатьJSON(Джсон, СписокПодразделений,Настройка);
	РезультатСтрока = Джсон.Закрыть(); 	
	Ответ.УстановитьТелоИзСтроки(РезультатСтрока,КодировкаТекста.UTF8);
	Возврат Ответ;
КонецФункции
Код функции GetPersonInfo
Функция GetPersonInfo(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-type","application/javascript");
	КодФизлица = Запрос.ПараметрыЗапроса.Получить("id");

	ЗапросКБазе = Новый Запрос;
	ЗапросКБазе.Параметры.Вставить("КодФизлица",КодФизлица);
	ВидыКонтактнойИнформации = Новый Массив;
	ВидыКонтактнойИнформации.Добавить(Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Мобильный телефон").Ссылка);
	ВидыКонтактнойИнформации.Добавить(Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Email").Ссылка);
	ВидыКонтактнойИнформации.Добавить(Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Домашний телефон").Ссылка);
	ВидыКонтактнойИнформации.Добавить(Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Рабочий телефон").Ссылка);
	ВидыКонтактнойИнформации.Добавить(Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Адрес места проживания").Ссылка);
	ЗапросКБазе.УстановитьПараметр("ВидыКонтактов",ВидыКонтактнойИнформации);
	ЗапросКБазе.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	                    |	ФизическиеЛицаКонтактнаяИнформация.Вид,
	                    |	ФизическиеЛицаКонтактнаяИнформация.Представление,
	                    |	ФизическиеЛицаКонтактнаяИнформация.Ссылка.Ссылка КАК СсылкаФизЛицо
	                    |ПОМЕСТИТЬ Контакты
	                    |ИЗ
	                    |	Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизическиеЛицаКонтактнаяИнформация
	                    |ГДЕ
	                    |	ФизическиеЛицаКонтактнаяИнформация.Вид В(&ВидыКонтактов)
	                    |;
	                    |
	                    |////////////////////////////////////////////////////////////////////////////////
	                    |ВЫБРАТЬ
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.ФИО КАК ФИО,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения КАК ДатаРождения,
	                    |	ДанныеДляПодбораСотрудников.Должность.Наименование КАК Должность,
	                    |	Контакты.Вид КАК ТипКонтакта,
	                    |	Контакты.Представление КАК Контакт
	                    |ИЗ
	                    |	Контакты КАК Контакты
	                    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
	                    |		ПО Контакты.СсылкаФизЛицо = ДанныеДляПодбораСотрудников.ФизическоеЛицо.Ссылка
	                    |ГДЕ
	                    |	ДанныеДляПодбораСотрудников.Сотрудник.Код = &КодФизлица
	                    |	И ДанныеДляПодбораСотрудников.Должность.Наименование <> """"
	                    |
	                    |СГРУППИРОВАТЬ ПО
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.ФИО,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения,
	                    |	ДанныеДляПодбораСотрудников.Должность.Наименование,
	                    |	Контакты.Вид,
	                    |	Контакты.Представление
	                    |
	                    |УПОРЯДОЧИТЬ ПО
	                    |	ФИО
	                    |ИТОГИ ПО
	                    |	ФИО";
	Результат = ЗапросКБазе.Выполнить();
	ВыборкаСотрудник = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ФИО");
	Пока ВыборкаСотрудник.Следующий() Цикл
		Сотрудник = Новый Структура;
		Сотрудник.Вставить("fio",Строка(ВыборкаСотрудник.ФИО));
		СписокКонтактов = Новый Массив;
		ВыборкаКонтактов = ВыборкаСотрудник.Выбрать();
		Пока ВыборкаКонтактов.Следующий() Цикл
			Контакт = Новый Структура;
			Контакт.Вставить("type",Строка(ВыборкаКонтактов.ТипКонтакта));
			Контакт.Вставить("value",Строка(ВыборкаКонтактов.Контакт));
			Сотрудник.Вставить("birthday",Строка(Лев(ВыборкаКонтактов.ДатаРождения,10)));	
			Сотрудник.Вставить("who",Строка(ВыборкаКонтактов.Должность));
			СписокКонтактов.Добавить(Контакт);		
		КонецЦикла; 	
		Сотрудник.Вставить("contacts",СписокКонтактов);;
	КонецЦикла; 
	Джсон = Новый ЗаписьJSON;
	Джсон.УстановитьСтроку();
	Настройка = Новый НастройкиСериализацииJSON;
	ЗаписатьJSON(Джсон, Сотрудник, Настройка);
	РезультатСтрока = Джсон.Закрыть(); 	
	Ответ.УстановитьТелоИзСтроки(РезультатСтрока,КодировкаТекста.UTF8);
	Возврат Ответ;
	
КонецФункции
Код функции GetBirthdayList
Функция GetBirthdayList(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	КоличествоДней = Запрос.ПараметрыЗапроса.Получить("days");
	ЗапросКБазе = Новый Запрос();
	ЗапросКБазе.Параметры.Вставить("Дней", Число(КоличествоДней));
	ЗапросКБазе.Параметры.Вставить("Сегодня", ТекущаяДата());
	ЗапросКБазе.Текст = "ВЫБРАТЬ
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Наименование КАК ФИО,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения КАК ДатаРождения,
	                    |	ДЕНЬГОДА(ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения) - ДЕНЬГОДА(&Сегодня) КАК ДоДняРождения
	                    |ИЗ
	                    |	РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
	                    |ГДЕ
	                    |	ДЕНЬГОДА(ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения) - ДЕНЬГОДА(&Сегодня) <= &Дней
	                    |	И ДЕНЬГОДА(ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения) - ДЕНЬГОДА(&Сегодня) > 0
	                    |
	                    |СГРУППИРОВАТЬ ПО
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.ДатаРождения,
	                    |	ДанныеДляПодбораСотрудников.ФизическоеЛицо.Наименование
	                    |
	                    |УПОРЯДОЧИТЬ ПО
	                    |	ДоДняРождения";
	Результат = ЗапросКБазе.Выполнить();
	ВыборкаСотрудник = Результат.Выбрать();
	СписокСотрудников = Новый Массив;
	Пока ВыборкаСотрудник.Следующий() Цикл
		Сотрудник = Новый Структура;
		Сотрудник.Вставить("fio",Строка(ВыборкаСотрудник.ФИО));
		Сотрудник.Вставить("days",Строка(ВыборкаСотрудник.ДоДняРождения));	
		Сотрудник.Вставить("birthday",Строка(Лев(ВыборкаСотрудник.ДатаРождения,10)));	
		СписокСотрудников.Добавить(Сотрудник);
	КонецЦикла; 
	Джсон = Новый ЗаписьJSON;
	Джсон.УстановитьСтроку();
	Настройка = Новый НастройкиСериализацииJSON;
	ЗаписатьJSON(Джсон, СписокСотрудников, Настройка);
	РезультатСтрока = Джсон.Закрыть(); 	
	Ответ.УстановитьТелоИзСтроки(РезультатСтрока,КодировкаТекста.UTF8);
	Возврат Ответ;
КонецФункции

Алгоритм остальных функций аналогичен. Переходим к разработке клиентской части

Разработка клиентской части

При разработке клиентской части я использовал библиотеку Webix. Данная библиотека позволяет ускорить разработку интерфейса и его алгоритма работы, а также уменьшить количество строк для написания кода.

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

До использования Webix UI

Рисунок 2. Интерфейс до использования Webix UI

Webix UI

Рисунок 3. Исопльзование Webix UI

Помимо данной библиотеки клиентская часть, состоит из  следующих файлов:

  • index.html - точка входа, именно на эту страницу попадает клиент и с нее уже подгружаются logic.js и ui.js
  • logic.js - файл описывающий логику интерфейса: действия при нажатии на элементы, запросы к серверу и т. д.
  • ui.js - файл описывающий сам интерфейс.
Код ui.js
var ui_scheme = {
	id:"phonebook",
	rows: [
	{view: "toolbar", cols: [
	{view: "label", label: "Телефонный справочник", align:"left"},
	{},
	{view: "label", label: "Отображать уволенных: ", align:"right"},
	{view: "toggle", id:"fired", offLabel:"нет", onLabel:"да", width:50},
	{view: "icon", id:"birthday", icon:"birthday-cake"}
	]},
	{cols:[
		{
			width: 300,
			rows:[
			{view: "search",id:"search", placeholder:"Поиск..."},
			{view: "tree", select:"true", id:"list_person"}
			]},
			{   
				id: "info",
				hidden:true ,
				width: "800",
				rows:[
				{view:"template", id:"main_info", template:"<h1>#fio#</h1><h3>Должность: #who#</h3><h5>Дата рождения: #birthday#</h5>",  autoheight:true},
				{
					view:"datatable", 
					id: "contact_info",
					header:false,
					autowidth:true,
					columns:[
					{ id:"type",    header:"", width:200},
					{ id:"value",   header:"", width:600}
					],
					fixedRowHeight:false,  rowLineHeight:25, rowHeight:25
				}
				]            
			}
			]}
			]
		};

		var win_birthday = {
			view:"window",
			id:"wBirthday",
			position: "center",
			modal: "true",
			resize: "true",
			move: "true",
			width: 500,
			head:{
				view: "toolbar", cols: [
				{view: "label", label: "Ближайшие дни рождения"},
				{view: "icon", icon:"close", id:"win_close", align: "right", click:"$$('wBirthday').hide();"}
				]
			},
			body:{
				rows:[
				{view:"counter", id:"days", label:"До дня рождения", labelWidth: 150, step:1, value:14, min:4, max:365},
				{view:"list", id: "birthday_persons",  template:"#fio# - #birthday# (#days#)", hidden:true, width:400}
				]
			}
		};

Интерфейс страницы (ui_scheme) представляет собой рабочую област,ь разделенную на три части:

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

Дерево подразделений и сотрудников - это иерархический список где родителями являются подразделения, а подчиненными являются сотрудники.

Также имеется окно (win_birthday), которое состоит из заголовка окна, кнопки закрыть и списка сотрудников с указанием даты рождения и дней до дня рождения. Размеры и положения окна можно изменять и оно является модальным.

Код logic.js
function update_list()
{
	var url = "/../zup3/hs/person/personList?fired="+$$('fired').getValue();
	var auth = 'Basic ' + btoa(unescape(encodeURIComponent("web:web")))
	var res = null;
	webix.attachEvent("onBeforeAjax", 
		function(mode, url, data, request, headers, files, promise){
			headers["Authorization"]= auth;
		});
	webix.ajax(url,{
		error:function(text, data, XmlHttpRequest){
			alert("Ошибка работы с сервером");
		},
		success:function(text, data, XmlHttpRequest){
			$$("list_person").clearAll();
			$$("phonebook").disable();
			$$("phonebook").showProgress({
				type:"icon",
				delay:100,
				hide:true
			});
			setTimeout(function(){
				$$("list_person").parse(data.json());
				$$("phonebook").enable();
			}, 100);
		}
	});
}

function update_info(id)
{
	var url = "/../zup3/hs/person/personInfo?id="+id;
	var auth = 'Basic ' + btoa(unescape(encodeURIComponent("web:web")))
	var res = null;
	webix.attachEvent("onBeforeAjax", 
		function(mode, url, data, request, headers, files, promise){
			headers["Authorization"]= auth;
		});
	webix.ajax(url,{
		error:function(text, data, XmlHttpRequest){
			alert("Ошибка работы с сервером");
		},
		beforeSend:function(req) {
				req.setRequestHeader('Authorization', auth);
		},
		success:function(text, data, XmlHttpRequest){
		$$("phonebook").disable();
		$$("phonebook").showProgress({
			type:"icon",
			delay:100,
			hide:true
		});
		setTimeout(function(){
			$$("main_info").parse(data.json());
			$$("contact_info").clearAll();
			$$("contact_info").parse(data.json().contacts);
			$$("contact_info").adjustRowHeight("value", true); 
            $$("contact_info").render();
			$$("phonebook").enable();
			$$("info").show();
		}, 100);
	}
	});
}


function update_birthday(days)
{
	var url = "/../zup3/hs/person/birthdayList?days="+days;
	var auth = 'Basic ' + btoa(unescape(encodeURIComponent("web:web")))
	var res = null;
	webix.attachEvent("onBeforeAjax", 
		function(mode, url, data, request, headers, files, promise){
			headers["Authorization"]= auth;
		});
	webix.ajax(url,{
		error:function(text, data, XmlHttpRequest){
			alert("Ошибка работы с сервером");
		},
		beforeSend:function(req) {
				req.setRequestHeader('Authorization', auth);
		},
		success:function(text, data, XmlHttpRequest){
		$$("birthday_persons").disable();
		$$("birthday_persons").showProgress({
			type:"icon",
			delay:100,
			hide:true
		});
		setTimeout(function(){
			$$("birthday_persons").clearAll();
			$$("birthday_persons").parse(data.json());
			$$("birthday_persons").enable();
			$$("birthday_persons").show();
		}, 100);
	}
	});
}

webix.ready(function(){
	webix.ui(ui_scheme);
	webix.ui(win_birthday);
	webix.extend($$("phonebook"), webix.ProgressBar);
	webix.extend($$("birthday_persons"), webix.ProgressBar);
	update_list();
	$$('fired').attachEvent("onItemClick", function(){
		update_list();
	})
	$$('list_person').attachEvent("onItemClick", function(id, e, node){
		if ($$('list_person').isBranch(id) == false)
			update_info(id);
	})
	$$('birthday').attachEvent("onItemClick", function(){
		$$("wBirthday").show();
		update_birthday($$('days').getValue());
	})

	$$("days").attachEvent("onChange",function(){
		update_birthday(this.getValue());
	})

	$$("search").attachEvent("onTimedKeyPress",function(){
		$$("list_person").filter("#value#",this.getValue());
	})

})

Когда выполняется файл logic.js, он загружает интерфейс и подключает индикатор загрузки

webix.ui(ui_scheme);
webix.ui(win_birthday);
webix.extend($$("phonebook"), webix.ProgressBar);
webix.extend($$("birthday_persons"), webix.ProgressBar);

Затем вызывается функция update_list(), которая формирует список сотрудников и подразделений, отправляя запрос на сервер. После чего добавляются события к следующим объектам

$$('fired').attachEvent("onItemClick", function(){
		update_list();
	})

При нажатии на клавишу "Показывать уволенных сотрудников" происходит обновление списка подразделений и сотрудников

$$('list_person').attachEvent("onItemClick", function(id, e, node){
		if ($$('list_person').isBranch(id) == false)
			update_info(id);
	})

При нажатии на элементе дерева подразделений и сотрудников проверяется, является ли этот элемент сотрудником или подразделением (имеет ли дочерние объекты), если сотрудник, то обновляется область информации.

$$('birthday').attachEvent("onItemClick", function(){
		$$("wBirthday").show();
		update_birthday($$('days').getValue());
	})

При нажатии на кнопку "День рождения" отображается окно и обновляется список сотрудников и дат рождений в данном окне.

$$("search").attachEvent("onTimedKeyPress",function(){
        $$("list_person").filter("#value#",this.getValue());
    })

При изменении значения "До дня рождения" обновляется список сотрудников и дат рождений

$$("search").attachEvent("onTimedKeyPress",function(){
        $$("list_person").filter("#value#",this.getValue());
    })

Если поле search будет изменено то применяется фильтр к дереву подразделений и сотрудников.

Алгоритмы обновления информации о сотрудниках, подразделениях и дат рождения очень схожи:

  1. Формируется URL для запроса
  2. Формируется строка авторизации
  3. До отправки запроса отправляется запрос авторизации
  4. Отправляется запрос на сервер
  5. Обрабатывается результат и парсится в объекты страницы.

Я надеюсь, что данный материал был интересен и полезен для читателя. С радостью отвечу на вопросы в комментариях и выслушаю критику по данному материалу.

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ruha 54 10.03.17 17:04 Сейчас в теме +3 $m
Исходники стоит прикреплять?
2. andrei.k 15.03.17 09:52 Сейчас в теме
(1) Если не сложно, прикрепите пожалуйста. Реализация интересная.
kraynev-navi; +1 Ответить
6. ruha 54 15.03.17 14:14 Сейчас в теме
(2)
(1) Если не сложно, прикрепите пожалуйста. Реализация интересная.

Не сложно. Прикрепил архив с клиентской частью, и там же файл http.txt с текстом для http-сервиса. Для работы клиентской части, необходимо добавить библиотеку webix.
Прикрепленные файлы:
phone.zip
mkostya; Andr0med; +2 Ответить
12. Andr0med 27.05.19 09:46 Сейчас в теме
(6) Руслан, подскажите, пожалуйста, в чем может быть причина появления окна авторизации при запуске Вашего проекта? Как победить?
14. ruha 54 27.05.19 14:43 Сейчас в теме
3. DonAlPatino 159 15.03.17 12:13 Сейчас в теме
А что с клиентскими лицензиями на 1С в такой конфигурации происходит? Делал подобную разработку, но у меня получился комбинированный вариант AD + база в MS SQL, куда грузятся данные из 1С. Насчет AD могу сказать еще, что тормозное оно при отдаче данных (у меня там еще фотки сотрудников) до ужаса. Вот думаю может переделать.
4. ruha 54 15.03.17 14:08 Сейчас в теме
(3) А вот это интересный вопрос, даже не думал об этом. Если я не ошибаюсь, то 1С лицензия идет на сеанс, при открытие справочника, сеанс создается только на время обращения к базе. В консоле администрирования посмотрел сеансы только "живых душ", пользователь "web", который используется не висит. Вроде не зависал ни разу.
5. ruha 54 15.03.17 14:10 Сейчас в теме
(3) А сколько пользователей? Просто когда я делал, я все думал как реализовать: каждую запись с отдельным запросом к БД, или просто одним запросом все данные взять. И если вы будете реализовать у себя и будет большой объем данных, хотел узнать, как долго будут лететь данные общий запросом.
7. DonAlPatino 159 15.03.17 14:55 Сейчас в теме
(5) Под 200 человек. Соответственно тянется одним запросом весь список и отдельными запросами фотки.
8. ruha 54 15.03.17 16:00 Сейчас в теме
(7) Может отдельными запросами лучше? По необходимости подгружать информацию по нужному сотруднику
9. DonAlPatino 159 15.03.17 17:21 Сейчас в теме
(8)У меня был проект по замене "старого" списка, который целиком велся в ручную и где карточка сотрудника сразу отображалась. И меня за можай загнали с криком "сделать как было". А потом, я так понимаю, запрос к AD долгий вне зависимости от того просто ты список сотрудников получаешь или список сотрудников с полями. Скорость одна. Ну либо где-то в коде (там .Net и я на этом проектике его изучал) какие-то откровенные глупости. Сейчас рефачу по-немного когда время есть. Может найду.
10. user723770 20.04.17 17:38 Сейчас в теме
У нас крутится нечто подобное для рассылки корреспонденции. 1С на SQL и данные берем из базы на прямую из справочников. Лицензии 1С не задействованы.
11. Andr0med 21.05.19 13:57 Сейчас в теме
Бодрого времени суток! Искал варианты реализации корпоративного сайтика в связке с 1С, нашел эту статью. Помогло сильно, за что нечеловеческое спасибо!
Скачал, установил 32-разрядный Apache (64-разрядный на Win7 64x не взлетел).
В платформе 1С доустановил веб-расширение. В самописной конфигурации создал справочники, заполнил их данными, подправил функции в модуле HTTP-сервиса, чтобы возвращали данные той же структуры, что в примере. Опубликовал. Создался файл default.vrd. В httpd.conf всё, что положено, прописалось.
Захожу в браузере по нужному адресу и получаю форму входа, в которой нужно ввести имя пользователя и пароль.

Я вводил данные локального юзера. Не то.
Создал в конфигурации 1С пользователя, дал ему полные права на все объекты (в учебных целях!), вводил его данные - не то.
Подскажите, какого лешего пользователя нужно ввести ?
Может быть, дело в библиотеках webix'а? Я стандартную скачал/установил, там функционал немного урезан...
Прикрепленные файлы:
13. ruha 54 27.05.19 14:42 Сейчас в теме
Так постараюсь вспомнить) Давно уже это делал, но во-первых посмотрите права на использование сервисом (не помню есть ли они или нет). Во-вторых напишите как вы отправляете строку авторизации в скрипте, точнее как формируете
15. Sergey101081 23.01.21 14:12 Сейчас в теме
На панели инструментов в верхней части не отображается кнопка списка дней рождений;
отвечает это строка {view: "icon", id:"birthday", icon:"birthday-cake"}
Как добавить Иконку? подскажите. В JavaScript полный ноль...
ЕЩЕ
Если в строке браузера ввожу http://localhost/httptest/hs/person/personList, то данные возвращаются
а если запускаю index.html, то выдает "Ошибка работы с сервером"
Сточка в скрипте должна выглядеть так: var url = "http://localhost/httptest/hs/person/personList?fired="+$$('fired').getValue();
или так: var url = "/. ./httptest/hs/person/personList?fired="+$$('fired').getValue();
20. ruha 54 06.04.21 15:18 Сейчас в теме
(15) Вроде и так и так правильно, только во втором варианте между точками не должно быть пробела
16. Sergey101081 23.01.21 15:24 Сейчас в теме
Выдает "Ошибка работы с сервером":
Access to XMLHttpRequest at 'http://localhost/httptest/hs/person/personList?fired=0' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
19. ruha 54 06.04.21 15:16 Сейчас в теме
(16) Ошибка CORSов, (https://developer.mozilla.org/ru/docs/Web/HTTP/CORS). У вас почему-то в headers не отправляется origin, точнее отправляется, но null
17. user1200393 06.04.21 02:14 Сейчас в теме
Не могу разобраться, помогите пожалуйста:
Список сотрудников загружается, но страница остается неактивной и в разделе Info бесконечно отображается прогрессбар.
setTimeout(function(){
				$$("list_person").parse(data.json());
				$$("phonebook").enable();				
}, 100);

Этот код выполняется, но
$$("phonebook").enable();

не срабатывает.

Если закомментировать
$$("phonebook").disable();
$$("phonebook").showProgress({
	type:"icon",
	delay:100,
	hide:true
});

То можно выделять сотрудников и будет вызываться функция function update_info, однако она корректно не выполняется по той же причине (бесконечный прогрессбар). Если и там закомментировать соотвествующий блок и не переводить страницу в disable(), то функция выполняется, но Info и contact_info не заполняются (ничего не отображается - просто пустая страница).

Данные по запросам personList и personInfo из базы приходят.
18. ruha 54 06.04.21 15:15 Сейчас в теме
(17)
То можно выделять сотрудников и будет вызываться функция function update_info, однако она корректно не выполняется по той же причине (бесконечный прогрессбар). Если и там закомментировать соотвествующий блок и не переводить страницу в disable(), то функция выполняется, но Info и contact_info не заполняются (ничего не отображается - просто пустая страница).

Я могу получить удаленнку, чтобы уже на развернутой системе глянуть
21. user1200393 07.04.21 06:16 Сейчас в теме
(17)Разобрался - криво установил Webix.
Повторил сначала и всё заработало.
Спасибо!
Оставьте свое сообщение

См. также

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция Промо

Практика программирования WEB v7.7 v8 Бесплатно (free)

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    58361    Serginio    33    

WEB/HTTP сервисы. Базовые отличия и применение на практике

Практика программирования WEB v8 Бесплатно (free)

Рассказываем о WEB и HTTP сервисах, их практическом применении, о шишках, которые мы набили, и о выводах, которые сделали. Спойлер: тех, кто дочитает статью до конца, ждет бонус от автора.

04.10.2021    3780    Neti    14    

Интеграция 1С с ГИИС ДМДК

Обмен через XML WEB v8 ERP2 Ювелирная промышленность и торговля Россия Бесплатно (free)

ГИИС ДМДК - единая информационная платформа для взаимодействия участников рынка драгоценных металлов и драгоценных камней. с 01.09.21 стартовал обязательный обмен данными с Федеральной пробирной палатой (ФПП) исключительно через ГИИС. А постепенно - с 01.01.2022 и с 01.03.2022 - все данные о продаже драгоценных металлов и камней должны быть интегрированы с ГИИС. У многих пользователей возникает вопрос как автоматизировать обмен между программой 1С и ГИИС ДМДК. В настоящей статье ВЦ Раздолье поделится своим опытом о реализации такого обмена. Автор статьи - Мордовин Антон - архитектор систем на базе 1С Внедренческого центра "Раздолье".

30.09.2021    1744    1СERP    19    

Интеграция 1С с Битрикс24 через вебхуки

WEB v8 1cv8.cf Россия Бесплатно (free)

Пример получения токена и http запрос к API битрикса.

15.09.2021    1234    TyurinArt    5    

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    43035    YPermitin    42    

Обмен с HTTP сервисом файлами по формату multipart/form-data

WEB v8 1cv8.cf Россия Бесплатно (free)

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

07.09.2021    2126    ix5s    21    

Разработка гибридного web-приложения на 1С, возможности и ограничения

WEB v8 Бесплатно (free)

Все чаще разработчики склоняются к использованию 1C в качестве бэкенда при разработке веб-приложений. Но благодаря встраиванию веб-клиента 1С в сайт можно получить еще больше готовой функциональности. О том, как реализовать гибридное приложение за счет связки 1С с другими веб-технологиями, рассказал разработчик компании Neti Эльдар Мингалиев.

06.09.2021    2404    Бэнни    11    

Работа с WEB-сервисами под HTTPS на примере прямого обмена между базами (1С – 1С) 

Обмен данными 1С WEB v8 Россия Бесплатно (free)

Использование веб-сервисов 1С при обмене 1С – 1С позволяет быстро передавать достаточно большие объемы данных из базы-источника в базу-приемник в объектах языка 1С. Данный метод обмена может применяться при бесшовной интеграции между двумя базами 1С, но требует определенной серверной инфраструктуры (установленного и настроенного WEB-сервера).

03.09.2021    5637    UltraUnion2005    8    

Заготовка для загрузки файлов по ftp Промо

WEB Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

3 процедуры и 1 макет

03.06.2013    31255    anig99    6    

Глава 2. Как я написал (собрал с инфостарта) свой парсер сайта 1С Releases

Практика программирования WEB v8 1cv8.cf 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

Путешествие начинающего программиста 1С. Глава вторая. Призываем экспертов в комментарии, оптимизируем код, ругаемся на кривые руки автора. Автор же, в свою очередь, делится своим опытом, читает умные комментарии, стремится дать те знания, за которыми он сидел ночами тем, кто их хочет найти.

31.08.2021    723    ldmonster    4    

Взаимодействие с api Честный знак (Молочная продукция)

WEB Практика программирования Универсальные функции v8 1cv8.cf Бесплатно (free)

Обзор основных примеров взаимодействия с Честным знаком по api для нетиповых конфигураций.

30.08.2021    1421    user5300    39    

Умная маршрутизация: о сложностях интеграции с 1С (часть 2)

WEB v8 УТ11 Бесплатно (free)

В статье будет много примеров кода с комментариями работы расширения для обмена данными УТ11.4 с Яндекс.Маршрутизацией через выгрузку/загрузку EXCEL файла.

27.08.2021    1813    greencactus    6    

Встраивание форм 1С на страницы сайта

WEB v8 1cv8.cf Бесплатно (free)

В платформе 8.3.16 появилась возможность выводить на страницах сайта информацию из веб-клиента 1С так, что пользователь даже не заметит, что работает с платформой. Руководитель компании Айтон Михаил Пинягин на онлайн-митапе «Web-клиенты для 1С» рассказал о том, какие особенности нужно учесть при настройке встраиваемого веб-клиента, и какие возможности он дает.

27.08.2021    2343    mikepin    5    

Гарри Поттер и подкапотное пространство веб-клиента

WEB v8 Бесплатно (free)

При разработке сайтов, интегрированных с 1С через HTTP-сервисы, приходится бороться с кодировками, искать производительные интерфейсные решения и задумываться над безопасностью. В ходе онлайн-митапа «Web-клиенты для 1С» Юрий Лазаренко показал на практике, как работает магия самодельного веб-клиента и как решать проблемы, возникающие при интеграции.

20.08.2021    2711    TitanLuchs    19    

Умная маршрутизация: кейс интеграции с 1С (часть 1)

WEB v8 Бесплатно (free)

Как мы решали проблемы с доставкой в нашем интернет-магазине, внедрили новый бизнес-процесс за 3 месяца и научились меньшим количеством машин привозить больше заказов клиентам.

18.08.2021    4076    greencactus    36    

Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика (Украина)

WEB v8 Украина Бесплатно (free)

Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика, Украина. Тестирование проводил на 1С:Предприятие 8.3 (8.3.10.2561).

28.07.2021    722    Pervuy    4    

Телеграм-бот как инструмент

WEB v8 1cv8.cf Бесплатно (free)

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

21.07.2021    3902    M_A_D    19    

Доработка в расширении Яндекс маркета (скачать все этикетки)

Практика программирования WEB v8 УТ11 КА2 Бесплатно (free)

Доработка кнопки "Скачать все этикетки" - выбрали каталог и сохранили все за один раз, а не 100500 раз нажимаем кнопку сохранить.

08.07.2021    983    rst_filippov    0    

Кадровое делопроизводство в 1C:Зарплата и управление персоналом

Зарплата Управление персоналом (HRM) v8 v8::СПР ЗУП3.x БУ УУ Бесплатно (free)

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

06.07.2021    1705    Koder_Line    0    

Интеграция 1С 8 и HostCMS

WEB v8 1cv8.cf Бесплатно (free)

Интеграции 1С с сайтами очень сложно оценивать, ибо на сайте разработчика CMS, а может, и на странице конкретного модуля, зачастую можно найти инструкцию подключения обмена, но в ходе работы постоянно появляются подводные камни: то одно не выгружается, то другое, порой, кажется, все данные передаются, но документы или элементы справочников не заполняются. А перерабатывать типовой механизм зачастую бывает себе дороже. Причем бывают и ситуации, когда нужно вносить изменения и в 1С, и на сайте. Стоимость таких работ возрастает и встает вопрос о том, нужно ли это вообще. Сейчас я расскажу о том, как мы подключали HostCMS, а в конце статьи приведу результаты обмена.

04.07.2021    807    Koder_Line    0    

API ОФД-Я разбор документации с примерами

WEB v8 1cv8.cf Россия Бесплатно (free)

Примеры запросов 1С для получения данных с ОФД-Ярус через API.

20.04.2021    838    www76    0    

Работа через сервис 1С-Отчетность нескольких пользователей

Регламентированная отчетность Зарплата WEB v8 v8::СПР ЗУП3.x Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Организации, в которых количество сотрудников превышает установленное значение, обязаны отправлять отчетность по телекоммуникационным каналам связи. Это может быть Контур-Экстерн, Такском или любой другой провайдер. Все чаще пользователи 1С используют сервис 1С-отчетность. И все чаще сертификат оформляется на сотрудника отдела кадров или бухгалтерии. В случае, если нужно оформить несколько сертификатов, возникают трудности в версии ЗУП 3.1.14 и более поздних. О том, как с ними справиться, пойдет речь в данной публикации.

05.04.2021    1930    keat24    1    

Правила обмена больше не нужны

Внешние источники данных Обмен через XML Перенос данных из 1C8 в 1C8 Распределенная БД (УРИБ, УРБД) WEB v8 Бесплатно (free)

Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.

17.03.2021    11733    Nikola23    39    

Как отправить сообщение Telegram в группу?

WEB v8 Россия Бесплатно (free)

Отправка сообщения в группу Telegram.

01.03.2021    2868    kite2    2    

Альфа-Авто 5.0 и современные HTTP сервисы

WEB v8 1cv8.cf Автомобили, автосервисы УУ Бесплатно (free)

Решение, позволяющее программным продуктам, работающим на устаревших версиях платформы 1С (8.2), интегрироваться с современными HTTP сервисами. Решение, интегрированное с HTTP-сервисом программы по расчету компонентов для изготовления ЛКМ, описанное в настоящей статье, успешно работает в одном из автосервисов, работающем на устаревшей платформе и конфигурации Альфа-Авто 5.0.

01.03.2021    1139    osivv    1    

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

WEB v8 Россия Бесплатно (free)

Есть база, с пользователем/паролем, нужно подключиться к Odata из другой базы 1С, получить элементы справочника.

24.02.2021    967    user823999    6    

Интеграция с API WB (Wildberries). Создание карточки товара (спецификации)

WEB v8 1cv8.cf ИТ-компания Россия Бесплатно (free)

Опыт интеграции с API WB (Wildberries), опыт создания карточки товара, получение токенов API WB.

18.01.2021    28551    jenyavp    56    

HTML редактор/editor (Wysiwyg) для WebKit 1С (CMS, B2B), альтернатива TinyMCE и стандартному ФорматированныйДокумент

WEB Интеграция v8 v8::УФ 1cv8.cf Бесплатно (free)

Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.

28.12.2020    3911    SizovE    25    

Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент

Практика программирования WEB Универсальные функции v8 v8::УФ 1cv8.cf Бесплатно (free)

Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.

24.11.2020    1229    SizovE    4    

Как сделать интеграцию (обмен) с интернет-магазином? Пошаговый план действий (Часть 1)

WEB v8 1cv8.cf УУ Бесплатно (free)

C 2011 года я занимаюсь интеграцией с интернет-магазинами и за это время, наверное, повидал все. Делал интеграцию как «культурными», так и «экзотическими» способами. Количество магазинов исчисляется сотнями. В этой серии статей я буду делиться своим опытом, а также выкладывать какие-то полезные наработки.

19.11.2020    8717    markbraer    12    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

Практика программирования WEB Интеграция Универсальные функции v8 Бесплатно (free)

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    2227    SizovE    2    

Web Dashboard (мобильная и десктопная версия): оптимальная схема организации взаимодействия с зоопарком систем

WEB v8 Бесплатно (free)

Задача: из множества систем (1С:ERP, 1C:CRM, Кронос:WMS, 1С:Розница, 1С:УПП...) оперативно и онлайн осуществлять мониторинг на телефоне/десктопе/планшете/телевизоре бизнес-аналитику в дашборде для директора. Рассмотрим в статье, как правильно интегрировать между собой все базы, какие для этого инструменты использовать.

10.11.2020    13302    SizovE    2    

Отладка модуля ДиадокПро

WEB v8 1cv8.cf Бесплатно (free)

В обработке ДиадокПро все дополнительные модули встроены во внешние обработки, которые хранятся в макетах. Это усложняет процесс самостоятельной интеграции, так как теряется возможность попасть в них в режиме отладки. Но не всё так страшно, поэтому ниже инструкция)

30.10.2020    4406    Максим-777    18    

JSON примеры меню B2B web-приложения "Личный кабинет" на движке EDIbot для телефона/десктопа

WEB v8 Бесплатно (free)

Рассмотрим на примерах работу движка EDIbot при организации меню B2B "Личного кабинета" (мобильная версия, версия десктоп) грузовладельца WMS-системы.

29.10.2020    1358    SizovE    0    

Обмен с сайтом посредством Post-запроса, json

WEB v8 1cv8.cf Бесплатно (free)

Задача - передавать на сайт объекты с наименованием и уникальным идентификатором (УИ), которые изменяются в 1С. Также нужно сохранять историю отправленных пакетов.

29.10.2020    5833    John_d    26    

Организация HTTP публикации каталога товаров используя PostgREST

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу порядок установки настройки и использования PostgREST на примере организации каталога товаров.

05.10.2020    1659    malikov_pro    2    

Интеграционная прослойка(middleware) на Golang. Часть 5 - Обмен с 1С через HTTP-сервисы платформы

WEB v8 Бесплатно (free)

В этой статье научим прослойку отправлять данные в 1С, для этого используем HTTP-сервисы платформы. Обменяемся данными с новым справочником Клиенты. Но главное создадим HTTP-сервис для получения сообщений из очереди RabbitMQ.

28.09.2020    2681    dmitry-irk38    4    

Отладка http сервиса

WEB v8 Бесплатно (free)

При разработке http сервиса возникает ситуация, а как протестировать http сервис? Создали мы сервис, настроили шаблоны, передали, если нужно параметры, открываем браузер заполняем строку подключения и БАХ, ошибка. Что делать?

23.09.2020    5303    hpi    12    

Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис

WEB v8 1cv8.cf Бесплатно (free)

Пошаговое руководство по созданию http-сервиса (часть вторая). Передача параметра в http сервис.

22.09.2020    8577    hpi    7    

Организация данных и вариант обработки для организации обмена с сайтом

WEB v8 1cv8.cf Бесплатно (free)

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

22.09.2020    1843    malikov_pro    4    

Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием HTTP-сервиса, плюс особенности авторизации

Практика программирования Обмен данными 1С WEB v8 1cv8.cf Бесплатно (free)

В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке

18.09.2020    1601    R_o_n_n_y    5    

Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант формирования запроса

11.09.2020    5544    malikov_pro    15    

Просто о 1С:ЗУП 3.1 за 10 минут

Зарплата Управление персоналом (HRM) v8 v8::СПР ЗУП3.x Россия БУ УУ Бесплатно (free)

Когда начинал работать с конфигурацией 1С ЗУП 2.5 не было никакого краткого описания этой конфигурации. Приходилось читать умные книги. Статья представляет собой вводный инструктаж в 1С: ЗУП 3.1 для начинающих.

04.09.2020    14052    Kaval88    32