Взаимодействие мобильного приложения 1С и центральной информационной базы с использованием http-сервиса

Публикация № 1671504 07.06.22

Приемы и методы разработки - Мобильная разработка

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

Описание версий платформ и другого ПО:

Версия платформы 1С: 8.3.18.1563

Версия мобильной платформы: 8.3.18.77

Версия web-сервера Apache: 2.4.48

Все ПО имеет разрядность х64.

 

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

Наше предприятие занимается оптовой и розничной торговлей.

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

Приемка имеет два режима работы: прием грузовых мест и прием товарного состава грузового места.

Данные об отгруженных местах и товарном составе записываются и хранятся в двух регистрах сведений в центральной базе:

Регистр сведений "МестаДляПередачиТоваров"

 

Регистр сведений "НоменклатураПоМестамДляПередачиТоваров"

 

Мобильное приложение должно уметь:

  • Отправлять запрос на получение списка пользователей базы данных и выводить их на ТСД для выбора и авторизации;
  • Отправлять запрос авторизации;
  • Получать список документов передачи товаров и отображать его на ТСД;
  • При выборе документа - получать список грузовых мест из учетной системы;
  • При сканировании или выборе уже отсканированного грузового места - получать список товаров;
  • При сканировании товара - записывать принятое количество в центральную базу.

 

Для связи мобильного приложения и центральной базы, в последней был создан http-сервис c именем "invent" и реализован один единственный метод "main" методом POST. Все остальные процедуры и функции вынесены в отдельный модуль "интеркомВызовСервера".

 

Текст обработчика метода main(POST)

Функция mainPOST(Запрос)
	
	Отказ = Ложь;
	ТекстОшибки = "";
	Тело = "";
	
	СтрокаТелаЗапроса = Запрос.ПолучитьТелоКакСтроку();
	
	Попытка
		ТелоЗапроса = интеркомВызовСервера.ДесериализоватьИзJSON(СтрокаТелаЗапроса);
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка десериализации запроса.";
	КонецПопытки;
	
	Отказ = ТелоЗапроса = Неопределено;
	ТекстОшибки = ?(Отказ,"Запрос неопределен.", "");
	
	//Формируем структуру с данными из тела запроса и проверяем состав полей
	Если НЕ Отказ Тогда
		СтруктураЗапроса = Новый Структура;
		интеркомВызовСервера.СформироватьСтруктуруЗапроса(ТелоЗапроса, СтруктураЗапроса, Отказ, ТекстОшибки);
	КонецЕсли;

	Если НЕ Отказ Тогда
		интеркомВызовСервера.ОбработатьЗапросТСД(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);		
	КонецЕсли;
										
	СтруктураТелаОтвета = Новый Структура;							
	СтруктураТелаОтвета.Вставить("success", НЕ Отказ);
	СтруктураТелаОтвета.Вставить("error", ТекстОшибки);
	СтруктураТелаОтвета.Вставить("body", Тело);
	
	Попытка
		ТелоОтвета = интеркомВызовСервера.СериализоватьВJSON(СтруктураТелаОтвета);
	Исключение
		Отказ = Истина;
		
		СтруктураТелаОтвета = Новый Структура;							
		СтруктураТелаОтвета.Вставить("success", Ложь);
		СтруктураТелаОтвета.Вставить("error", "Ошибка сериализации ответа.");
		СтруктураТелаОтвета.Вставить("body", "");
		
		ТелоОтвета = интеркомВызовСервера.СериализоватьВJSON(СтруктураТелаОтвета);
	КонецПопытки;
	
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.Заголовки.Вставить("Content-type", "application/json;  charset=utf-8");        
	Ответ.УстановитьТелоИзСтроки(ТелоОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	Возврат Ответ;

КонецФункции

 

Текст модуля интеркомВызовСервера


Функция ДесериализоватьИзJSON(Значение, ИменаСвойствСоЗначениямиДата = Неопределено) Экспорт
    
    Если ПустаяСтрока(Значение) Тогда 
        Структура = Неопределено;
    Иначе
        ЧтениеJSON = Новый ЧтениеJSON;         
        ЧтениеJSON.УстановитьСтроку(Значение);    
        Если ИменаСвойствСоЗначениямиДата = Неопределено Тогда
            Структура = ПрочитатьJSON(ЧтениеJSON, Истина); 
        Иначе
            Структура = ПрочитатьJSON(ЧтениеJSON, Истина, ИменаСвойствСоЗначениямиДата)
        КонецЕсли;                   
        ЧтениеJSON.Закрыть();
    КонецЕсли;
    
    Возврат Структура;
    
КонецФункции

Функция СериализоватьВJSON(Значение) Экспорт
    
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
    
    ЗаписьJSON = Новый ЗаписьJSON();          
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);     
    ЗаписатьJSON(ЗаписьJSON, Значение);    
    
    СериализованнаяСтрока = ЗаписьJSON.Закрыть();
    
    Возврат СериализованнаяСтрока;    

КонецФункции

//Формируем структуру с данными из полученного запроса и заодно проверяем, все ли поля есть
Процедура СформироватьСтруктуруЗапроса(ТелоЗапроса, СтруктураЗапроса, Отказ, ТекстОшибки) Экспорт
	
	МассивОбязательныхПолейЗапроса = МассивОбязательныхПолейЗапроса();	
	
	Для каждого ИмяПоля ИЗ МассивОбязательныхПолейЗапроса Цикл
		
		ЗначениеПоля = ТелоЗапроса.Получить(ИмяПоля);
		Если ЗначениеПоля <> Неопределено Тогда
			СтруктураЗапроса.Вставить(ИмяПоля, ЗначениеПоля);
		Иначе 
			Отказ = Истина;
			ТекстОшибки = "Переданы неверные параметры.";
			Прервать;
		КонецЕсли;
				
	КонецЦикла;
	
КонецПроцедуры

//Массив обязательных полей которые должны присутствовать в теле запроса JSON
Функция МассивОбязательныхПолейЗапроса()
	
	МассивПолей = Новый Массив;
	МассивПолей.Добавить("org");
	МассивПолей.Добавить("doc");
	МассивПолей.Добавить("user");
	МассивПолей.Добавить("method");
	МассивПолей.Добавить("body");
	
	Возврат МассивПолей;
	
КонецФункции

Процедура ОбработатьЗапросТСД(СтруктураЗапроса, Тело, Отказ, ТекстОшибки) Экспорт
	
	Если СтруктураЗапроса.method = "get_users" Тогда
		
		ОбработатьМетод_get_users(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
		
	ИначеЕсли СтруктураЗапроса.method = "auth" Тогда
		
		ОбработатьМетод_auth(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
		
	ИначеЕсли СтруктураЗапроса.method = "get_docs" Тогда
		
		ОбработатьМетод_get_docs(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
		
	ИначеЕсли СтруктураЗапроса.method = "cargo" Тогда
		
		ОбработатьМетод_cargo(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
		
	ИначеЕсли СтруктураЗапроса.method = "check_cargo" Тогда
		
		ОбработатьМетод_check_cargo(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
		
	ИначеЕсли СтруктураЗапроса.method = "check_good" Тогда
		
		ОбработатьМетод_check_good(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
		
	Иначе
		Отказ = Истина;
		ТекстОшибки = "Метод " + СтруктураЗапроса.method + " не найден";
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

//Обработки методов

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

Процедура ОбработатьМетод_auth(СтруктураЗапроса, Тело, Отказ, ТекстОшибки)
	
	Пароль = СтруктураЗапроса.body;
	
	Попытка
		ПользовательСсылка = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.user));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найден пользователь по идентификатору " + СтруктураЗапроса.user;
		Возврат;
	КонецПопытки;
	
    УстановитьПривилегированныйРежим(Истина);
	
    Попытка
    	ХешТекущегоПароля = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ПользовательСсылка.ИдентификаторПользователяИБ).СохраняемоеЗначениеПароля;
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при авторизации пользователя " + СтруктураЗапроса.user;
		Возврат;
	КонецПопытки;
	
	УстановитьПривилегированныйРежим(Ложь);
	
	Если ХешТекущегоПароля = "" Тогда
		Возврат;  // Пустой пароль
	КонецЕсли;
	
	ПозицияРазделителя = Найти(ХешТекущегоПароля, ",");
    	
	Отказ = НЕ (Пароль = Лев(ХешТекущегоПароля, ПозицияРазделителя - 1));
	ТекстОшибки = "Пароль не подходит";
	Возврат;
    
КонецПроцедуры

Процедура ОбработатьМетод_get_docs(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
	
	Попытка
		Организация = Справочники.Организации.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.org));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найдена организация по идентификатору " + СтруктураЗапроса.org;
		Возврат;
	КонецПопытки;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПередачаТоваровМеждуОрганизациями.Ссылка КАК Ссылка,
	|	ПередачаТоваровМеждуОрганизациями.Номер КАК Номер,
	|	ПередачаТоваровМеждуОрганизациями.Дата КАК Дата
	|ИЗ
	|	Документ.ПередачаТоваровМеждуОрганизациями КАК ПередачаТоваровМеждуОрганизациями
	|ГДЕ
	|	ПередачаТоваровМеждуОрганизациями.Проведен
	|	И ПередачаТоваровМеждуОрганизациями.интеркомСтатус = ЗНАЧЕНИЕ(Перечисление.интеркомСтатусыПередачиТоваровМеждуОрганизациями.Отправлено)
	|	И ПередачаТоваровМеждуОрганизациями.ОрганизацияПолучатель = &Организация";
	
	Запрос.УстановитьПараметр("Организация", Организация);
	
	Попытка
		РезультатЗапроса = Запрос.Выполнить();
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при выполнении запроса метода get_docs";
		Возврат;
	КонецПопытки;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Тело = Новый Массив;

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		СтруктураДокумента = Новый Структура;
		СтруктураДокумента.Вставить("id", XMLСтрока(ВыборкаДетальныеЗаписи.Ссылка));
		СтруктураДокумента.Вставить("number", ВыборкаДетальныеЗаписи.Номер);
		СтруктураДокумента.Вставить("date", Формат(ВыборкаДетальныеЗаписи.Дата,"ДФ=dd.MM.yy"));
		
		Тело.Добавить(СтруктураДокумента);

	КонецЦикла;
	
КонецПроцедуры

Процедура ОбработатьМетод_cargo(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
	
	Попытка
		ПередачаСсылка = Документы.ПередачаТоваровМеждуОрганизациями.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.doc));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найден документ передачи по идентификатору " + СтруктураЗапроса.doc;
		Возврат;
	КонецПопытки;

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

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		СтруктураМеста = Новый Структура;
		СтруктураМеста.Вставить("checked", ВыборкаДетальныеЗаписи.Принято);
		СтруктураМеста.Вставить("number", ВыборкаДетальныеЗаписи.НомерМеста);
		СтруктураМеста.Вставить("date", Формат(ВыборкаДетальныеЗаписи.ВремяПриемкиМеста,""));
		СтруктураМеста.Вставить("barcode", ВыборкаДетальныеЗаписи.ШтрихкодМеста);
		
		Тело.Добавить(СтруктураМеста);

	КонецЦикла;
	
КонецПроцедуры

Процедура ОбработатьМетод_check_cargo(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
	
	ШтрихкодМеста = СтруктураЗапроса.body;
	
	Попытка
		ПередачаСсылка = Документы.ПередачаТоваровМеждуОрганизациями.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.doc));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найден документ передачи по идентификатору " + СтруктураЗапроса.doc;
		Возврат;
	КонецПопытки;
	
	Попытка
		ПользовательСсылка = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.user));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найден пользователь по идентификатору " + СтруктураЗапроса.user;
		Возврат;
	КонецПопытки;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	МестаДляПередачиТоваров.НомерМеста КАК НомерМеста
	|ИЗ
	|	РегистрСведений.МестаДляПередачиТоваров КАК МестаДляПередачиТоваров
	|ГДЕ
	|	МестаДляПередачиТоваров.ПередачаТоваров = &ПередачаТоваров
	|	И МестаДляПередачиТоваров.ШтрихкодМеста = &ШтрихкодМеста";
	
	Запрос.УстановитьПараметр("ПередачаТоваров", ПередачаСсылка);
	Запрос.УстановитьПараметр("ШтрихкодМеста", ШтрихкодМеста);
	
	Попытка
		РезультатЗапроса = Запрос.Выполнить();
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при запросе грузового места с штрихкодом " + ШтрихкодМеста;
		Возврат;
	КонецПопытки;
	
	Если РезультатЗапроса.Пустой() Тогда
		//Если не нашли место в текущем документе, пробуем общий поиск документа
		Отказ = Истина;
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	МестаДляПередачиТоваров.Принято КАК Принято,
		|	МестаДляПередачиТоваров.ПередачаТоваров.Номер КАК Номер,
		|	МестаДляПередачиТоваров.ПередачаТоваров.Дата КАК Дата
		|ИЗ
		|	РегистрСведений.МестаДляПередачиТоваров КАК МестаДляПередачиТоваров
		|ГДЕ
		|	МестаДляПередачиТоваров.ШтрихкодМеста = &ШтрихкодМеста";
		
		Запрос.УстановитьПараметр("ШтрихкодМеста", ШтрихкодМеста);
		
		Попытка
			РезультатЗапроса = Запрос.Выполнить();
		Исключение
			ТекстОшибки = "Ошибка при повторном запросе грузового места с штрихкодом " + ШтрихкодМеста;
			Возврат;
		КонецПопытки;
		
		Если РезультатЗапроса.Пустой() Тогда
			ТекстОшибки = "Грузовое место с штрихкодом " + ШтрихкодМеста + " не найдено.";
			Возврат;
		КонецЕсли;
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
		ВыборкаДетальныеЗаписи.Следующий();
		
		ТекстОшибки = "Грузовое место с штрихкодом " + ШтрихкодМеста + " отгружено другим документом (Передача товаров №" + ВыборкаДетальныеЗаписи.Номер + " от " + ВыборкаДетальныеЗаписи.Дата;
		
		Возврат;
		
	КонецЕсли;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	ВыборкаДетальныеЗаписи.Следующий();
	НомерМеста = ВыборкаДетальныеЗаписи.НомерМеста;
	
	НаборЗаписей = РегистрыСведений.МестаДляПередачиТоваров.СоздатьНаборЗаписей(); 
	
	НаборЗаписей.Отбор.ПередачаТоваров.Установить(ПередачаСсылка); 
	НаборЗаписей.Отбор.ШтрихкодМеста.Установить(ШтрихкодМеста); 
	
	НоваяЗапись = НаборЗаписей.Добавить(); 
	НоваяЗапись.ПередачаТоваров = ПередачаСсылка;
	НоваяЗапись.ШтрихкодМеста = ШтрихкодМеста;
	
	НоваяЗапись.Принято = Истина; 
	НоваяЗапись.ФизическоеЛицо = ПользовательСсылка.ФизическоеЛицо; 
	НоваяЗапись.ВремяПриемкиМеста = ТекущаяДата(); 
	НоваяЗапись.НомерМеста = НомерМеста; 
	
	Тело = Новый Структура;
	Тело.Вставить("date" ,Формат(НоваяЗапись.ВремяПриемкиМеста,""));
	
	Попытка
		НаборЗаписей.Записать();
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при записи грузового места с штрихкодом " + ШтрихкодМеста;
		Возврат;
	КонецПопытки;
	
	//Формируем сразу товарный состав места
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	НоменклатураПоМестамДляПередачиТоваров.Номенклатура КАК Ссылка,
	|	НоменклатураПоМестамДляПередачиТоваров.КоличествоПринято КАК КоличествоПринято,
	|	НоменклатураПоМестамДляПередачиТоваров.Номенклатура.Наименование КАК Наименование
	|ИЗ
	|	РегистрСведений.НоменклатураПоМестамДляПередачиТоваров КАК НоменклатураПоМестамДляПередачиТоваров
	|ГДЕ
	|	НоменклатураПоМестамДляПередачиТоваров.ПередачаТоваров = &ПередачаТоваров
	|	И НоменклатураПоМестамДляПередачиТоваров.НомерМеста = &НомерМеста";
	
	Запрос.УстановитьПараметр("НомерМеста", НомерМеста);
	Запрос.УстановитьПараметр("ПередачаТоваров", ПередачаСсылка);
	
	Попытка
		РезультатЗапроса = Запрос.Выполнить();
	Исключение
		Тело.Вставить("goods" , Неопределено);
		ТекстОшибки = "Ошибка при получении товарного состава грузового места " + ШтрихкодМеста;
		Возврат;
	КонецПопытки;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	МассивТоваров = Новый Массив;
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		СтруктураТовара = Новый Структура;
		СтруктураТовара.Вставить("id", XMLСтрока(ВыборкаДетальныеЗаписи.Ссылка));
		СтруктураТовара.Вставить("name", ВыборкаДетальныеЗаписи.Наименование);
		СтруктураТовара.Вставить("qnt", ВыборкаДетальныеЗаписи.КоличествоПринято);
		МассивТоваров.Добавить(СтруктураТовара);
		
	КонецЦикла;
	
	Тело.Вставить("goods" , МассивТоваров);

КонецПроцедуры

Процедура ОбработатьМетод_check_good(СтруктураЗапроса, Тело, Отказ, ТекстОшибки);
	
	ШтрихкодНоменклатуры = СтруктураЗапроса.body["barcode"];
	НомерМеста = СтруктураЗапроса.body["cargo"];
	Количество = СтруктураЗапроса.body["qnt"];
	
	Попытка
		ПередачаСсылка = Документы.ПередачаТоваровМеждуОрганизациями.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.doc));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найден документ передачи по идентификатору " + СтруктураЗапроса.doc;
		Возврат;
	КонецПопытки;
	
	Попытка
		ПользовательСсылка = Справочники.Пользователи.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураЗапроса.user));
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Не найден пользователь по идентификатору " + СтруктураЗапроса.user;
		Возврат;
	КонецПопытки;
	
	//Поиск номенклатуры по штрихкоду
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура
	|ИЗ
	|	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
	|ГДЕ
	|	ШтрихкодыНоменклатуры.Штрихкод = &Штрихкод";
	
	Запрос.УстановитьПараметр("Штрихкод", ШтрихкодНоменклатуры);
	
	Попытка
		РезультатЗапроса = Запрос.Выполнить();
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при запросе номенклатуры по штрихкоду " + ШтрихкодНоменклатуры;
		Возврат;
	КонецПопытки;
	
	Если РезультатЗапроса.Пустой() Тогда
		Отказ = Истина;
		ТекстОшибки = "Номенклатура с штрихкодом " + ШтрихкодНоменклатуры + " не найдена";
		Возврат;
	КонецЕсли;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	ВыборкаДетальныеЗаписи.Следующий();
	Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
	
	//Запрос уже принятого количества
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	НоменклатураПоМестамДляПередачиТоваров.КоличествоПринято КАК КоличествоПринято
	|ИЗ
	|	РегистрСведений.НоменклатураПоМестамДляПередачиТоваров КАК НоменклатураПоМестамДляПередачиТоваров
	|ГДЕ
	|	НоменклатураПоМестамДляПередачиТоваров.ПередачаТоваров = &ПередачаТоваров
	|	И НоменклатураПоМестамДляПередачиТоваров.НомерМеста = &НомерМеста
	|	И НоменклатураПоМестамДляПередачиТоваров.Номенклатура = &Номенклатура";
	
	Запрос.УстановитьПараметр("ПередачаТоваров", ПередачаСсылка);
	Запрос.УстановитьПараметр("НомерМеста", НомерМеста);
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	
	Попытка
		РезультатЗапроса = Запрос.Выполнить();
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при запросе принятого количества для " + Номенклатура;
		Возврат;
	КонецПопытки;
	
	Если РезультатЗапроса.Пустой() Тогда
		Отказ = Истина;
		ТекстОшибки = "Номенклатура " + Номенклатура + " не найдена";
		Возврат;
	КонецЕсли;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	ВыборкаДетальныеЗаписи.Следующий();
	КоличествоПринято = ВыборкаДетальныеЗаписи.КоличествоПринято;
	
	НаборЗаписей = РегистрыСведений.НоменклатураПоМестамДляПередачиТоваров.СоздатьНаборЗаписей(); 
	
	НаборЗаписей.Отбор.ПередачаТоваров.Установить(ПередачаСсылка); 
	НаборЗаписей.Отбор.НомерМеста.Установить(НомерМеста); 
	НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура); 
	
	НоваяЗапись = НаборЗаписей.Добавить(); 
	НоваяЗапись.ПередачаТоваров = ПередачаСсылка;
	НоваяЗапись.НомерМеста = НомерМеста;
	НоваяЗапись.Номенклатура = Номенклатура;
	
	ОбщееКоличество = КоличествоПринято + Количество;
	
	НоваяЗапись.КоличествоПринято = ОбщееКоличество;  
	НоваяЗапись.ФизическоеЛицо = ПользовательСсылка.ФизическоеЛицо; 
	
	Попытка
		НаборЗаписей.Записать();
	Исключение
		Отказ = Истина;
		ТекстОшибки = "Ошибка при проверке количества номенклатуры " + Номенклатура;
		Возврат;
	КонецПопытки;
	
	Тело = Новый Структура;
	Тело.Вставить("id" , XMLСтрока(Номенклатура));
	Тело.Вставить("qnt" , ОбщееКоличество);

КонецПроцедуры

 

Некоторые моменты кода требуют уточнений.

Для хранения дополнительных настроек создан регистр "интеркомДополнительныеНастройкиПользователей".

Все пользователи базы на ТСД нам не нужны, отбор пользователей происходит из данного регистра по Организации и признаку "Пользователь ТСД". Идентификатор организации заносится в одноименную константу на мобильном устройстве и передается в запросе. Так же проверяется заполненность поля "Физическое лицо" у пользователя, так как это значение нам понадобится при записи факта приемки (кто принял и когда).

Полную конфигурацию приводить не буду, так как реализовано это все в Комплексной автоматизации.

 

Конфигурация мобильного приложения прилагается к статье.

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

 

Текст модуля "Взаимодействие" (Сервер/ВызовСервера)

//Выполняет метод сервиса
//СтруктураЗапроса:
// - ИмяМетода - строка.
// - ТелоЗапроса - Структура с передаваемыми в метод полями и значениями
// - ТелоОтвета - Структура, возвращенная в ответе метода сервиса
Функция ВыполнитьМетодPOST(ИмяМетода, ПараметрыМетода = "", Документ = "") Экспорт
	
	СтруктураЗапроса = ПодготовитьСтруктуруЗапросаДляМетода(ИмяМетода, ПараметрыМетода, Документ);
	
	ServerAddress = Повторно.ПолучитьКонстанту("ServerAddress");
	AuthString = Повторно.ПолучитьКонстанту("AuthString");
	PubPath = Повторно.ПолучитьКонстанту("PubPath");
	
	//Проверяем настройки
	Если НЕ (ЗначениеЗаполнено(PubPath) 
		И ЗначениеЗаполнено(AuthString) 
		И ЗначениеЗаполнено(ServerAddress)
		И СтруктураЗапроса.ТелоЗапроса <> Неопределено) Тогда
		
		Сообщить("Не заполнены обязательные настройки.");
		Возврат СтруктураЗапроса.ТелоОтвета;
	КонецЕсли;
	
	//Запрос
	ЗаписьJSON = Новый ЗаписьJSON;
	
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса.ТелоЗапроса);
	СтрокаJSON = ЗаписьJSON.Закрыть();
	
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("Authorization", AuthString);
	Заголовки.Вставить("Content-Type", "application/json");
	
	HTTPСоединение = Новый HTTPСоединение(ServerAddress);
	HTTPЗапрос = Новый HTTPЗапрос(PubPath, Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
	
	//Пинг
	Попытка
		HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
	Исключение
		Сообщить("Ошибка при отправке запроса на сервер " + ServerAddress);
		Возврат СтруктураЗапроса.ТелоОтвета;
	КонецПопытки;
	
	//Понг
	Если HTTPОтвет.КодСостояния = 200 Тогда 
		ОтветСервиса = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);	
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ОтветСервиса);
		Попытка
			СтруктураЗапроса.ТелоОтвета = ПрочитатьJSON(ЧтениеJSON);
			Если НЕ СтруктураЗапроса.ТелоОтвета.success Тогда
				
				Сообщить(СтруктураЗапроса.ТелоОтвета.error);
				
				СтруктураЗапроса.ТелоОтвета = Неопределено;
				
			КонецЕсли;
		Исключение
			Сообщить("Метод " + ИмяМетода + " получил неверные данные от сервиса " + ServerAddress + PubPath);
			СтруктураЗапроса.ТелоОтвета = Неопределено;
		КонецПопытки;
	Иначе
		Сообщить("Метод " + ИмяМетода + " вернул код состояния " + Строка(HTTPОтвет.КодСостояния) + " от сервиса " + ServerAddress + PubPath);
	КонецЕсли;

	Возврат СтруктураЗапроса.ТелоОтвета;
	
КонецФункции

Функция ПодготовитьСтруктуруЗапросаДляМетода(ИмяМетода, ПараметрыМетода, Документ)
	
	СтруктураЗапроса = Новый Структура;
	ТелоЗапроса = Новый Структура;
	ТелоОтвета = Неопределено;
	
	Организация = Повторно.ПолучитьКонстанту("OrgId");
	ТекущийПользователь = Повторно.ПолучитьКонстанту("ТекущийПользователь");
	ИмяМетода = ИмяМетода;
	
	Если НЕ (ЗначениеЗаполнено(Организация)) Тогда
		
		ТелоЗапроса = Неопределено;
		
	Иначе
		
		ТелоЗапроса.Вставить("org", Организация);
		ТелоЗапроса.Вставить("doc", Документ);
		ТелоЗапроса.Вставить("user", ТекущийПользователь);
		ТелоЗапроса.Вставить("method", ИмяМетода);
		ТелоЗапроса.Вставить("body", ПараметрыМетода);
	
	КонецЕсли;
	
	СтруктураЗапроса.Вставить("ТелоЗапроса", ТелоЗапроса);
	СтруктураЗапроса.Вставить("ТелоОтвета", ТелоОтвета);
	
	Возврат СтруктураЗапроса;
	
КонецФункции

Функция ПолучитьХешПароля(Пароль) Экспорт
    
    Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
    Хеш.Добавить(Пароль);
    Возврат Base64Строка(Хеш.ХешСумма);
    
КонецФункции

 

Текст модуля "Повторно" (Сервер/ВызовСервера/На время сеанса)

Функция ПолучитьКонстанту(ИмяКонстанты) Экспорт
	
	Возврат Константы[ИмяКонстанты].Получить();
	
КонецФункции

Процедура ЗаписатьКонстанту(ИмяКонстанты, Значение) Экспорт
	
	Константы[ИмяКонстанты].Установить(Значение);
	
КонецПроцедуры

 

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ЛокальныйОтказ = Ложь;
	ПолучитьСписокПользователей(ЛокальныйОтказ);
	ВыбратьЛогин(ЛокальныйОтказ);
	
КонецПроцедуры

&НаСервере
Процедура ПолучитьСписокПользователей(Отказ = Ложь)
	
	Ответ = Взаимодействие.ВыполнитьМетодPOST("get_users");
	
	Если Ответ <> Неопределено Тогда
		СписокПользователей.Очистить();
		Для Каждого Пользователь Из Ответ.body Цикл
			
			СписокПользователей.Добавить(Пользователь.id, Пользователь.name);
			
		КонецЦикла;
	Иначе
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьЛогин(Отказ)
	
	Если Отказ Тогда Возврат; КонецЕсли;
	
	ВыбранныйПользователь = СписокПользователей.ВыбратьЭлемент("Выберите пользователя", Повторно.ПолучитьКонстанту("ТекущийПользователь"));
	
	Если ВыбранныйПользователь = Неопределено Тогда
		ВыбратьЛогин(Отказ);
	Иначе
		ЭтаФорма.Заголовок = ВыбранныйПользователь.Представление;
		Повторно.ЗаписатьКонстанту("ТекущийПользователь", ВыбранныйПользователь.Значение);
		
		Если Повторно.ПолучитьКонстанту("ИспользоватьАвторизацию") Тогда
			
			Пароль = "";
			ВвестиСтроку(Пароль,"Введите пароль",15);
			
			Пароль = Взаимодействие.ПолучитьХешПароля(Пароль);
			
			Ответ = Взаимодействие.ВыполнитьМетодPOST("auth", Пароль);
			
			Если Ответ <> Неопределено Тогда
				//НачатьРаботу();
			КонецЕсли;
			
		Иначе
			//НачатьРаботу();
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры


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

 

В начале работы с мобильным приложением необходимо заполнить обязательные константы: 

ServerAddress (Адрес сервера) - это адрес сервера, где опубликован сервис.

AuthString (Строка авторизации) - строка HTTP аутентификации вида: Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6. (Это пользователь 1С с именем "Администратор" и без пароля)

PubPath (Путь к публикации) - это путь к публикации http-сервиса вида: /ka/hs/invent/main.

OrgId (Идентификатор организации) - Уникальный идентификатор элемента справочника "Организации" (для разделения ТСД по организациям)

ПрефиксГрузовогоМеста - префикс грузового места :). (Чтобы при сканировании отделить штрихкоды грузовых мест от штрихкодов товаров)

 

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

Что нового и инновационного она в себе несет? Ведь это же еще одна из многих реализация самого обычного функционала!

 

Тут я бы хотел вернуться в начало и все-таки обозначить цели этой статьи.

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

Вторая цель - создать обсуждение и возможно совместными усилиями сможем решить задачу внешнего события.

И третья цель - нетленка :) Инфостартом я пользуюсь уже давно, таким образом решил сделать закладку на будущее самому себе.

А посему приглашаю в комменты на обсуждение сего творения. Приветствуется любая, даже неконструктивная критика.

Всем спасибо!

 

Обновление от 21.06.2022

В общем, мне удалось решить проблему отлова внешнего события от сканера с помощью внешней компоненты: //soft.crimea.com/public/1230245/. Спасибо большое Евгению за его труды.

Обновил мобильное приложение.

У нас используются две модели сканеров: Honeywell EDA50K и Zebra MC3300.

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

 

Скачать файлы

Наименование Файл Версия Размер
Конфигурация мобильного приложения приемки.

.cf 93,69Kb
5
.cf 0.0.0.1 93,69Kb 5 Скачать
Конфигурация мобильного приложения приемки (с обработкой внешнего события)

.cf 2,36Mb
9
.cf 0.0.0.2 2,36Mb 9 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. suepifanov 731 07.06.22 13:54 Сейчас в теме
Скачал вам на стартмани)
А логирования ошибок вообще не делали?
4. 3dice 9 09.06.22 11:38 Сейчас в теме
(1) Обычно, конечно, делаю, примерно так:

Процедура ЗаписьПодробнойОшибкиВЖурнал(ИнформацияОбОшибке, Данные = Неопределено)
	
	МассивСообщенийВЖурнал = Новый Массив;

	МассивСообщенийВЖурнал.Добавить(ИнформацияОбОшибке.ИмяМодуля + ", в строке "+Строка(ИнформацияОбОшибке.НомерСтроки));
	МассивСообщенийВЖурнал.Добавить(ИнформацияОбОшибке.ИсходнаяСтрока);
	МассивСообщенийВЖурнал.Добавить(ИнформацияОбОшибке.Описание);
	
	СтрокаСообщенияДляЖурнала = СтрСоединить(МассивСообщенийВЖурнал, Символы.ПС);

	ЗаписьЖурналаРегистрации("HTTP-сервис: обмен с УТП",
							УровеньЖурналаРегистрации.Ошибка,
							Метаданные.ПланыОбмена.ОбменСУТП,
							Данные,
							СтрокаСообщенияДляЖурнала);
КонецПроцедуры
Показать
2. malikov_pro 1182 07.06.22 14:38 Сейчас в теме
Если есть желание реализовать на 1С https://github.com/gothinkster/realworld, можем скооперироваться
HTTP запросы лучше оборачивать в https://github.com/vbondarevsky/Connector
3. malikov_pro 1182 07.06.22 14:47 Сейчас в теме
(1) как хотите организовать логирование? Cам для HTTP запросов форматирую под sentry (статья в процессе).
5. eeeio 120 19.07.22 02:42 Сейчас в теме
Вы для сканеров случайно не делали воспроизведение звуков (при сканировании, например)?
6. 3dice 9 19.07.22 14:01 Сейчас в теме
(5) Не совсем понял. Встроенный в ТСД сканер и так пищит при сканировании.
7. eeeio 120 19.07.22 15:04 Сейчас в теме
(6) я неверно сформулировал. вопрос про ТСД - нужно звук удачного/неудачного распознавания выводить. Но сборка приложения почему-то не требует разрешений на вывод звука (хотя галочки стоят) и потом приложение жалуется, что доступа на воспроизведение звуков нет. Хочу найти конфу, которая собирается успешно и умеет нормально сигналить.
8. 3dice 9 19.07.22 23:00 Сейчас в теме
(7) Насколько я понял, необходимо при обработке полученного штрих-кода, если он не найден в базе данных, выводить какой-то специфический звуковой сигнал. Я правильно понял? Я такого не пробовал, но обычно хватает какого-то диалогового окна о том что штрих-код не найден. Но думаю не проблема прикрутить воспроизведение звука.
Оставьте свое сообщение

См. также

Дневник времени. Простое мобильное приложение 1С для телефона на Андроид Промо

Мобильная разработка Мобильная платформа Абонемент ($m)

Дневник времени. Для адептов тайм-менеджмента и всех тех, кто ценит свое время. Предназначен для ежедневных записей в телефоне расхода времени на различные задачи. Отчет по записям программы позволяет увидеть, сколько времени, на какие задачи расходовалось и проанализировать траты времени за месяц. Можно выгрузить записи в csv файл и анализировать на дескопном компьютере, например в Экселе. Можно составлять планы на день и отмечать, что удалось сделать, а что нет.

1 стартмани

12.03.2021    5539    5    pricec    1    

Мобильный ТСД - Мобильное решение для Android. Автоматизации складских операций. Превращает телефон в терминал сбора данных или используется на ТСД с ОС Android. Обмен через облако. Проверка марок в накладных из системы маркировки (честный знак).

Розничная торговля Логистика, склад и ТМЦ Мобильная разработка Обмен с ГосИС Платформа 1С v8.3 1С:Розница Розничная и сетевая торговля (FMCG) Россия Управленческий учет Абонемент ($m)

Возможности мобильного приложения: - Обмен данными с типовыми конфигурациями 1С, Штрих-М, через облако - Сбор штрих-кодов камерой телефона или сканером ТСД - Складские операций (Поступление / Реализация / Перемещение) - Проверка марок маркировки(честный знак) - Контроль остатков - Печать Ценников

5 стартмани

17.10.2022    1136    3    Derik    4    

Мобильное приложение для торговли

Оптовая торговля Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Абонемент ($m)

Шаблон мобильного приложения (документ Реализация и отчеты по остаткам и ценам номенклатуры) и расширение для встраивания в конфигурацию.

1 стартмани

23.08.2022    977    2    user1719555    0    

Мобильное приложение "Мобильный приемщик" для Альфа-Авто 5

Мобильная разработка Платформа 1С v8.3 Абонемент ($m)

Мобильное приложение для Android смартфонов/планшетов, позволяющее в оперативном порядке сделать фотографии, видео и голосовое описание принимаемого в ремонт (или по иным причинам) одного или нескольких автомобилей. Работает независимо от основной программы «Альфа-Авто».

1 стартмани

01.05.2022    2048    13    osivv    0    

Внешняя компонента: Android tools Промо

Мобильная разработка Разработка внешних компонент Платформа 1С v8.3 Мобильная платформа Абонемент ($m)

Несколько дополнительных функций для мобильного приложения\клиента под Android. Размер архива внешних компонент под архитектуры ARM и x86 - 230KB.

1 стартмани

12.01.2021    11155    32    KAV2    38    

1Scan. Интеграция веб-клиента 1С с устройством Android (смартфон, планшет, ТСД)

Мобильная разработка WEB-интеграция Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

15.11.2021    6906    32    kild    33    

Внешняя компонента для мобильного приложения

Разработка внешних компонент Мобильная разработка Мобильная платформа Россия Абонемент ($m)

Внешняя компонента для дополнения мобильной платформы некоторыми функциями.

1 стартмани

02.11.2021    5909    19    Prometeus2011    44    

Приложение Android для идентификации/распознавания образов (с обучением с одного раза, One-Shot Learning) с возможностью работы с 1С через веб-сервис Промо

Мобильная разработка Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

19.06.2018    23083    5    informa1555    16    

Пример формы авторизации на Javascript для мобильного приложения

Мобильная разработка Платформа 1С v8.3 Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Пример формы авторизации на Javascript для мобильного приложения

3 стартмани

25.10.2021    4763    6    rail21    11    

1С Push-уведомления с помощью Firebase Cloud Messaging

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Отправка Push-уведомлений из 1С в мобильное приложение за 6 шагов.

10 стартмани

17.09.2021    4921    3    zykov_vitaliy    10    

Мобильное приложение - расширение для конфигурации "INFOSTART ERP community edition"

Мобильная разработка Infostart ERP community Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширение для работы с мобильным приложением + мобильное приложение.

1 стартмани

19.08.2021    4174    7    33lab    4    

Мобильное приложение "Отчет по проделанной работе" Промо

Мобильная разработка Учет рабочего времени Платформа 1С v8.3 Россия Управленческий учет Абонемент ($m)

Приложение выполняет фиксацию рабочего времени у клиентов, а также заявок на работы, пригодится как шаблон для разработки своего или как готовое решение для работников в сфере услуг, которые фиксируют время у клиентов. В приложении 2 документа: первый "отчет за день", второй "заявка" и полезный инструмент "Отчет задачи", который в свою очередь создан для просмотра, анализа и закрытия заявок. Тестировал на Iphone 6s.

10 стартмани

01.12.2017    33044    10    olejnikov_m    6    

Распознавание речи в мобильном приложении 1С на Android

Мобильная разработка Разработка внешних компонент Мобильная платформа Абонемент ($m)

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

1 стартмани

15.07.2021    7684    7    salexdv    6    

Мобильное приложение для 1C:Drive для фотоотчетов с сохранением фотографий в Microsoft Azure Blob storage

Мобильная разработка Мобильная платформа Абонемент ($m)

Пример реализации мобильного приложения, которое использует Microsoft Azure Blob storage для сохранения фотографий и передает сведения о сделанных фотографиях в 1C:Drive.

1 стартмани

26.02.2021    5867    5    keypax    2    

7 причин, почему интеграция стала приятной. Не упускайте ряд потрясающих возможностей Промо

Внешние источники данных Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В статье показаны примеры получения данных без программирования на стороне «1С:Предприятие 8». Вам нужно проверить гипотезу и проанализировать данные, почему бы не интегрироваться с Excel? Используете технологии .NET и «1С:Предприятие 8», процесс связывания систем движется катастрофически медленно? Хотите native Android приложение с вашими данными всегда под рукой?

1 стартмани

01.10.2015    67758    54    pbazeliuk    23    

Авторизация в мобильном приложении 1С

Роли и права Мобильная разработка Платформа 1С v8.3 Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Реализация входа по паролю (личному коду) в мобильном приложении 1С.

10 стартмани

23.02.2021    10025    8    kaiman_fedor_yandex    0    

Выбор документов на мобильном устройстве (iOS)

Мобильная разработка Мобильная платформа Абонемент ($m)

При внедрении мобильного приложения, имеющего в своём функционале работу с файлами, возникла необходимость прикреплять к документам не только фотографии из библиотеки мультимедиа или тут же созданные фотографии, а документы (pdf, doc, xlsx, и др.). В операционной системе iOS файловая система скрыта для пользователя и взаимодействие с файлами осуществляется средствами самого приложения и только с файлами, расположенными в директории приложения (контейнере приложения). Т.е. задачей было поместить файлы в директорию приложения и организовать взимодествие с этим каталогом.

1 стартмани

29.11.2020    6375    0    OlegK    0    

Давайте подружим 1С и Android. Часть 1 - постановка задачи и подход к решению Промо

Мобильная разработка Платформа 1С v8.3 Абонемент ($m)

Серия уроков по созданию простейшего приложения на платформе Android для взаимодействия с 1С.

1 стартмани

29.02.2016    38886    43    solarisman    32    

Мобильный голосовой чат бот

Мобильная разработка Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

10.11.2020    3729    0    onec.developer    7    

Использование встроенного сканера ТСД на Android в мобильном клиенте и мобильном приложении (драйвер сканера Android для 1С)

Разработка внешних компонент Мобильная разработка Платформа 1С v8.3 Абонемент ($m)

Используя данный драйвер, можно без единой строки кода, просто установив на ТСД мобильный клиент 1С, сразу начать подбирать товары в документах вашей учётной системы. А, адаптировав нужные формы под небольшой размер экрана ТСД, можно просто создать полноценное рабочее место для выполнения операций с помощью ТСД, не прибегая к стороннему софту. Если же на складе плохая связь (или её нет вовсе), то можно использовать возможности мобильного клиента в автономном режиме (потребуется доработка вашей конфигурации). Драйвер также можно использовать и для Android приложения на мобильной платформе. В результате чего можно обойтись без ненужных полей ввода и клавиатуры «на пол-экрана».

3 стартмани

09.10.2020    42220    318    ltfriend    205    

1C.QuickPhoto - мобильное приложение для быстрой отправки фотографий в присоединенные файлы БСП

Мобильная разработка Обработка справочников Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Приложение предназначено для быстрого прекрепления фотографий к документам и справочникам программ 1С. Требуется установить расширение для своей конфигурации и опубликовать http-сервис.

2 стартмани

17.09.2020    8904    23    suepifanov    35    

Как сделать простое мобильное веб-приложение в 1С Промо

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В статье показан пример разработки простого мобильного веб-приложения "Контакты" с помощью функционала HTTP-сервисов появившегося в новой версии платформы 1С (8.3.5). Данное демонстрационное мобильное веб-приложение предоставляет доступ к телефонам и электронной почте контрагентов хранящихся в базе 1С, позволяет совершать звонки и писать электронные письма.

1 стартмани

04.06.2014    63246    218    rtnm    24    

Мобильная платформа. Штрихкоды в Android.

Разработка внешних компонент Мобильная разработка Сканер штрих-кода Мобильная платформа Абонемент ($m)

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

3 стартмани

14.09.2020    7439    4    kinan    19    

Мусорная корзина, или удаление помеченных объектов для мобильной платформы

Мобильная разработка Чистка данных Платформа 1С v8.3 Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Обработка удаления помеченных объектов для встраивания в Ваши мобильные приложения.

2 стартмани

18.08.2020    6454    4    GAMLET    0    

Тревожная кнопка. Мини конфигурация для выключения компьютера с телефона

Мобильная разработка Платформа 1С v8.3 Россия Абонемент ($m)

Мини конфигурация для выключения компьютера с мобильного телефона.

1 стартмани

10.08.2020    4677    3    user1209971    0    

Создание и управление интернет магазином на Android в режиме "Online" Промо

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

“DjanorgStore-Client” – обработка для управления в режиме "onLine" контентом приложения интернет магазина на Android платформах

1 стартмани

08.10.2012    29412    228    Kosigo    22    

Расширение "PUSH уведомления для мобильного клиента".

Мобильная разработка Мобильная платформа 1С:Комплексная автоматизация 1.х 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:CRM ПРОФ, КОРП Россия Абонемент ($m)

Расширение для отправки PUSH уведомлений в мобильный клиент на Android. Подходит для типовых конфигураций, протестирована на конфигурации КА 2.4.

1 стартмани

04.08.2020    9339    24    romanpolyashov@yandex.ru    0    

Нано HTTP сервер - внешняя компонента для мобильного приложения 1C, на Android

Разработка внешних компонент Мобильная разработка Платформа 1С v8.3 Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Нано HTTP сервер на терминале сбора данных "ATOL Smart.Lite android 7.0". Работает только с GET и POST запросами. Аутентификация BASE64. Не поддерживает HTTPS и не передает файлы. В прикрепленном архиве исходники на компоненту (С++ и java для Android Studio 3.6.2), ЦФ - мобильного приложения и тестовая обработка.

1 стартмани

22.06.2020    10555    17    SanyMaga    23    

miniWms. Программное решение для автоматизации склада

Мобильная разработка Логистика, склад и ТМЦ Платформа 1С v8.3 1С:Управление торговлей 11 Оптовая торговля, дистрибуция, логистика Управленческий учет Абонемент ($m)

Готовое Android приложение для автоматизации складских операций УТ 11. Доработка конфигурации не требуется. Навыки разработчика не требуются.

1 стартмани

16.06.2020    7072    9    Basili02    7    

Мобильное приложение 1С для просмотра контактов в базе Промо

Мобильная разработка Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление нашей фирмой 1.6 Абонемент ($m)

Партнеры: нативное приложение для просмотра контактов из вашей базы 1С на iPhone c iOS trendy интерфейсом

1 стартмани

29.08.2014    33411    9    playertwo    8    

Перехват сканирования Android Native API

Разработка внешних компонент Мобильная разработка Мобильная платформа Абонемент ($m)

Native компонента для перехвата сканирования шк и передачу в мобильную 1С.

1 стартмани

29.04.2020    16582    83    evgeny43    72    

Мобильная платформа. Уникальный идентификатор устройства Android при помощи внешней компоненты. Не IMEI

Разработка внешних компонент Мобильная разработка Мобильная платформа Абонемент ($m)

Идентифицируем устройства, на которых установлены копии нашего приложения.

3 стартмани

23.04.2020    10653    10    kinan    19    

Android Java и NativAPI C++ внешняя компонента для широковещательных сообщений (отправка и прием). Подключаем сканер ШК и клавиатуру к "1С мобильное приложение"

Оптовая торговля Розничная торговля Сканер штрих-кода Разработка внешних компонент Мобильная разработка Мобильная платформа Оптовая торговля, дистрибуция, логистика Абонемент ($m)

Подключаем сканер ШК и клавиатуру к "1С мобильное приложение", на терминале сбора данных "ATOL Smart.Lite android 7.0". Работаем с буфером обмена. В архиве к теме; 1. исходник компоненты (папка package готовый zip); 2. исходник "AccessibilityService" для перехвата клавиатуры (папка package готовый apk); 3. cf - тестовая конфигурация

1 стартмани

15.04.2020    15690    92    SanyMaga    102    

Мобильная платформа. Реакция на внешнее событие в Android при помощи внешней компоненты

Мобильная разработка Разработка внешних компонент Мобильная платформа Молдова Абонемент ($m)

Внешняя компонента для мобильной платформы на Android. Пришиваем платформе уши, чтобы лучше слышать.

3 стартмани

06.04.2020    12205    20    kinan    29    

Обработка голосового ввода текста с использованием (intent)

Мобильная разработка Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Обработка для голосового ввода текста с использованием дополнительных возможностей ОС Android.

1 стартмани

26.02.2020    8066    5    algabas    7    

Наш путь к эффективной инвентаризации склада

Логистика, склад и ТМЦ Розничная торговля Мобильная разработка Платформа 1С v8.3 Управленческий учет Абонемент ($m)

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

8 стартмани

12.01.2020    11091    2    Johny_v    23    

Обмен данными с Android через USB

Мобильная разработка Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Обработка с примером обмена данными конфигурации 1С через USB. Без установки Web сервера и настройки WiFi.

1 стартмани

23.12.2019    9806    8    asdfgcom    3    

Simple UI: простой конструктор мобильных приложений для устройств на Android. Обновление от 19.11.22

Мобильная разработка Платформа 1С v8.3 Управленческий учет Абонемент ($m)

Simple UI – это полностью бесплатная платформа для создания мобильных рабочих мест на Android. Конструктор позволяет создавать мобильные клиенты для учетных систем и самостоятельные приложения на телефонах, ТСД (терминалах сбора данных), планшетах, электронных киосках и других устройствах. При этом не нужно разбираться в мобильной разработке, Android SDK ведь основная цель платформы – максимально упростить процесс разработки и поддержки, сделать его визуальным, собирать приложения из готовых блоков с минимумом кода. Причем код обработчиков можно писать на языке учетной системы либо задавать логику обработки событий с помощью команд REST, SQL и визуального конструктора. Проект постоянно развивается изыскивая новые способы упрощения разработки и повышения функционала и является пожалуй самым быстрым способом как создать MVP-проект так и продакшн-систему под конкретное внедрение или тиражный продукт.Тестировалось на 1С: Предприятие 8.3 релиз 8.3.13.1865.

1 стартмани

14.11.2019    42368    426    informa1555    249    

Получение AndroidID в мобильном приложении

Мобильная разработка Мобильная платформа Россия Абонемент ($m)

Получаем Android DeviceID в мобильном приложении/клиенте, используя стороннее приложение.

1 стартмани

05.11.2019    15113    11    sam441    13    

Использование библиотеки Retrofit в проектах на Андроид

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Использование библиотеки Retrofit в проектах на Андроид для обмена данными с 1С с помощью HTTP-сервисов, с примерами и готовым рабочим шаблоном.

5 стартмани

04.11.2019    18136    11    WKBAPKA    51    

Мобильное приложение для Android для отправки СМС из 1C

SMS рассылки Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Вашему вниманию предлагается мобильное приложение (конфигурация .cf) + HTTP сервис для отправки СМС из 1С8

2 стартмани

04.11.2019    13193    23    dimasikus31    7    

Мобильная платформа. Косяки работы с интерфейсом

Мобильная разработка Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Думаю, каждый, кто хоть немного акцентировался на работе интерфейса на мобилке, сталкивался с проблемами с управлением элементами формы. О них и предлагаю поговорить.

1 стартмани

24.10.2019    10330    4    Crazy_Max    2    

ODa - Android приложение для подключения к любой конфигурации 1С, используя OData протокол

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

В платформе 1С реализована прекрасная возможность работы с открытым веб-протоколом OData, который предоставляет любой другой платформе интерфейс доступа - возможность запрашивать и обновлять данные из базы 1С. Далее в статье будут описаны особенности работы мобильного приложения ODa, которое без программировании на стороне Android'a позволит разработчикам публиковать базы 1С, что даст возможность обычным пользователям взаимодействовать с объектами метаданных, используя нативные элементы интерфейса платформы Android.

1 стартмани

22.10.2019    17981    8    Kosigo    11    

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

Разработка внешних компонент Мобильная разработка Защита ПО и шифрование Мобильная платформа Абонемент ($m)

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

5 стартмани

17.09.2019    12542    2    IgorKissil    9