Кто обсуждает ситуацию с клиентом – конечно же, менеджер, но менеджеру заходить в WMS и оттуда получать печатную форму с фото (лениво/нет времени /нет учетки в WMS/прочее) – тут подчеркнуть нужное… Решение: менеджер у учетной базе (в данном случае это УПП) находит конкретный документ отгрузки и нажимает там кнопку «Печать фото отгрузки» и появляется печатная форма с фото отгрузки.
Работа механизма проверялась на платформе 8.3.27.1606.
Решение делится на два этапа:
1 Создание фото в базе WMS.
2 Получение менеджером печатной формы с картинками (фото) в базе УПП.
Первый этап (Создание фото в базе WMS) технически организован так:
Есть документ БМСкладскоеЗадание (СЗ). На одной из закладок которого есть кнопки для работы с фото.

Основная кнопка тут вот эта
по нажатию на нее вызывается процедура которая собственно обеспечивает фотографирование и сохранение фотографии в базе:
&НаКлиенте
Процедура ФотоСделать(Команда)
Если ЕстьЛиОбъектПроверкаНасервере() Тогда
ДанныеФото = ПолучитьДанныеФотоСнимка(); //непосредственно делает фото
Если ДанныеФото <> Неопределено Тогда
ТекущееФото = ДанныеФото.ПолучитьДвоичныеДанные();
СоздатьСтрокуНаСерванте(ТекущееФото); //пишет данные в регистр сведений «РегистрФоток»
КлючЗаписи = ВернутьГлючь(Ложь); //получает нужный ключ записи регистра «РегистрФоток» чтоб показать картинку на форме документа (тут и далее в коде есть переменная «ДатаЗаписиФото» – она хранит дату и время фото выведенного на форме)
Если НЕ КлючЗаписи =Неопределено Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Данные"); //непосредственно показывает картинку на форме документа по полученному ключу
КонецЕсли;
КонецЕсли;
иначе
сообщить("Нужно записать документ.");
КонецЕсли;
КонецПроцедуры
Вспомогательные процедуры:
&НаСервере
Функция ЕстьЛиОбъектПроверкаНасервере()
ДокументОбъект = РеквизитФормыВЗначение("Объект");
возврат НЕ ДокументОбъект.ЭтоНовый();
КонецФункции
&НаКлиенте
Функция ПолучитьДанныеФотоСнимка()
Данные = Неопределено;
#Если МобильныйКлиент Тогда
Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
Если КачествоФото<10 Тогда
пКачество = 10;
ИначеЕсли КачествоФото>100 Тогда
пКачество = 100;
иначе
пКачество = КачествоФото;
КонецЕсли;
Данные = СредстваМультимедиа.СделатьФотоснимок(ТипКамеры, , пКачество);
Возврат Данные;
Иначе
Сообщить("Данное устройство не поддерживает фотоснимок!")
КонецЕсли;
#КонецЕсли
Возврат Данные;
КонецФункции
&НаСервере
Процедура СоздатьСтрокуНаСерванте(Данные)
НовРег = РегистрыСведений.РегистрФоток.СоздатьМенеджерЗаписи();
НовРег.Документ = Объект.Ссылка;
НовРег.Данные = Новый ХранилищеЗначения(Данные,Новый СжатиеДанных(9));
НовРег.Период = ТекущаяДата();
НовРег.Записать(Ложь);
КонецПроцедуры
&НаСервере
Функция ВернутьГлючь(ВМеньшуюСторону) Экспорт
з=Новый Запрос;
Т=
"ВЫБРАТЬ
| МАКСИМУМ(РегистрФоток.Период) КАК Период
|ИЗ
| РегистрСведений.РегистрФоток КАК РегистрФоток
|ГДЕ
| РегистрФоток.Документ = &Документ
| И РегистрФоток.Период < &ДатаВход";
Если ВМеньшуюСторону=Ложь Тогда
Т=СтрЗаменить(Т,"МАКСИМУМ(РегистрФоток.Период)","МИНИМУМ(РегистрФоток.Период)");
Т=СтрЗаменить(Т,"РегистрФоток.Период < &ДатаВход","РегистрФоток.Период > &ДатаВход");
КонецЕсли;
з.Текст=Т;
з.УстановитьПараметр("Документ",Объект.Ссылка);
з.УстановитьПараметр("ДатаВход",?(ЗначениеЗаполнено(ДатаЗаписиФото),ДатаЗаписиФото,ТекущаяДата()));
рез=з.Выполнить().Выбрать();
Если рез.Следующий() Тогда
Если ЗначениеЗаполнено(рез.Период) Тогда
Отбор = Новый Структура;
Отбор.Вставить("Документ", Объект.Ссылка);
Отбор.Вставить("Период", рез.Период);
ДатаЗаписиФото=рез.Период;
Возврат РегистрыСведений.РегистрФоток.СоздатьКлючЗаписи(Отбор);
иначе
Возврат Неопределено;
КонецЕсли;
иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Остальные кнопки и поля:
и
- обеспечивают «листание» фоток (думаю можно организовать «листание» без кнопок этих колхозных, но у меня так сделано….) их код:
&НаКлиенте
Процедура СдвинутьФотоВлево(Команда)
КлючЗаписи = ВернутьГлючь(Истина);
Если НЕ КлючЗаписи =Неопределено Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Данные");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СдвинутьФотоВПраво(Команда)
КлючЗаписи = ВернутьГлючь(Ложь);
Если НЕ КлючЗаписи =Неопределено Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Данные");
КонецЕсли;
КонецПроцедуры
- удаление текущего фото:
&НаКлиенте
Процедура УдалитьФото(Команда)
Если ЗначениеЗаполнено(ДатаЗаписиФото) Тогда
Ответ=Вопрос("Удалить фото?",РежимДиалогаВопрос.ДаНет);
Если Ответ=КодВозвратаДиалога.Да Тогда
УдалитьНаСервереЗаписьРегистраРегистрФото(ДатаЗаписиФото);
КлючЗаписи = ВернутьГлючь(Истина);
Если НЕ КлючЗаписи =Неопределено Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Данные");
иначе
СсылкаНаКартинку = "";
КонецЕсли;
КонецЕсли;
иначе
сообщить("Не определено фото.");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УдалитьНаСервереЗаписьРегистраРегистрФото(ДатаЗаписиФото);
НовРег = РегистрыСведений.РегистрФоток.СоздатьНаборЗаписей();
НовРег.Отбор.Документ.Установить(Объект.Ссылка);
НовРег.Отбор.Период.Установить(ДатаЗаписиФото);
НовРег.Записать();
КонецПроцедуры
тут выставляется «качество фото» перед тем как делать фото (значения от 1 до 100) но при скажем «10» – совсем плохое качество а при «100» – фото очень много весят, экспериментально остановились на «30» но даем пользователю менять качество самому при необходимости.
Второй этап (Получение менеджером печатной формы с картинками (фото) в базе УПП) технически организован так:
В базе WMS опубликован Web-сервис «VigruzkaV_UPP» со свойством Sinhr, которое имеет следующие параметры:

Функция Sinhr имеет следующий код (суть: получили УИДы документов «ДокументДляХраненияВида» по которым ищем документы «БМСкладскоеЗадание» в WMS (к «БМСкладскоеЗадание» фото привязаны) после чего ищем фото в регистре сведений «РегистрФоток», выводим фото в табличный документ и отправляем табличный документ в УПП):
Функция Sinhr(Tab)
ТЗВход=Tab.Получить();
Если ТипЗнч(ТЗВход)=Тип("ТаблицаЗначений") и ТЗВход.Количество()>0 Тогда
Если ТЗВход[0].ТипЗапросаДанных="ФотоОтчет" Тогда
ИДДокумента=ТЗВход[0].ИДДокумента;
ИДДокументаЗаявкаНаТранспорт=ТЗВход[0].ИДДокументаЗаявкаНаТранспорт;
СсылкаДок=Документы.ДокументДляХраненияВида.ПолучитьСсылку(Новый УникальныйИдентификатор(ИДДокумента));
Если ЗначениеЗаполнено(ИДДокументаЗаявкаНаТранспорт) Тогда
СсылкаДокЗаявкаНаТранспорт=Документы.ДокументДляХраненияВида.ПолучитьСсылку(Новый УникальныйИдентификатор(ИДДокументаЗаявкаНаТранспорт));
иначе
СсылкаДокЗаявкаНаТранспорт=Документы.ДокументДляХраненияВида.ПолучитьСсылку(Новый УникальныйИдентификатор(ИДДокумента));
КонецЕсли;
з=Новый Запрос;
Торт=
"ВЫБРАТЬ
| БМСкладскоеЗадание.Ссылка КАК Ссылка
|ПОМЕСТИТЬ Т1
|ИЗ
| Документ.БМСкладскоеЗадание КАК БМСкладскоеЗадание
|ГДЕ
| (БМСкладскоеЗадание.ДокументОснование = &ДокументОснование
| ИЛИ БМСкладскоеЗадание.ДокументОснование = &ДокументОснованиеЗаявкаНаТранспорт)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| БМСкладскоеЗаданиеДоки.Ссылка
|ИЗ
| Документ.БМСкладскоеЗадание.Доки КАК БМСкладскоеЗаданиеДоки
|ГДЕ
| БМСкладскоеЗаданиеДоки.Докумка = &ДокументОснование
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РегистрФоток.Период КАК Период,
| РегистрФоток.Документ КАК Ссылка
|ИЗ
| РегистрСведений.РегистрФоток КАК РегистрФоток
|ГДЕ
| РегистрФоток.Документ В
| (ВЫБРАТЬ
| Т1.Ссылка КАК Ссылка
| ИЗ
| Т1 КАК Т1)
|
|УПОРЯДОЧИТЬ ПО
| Период";
з.УстановитьПараметр("ДокументОснование",СсылкаДок);
з.УстановитьПараметр("ДокументОснованиеЗаявкаНаТранспорт",СсылкаДокЗаявкаНаТранспорт);
з.Текст=Торт;
рез1=з.Выполнить().Выбрать();
Табл=Новый ТабличныйДокумент;
Мак=ПолучитьОбщийМакет("МакетМагазин");
Ш=мак.ПолучитьОбласть("Шапка");
Ш.Параметры.Объект=СсылкаДок.ВидДокумента+" №"+СсылкаДок.Номер+" от "+Формат(СсылкаДок.Дата,"ДФ=dd.MM.yyyy");
Табл.Вывести(Ш);
ОбластьКартинки = мак.ПолучитьОбласть("Изображение");
Пока Рез1.Следующий() Цикл
НашДок=рез1.Ссылка;
Если не Рез1.Период=Null Тогда
ОтборчеГ = Новый Структура;
ОтборчеГ.Вставить("Документ",НашДок);
ДвоичныеДанные=РегистрыСведений.РегистрФоток.ВернутьЗначениРегистра(Рез1.Период,ОтборчеГ);
Рисунок = Табл.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
Индекс=Табл.Рисунки.Индекс(Рисунок);
Табл.Рисунки[Индекс].Картинка = Новый Картинка(ДвоичныеДанные);
ОбластьКартинки=Табл.Область("R"+СтрЗаменить(СтрЗаменить(Строка(Табл.ВысотаТаблицы+2),Символ(160),""),".","")+"C1"
+":R"+СтрЗаменить(СтрЗаменить(Строка(Табл.ВысотаТаблицы+28),Символ(160),""),".","")+"C3");
Табл.Рисунки[Индекс].Расположить(ОбластьКартинки);
КонецЕсли;
КонецЦикла;
ХЗ= Новый ХранилищеЗначения(Табл, Новый СжатиеДанных(9));
Возврат ХЗ;
КонецЕсли;
КонецЕсли;
КонецФункции
Тут есть еще процедура «ВернутьЗначениРегистра», она имеет следующий код:
&НаСервере
Функция ВернутьЗначениРегистра(Период,Отбор) Экспорт
Возврат РегистрыСведений.РегистрФоток.ПолучитьПоследнее(Период,Отбор).Данные.Получить();
КонецФункции
Макет печатной формы-простейший, выглядит так (прилагаю файл с макетом, хотя не думаю, что имеет хоть какой-то смысл его скачивать за деньги!!!):

На стороне УПП (по кнопке «Печать фото отгрузки») вызывается процедура «БМДействияФормыФото()» которая имеет следующий код:
Процедура БМДействияФормыФото()
Если ЭтоНовый()Тогда
сообщить("Документ не записан.");
иначе
Попытка
ТЗОтправляем=Новый ТаблицаЗначений();
ТЗОтправляем.Колонки.Добавить("ТипЗапросаДанных",Новый ОписаниеТипов("Строка"));
ТЗОтправляем.Колонки.Добавить("ИДДокумента",Новый ОписаниеТипов("Строка"));
ТЗОтправляем.Колонки.Добавить("ИДДокументаЗаявкаНаТранспорт",Новый ОписаниеТипов("Строка"));
НьюСтрока=ТЗОтправляем.Добавить();
НьюСтрока.ТипЗапросаДанных="ФотоОтчет";
НьюСтрока.ИДДокумента=Строка(Ссылка.УникальныйИдентификатор());
ЗаявкаТранспорт=Новый Запрос;
ЗаявкаТранспорт.Текст=
"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
| БМЗаявкаНаТранспортРейсы.Ссылка
|ИЗ
| Документ.БМЗаявкаНаТранспорт.Рейсы КАК БМЗаявкаНаТранспортРейсы
|ГДЕ
| БМЗаявкаНаТранспортРейсы.ДокументОснование = &ДокументОснование";
ЗаявкаТранспорт.УстановитьПараметр("ДокументОснование",Ссылка);
щщ=ЗаявкаТранспорт.Выполнить().Выбрать();
Если щщ.Следующий() тогда
НьюСтрока.ИДДокументаЗаявкаНаТранспорт=Строка(щщ.Ссылка.УникальныйИдентификатор());
иначе
НьюСтрока.ИДДокументаЗаявкаНаТранспорт="";
КонецЕсли;
ПутьКСервису="http://ХХХ. ХХХ. ХХХ. ХХХ /WMS_2025";
ТЗОтправляем = Новый ХранилищеЗначения(ТЗОтправляем, Новый СжатиеДанных(9));
ВСОпределение = Новый WSОпределения(ПутьКСервису+"/ws/VigruzkaV_UPP.1cws?wsdl"," ХХХ "," ХХХ "); //,,30
ВСервис = ВСОпределение.Сервисы.Получить("http://www.1c.ru/SSL/VigruzkaV_UPP","VigruzkaV_UPP");
ВТочкаВхода = ВСервис.ТочкиПодключения.Получить("VigruzkaV_UPPSoap");
ВОперация = ВТочкаВхода.Интерфейс.Операции.Получить("Sinhr");
ДанныеXDTO = ВСОпределение.ФабрикаXDTO.Создать(ВОперация.Параметры.Получить("TZVhod").Тип, ТЗОтправляем);
ВСПрокси = Новый WSПрокси(ВСОпределение, "http://www.1c.ru/SSL/VigruzkaV_UPP","VigruzkaV_UPP","VigruzkaV_UPPSoap") ;
ВСПрокси.Пользователь=" ХХХ ";
ВСПрокси.Пароль=" ХХХ ";
Ответ = ВСПрокси.Sinhr(ДанныеXDTO);
ТабДок=Ответ.Получить();
ТабДок.Показать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Результат в УПП вот такой:

В принципе это все.
Вступайте в нашу телеграмм-группу Инфостарт