В магазинах самообслуживания "случаются" недостачи товаров. И если это не маркированный товар, то тут нет проблем. Но в магазинах, торгующих алкоголем, необходимо, чтобы учёт совпадал с ЕГАИС. Поэтому мной ещё для 1с8 Розницы 1.0 была написана простенькая обработка (ПроверитьСоответствиеОстатковТоваровСНоменклатуройЕГАИС.erf). При обнаружении недостачи или пересорта определённого вида товара, на компьютере запускалась обработка (ИнвентаризацияАкцизныхМарок.epf), загружались акцизные марки из регистра сведений. Далее бутылки несли к компьютеру и сканировались.
"Помощником корректировки остатков ЕГАИС" управляющие магазином отказались пользоваться категорически. Поэтому при переходе на Розницу редакция 2.3 (2.3.9.28) обработки были перенесены на УФ.
Далее хотелось передавать данные на смартфон, дабы не носить бутылки из подсобного помещения. Я решил сохранять список марок во временный файл, а путь к файлу выводить на экран в виде qr-кода.
&НаКлиенте
Процедура ОтправитьДанные(Команда)
Если ЗначениеЗаполнено(Объект.АдресХранилищаМарок) Тогда
ВыбФайл = Новый Файл(Объект.АдресХранилищаМарок);
Если ВыбФайл.Существует() Тогда
УдалитьФайлы(Объект.АдресХранилищаМарок);
КонецЕсли;
КонецЕсли;
МассивМарок = Новый Массив;
Для Каждого Стр Из МаркиВНаличии Цикл
МассивМарок.Добавить(ПолучитьАМ(Стр.АкцизнаяМарка));
КонецЦикла;
Объект.АдресХранилищаМарок = ОтправитьНаСервере(МассивМарок);
СформироватьДанныеQRКода(Объект.АдресХранилищаМарок);
КонецПроцедуры
&НаСервере
Функция ОтправитьНаСервере(МассивМарок)
АдресХранилищаМарок = ПолучитьИмяВременногоФайла();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(АдресХранилищаМарок);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивМарок, НазначениеТипаXML.Явное);
СериализованнаяСтрока = ЗаписьJSON.Закрыть();
Возврат АдресХранилищаМарок;
КонецФункции
&НаСервере
Процедура СформироватьДанныеQRКода(Идентификатор)
ИдентификаторQRКода = Идентификатор;
ДанныеQRКода = ПоместитьВоВременноеХранилище(
ГенерацияШтрихкода.ДанныеQRКода(
Идентификатор,
0,
190),
ЭтотОбъект);
КонецПроцедуры
На смартфоне считываем qr-код файла с марками и отправляем его Веб сервису, чтобы получить список марок.
Первая кнопка сканировать задание
&НаКлиенте
Процедура СкнироватьЗадание(Команда)
ОчиститьСообщения();
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("КодQR", Истина);
ДополнительныеПараметры.Вставить("ИмяОбработчикаЗакрытияСканирования", "ОбработкаЗакрытияСканирования");
ПодключаемоеОборудованиеКлиент.ПолучитьШтрихкод(ДополнительныеПараметры);
КонецПроцедуры
Вторая кнопка
#Область ВебСерверПолучить
&НаСервере
Функция ПолучитьМаркиНаСервере(АдресМарок)
User = ЗначениеНастроек.ПолучитьЗначениеКонстанты("Пользователь");
Pass = ЗначениеНастроек.ПолучитьЗначениеКонстанты("Пароль");
АдресСервера = ЗначениеНастроек.ПолучитьЗначениеКонстанты("АдресСервера");
ИмяПубликации = ЗначениеНастроек.ПолучитьЗначениеКонстанты("ИмяПубликации");//"Svr";
ВебСервис = ЗначениеНастроек.ПолучитьЗначениеКонстанты("ИмяВебСервиса");//"Stock";
ВебОпределение = "/"+ИмяПубликации+"/ws/"+ВебСервис+".1cws?wsdl";
Определение = Новый WSОпределения("http://"+АдресСервера+ВебОпределение,User,Pass);
Прокси = Новый WSПрокси(Определение, "http://localhost/"+ВебСервис, ВебСервис, ВебСервис+"Soap");
Прокси.Пользователь = User;
Прокси.Пароль = Pass;
Возврат Прокси.GetData(АдресМарок);
КонецФункции
&НаКлиенте
Процедура ПолучитьМарки(Команда)
АдресМарок = ЗначениеНастроек.ПолучитьЗначениеКонстанты("АдресХранилища");
СтрокаМарок = ПолучитьМаркиНаСервере(АдресМарок);
МассивМарок = СтрРазделить(СтрокаМарок,";");
ОтправитьМаркиВХранилище(МассивМарок);
КонецПроцедуры
&НаСервере
Процедура ОтправитьМаркиВХранилище(МассивМарок)
ТМарки = Новый ТаблицаЗначений;
ТМарки.Колонки.Добавить("Марка", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(200)));
ТМарки.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(3, 0)));
Для Считать=1 По МассивМарок.Количество() Цикл
НоваяСтрока = ТМарки.Добавить();
НоваяСтрока.Марка = МассивМарок[Считать-1];
НоваяСтрока.Количество = 0;
КонецЦикла;
Константы["ТаблицаМарок"].Установить(Новый ХранилищеЗначения(ТМарки));
КонецПроцедуры
#КонецОбласти
Веб сервис состоит из 2х процедур. Первая отправляет файл с марками, вторая получает марки со смртфона и записывает в тот же файл.
Функция GetData(ЗапросСайта)
Возврат ПрочитатьФайлНаСервере(ЗапросСайта);
КонецФункции
&НаСервере
Функция ПрочитатьФайлНаСервере(ЗапросСайта)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ЗапросСайта);
МассивМарок = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат СтрСоединить(МассивМарок,";");
КонецФункции
Функция PutData(АдресХранилища, СтрМассивМарок)
Возврат ЗаписатьФайлНаСервере(АдресХранилища,СтрМассивМарок);
КонецФункции
&НаСервере
Функция ЗаписатьФайлНаСервере(АдресХранилища,СтрМассивМарок)
МассивМарок = СтрРазделить(СтрМассивМарок,";");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(АдресХранилища);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивМарок, НазначениеТипаXML.Явное);
СериализованнаяСтрока = ЗаписьJSON.Закрыть();
Возврат "1";
КонецФункции
Далее отсканированные марки читаем из файла, который отправил нам смартфон.
&НаКлиенте
Процедура ПолучитьДанные(Команда)
МаркиИзХранилища = ПолучитьДанныеНаСервере(Объект.АдресХранилищаМарок);
Для Считать=0 По МаркиИзХранилища.Количество()-1 Цикл
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ШтрихКодМарки", МаркиИзХранилища[Считать]);
НайденнаяСтрока = ЭтаФорма.МаркиВНаличии.НайтиСтроки(ПараметрыОтбора);
Если НайденнаяСтрока.Количество() = 0 Тогда
//Сообщение.Текст = НСтр("ru = 'Марка не найдена!';"
//+ " en = 'Article not found!'");
//Сообщение.Сообщить();
Иначе
НайденнаяСтрока[0].Проверена = Истина;
КонецЕсли;
КОнецЦикла;
КонецПроцедуры
Тестирование производилось на 1С:Предприятие 8.3 (8.3.19.1150). Розница, редакция 2.3 (2.3.9.28), IIS, SQL.