Добрый день
В организации требуется применение ТСД. Я как программист 1С прослушал курс по программированию в "Mobile logistics".

Требуется наглядное пособие по стыковке двух этих продуктов или провести удаленную демонстрацию (либо с выездом, Спб). Не только за $SM. Спасибо
---
ATOL\MobileLogistics\Integration\Обработки\1CV82\УТ 10.3 и Розница 1.0 - вот тут лежи обработка взаимодествия она немного отличается от типовой.
---
Итак, рассказываю.
Моя обработка написана на базе типовой ATOLPDT_v2, которая мне не подошла, уже не помню почему.
Вообще с обменом все просто: конфигурация Mobile Logistics (ML) представляет собой набор таблиц + интерфейс к ним. Драйвер ATOL предоставляет возможность загрузить/выгрузить/очистить любую таблицу конфигурации ML - по крайней мере я пользовался только этими возможностями, может там что и еще есть, не знаю.
Ниже код обмена из моей обработки приведен почти полностью. Вообще я взял типовой код из атоловской обработки и доработал его как мне было нужно, оставив низкоуровневую работу с драйвером без изменения (например это не приведенные здесь ВыгрузитьТаблицу, ЗагрузитьТаблицу и т.д. - их можно посмотреть в ATOLPDT_v2
ТаблицаДок и ТаблицаСтрокДок у меня - таблицы значений, повторяющие таблицы в конфигурации ML (в них мы получаем данные, и их же потом используем для выгрузки - заполняем в процедурах ПолучитьТаблицуДок(ТаблицаДок) и ПолучитьТаблицуСтрокДокументов(ТаблицаСтрокДок))...

```1c
    Процедура ВыполнитьОбмен()
    ТекстОшибки = ";
    ТаблицаДок=Неопределено;
    ТаблицаСтрокДок=Неопределено;

    Если МенеджерОборудованияКлиент.ОбновитьРабочееМестоКлиента() Тогда
    // Подключение устройства
    ИдентификаторУстройства = МенеджерОборудованияКлиент.ВыбратьУстройство("ТерминалСбораДанных",
    НСтр("ru='Выберите терминал сбора данных'"), НСтр("ru='Терминал сбора данных не подключен'"));

    Если ИдентификаторУстройства <> Неопределено Тогда
    Результат = МенеджерОборудованияКлиент.ПодключитьОборудованиеПоИдентификатору(УникальныйИдентификатор,ИдентификаторУстройства,ТекстОшибки);

    Если Результат Тогда

    Если ВыполнитьОбменСТСД(ИдентификаторУстройства,ТаблицаДок, ТаблицаСтрокДок) Тогда //загрузка
    Результат = СохранитьДанныеВБазу(ТаблицаДок, ТаблицаСтрокДок);
    Если Результат Тогда

    ТекстОшибки=ПроверитьНаличиеШКВНоменклатуреЗаказов();
    Если ЗначениеЗаполнено(ТекстОшибки) Тогда
    Сообщить("Не найдены штрихкоды для следующих позиций:");
    Сообщить(ТекстОшибки);
    Сообщить("Заказы, в которых есть указанные позиции номенклатуры, не были выгружены");
    Если КоличЗаказовКВыгрузке()=0 Тогда
    Возврат;
    КонецЕсли;
    КонецЕсли;

    ПолучитьТаблицуДок(ТаблицаДок);
    ПолучитьТаблицуСтрокДокументов(ТаблицаСтрокДок);
    Если ВыполнитьОбменСТСД(ИдентификаторУстройства,ТаблицаДок, ТаблицаСтрокДок, Истина) Тогда //выгрузка
    Если ОбновитьСтатусыВыгруженных(ТекстОшибки) Тогда
    ОбновитьСписок();
    Иначе
    Сообщить("При установке состояния выгруженных в ТСД заказов произошли ошибки:");
    Сообщить(ТекстОшибки);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;

    МенеджерОборудованияКлиент.ОтключитьОборудованиеПоИдентификатору(УникальныйИдентификатор,ИдентификаторУстройства);

    Предупреждение("Обмен завершен");
    Иначе
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
    КонецЕсли;
    КонецЕсли;
    Иначе
    ТекстСообщения = НСтр("ru = 'Предварительно необходимо выбрать рабочее место внешнего оборудования текущего сеанса.'");

    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
    КонецЕсли;
    КонецПроцедуры

    Функция ВыполнитьОбменСТСД(ИдентификаторУстройства, ТаблицаДок, ТаблицаСтрокДок, Выгрузка=Ложь)

    ОписаниеОшибки = ";
    Результат=Истина;

    Если НЕ Выгрузка Тогда //загрузка
    ВыходныеПараметры = Неопределено;
    ВходныеПараметры = Новый Массив;
    ВходныеПараметры.Добавить(1); // Номер таблицы для загрузки - Документы

    Результат = ВыполнитьКомандуАТОЛ(ИдентификаторУстройства,"DownloadDocument",ВходныеПараметры,ВыходныеПараметры);

    Если Результат Тогда
    ТаблицаДок = Новый Массив;
    Для Индекс = 0 По ВыходныеПараметры.Количество() - 1 Цикл
    ТаблицаДок.Добавить(Новый Массив);
    Для Инд=0 По КолонокТабДок-1 Цикл
    ТаблицаДок[Индекс].Добавить(ВыходныеПараметры[Индекс][Инд]);
    КонецЦикла;
    КонецЦикла;

    ВыходныеПараметры = Неопределено;
    ВходныеПараметры = Новый Массив;
    ВходныеПараметры.Добавить(0); // Номер таблицы для загрузки - строки документов

    Результат = ВыполнитьКомандуАТОЛ(ИдентификаторУстройства,"DownloadDocument",ВходныеПараметры,ВыходныеПараметры);

    Если Результат Тогда
    ТаблицаСтрокДок = Новый Массив;
    Для Индекс = 0 По ВыходныеПараметры.Количество() - 1 Цикл
    ТаблицаСтрокДок.Добавить(Новый Массив);
    Для Инд=0 По КолонокТабСтрокДок-1 Цикл
    ТаблицаСтрокДок[Индекс].Добавить(ВыходныеПараметры[Индекс][Инд]);
    КонецЦикла;
    КонецЦикла;
    КонецЕсли;

    КонецЕсли;
    Иначе //выгрузка

    // перед выгрузкой очистим таблицы в терминале
    ВыходныеПараметры = Неопределено;
    ВходныеПараметры = Новый Массив;
    ВходныеПараметры.Добавить(1); // Номер таблицы - Документы
    Результат = ВыполнитьКомандуАТОЛ(ИдентификаторУстройства,"ОчиститьТаблицу",ВходныеПараметры,ВыходныеПараметры);
    Если Результат Тогда
    ВыходныеПараметры = Неопределено;
    ВходныеПараметры = Новый Массив;
    ВходныеПараметры.Добавить(0); // Номер таблицы - строки документов
    Результат = ВыполнитьКомандуАТОЛ(ИдентификаторУстройства,"ОчиститьТаблицу",ВходныеПараметры,ВыходныеПараметры);
    КонецЕсли;
    Если ТаблицаДок.Количество()<>0 И ТаблицаСтрокДок.Количество()<>0 Тогда //выгружаем только если есть что выгружать
    Если Результат Тогда
    ВыходныеПараметры = Неопределено;
    ВходныеПараметры = Новый Массив;
    ВходныеПараметры.Добавить(1); // Номер таблицы для выгрузки - Документы
    ВходныеПараметры.Добавить(ТаблицаДок);

    Результат = ВыполнитьКомандуАТОЛ(ИдентификаторУстройства,"UploadDirectory",ВходныеПараметры,ВыходныеПараметры);

    Если Результат Тогда
    ВыходныеПараметры = Неопределено;
    ВходныеПараметры = Новый Массив;
    ВходныеПараметры.Добавить(0); // Номер таблицы для выгрузки - строки документов
    ВходныеПараметры.Добавить(ТаблицаСтрокДок);

    Результат = ВыполнитьКомандуАТОЛ(ИдентификаторУстройства,"UploadDirectory",ВходныеПараметры,ВыходныеПараметры);

    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;

    Если НЕ Результат Тогда
    ОписаниеОшибки = НСтр("ru='При выгрузке данных в терминал сбора данных произошла ошибка.
    |%ОписаниеОшибки%
    |Данные в терминал сбора данных не выгружены.'");
    ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%ОписаниеОшибки%", ВыходныеПараметры[1]);

    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки);
    КонецЕсли;

    Возврат Результат;
    КонецФункции

    // Перенаправляет команду ответственному обработчику драйвера
    // (в соответствии с указанным значением обработчика во входном параметре "Идентификатор")
    &НаКлиенте
    Функция ВыполнитьКомандуАТОЛ(Идентификатор, Команда, ВходныеПараметры, ВыходныеПараметры, Таймаут = -1) Экспорт

    Результат = Ложь;

    // Поиск подключенного устройства
    ПодключенноеУстройство = ПолучитьПодключенноеУстройство(глПодключаемоеОборудование.ПараметрыПодключенияПО,Идентификатор);

    Если ПодключенноеУстройство <> Неопределено Тогда
    // Получение объекта драйвера
    ОбъектДрайвера = ПолучитьОбъектДрайвера(ПодключенноеУстройство.ОбработчикДрайвера);
    Если ОбъектДрайвера = Неопределено Тогда
    //Сообщить об ошибке, что не удалось загрузить драйвер.
    ВыходныеПараметры = Новый Массив();
    ОписаниеОшибки = НСтр("ru = '"%Наименование%": Не удалось загрузить драйвер устройства.
    |Проверьте, что драйвер корректно установлен и зарегистрирован в системе.'");
    ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%Наименование%", ПодключенноеУстройство.Наименование);
    ВыходныеПараметры.Добавить(999);
    ВыходныеПараметры.Добавить(ОписаниеОшибки);

    Иначе
    Парам = ПодключенноеУстройство.Параметры;
    ПараметрыПодключения = ПодключенноеУстройство.ПараметрыПодключения;
    //ОбработчикДрайвера = ПодключенноеУстройство.ОбработчикДрайвера;

    Парам.ТаблицаВыгрузки = ВходныеПараметры[0];

    ВыходныеПараметры = Новый Массив();

    // Выгрузка таблицы в устройство
    Если Команда = "UploadDirectory" Тогда
    ТаблицаВыгрузки = ВходныеПараметры[1];
    Результат = ВыгрузитьТаблицу(ОбъектДрайвера, Парам, ПараметрыПодключения, ТаблицаВыгрузки, ВыходныеПараметры);
    // Загрузка таблицы из устройства
    ИначеЕсли Команда = "DownloadDocument" Тогда
    Результат = ЗагрузитьТаблицу(ОбъектДрайвера, Парам, ПараметрыПодключения, ВыходныеПараметры);
    // Очистка таблицы на устройстве
    ИначеЕсли Команда = "ОчиститьТаблицу" Тогда
    Результат = ОчиститьТаблицу(ОбъектДрайвера, Парам, ПараметрыПодключения, ВыходныеПараметры);
    // Указанная команда не поддерживается данным драйвером
    Иначе
    ВыходныеПараметры.Добавить(999);
    ВыходныеПараметры.Добавить(НСтр("ru='Команда "%Команда%" не поддерживается данным драйвером.'"));
    ВыходныеПараметры[1] = СтрЗаменить(ВыходныеПараметры[1], "%Команда%", Команда);
    //Результат = Ложь;
    КонецЕсли;

    КонецЕсли;
    Иначе
    //Сообщить об ошибке, что устройство не подключено.
    ВыходныеПараметры = Новый Массив();
    ТекстСообщения = НСтр("ru = 'Устройство не подключено.
    |Перед выполнением операции устройство должно быть подключено.'");
    ВыходныеПараметры.Добавить(999);
    ВыходныеПараметры.Добавить(ТекстСообщения);
    КонецЕсли;

    Возврат Результат;

    КонецФункции
```
---
СРОЧНО!!!
---
А стыковка каких именно продуктов интересует? что одно, что другое - платформы для разработки. Назови конкретные конфигурации как минимум, ну и что вообще от ТСД надо?
---
MK, Нужно показать как передать внесенные данные на ТСД в 1С, получение обратной инфы из 1С в ТСД. Работа в онлайн/оффлайн режиме.

Лучше всего взять какую нить пустую конфигурацию ТСД (т.к. для нас это не важно), и пошагово рассказать как все происходит
---
Ну у меня есть обработка обмена с ТСД с конфигурацией Mobile Logistics самописной, - могу выложить куски кода, отвечающие за обмен.Связаться и рассказать пошагово к сожалению сейчас нет времени. Если нужда к тому времени не пропадет, можно будет где-нибудь в субботу пообщаться.
---
MK, буду благодарен
---
Короче выгрузка происходит в обработке взаимодействия "ATOLPDT_v2". В ней есть процедура

Читайте коменты

```1c
    // Функция осуществляет выгрузку таблицы в терминал сбора данных.
    // (API v2.2)
    //
    // Параметры:
    // Идентификатор - <Строка>
    // - Идентификатор терминала сбора данных.
    //
    // ТаблицаВыгрузки - <ТаблицаЗначений>
    // - Таблица товаров, выгружаемых в ТСД.
    //
    // Возвращаемое значение:
    // <ПеречислениеСсылка.ТООшибки*> - Результат работы функции
    //
    Функция ВыгрузитьТаблицу(Объект, ТаблицаВыгрузки) Экспорт

    Результат = мНетОшибки;

    Результат = НачатьВыгрузку(Объект); // Позицианируемся на интересующий нас справочник в ML
    Если Результат = мНетОшибки Тогда
    Для Каждого СтрокаТаблицы Из ТаблицаВыгрузки Цикл
    Результат = ВыгрузитьСтроку(Объект, СтрокаТаблицы.Штрихкод, СтрокаТаблицы.Наименование,
    СтрокаТаблицы.ЕдиницаИзмерения, СтрокаТаблицы.ХарактеристикаНоменклатуры,
    СтрокаТаблицы.СерияНоменклатуры, СтрокаТаблицы.Качество,
    СтрокаТаблицы.Цена, СтрокаТаблицы.Количество); // Выполняем загрузку данных в справочник на который мы спозиционировались
    Если Результат <> мНетОшибки Тогда
    Объект.Драйвер.ПрерватьОперацию();
    Прервать;
    КонецЕсли;
    КонецЦикла;

    Если Результат = мНетОшибки Тогда
    Результат = ЗавершитьВыгрузку(Объект); // Заканчиваем выгрузку
    Если Результат <> мНетОшибки Тогда
    Объект.Драйвер.ПрерватьОперацию();
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;

    Возврат Результат;

    КонецФункции // ВыгрузитьТаблицу()
```

```1c
    Функция НачатьВыгрузку(Объект) Экспорт

    Результат = мНетОшибки;

    Объект.Драйвер.НомерТекущегоУстройства = Объект.ИДУстройства;

    Объект.Драйвер.НомерФормы = Объект.Параметры.ТаблицаВыгрузки; // Указываем номер справочника для добавление
    Объект.Драйвер.НачатьДобавление(); // новых элементов
    Если Объект.Драйвер.Результат <> 0 Тогда
    Объект.ОписаниеОшибки = Объект.Драйвер.ОписаниеРезультата;
    Результат = мОшибкаНеизвестно;
    КонецЕсли;

    Возврат Результат;

    КонецФункции // НачатьВыгрузку()
```

```1c
    Функция ВыгрузитьСтроку(Объект, Штрихкод, Номенклатура, ЕдиницаИзмерения,
    ХарактеристикаНоменклатуры, СерияНоменклатуры,
    Качество, Цена, Количество) Экспорт

    Результат = мНетОшибки;

    ФорматВыгрузки = Объект.Параметры.ФорматВыгрузки.ПолучитьОбъект();
    СоответствиеПолей = ФорматВыгрузки.ПолучитьСоответствиеПолейТСД(Штрихкод,
    Номенклатура,
    ЕдиницаИзмерения,
    ХарактеристикаНоменклатуры,
    СерияНоменклатуры,
    Качество,
    Цена,
    Количество);
    Элемент = Неопределено;
    Для Каждого Элемент Из СоответствиеПолей Цикл
    ИндексПоля = Число(Сред(Элемент.Ключ, 5)) - 1; // добавляем данные в нужные поля исходя из СоответствиеПолей
    Объект.Драйвер.ИндексПоляОтчета = ИндексПоля;
    Объект.Драйвер.ПолеОтчета = Элемент.Значение;
    КонецЦикла;
    Объект.Драйвер.УстановитьЗапись();

    Если Объект.Драйвер.Результат <> 0 Тогда
    Объект.ОписаниеОшибки = Объект.Драйвер.ОписаниеРезультата;
    Результат = мОшибкаЗагрузкиСтроки;
    КонецЕсли;

    Возврат Результат;

    КонецФункции // ВыгрузитьСтроку()
```

Форматы выгрузки это справочник в 1С который содержит соответствие полей данных 1С и справочников ML/
---
ATOL\MobileLogistics\Integration\Обработки\1CV82\УТ 10.3 и Розница 1.0 - вот тут лежи обработка взаимодествия она немного отличается от типовой.
---
Consultant_1C, Спасибо, попробую