Русаков Григорий | Директор | Аналитика. Проекты и решения

«Как создавать, продвигать приложение и конкурировать с фирмой 1С на протяжении 11 лет»

Рассказ о том, как с 2007 года мне (как директору и основному разработчику) удается продвигать на рынок отраслевое решение на базе «1С:Предприятие 8», как конкурировать с самой фирмой «1С», принимать не стандартные решения и продолжать продавать продукт. Речь пойдет о системе электронного документооборота СЭД «Корпоративный документооборот», имеющей тысячи пользователей. Основные тезисы выступления: 1. Риск выхода на пустой рынок в 2007 году – раз нет решений, то возможно они не востребованы рынком? Оказалось, что востребованы. Что приносит больше денег - слабое решение на пустом рынке или отличное решение, но на рынке с большой конкуренцией? 2. Как конкурировать с фирмой «1С» на её поле? Стараемся всегда идти на шаг впереди: переход на 8.2 раньше, переход на «Такси» раньше, графический редактор значительно раньше, push-уведомления для iOS раньше и т.д. Всё это были информационные поводы для новостей. Слабое место – отсутствие методических материалов и различных книг для клиентов, но у нас меньше объем кода (в отличие от типовых продуктов фирмы 1С), проще модифицировать под себя it-специалистам клиента; 3. Продажи падают – как удержать? Стоит ли переименовать продукт для отстройки от конкурента или оставить старое наименование? Добавить ли новые подсистемы – KPI и технической поддержки? Минимизация затрат на техническую поддержку клиентов с сохранением качества. Бесплатные пожизненные обновления. Апгрейды на другие продукты. Лучшие условия для партнеров; 4. Клиенты заявляют - «А мы хотим тут новую кнопку (иначе не купим)!» Как соблюсти баланс между усложнением решения и удовлетворением конкретного клиента? Плюсы развития продукта под реальные нужды предприятий, а не под гипотетические задачи; 5. Повышать или понижать цену? Что увеличит продажи продукта? 6. Куда развиваться после 11 лет? Создание на основе продукта отдельных подсистем для программ фирмы «1С». Сертификация встраиваемых модулей в программы «1С:УТ», «1С:УНФ», «1С:Документооборот» и другие; 7. А может сделать OpenSource? Плюсы и минусы продукта в OpenSource. Дополнительная информация: Сколько вышло больших обновлений (на 8.1 для 8.2 и 8.3 такси). Расскажем были ли возражения против платного перехода на новые редакции. Одно из интересных решений – графический редактор бизнес-процессов, позволяющий создавать произвольные процессы в пользовательском режиме (не в «Конфигураторе») создан в 2010 году, фирма «1С» создала аналогичный в 2017. Изначально продукт поставляется с полностью открытым кодом, без дополнительных ключей защиты. Есть ли плюсы в такой поставке или больше минусов – приходите и всё узнаете!

Медиадисплей. Дополнительный монитор вместо дисплея покупателя

0. Техподдержка 25.05.17 07:15
Вместо двустрочного дисплея покупателя можно использовать обычный монитор компьютера, подключенный к кассовому компьютеру.

Перейти к публикации

Комментарии
Сортировка: Древо
1. pafftis 12 22.08.17 19:22 Сейчас в теме
так и не въехал как её в 1с прикрутить!
2. Техподдержка 22.08.17 19:25
(1) У вас какая конфигурация?
3. Intenso 07.12.17 15:39 Сейчас в теме
Расширение для УТ11 есть? В демо режиме работает чтобы понять стоит ли вобще разработка покупки и сколько там костылей если они есть?
4. Техподдержка 08.12.17 06:05
(3) Нет расширения для УТ. Его несложно сделать самому на примере расширения для розницы.

Текст модуля формы расширения для розницы (обработка РМКУправляемыйРежим):



&НаКлиенте
&Вместо("ВывестиИнформациюНаДисплейПокупателя")
Процедура rbs_ВывестиИнформациюНаДисплейПокупателя(Команда)
    
	Если Не ИспользоватьПодключаемоеОборудование Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(НаборПравИНастроек.ШаблонРаботыДисплеяПокупателя) Тогда
		ВыводитьИтоги = Ложь;
		ТекстПриПростое = НСтр("ru = 'ДОБРО ПОЖАЛОВАТЬ!'");
		ТекстВНерабочемСостоянии = НСтр("ru = 'КАССА НЕ РАБОТАЕТ'");
	Иначе
		ВыводитьИтоги = НаборПравИНастроек.ВыводитьПромИтогНаДисплей;
		ТекстПриПростое = НаборПравИНастроек.ТекстПриПростое;
		ТекстВНерабочемСостоянии = НаборПравИНастроек.ТекстВНерабочемСостоянии;
	КонецЕсли;
	
	Строка1 = "";
	Строка2 = "";
	ВыровнятьВПраво = Ложь;
	
	Если Команда = "НачалоРаботы" Тогда
		Строка1 = ТекстПриПростое;
		
	ИначеЕсли Команда = "Оплата" Тогда
		Строка1 = НСтр("ru = 'ВНЕСЕНО:'") + " " + ДисплейПокупателяПараметры.Оплата;
		Строка2 = НСтр("ru = '  СДАЧА:'") + " " + ДисплейПокупателяПараметры.Сдача;
	ИначеЕсли Команда = "ОжиданиеОплаты" Тогда
		
		ДисплейПокупателяПараметры.СуммаВсего  = Формат(СуммаВсего, "ЧДЦ=2;ЧГ=;ЧН=0.00");
		ДисплейПокупателяПараметры.СуммаСкидки = Формат(СуммаСкидки, "ЧДЦ=2;ЧГ=");
		
		Если ПустаяСтрока(ДисплейПокупателяПараметры.СуммаСкидки) Тогда
			Строка1 = НСтр("ru = '  ИТОГО:'") + " " + ДисплейПокупателяПараметры.СуммаВсего;
		Иначе
			Строка1 = НСтр("ru = '  ИТОГО:'") + " " + ДисплейПокупателяПараметры.СуммаВсего;
			Строка2 = НСтр("ru = ' СКИДКА:'") + " " + ДисплейПокупателяПараметры.СуммаСкидки;
		КонецЕсли;
		
	ИначеЕсли Команда = "ОтменаОплаты" Тогда
		Строка1 = НСтр("ru = 'ОТМЕНА ОПЛАТЫ'");
		
	ИначеЕсли Команда = "ДобавлениеТовара" 
		ИЛИ Команда = "УдалениеТовара" 
		ИЛИ Команда = "ИзмененияКоличества" 
		ИЛИ Команда = "ИзмененияЦены" Тогда
		
		ИнформацияНаименование = ДисплейПокупателяПараметры.ТоварНаименование;
		
		Если ВыводитьИтоги Тогда
			
			Если Команда = "УдалениеТовара" Тогда
				Строка1 = НСтр("ru = 'СТОРНО:'") + " ";
			Иначе
				Строка1 = НСтр("ru = '  ЦЕНА:'") + " ";
			КонецЕсли;
			
			Если НЕ ДисплейПокупателяПараметры.ТоварКоличество = 1 ИЛИ  Команда = "ИзмененияКоличества" ИЛИ Команда = "УдалениеТовара" Тогда
				Строка1 =  Строка1 + Строка(ДисплейПокупателяПараметры.ТоварКоличество) + "x";
			КонецЕсли;
			
			Строка1 = Строка1 + Строка(ДисплейПокупателяПараметры.ТоварЦена);
			Строка2 = НСтр("ru = ' ИТОГО:'") + " " + ДисплейПокупателяПараметры.СуммаВсего;
			
		Иначе
			
			ВыровнятьВПраво = Истина;
			Строка1 = Строка(ДисплейПокупателяПараметры.ТоварНаименование);
			Строка2 = Строка(ДисплейПокупателяПараметры.ТоварЦена);
			Если Не ПустаяСтрока(Строка1) Тогда
				Если НЕ ДисплейПокупателяПараметры.ТоварКоличество = 1 ИЛИ Команда = "ИзмененияКоличества" ИЛИ Команда = "УдалениеТовара" Тогда
					Строка2 = Строка(ДисплейПокупателяПараметры.ТоварКоличество) + "x" + Строка2 +  "=" +  Строка(ДисплейПокупателяПараметры.ТоварСумма);
				КонецЕсли;
				Если Команда = "УдалениеТовара" Тогда
					Строка2 = "-" + Строка2;
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
	ИначеЕсли Команда = "Аннулирование" Тогда
		Строка1 = НСтр("ru = 'ЧЕК АННУЛИРОВАН'");
		
	ИначеЕсли Команда = "ОтложитьЧек" Тогда
		Строка1 = НСтр("ru = 'ЧЕК ОТЛОЖЕН'");
	
	ИначеЕсли Команда = "ВозвратТовара" Тогда
		Строка1 = НСтр("ru = 'ВОЗВРАТ ТОВАРА'");
		 
	 ИначеЕсли Команда = "Сервис" Тогда
		Строка1 = ТекстВНерабочемСостоянии;
	
	КонецЕсли;
	
	Описание = Новый ОписаниеОповещения("ВывестиИнформациюНаДисплейПокупателяЗавершение", ЭтотОбъект);
    //типовой вызов
	МенеджерОборудованияКлиент.НачатьВыводИнформацииНаДисплейПокупателя(Описание,,, Строка1 + Символы.ПС + Строка2);
	
	
	/////РБ-Софт

//Шаблон для заголовка JSON-запроса
		 ЗаголовокЗапроса = "{""ordertable"":{
		 |""addmode"":""0"",
		 |""rows"":
		 |[";
//Шаблон для строки вывода товара в JSON-запросе
		 СтрокаЗапроса="{""name"":""<Наименование>"",
		 |""count"":""<Количество>"",
		 |""summ"":""<Сумма>""
		 |}";
//Шаблон для подвала JSON-запроса
		 ПодвалЗапроса="],
		 |""rowheight"": ""<КоличествоВидимыхСтрок>""
		 |},
		 |""currentrow"": ""<НомерВыделеннойСтроки>"",
		 |""infocount"":""<КоличествоПозиций>"",
		 |""infoToPay"": ""<СуммаКОплате>"",
		 |""infoCashIn"": ""<СуммаПринято>"",
		 |""infoRest"": ""<СуммаСдачи>"",
		 |""infoPaymentType"": ""<ТипОплаты>""
		 |}
		 |";
		 
		 
		 
		 ТипОплаты="Наличные";
		  			 
		 
		 
		 НомерВыделеннойСтроки = ЭтаФорма.Элементы.Товары.ТекущаяСтрока;
		 
		 КоличествоВидимыхСтрок=30;

//Заполняем данными подвал запроса
		 
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<КоличествоВидимыхСтрок>",Формат(КоличествоВидимыхСтрок,"ЧГ="));
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<НомерВыделеннойСтроки>",Формат(НомерВыделеннойСтроки,"ЧГ="));
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<КоличествоПозиций>",Формат(Объект.Товары.Количество(),"ЧГ="));
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<СуммаКОплате>",ДисплейПокупателяПараметры.СуммаВсего);
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<СуммаПринято>",ДисплейПокупателяПараметры.Оплата);
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<СуммаСдачи>",ДисплейПокупателяПараметры.Сдача);
		 
		 ПодвалЗапроса=СтрЗаменить(ПодвалЗапроса,"<ТипОплаты>",ТипОплаты);
		 
		 
	
	
    ОповещениеПриЗавершении=Описание;
    ИдентификаторУстройства=Неопределено;
    СтрокиТекста=Строка1 + Символы.ПС + Строка2;
    
    ПодключенныеУстройства = МенеджерОборудованияКлиент.ПолучитьПодключенныеУстройства(глПодключаемоеОборудование.ПараметрыПодключенияПО, 
		ПредопределенноеЗначение("Перечисление.ТипыПодключаемогоОборудования.ДисплейПокупателя"), ИдентификаторУстройства);
        
    
    
	Если ПодключенныеУстройства.Количество() > 0 Тогда
        Для Каждого Устройство Из ПодключенныеУстройства Цикл
            Если Устройство.ИдентификаторОбъекта="AddIn.RBSoftMediaDisplay" Тогда
                //Нашли дисплей РБ-Софт
				
				Если Команда = "НачалоРаботы" Тогда
					
                                         //Установка темы "Магазин 2"
					ТекстЗапроса="{""theme"": ""3""}";
					Результат="";
					Если НЕ Устройство.ОбъектДрайвера.ВыполнитьЗапрос("SetTheme",ТекстЗапроса,Результат) Тогда
						ОписаниеОшибки="";
						КодОшибки = Устройство.ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
						Сообщить("Код ошибки "+КодОшибки +" : "+ОписаниеОшибки);
					КонецЕсли;    
				
				ИначеЕсли Команда = "ДобавлениеТовара" 
					ИЛИ Команда = "УдалениеТовара" 
					ИЛИ Команда = "ИзмененияКоличества" 
					ИЛИ Команда = "ИзмененияЦены" 
					ИЛИ Команда = "Оплата" 
					ИЛИ Команда = "ОжиданиеОплаты" 
					
					Тогда
					//Заполняем текст запроса для отображения товаров

					
					СтрТоварыЗапроса="";
					Для Каждого Стр Из Объект.Товары Цикл
						
						
						
						СтрТовар=СтрЗаменить(Стр.ПредставлениеТабло,"""","'");
						СтрТовар=СтрЗаменить(СтрТовар,Символ(13)," ");
						СтрТовар=СтрЗаменить(СтрТовар,Символ(10)," ");
						СтрТовар=СтрЗаменить(СтрТовар,Символы.Таб," ");
						
						Если Цел(Стр.КоличествоУпаковок)=Стр.КоличествоУпаковок Тогда
							СтрКоличество = Формат(Стр.КоличествоУпаковок,"ЧЦ=15; ЧДЦ=0;ЧРГ=");
						Иначе    
							СтрКоличество = Формат(Стр.КоличествоУпаковок,"ЧЦ=15; ЧДЦ=3; ЧРД=.; ЧРГ=");
						КонецЕсли;    
						СтрКоличество=СокрЛП(СтрКоличество);
						
						СтрСумма = Формат(Стр.Сумма,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=");
						
						ТекСтрокаЗапроса=СтрЗаменить(СтрокаЗапроса,"<Наименование>",СтрТовар);
						ТекСтрокаЗапроса=СтрЗаменить(ТекСтрокаЗапроса,"<Количество>",СтрКоличество);
						ТекСтрокаЗапроса=СтрЗаменить(ТекСтрокаЗапроса,"<Сумма>",СтрСумма);
						
						СтрТоварыЗапроса=СтрТоварыЗапроса+?(СтрТоварыЗапроса="","",",")+"
						|"+ТекСтрокаЗапроса;
					КонецЦикла;    
					
					
					//Собираем полный текст JSON-запроса
					ТекстЗапроса =ЗаголовокЗапроса+СтрТоварыЗапроса+ПодвалЗапроса;
					Результат="";
                                        //Отправляем JSON-запрос через метод компоненты
                                        //Можно отправлять и встроенным механизмом работы с JSON
					Если НЕ Устройство.ОбъектДрайвера.ВыполнитьЗапрос("SetParameters",ТекстЗапроса,Результат) Тогда
						ОписаниеОшибки="";
						КодОшибки = Устройство.ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
						Сообщить("Код ошибки "+КодОшибки +" : "+ОписаниеОшибки);
					КонецЕсли;    
				КонецЕсли;    
                
            КонецЕсли;
    	КонецЦикла
	КонецЕсли;

	ПродолжитьВызов(Команда);
КонецПроцедуры

Показать
5. Intenso 08.12.17 14:27 Сейчас в теме
(4) То что можно самому написать это понятно, решение не бесплатное почему и спрашиваю. Т.к. отсутвие расширения понесет доп расходы на его разработку. Что на счет демо версии? она имеестя? можно как то попробовать как оно работает какую информацию и куда можно выводить и тд?
6. aGolosey 22.02.18 06:07 Сейчас в теме
Здравствуйте! Я скачал два файла, те, что бесплатные. Установил их. Программа запустилась, а вот драйвера не смог поставить в УТ 11. Выдает ошибку в настройке драйверов "Не установлен на текущем компьютере. Не определен тип: AddIn.RBSoftMediaDisplay". Как поправить ее?
8. Техподдержка 28.03.18 11:59
(6) 1С:Совместимый драйвер - это zip-архив.
Его можно подключить к 1С УТ11. Установить надо под правами администратора (запуск 1С под правами администратора).

Или просто разархивировать и запустить setup.exe под правами администратора.
Это как раз подходит, если хотим использовать для УТ 10, или ТиС 7.7.
9. user937909 30.04.18 10:50 Сейчас в теме
Добрый день. Можно ли на второй дисплей выводить прайс лист? Настраивается ли ширина области экрана для рекламы и ширина экрана для товаров из чека? Для использования полного функционала нужно ли вносить изменения в конфигурацию Розница 2.2? Работает ли с базовой версией Розницы 2.2?
10. Техподдержка 30.04.18 12:47
Здравствуйте. Прайс в виде таблицы можно выводить.
Ширина таблицы чека настраивается. Для использования полного функционала необходимо вносить изменения в конфигурацию. С базовой работает только двухстрочный режим дисплея покупателя.
Оставьте свое сообщение
Все разделы

Вакансии


Программист 1С
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Преподаватель 1С
Санкт-Петербург
Полный день

Удаленный ИТ-журналист
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 150 000 руб.
Полный день