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

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

Управление - Управление персоналом (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 51 10.03.17 17:04 Сейчас в теме +3 $m
Исходники стоит прикреплять?
2. andrei.k 15.03.17 09:52 Сейчас в теме
(1) Если не сложно, прикрепите пожалуйста. Реализация интересная.
kraynev-navi; +1 Ответить
6. ruha 51 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 51 27.05.19 14:43 Сейчас в теме
3. DonAlPatino 138 15.03.17 12:13 Сейчас в теме
А что с клиентскими лицензиями на 1С в такой конфигурации происходит? Делал подобную разработку, но у меня получился комбинированный вариант AD + база в MS SQL, куда грузятся данные из 1С. Насчет AD могу сказать еще, что тормозное оно при отдаче данных (у меня там еще фотки сотрудников) до ужаса. Вот думаю может переделать.
4. ruha 51 15.03.17 14:08 Сейчас в теме
(3) А вот это интересный вопрос, даже не думал об этом. Если я не ошибаюсь, то 1С лицензия идет на сеанс, при открытие справочника, сеанс создается только на время обращения к базе. В консоле администрирования посмотрел сеансы только "живых душ", пользователь "web", который используется не висит. Вроде не зависал ни разу.
5. ruha 51 15.03.17 14:10 Сейчас в теме
(3) А сколько пользователей? Просто когда я делал, я все думал как реализовать: каждую запись с отдельным запросом к БД, или просто одним запросом все данные взять. И если вы будете реализовать у себя и будет большой объем данных, хотел узнать, как долго будут лететь данные общий запросом.
7. DonAlPatino 138 15.03.17 14:55 Сейчас в теме
(5) Под 200 человек. Соответственно тянется одним запросом весь список и отдельными запросами фотки.
8. ruha 51 15.03.17 16:00 Сейчас в теме
(7) Может отдельными запросами лучше? По необходимости подгружать информацию по нужному сотруднику
9. DonAlPatino 138 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 51 27.05.19 14:42 Сейчас в теме
Так постараюсь вспомнить) Давно уже это делал, но во-первых посмотрите права на использование сервисом (не помню есть ли они или нет). Во-вторых напишите как вы отправляете строку авторизации в скрипте, точнее как формируете
Оставьте свое сообщение

См. также

Онлайн-курс "1С:Специалист-консультант по "1С:Зарплата и управление персоналом" 22-25 июня 2020 года Промо

Решение задач на 1С:Специалист Бухгалтерский учет Зарплата Управление персоналом (HRM) v8 v8::СПР ЗУП3.x БУ УУ Бесплатно (free)

Спрос на специалистов по внедрению "1С:Зарплата и управление персоналом 8" с каждым днем растет. Станьте одним из востребованных специалистов - пройдите обучение по актуальной редакции 1C:ЗУП 3.1.

13200 руб.

14.06.2018    9865    3    5    

История создания успешной системы чат-ботов на 1С

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

Использование чат-ботов в мессенджерах позволяет автоматизировать многие сложные бизнес-процессы путем диалога с системой через виртуального собеседника. О том, как создать универсальную систему ботов с бэкендом на 1С, работающую в Telegram, Viber и Facebook Messenger одновременно, на конференции Infostart Event 2019 Inception рассказал программист-фрилансер Константин Гейнрих.

21.05.2020    3537    0    CyberCerber    8    

Парсинг html страниц с выводом информации через JavaScript с использованием Selenium

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

Есть девочки как девочки, есть мальчики как мальчики, есть сайтики как сайтики, но странички их обманщики. В целях сохранить информацию, от автоматизированного сбора, многие ресурсы пытаются защитить ее. Один из таких способов - вывод информации на странице через JavaScript. При получении такой страницы в 1С, JavaScript не успевает вывести необходимые данные, и в 1с получаем практически пустую страницу. В статье приведу пример разработки, для парсинга таких страниц, без регистрации и смс.

20.05.2020    1242    0    platonov.e    16    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Шаг третий, WooCommerce, публикация категорий товаров

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

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции публикации категорий товаров в магазин WooCommerce, с комментариями внутри.

13.05.2020    1170    0    osivv    3    

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

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

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

10.03.2016    53543    0    Serginio    33    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Шаг второй, публикация картинок

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

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции передачи фото из 1С, с комментариями внутри.

13.05.2020    852    0    osivv    0    

Интеграция Camunda BPM и 1С

WEB Интеграция v8 Бесплатно (free)

Быстрый старт. Только практические примеры. Установка, запуск и публикация бизнес-процесса на сервере Camunda BPM. Управление бизнес-процессами из 1С при помощи Camunda REST API.

12.05.2020    829    0    zhichkin    4    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Первый шаг

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

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции 1С с комментариями внутри.

28.04.2020    2343    0    osivv    23    

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

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

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

11.04.2013    39564    0    YPermitin    33    

Выразительный Web API

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

Теория разработки Web API с ожидаемым поведением, за который не будет стыдно за пределами мира 1С.

27.04.2020    3591    0    fr13    19    

Хранение статистики публикаций автора сообщества Инфостарт ® (мобильное приложение И ++)

Мобильная разработка WEB v8 1cv8.cf Бесплатно (free)

Инфостарт ® достаточно удобный в плане работы со своим личным кабинетом сайт. Но программисты тем и отличаются от большинства людей, что им хочется знать больше. Поэтому появилась конфигурация 1С (она же мобильное приложение 1С) для более подробного учета статистики публикаций: рейтинг, количество просмотров, количество комментариев в динамике и в разрезах.

24.04.2020    1146    0    capitan    13    

Интеграция УАТ с топливными сервисами

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

Интеграция конфигурации Управление автотранспортом с топливными веб-сервисами.

21.04.2020    5984    0    RPGrigorev    2    

Помощник работы с VirtueMart Промо

WEB Розничная торговля Розничная торговля v8 УТ10 УПП1 Россия Бесплатно (free)

Обработка для обмена данными с интернет-магазином на базе VirtueMart. Позволяет выгружать товары с изображениями и загружать заказы покупателей. Управлять интернет-магазином теперь стало просто!

19.04.2012    23103    1    salexdv    13    

Интеграция 1С с веб-сервисами Лукойл ЛИКАРД

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

Описание интерфейса взаимодействия сервиса Лукойл- ЛИКАРД с информационной системой 1С.

20.04.2020    2499    0    RPGrigorev    0    

Изменения в 1С: ЗУП 3.1 в связи с Указом Президента РФ о нерабочей неделе и ее продлении

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

Какие же изменения реализованы в программе 1С:ЗУП 3.1 для поддержки Указа Президента.

13.04.2020    1640    0    Neti    2    

Ошибка инициализации модуля: HTTPСервис

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

Решение проблемы "Ошибка при работе с HTTP сервисом 500. Ошибка инициализации модуля".

13.04.2020    1395    0    VipDim    10    

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

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

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

03.06.2013    29148    0    anig99    6    

COVID-19. Динамика эпидемии

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

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

01.04.2020    2435    0    Alejandro_V    6    

Как я собрал для себя высокопроизводительный и бесплатный облачный бекенд для 1С на PosgreSQL + PostgREST

Производительность и оптимизация (HighLoad) WEB Интеграция Мобильная разработка Администрирование веб-серверов v8 Бесплатно (free)

В этой статье я расскажу о проблемах бека для мобильных приложений или другого фронта, который требует производительности, быстрой реакции и отказоустойчивости, и как я решил это благодаря opensource проекту PostgREST и СУБД Postgre SQL 12. Проведу простой тест производительности для сравнения 1С с данным решением. Это может быть полезно всем, кто разрабатывает мобильные приложения либо фронтсайд-приложения для 1С на чем угодно - на мобильной платформе или на нативном языке или на Simple UI. И также обзор новых функций SimpleUI для связи с этим бекендом.

31.03.2020    9174    0    informa1555    21    

Премия за дни повышения квалификации

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

Пример настройки и расчета премии за дни повышения квалификации в ЗУП 3.1.

16.03.2020    1763    0    user1034502    0    

Получение html-кода страницы. JS из 1С

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

Получение исходника страницы, выполнение произвольного js-кода. Теперь с WebKit от 1С.

18.02.2020    3997    0    Yashazz    1    

Отладка конфигурации в режиме веб-клиента

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

После очередного обновления платформы при попытке запуска отладки в веб-клиенте стало появляться сообщение. Собственно, до этого момента никогда веб-клиентом особо не пользовался и необходимости в отладке как-то не возникало. Данное сообщение заставило задуматься, что не так с отладкой в веб-клиенте и как ее собственно включить? Тот самый неловкий момент, когда программа просит обратиться к администратору, а администратор - это вы.

12.02.2020    3240    0    gamletspb    1    

Анализ работы внешней обработки сервиса МодульКасса применительно к задаче фискализации чеков при доставке

Кассовые операции WEB v8 УТ11 Россия Бесплатно (free)

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

11.02.2020    1876    0    malikov_pro    0    

Отправка "Заявления на подключение к ЭДО ПФР" из программы "1С: Бухгалтерия предприятия, ред. 2" для СЗВ-ТД

Документооборот и делопроизводство Зарплата Управление персоналом (HRM) v8 v8::БУ БП2.0 Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Инструкция по отправке "Заявления на подключение к ЭДО ПФР" из программы "1С Бухгалтерия предприятия, ред. 2" для обмена сведениями об электронных трудовых книжках и отправки отчетов по форме СЗВ-ТД.

11.02.2020    16171    0    rusmil    8    

Вариант реализации REST API для 1С-Битрикс Управление сайтом

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

В статье опишу вариант обмена 1С УТ 11.4 и 1С-Битрикс УС 18.5 с иcпользованием компонентов Symfony, в качестве примера обмен данными по складам.

28.01.2020    2973    0    malikov_pro    2    

Вариант реализации работы с сервисом Dadata применительно к конфигурации УТ 11.4 и подобным

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

В статье описывается реализация получения данных с сервиса DaData при работе с формами справочников в конфигурации УТ 11 для дополнения информации по ФИО, ИНН, Адресу.

22.01.2020    2236    0    malikov_pro    5    

Двусторонний обмен с поставщиком через интернет-магазин для реализации товаров с ответственного хранения (с 01.02.2020 "Партии" не используются)

Файловые протоколы обмена, FTP WEB v8 УНФ Оптовая торговля, дистрибуция, логистика Россия УУ Бесплатно (free)

Рассмотрены реализация двустороннего обмена данными с использованием API-сервиса сайта поставщика при продаже товаров со склада ответственного хранения, алгоритм движения товаров и обмена документами на примере конфигурации 1С: УНФ у партнера, который взаимодействует с поставщиком "ООО Пауэр-Интернэшнл-шины" - одним из крупнейших в России поставщиков автомобильных шин и дисков.

16.01.2020    3358    0    chkurs    0    

Получение номера ВСД по идентификатору 1С: Меркурий

Производство готовой продукции (работ, услуг) WEB v8 УТ11 Пищевая промышленность Россия Бесплатно (free)

Код парсинга веб страницы для получения номера ВСД в системе Меркурий.

24.11.2019    3460    0    ohyen    0    

Немного о интеграции с CRM AMO

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

Немного информации о том, как настроить интеграцию с CRM AMO. Пример функций для подключения к АМО и обновления заказа. Пример на основе API авторизации.

15.11.2019    3325    0    xxxAndricxxx    6    

Ещё немного о ИНН и сервисе DaData

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

Об использовании сервиса dadata и немного информации о возможностях получать данные по ИНН. Возможно, кому-то будет полезным.

14.11.2019    6024    0    xxxAndricxxx    21    

Вариант реализации клиента SOAP на примере получения остатков из MERLION

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

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

14.11.2019    2783    0    malikov_pro    0    

Разбор любого JSON-объекта в соответствующую структуру

Инструментарий разработчика WEB v8 1cv8.cf Бесплатно (free)

Данная публикация предназначена разработчикам 1С, которым приходиться разбирать данные формата JSON. Выложенный пример кода создает объект типа Структура, полностью повторяющий структуру данных формата JSON.

13.11.2019    6134    0    user665435_al.windstorm    14    

Проверка reCAPTCHA от Google на стороне HTTP-Сервиса

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

Код проверяет переданный токен reCAPTCHA от Google при вызове HTTP-Сервиса. Таким образом проверяем, отправил ли данные на наш HTTP-Сервис робот или реальный пользователь.

06.11.2019    5135    0    AVR    0    

WiseAdvise: Настройка расчета управленческой зарплаты в 1С:ЗУП КОРП 3.1

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

В статье описан механизм настройки расчета управленческой заработной платы в 1С ЗУП 3.1 КОРП в сравнении с аналогичным механизмом в ЗУП 2.5.

23.10.2019    6174    0    tamriko666@gmail.com    5    

Простой способ опубликовать базу 1C из дома в интернет, когда Ваш провайдер этого не обеспечивает (3G, 4G модем и т.п.)

WEB Облачные сервисы, хостинг v8 1cv8.cf Бесплатно (free)

Если у Вас возникла потребность опубликовать из дома во всемирную паутину базу 1С (например, для тестирования), в т.ч. интерфейс OData, HTTP или Web-сервисы, а интернет-провайдер (например, 3G Мегафон) не предоставляет возможности инициировать соединения извне, то в конце статьи Вы найдете простой, быстрый и условно-бесплатный способ это сделать.

14.10.2019    9427    0    uno-c    25    

Объединение организаций в ЗУП при реорганизации с переносом данных из ЗУП 2.5 в ЗУП 3.1

Зарплата Управление персоналом (HRM) Перенос данных из 1C8 в 1C8 v8 v8::СПР ЗУП2.5 ЗУП3.x БУ Бесплатно (free)

В этой статье описан опыт объединения 2-х организаций при реорганизации в ЗУП 3.1 с переносом данных одной организации из ЗУП 2.5 (релизы баз более или менее свежие, но не самые последние на момент перехода, примерно двух- и трехмесячной давности). За основу было взято решение из этой статьи https://infostart.ru/public/833658/, в которой описан алгоритм решения задачи, за что автору статьи огромная благодарность! Здесь же даны некоторые комментарии и пояснения к алгоритму переноса и объединения, описаны выявленные мною ошибки. Также приведена небольшая инструкция по использованию обработки ирПодборИОбработкаОбъектовБД — она будет полезна для пользователей — «не программистов», впервые работающих в не управляемых формах.

09.10.2019    5980    0    Neti    1    

Самый примитивный HTTP-сервис в мире

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

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

12.09.2019    17937    0    YPermitin    26    

Отчеты ЗУП. Решения всех отчетов из сборника задач для подготовки к Специалист-консультант ЗУП с картинками

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

Когда готовился к сдаче экзамена на Специалист консультант по ЗУП, в процессе решения задач из сборника обнаружил, что те решения отчетов, которые есть в сети и на Инфостарте, недостаточно проиллюстрированы, и для новичка это может быть довольно тяжело и затратно по времени - разобраться, что к чему, с "нуля". Делал как шпаргалку для себя. Экзамен сдал на отлично. Рекомендую тем, кто готовится - прорешать все отчеты.

26.08.2019    10809    0    user1024932    19    

Свой веб интерфейс к 1С: побеждаем CORS на IIS, сохраняя авторизацию

WEB Администрирование данных 1С v8 Бесплатно (free)

Если "веб морда" расположена не по тому же адресу, что и публикация 1С (что часто бывает, например, при разработке, публикация 1С на http://localhost/1c, а разрабатываемое веб-приложение на http://localhost:8080) или, например, мы заходим на веб приложение то по ip адресу, то по имени сервера, или просто веб сервер и сервер, на котором опубликована 1С - это разные сервера, то для большинства запросов от браузера к 1С срабатывает политика CORS, которая заключается в том, что браузер сначала посылает запрос OPTIONS, на который сервер должен ответить определенным образом, заголовками, содержащими разрешения, а потом уже (если разрешение есть), браузер посылает основной запрос. В случае, когда в публикации 1С (default.vrd) жестко прописан логин и пароль, разрулить ситуацию можно средствами 1С. В случае же, когда нужно сохранить авторизацию (или используется стандартный интерфейс odata), начинаются проблемы.

20.08.2019    9357    0    Fragster    9    

Вывод отчетов из Штрих-М Торговое предприятие 5 на кассовое ПО Кассир 5 через веб-сервис

Розничная торговля WEB Розничная торговля v8 1cv8.cf Розничная и сетевая торговля (FMCG) Россия УУ Бесплатно (free)

Универсальный механизм вывода отчетов товароучетной системы Штрих-М Торговое предприятие в кассовое ПО Кассир 5 посредством веб-сервиса.

14.08.2019    5197    0    Van2507    1    

Совсем простой обмен HTTP, 2 функции

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

Функция для вызова рест-сервиса и функция для разбора результата. Быстро, просто, универсально.

12.08.2019    7636    0    Yashazz    15    

Использование HTTP-сервиса для создания "фронтенда" HTML/CSS/jQuery. Продолжение

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

Получение изображений из информационной базы и отправка файлов через "фронт" на HTML/CSS/JS.

08.08.2019    7193    0    Sedaiko    1    

1Script.Web. Интернет-приложения на языке 1С

WEB OneScript Инструментарий разработчика v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    18268    0    Evil Beaver    33    

Неверные остатки на сайте битрикс

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

Исправление процедуры выгрузки остатков на сайт битрикс из УТ 11

25.04.2019    5123    0    distorshion    4