Не прошло и три года...
Всем добра!
Не прошло и три года с момента, как учебная версия 1С стала бесплатной (то есть абсолютно). Для запуска любой современной конфигурации она, конечно, не подойдет (достаточно справочника объектов метаданных информационной базы, чтобы вылезти за пределы дозволенного), но для разработки мобильного приложения и связки его с какой-нить базой с демопрайсом, вполне сгодится.
Куда, как?
Если у вас нет дома 1С, ломать ее вас душит совесть, а купить - жаба, то освоить разработку почти всего на 1С не составляет никакой проблемы. Для этого достаточно нажать кнопку со своей ОСью и ввести пару слов в "анкете" - Тыдыщь...
В преамбуле написано, что вы можете чуть ли не все (например, можно доработать любую имеющуюся конфигурацию), но это не так, ибо отладить вы ее не сможете - ограничение на небольшое количество элементов справочников, регистров и иного просто сделает невозможным запуск даже пустой конфигурации. Но нам это и не нужно...
Итак, приступим к волшебству (ну или к ужасному колдунству, ибо я опять буду раздражать ратующих за права переменных на достойное имя).
ТЕСТОВАЯ КОНФА С ПРАЙСОМ
Итак, давайте запилим тестовую конфу с прайсом, загрузим его с какого-нить экселя, сделаем отображение картинки в форме элемента номенклатуры и замутим транспорт с помощью веб-сервисов. Погнали!
1. Справочник с номенклатурой.
Ну тут все просто:
- Создадим справочник
- Добавим парочку реквизитов (ПолнНаименование, Цена)
- Добавим реквизит, в котором будем хранить картинку - "фото", укажем тип значения - "ХранилищеЗначений"
Дальше создадим форму списка и форму элемента, в которой будем показывать картинку.
Ну форма проста до безобразия: Код, Наименование, ПолнНаименование и Картинка (поле внизу).
Лирическое отступление...
Для того, чтобы отобразить на управляемой форме (про обычные я уже давно забыл, как про страшный сон) картинку (в том числе и в мобильном приложении), достаточно создать реквизит формы с типом "Строка" и положить туда адрес временного хранилища, в которое, в свою очередь, нужно положить двоичные данные картинки. Т.е. тут все просто.
В реквизиты формы добавляем реквизит "Картинка", куда будем класть и ложить адреса временного хранилища.
Дальше давайте напишем супермегакод, который покажет нам картинку и заставит загрузиться ее из файла (потом проделаем это же для камеры мобильного устройства).
Итак, что тут с кодом не понятно? Элементарно же, да?
Отображение картинки на форме
1. При создании на сервере смотрим, есть ли у нас ссылка (мало ли это новый элемент справочника, которых на любительской версии 1С мы можем создать очень немного.
2. Проверим, есть ли там у нас что в хранилище значений. Да, я лезу туда через много точек - имею право.
3. Если есть, то покладем и положим это во временное хранилище, а адрес засунем в реквизит "Картинка".
С этим все.
Теперь давайте разберемся, как загрузить картинку из файла (например, для нового товара или для старого, у которого картинки нет, или у которого картинка по какой-то причине нас перестала устраивать).
Загрузка картинки из файла
1. Для реквизита формы "Картинка" в подменю я добавил команду "УстановитьФото", хотя мог бы сделать это и через нажатие на картинку (в мобильном приложении именно так и будет сделано).
2. При выполнении этой команды у нас открывается диалог выбора фалов, который ограничивается фильтрами.
3. При любом действии с диалогом у нас отрабатывает оповещение, в котором мы сначала проверяем, есть ли вообще что-то в переменной "рез" (ратующие за права переменных иметь хорошее имя - плачьте!), и если там ничего нет - выходим.
4. Ежели у нас там что-то есть, то файл мы передаем в процедуру "УстановитьФотоНаСервере", туда же передаем и сцылку (ибо процедура у нас без контекста).
5. Ну а дальше просто засовываем двоичные данные в хранилище значений с максимальным сжатием, пихаем это все в объект и записываем.
6. Дальше надо перечитать текущий объект (мы его изменили) и установить картинку в поле - об этом мы уже говорили.
Форма номенклатуры готова. Перейдем к веб-сервисам...
2. Веб-сервисы!
Ну тут тоже все дико элементарно. Создаем веб-сервис как-то так:
Здесь вроде как важно выбрать пакет XDTO. Например, пакет с ядром основных типов в 1С, который выбрал я. Ну и все эти URI, имена веб-сервисов и... Блин, больше ничего нет...
Добавим две операции:
1. Операция GetGoods, возвращающая... да, то же самое хранилище значений, как в случае с картинкой.
2. Операция SetPhoto с двумя параметрами - Код и Фотка. По коду мы будем идентифицировать наш товар, а фотка будет содержать фотку...
Ну и напишем этот злосчастный код (как же всем охота уже все эти "лоу коде" или вообще без него, где никто не сможет творить разную дичь с именами переменных и даже постоянных)
С первой функцией все предельно просто - в две строки мы выгружаем данные из запроса в таблицу, которую пакуем в хранилище значений и отправляем вызывающей стороне.
Со второй операцией тоже все просто: находим номенклатуру по коду и засовываем в реквизит с фоткой двоичные данные из хранилища значений. Ну и от имен переменных пусть будет плохо тем, кому от этого бывает плохо )))
Мобильное приложение
Итак, добрались мы с вами до мобильного приложения. Я, обычно, ничего не горожу в нем - там не надо никаких справочников, документов, регистров и прочей неведомой фигни. Мобильное приложение служит для того, чтобы быть устройством ввода для основной базы, а не для того, чтобы хранить в себе миллион непонятных сущностей, которые в нашем конкретном случае уж точно не нужны.
Итак, архитектура всего этого проста до безобразия:
1. Константа с адресом сервера, на котором опубликован наш веб-сервис.
2. Общая форма MAIN, в которой все и будет работать.
В форме у нас две закладки (Товары и Настройка), в виде закладок указано, что они отображаются для тачскрина. На первой закоадке товары с фоткой, на второй - настройки (поле для ввода адреса сервера с веб-сервисом):
Ну и много кода:
Здесь к нас парочка процедур для "дергания" веб-сервисов. В принципе элементарно - создается WSСоединение, "на основании" соединения создается WSПрокси, через который и дергается наш сервис. Про публикацию этого всего статей здесь миллионы, так что не буду особо заморачиваться.
Здесь первым номером идет процедура команды подключения к веб-сервису (загрузить данные). Она связана с кнопочкой, которую нужно жамкнуть после ввода адреса (она прям за адресом). Если данные получили - переключаемся на закладку с товарами, если нет - сообщаем ошибку (а ошибки будут, ибо для учебной версии доступно только одно соединение).
Ну а дальше идут процедуры и функции для вывода картинки, т.е. помещения ее во временное хранилище из хранилища значений, ну и обратные операции тоже наличествуют.
Ну и как финал - механизм фотографирования мобильной платформы, который никак не удалось создателям запихать в асинхронную обертку.
Ну и вот что получилось:
А здесь то, что в итоге получилось в тестовой базе с прайсом:
А что там по поводу экселя?
Да, я там выше обмолвился случайно про загрузку из экселя, при том кнопку загрузки видно на последнем скрине. Ну так и быть, придется выдать код (даже не картинку) - пусть от этого кода сведет зубы всем ценителям:
&НаСервереБезКонтекста
Процедура ЗагрузитьТоварыНаСервере( ДД, Расширение )
ИФ = ПолучитьИмяВременногоФайла( Расширение );
ДД.Записать( ИФ );
ТД = Новый ТабличныйДокумент;
ТД.Прочитать( ИФ, СпособЧтенияЗначенийТабличногоДокумента.Текст );
Ч = Новый ОписаниеТипов("число", Новый КвалификаторыЧисла( 15, 2, ДопустимыйЗнак.Неотрицательный ) );
НачатьЧтение = Ложь;
Для А = 1 По ТД.ВысотаТаблицы Цикл
Если НачатьЧтение Тогда
Ц = СокрЛП( ТД.Область(А, 4).Текст );
Если НЕ ПустаяСтрока( Ц ) Тогда
Наименование = СокрЛП( ТД.Область(А, 3).Текст );
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию( Наименование );
Если ПустаяСтрока( Ссылка ) Тогда
О = Справочники.Номенклатура.СоздатьЭлемент();
О.Наименование = Наименование;
О.ПолнНаименование = Наименование;
О.Цена = Ч.ПривестиЗначение(
СтрЗаменить(
СтрЗаменить(
СтрЗаменить(Ц, " руб.", ""),",","."
)," ", "")
);
О.Записать();
КонецЕсли;
КонецЕсли;
ИначеЕсли ТД.Область(А, 4).Текст = "Цена" Тогда
НачатьЧтение = Истина
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьТовары(Команда)
Длг = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла.Открытие );
Длг.Фильтр = "*.xls|*.xls|*.xlsx|*.xlsx";
Длг.Показать( Новый ОписаниеОповещения( "ПриВыбореФайлаКартинки",ЭтаФорма ) );
КонецПроцедуры
&НаКлиенте
Процедура ПриВыбореФайлаКартинки(Рез, Доп) Экспорт
Если Рез = Неопределено Тогда Возврат КонецЕсли;
фл = Новый Файл( Рез[0] );
ЗагрузитьТоварыНаСервере( Новый ДвоичныеДанные(Рез[0]), Фл.Расширение );
ОповеститьОбИзменении(Тип("СправочникСписок.Номенклатура"));
КонецПроцедуры
Файл был какой-то такой (первый прайс, попавшийся в гугле):