При ведении активного товарного каталога в конфигурации «1С:Управление торговлей 10.3» часто возникает задача оперативного наполнения карточек номенклатуры фотографиями. Ручной процесс — сфотографировать товар на телефон, подключить устройство к компьютеру по кабелю, скопировать файлы, открыть каждую карточку номенклатуры и вручную прикрепить изображение — занимает огромное количество рабочего времени сотрудников. Разберем основные варианты автоматизации этой задачи и спроектируем удобный процесс загрузки снимков прямо с мобильного устройства в базу 1С.
Использование мессенджера Telegram является одним из наиболее быстрых и простых в поддержке решений. Пользователю не требуется устанавливать сторонние мобильные приложения или настраивать VPN-подключения на телефоне, а логика взаимодействия полностью контролируется на стороне 1С.
Рассмотрим типовой сценарий взаимодействия сотрудника с ботом:
ХранилищеДополнительнойИнформации.Для реализации этого метода нам потребуется опубликовать HTTP-сервис на веб-сервере (Apache или IIS), который будет обрабатывать вебхуки (Webhooks) от Telegram Bot API. Разберем пример программного сохранения входящего файла в карточку товара УТ 10.3:
Функция ПрикрепитьФайлКНоменклатуре(СсылкаНоменклатура, ДвоичныеДанныеФайла, ИмяФайла = "Фото.jpg") Экспорт
// Создаем запись в хранилище дополнительной информации
НовыйЭлемент = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
НовыйЭлемент.Объект = СсылкаНоменклатура;
НовыйЭлемент.Наименование = ИмяФайла;
НовыйЭлемент.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
НовыйЭлемент.Хранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(9));
Попытка
НовыйЭлемент.Записать();
// Если у номенклатуры еще не установлено основное изображение, назначаем созданное
ОбъектНоменклатура = СсылкаНоменклатура.ПолучитьОбъект();
Если Не ЗначениеЗаполнено(ОбъектНоменклатура.ОсновноеИзображение) Тогда
ОбъектНоменклатура.ОсновноеИзображение = НовыйЭлемент.Ссылка;
ОбъектНоменклатура.Записать();
КонецЕсли;
Возврат Истина;
Исключение
ЗаписьЖурналаРегистрации("ЗагрузкаФотоTelegram", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Если по корпоративной политике использование сторонних мессенджеров запрещено, мы можем разработать легковесную HTML5-страницу, адаптированную под мобильные экраны. Страница разворачивается на внутреннем корпоративном веб-сервере и обменивается данными с 1С через HTTP-сервисы в формате JSON и Base64.
Проанализируем технические преимущества данного подхода:
input type="file" capture="environment".Посмотрим на пример обработки входящего HTTP-запроса с изображением в модуле HTTP-сервиса 1С:
Функция ЗагрузитьФотоPost(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеЗапроса = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Штрихкод = ДанныеЗапроса.Штрихкод;
СтрокаBase64 = ДанныеЗапроса.ИзображениеBase64;
ДвоичныеДанные = Base64Значение(СтрокаBase64);
// Поиск номенклатуры по регистру сведений Штрихкоды
СсылкаНоменклатура = НайтиНоменклатуруПоШтрихкоду(Штрихкод);
Если ЗначениеЗаполнено(СсылкаНоменклатура) Тогда
Если ПрикрепитьФайлКНоменклатуре(СсылкаНоменклатура, ДвоичныеДанные) Тогда
Результат = Новый Структура("Успех, Описание", Истина, "Фотография успешно привязана к товару");
Иначе
Результат = Новый Структура("Успех, Описание", Ложь, "Ошибка записи в хранилище 1С");
КонецЕсли;
Иначе
Результат = Новый Структура("Успех, Описание", Ложь, "Товар со штрихкодом " + Штрихкод + " не найден");
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Результат);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Возврат Ответ;
КонецФункции
Платформа 1С предоставляет возможность создания отдельных мобильных конфигураций. Это решение позволяет написать интерфейс на встроенном языке 1С и использовать встроенные механизмы работы с мультимедиа.
Разберем по шагам создание функционала съемки в мобильном клиенте 1С:
СредстваМультимедиа.СделатьСнимок() для прямого обращения к фотокамере смартфона.Посмотрим на пример клиентского кода мобильного приложения 1С:
&НаКлиенте
Процедура СделатьСнимокТовара(Команда)
Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
ПараметрыСнимка = Новый ПараметрыСнимка;
ПараметрыСнимка.Качество = 75;
ПараметрыСнимка.Разрешение = РазрешениеИзображенияКамеры.Высокое;
Оповещение = Новый ОписаниеОповещения("ПослеСозданияСнимка", ЭтотОбъект);
СредстваМультимедиа.СделатьСнимок(Оповещение, ПараметрыСнимка);
Иначе
ПоказатьПредупреждение(, "Камера не поддерживается на данном устройстве.");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеСозданияСнимка(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Результат содержит ДвоичныеДанные полученного снимка
ОтправитьФотоВЦентральнуюБазу(ТекущийШтрихкод, Результат);
КонецЕсли;
КонецПроцедуры
Важное предостережение: Разработка логики в мобильной 1С занимает немного времени, однако сборка и распространение готовых APK/IPA-файлов требуют настройки среды разработки мобильных приложений (Android SDK), а при обновлении структуры конфигурации потребуется повторная сборка и установка обновлений на все телефоны сотрудников.
При внедрении мобильного ввода изображений в старые конфигурации необходимо учитывать особенности работы с базой данных:
1Cv8.1CD. Перед сохранением необходимо сжимать разрешение до 1200–1600 px по большей стороне.ХранилищеДополнительнойИнформации. Для масштабных баз рекомендуется выносить хранение прикрепленных файлов на внешний том файловой системы или в объектное хранилище (S3/MinIO), оставляя в базе 1С только ссылки на них.