Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Обмен с сайтом 2 страниц V   1 2 >          
r1p88@mail.ru Подменю пользователя
сообщение 06.11.14, 14:21
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Добрый день. Подскажите пожалуйста как решить мою проблему. Есть сайт на OpenCart, есть подключенный к нему модуль OpenCart Exchange 1C . Модуль на сайте настроен. Обмен с сайтом настроен. Всё выгружается, НО, есть одно но. На сайт выгружается цена в долларах. А нужно чтобы выгружалась в грн. Для примера показываю на картинке что конкретно я имею ввиду:


Каким образом настроить так, чтобы выгружалась нужная цена? Я облазил уже весь модуль "Обмена с сайтом".

Petre Подменю пользователя
сообщение 06.11.14, 15:25
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

Может пусть еще кто-нибудь облазит модуль?


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Acid Подменю пользователя
сообщение 06.11.14, 17:33
Сообщение #3

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

ТИТЬКИ! 32541510.gif я один вижу?


Signature

Документируйте Код! мать вашу...


Kutuzov Подменю пользователя
сообщение 06.11.14, 17:37
Сообщение #4

Оратор
Иконка группы
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0

Цитата(Acid @ 06.11.14, 17:33) *
ТИТЬКИ! 32541510.gif я один вижу?


Может это указание места куда катится грн. На титьки не похоже.


Signature
Вы станете богаче, лишь став умнее...
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны...

r1p88@mail.ru Подменю пользователя
сообщение 07.11.14, 9:50
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

И всё таки, может кто поможет? Вместо того чтобы прикалываться?

Acid Подменю пользователя
сообщение 07.11.14, 17:24
Сообщение #6

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

покажите модуль обмена.


Signature

Документируйте Код! мать вашу...


r1p88@mail.ru Подменю пользователя
сообщение 10.11.14, 13:40
Сообщение #7

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Он слишком большой. Меня админы будут бить если я его добавлю)))) Один раз уже предупреждали. А функции раскрывающегося списка я здесь не нашёл. Как быть? кинуть весь модуль?

Vofka Подменю пользователя
сообщение 10.11.14, 14:21
Сообщение #8

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Цитата(r1p88@mail.ru @ 10.11.14, 13:40) *
Он слишком большой. Меня админы будут бить если я его добавлю)))) Один раз уже предупреждали.

r1p88@mail.ru, я боюсь, что выложенный полностью модуль вряд ли чем поможет.

Цитата(r1p88@mail.ru @ 10.11.14, 13:40) *
А функции раскрывающегося списка я здесь не нашёл. Как быть? кинуть весь модуль?

Когда пишете ответ слева под смайликами есть блок "Теги", в котором присутствует "Спрятать". Если оно всё влезет в "Спрятать" - размещайте. Но повторюсь, что по моему лично мнению 100 000 строк кода в виде текста на форуме делу врядли помогут.

r1p88@mail.ru Подменю пользователя
сообщение 10.11.14, 14:35
Сообщение #9

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Vofka @ 10.11.14, 15:21) *
r1p88@mail.ru, я боюсь, что выложенный полностью модуль вряд ли чем поможет.


Я тогда выложу часть кода, который был вставлен в стандартный модуль обмена с сайтом и если нужно выложить ещё какую нибудь часть когда, напишите какую выложу.
Код, который был вставлен:
// Передаем значение валюты выбраной цены в переменную - ТекТипЦены 
    ТекТипЦены = ПостроительЗапроса.Отбор.ТипЦен.Значение.ВалютаЦены.Ссылка;    
    
    //Мой код для конвертации цены номенклатуры, в валюту цены, выбранной в отборе
        Если ТекТипЦены <> Неопределено Тогда
            
            Если СтрокаЦены.Валюта <> ТекТипЦены Тогда
                НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
                СтрокаЦены.Цена = НовЦена;
                СтрокаЦены.Валюта = ТекТипЦены;
                             КонецЕсли;

        КонецЕсли;
            //Конец кода


С этим добавленным кодом выдаёт ошибку "Поле обьекта ВалютаЦены не найдено". В настройках модуля обмена в отборе я указал поле "ТипЦен-Валюта Цены по умолчанию" и значение поставил ГРН. Если не использовать этот кусок кода, а использовать стандартный модуль обмена с сайтом, то происходит, то что я писал в первом сообщении.

Acid Подменю пользователя
сообщение 10.11.14, 14:47
Сообщение #10

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Текст запроса покажите


Signature

Документируйте Код! мать вашу...


r1p88@mail.ru Подменю пользователя
сообщение 10.11.14, 15:03
Сообщение #11

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Acid @ 10.11.14, 15:47) *
Текст запроса покажите


В самом модуле обмена с сайтом запросов несколько. Не совсем понимаю какой именно текст запроса необходимо вам предоставить.

Acid Подменю пользователя
сообщение 10.11.14, 15:48
Сообщение #12

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

плохо. давайте 1-ый по очереди


Signature

Документируйте Код! мать вашу...


r1p88@mail.ru Подменю пользователя
сообщение 10.11.14, 16:02
Сообщение #13

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Вот модуль обмена с сайтом. Раскидал на 3 части, так как не знал, поместиться ли всё в один тег. Если неправильно написал извиняюсь.

Первая часть
Перем ПрефиксУзлаCML;
Перем НачалоЭлементаCML;
Перем КонецЭлементаCML;
Перем ПрефиксАтрибутаCML;

Перем ПодкаталогКартинок;
Перем ПодкаталогБезопасностиКаталогаВыгрузки;

Перем ПараметрЗапросаHTTP_Инициализация;
Перем ПараметрЗапросаHTTP_ПередачаФайла;
Перем ПараметрЗапросаHTTP_ИмпортФайлаСервером;
Перем ПараметрЗапросаHTTP_ПолучитьДанные;
Перем ПараметрЗапросаHTTP_УспешноеЗавершениеИмпорта;
    
Перем ОтветСервера_ZIPРазрешен;
Перем ОтветСервера_ОграничениеРазмераФрагментаФайлаОбмена;
Перем ОтветСервера_УспешноеЗавершениеТекущейОперации;
Перем ОтветСервера_АварийноеЗавершениеТекущейОперации;
Перем ОтветСервера_ВыполнениеТекущейОперации;

Перем ПустаяХарактеристикаСсылка;

Перем НаименованиеНалога;

Перем НаименованиеКаталогаТоваровCML;
Перем НаименованиеПакетаПредложенийCML;

Перем БулевоЗначениеCML_Истина;
Перем БулевоЗначениеCML_Да;

Перем ТипНоменклатурыCML_Услуга;
Перем ТипНоменклатурыCML_Товар;
Перем ЗначениеCML_ТипНоменклатуры;

Перем мСоответствиеНаименованийКатегорийДокумента;
Перем мСтруктураИнформацииИсторииОбмена;

Перем мВидНоменклатурыУслуга;    
Перем мВидНоменклатурыТовар;

Перем мМассивЗагруженныхДокументов;

Перем ТекТипЦены; //Переменная для хранения валюты выбранной цены

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБМЕНА HTTP


Функция HTTPЗагрузитьССервера(СтруктураПараметровСайта, ТипСоединения, КоличествоОбработанныхДокументов)
    
    Успешно = Истина;
    ОтветСервера = "";
    Соединение = Неопределено;
    КоличествоОбработанныхДокументов = 0;
    
    АдресДляРаботы = СтруктураПараметровСайта.АдресСкрипта + "?type=" + ТипСоединения;
    
    СтрокаСообщенияПользователю = "";
    Успешно = ПроцедурыОбменаССайтом.HTTPВыполнитьАвторизациюДляСоединения(Соединение, СтруктураПараметровСайта, ОтветСервера, СтрокаСообщенияПользователю, ТипСоединения);
    Если Не ПустаяСтрока(СтрокаСообщенияПользователю) Тогда
        СообщитьОбОшибкеОбмена(СтрокаСообщенияПользователю, Ложь);                        
    КонецЕсли;
    
    Если Не Успешно Тогда
        Возврат Ложь;
    КонецЕсли;
            
    КукиИмя            = СтрПолучитьСтроку(ОтветСервера,2);
    КукиЗначение       = СтрПолучитьСтроку(ОтветСервера,3);
    ЗаголовкиЗапросов = "Cookie: " + КукиИмя + "=" + КукиЗначение;

    ОтобразитьСостояние("Загрузка данных с сервера...");
    
    ИнформацияДляПользователя = "";
    ОтветСервера = ПроцедурыОбменаССайтом.HTTPПолучитьДанныеССервера(Соединение, АдресДляРаботы + ПараметрЗапросаHTTP_ПолучитьДанные, ЗаголовкиЗапросов, ИнформацияДляПользователя);
    Если Не ПустаяСтрока(ИнформацияДляПользователя) Тогда
        СообщитьПользователю(ИнформацияДляПользователя, Ложь);
    КонецЕсли;
    
    Если ОтветСервера = Неопределено Тогда
        СообщитьОбОшибкеОбмена("Не удалось загрузить данные с сервера.", Ложь);
        Возврат Ложь;
    КонецЕсли;
        
    СтрокаCML = "";
    
    Если Лев(ОтветСервера, 2) = "PK" Тогда
        СтрокаCML = РаспаковатьZIPАрхив(ОтветСервера);
    Иначе
        Если Лев(ОтветСервера, 5) = "<?xml" Тогда
            СтрокаCML = ОтветСервера;
        КонецЕсли;    
    КонецЕсли;                        
    
    Если НЕ ЗначениеЗаполнено(СтрокаCML) Тогда
        СообщитьОбОшибкеОбмена("Не удалось прочитать данные, загруженные с сервера.", Ложь);
        Возврат Ложь;        
    КонецЕсли;
        
    ДеревоДокументов = РазобратьCML(СтрокаCML);
    
    Если ДеревоДокументов = Неопределено Тогда
        СообщитьОбОшибкеОбмена("Не удалось разобрать данные, загруженные с сервера.", Ложь);
        Возврат Ложь;        
    КонецЕсли;
        
    Успешно = ОбработатьДокументы(ДеревоДокументов, КоличествоОбработанныхДокументов);
    
    Если НЕ Успешно Тогда
        СообщитьОбОшибкеОбмена("Не удалось обработать документы, загруженные с сервера.", Ложь);
        Возврат Ложь;
    КонецЕсли;
    
    ИнформацияДляПользователя = "";
    ПроцедурыОбменаССайтом.HTTPПолучитьДанныеССервера(Соединение, АдресДляРаботы + ПараметрЗапросаHTTP_УспешноеЗавершениеИмпорта, ЗаголовкиЗапросов, ИнформацияДляПользователя);
    Если Не ПустаяСтрока(ИнформацияДляПользователя) Тогда
        СообщитьПользователю(ИнформацияДляПользователя, Ложь);
    КонецЕсли;
                    
    Возврат Успешно;
    
КонецФункции

Функция HTTPВыгрузитьНаСервер(СтруктураПараметровСайта,
    КаталогОбмена,
    МассивПодкаталогов = Неопределено,
    ОжидатьЗавершенияИмпортаФайловСервером = Ложь,
    ТипСоединения = "catalog")
    
    Успешно    = Истина;
    
    ОтветСервера = "";
    Соединение = Неопределено;
    
    АдресДляРаботы = СтруктураПараметровСайта.АдресСкрипта + "?type=" + ТипСоединения;
        
    СтрокаСообщенияПользователю = "";
    Успешно = ПроцедурыОбменаССайтом.HTTPВыполнитьАвторизациюДляСоединения(Соединение, СтруктураПараметровСайта, ОтветСервера, СтрокаСообщенияПользователю, ТипСоединения);
    Если Не ПустаяСтрока(СтрокаСообщенияПользователю) Тогда
        СообщитьОбОшибкеОбмена(СтрокаСообщенияПользователю, Истина);                        
    КонецЕсли;
    
    Если Не Успешно Тогда
        Возврат Ложь;
    КонецЕсли;    
        
    КукиИмя            = СтрПолучитьСтроку(ОтветСервера, 2);
    КукиЗначение       = СтрПолучитьСтроку(ОтветСервера, 3);
    ЗаголовкиЗапросов = "Cookie: " + КукиИмя + "=" + КукиЗначение;

    ОтобразитьСостояние("Запрос параметров обмена...");
    
    ОтветСервера = ПроцедурыОбменаССайтом.HTTPПолучитьДанныеССервера(Соединение, АдресДляРаботы + ПараметрЗапросаHTTP_Инициализация, ЗаголовкиЗапросов);
    
    Если ОтветСервера = Неопределено Тогда
        СообщитьОбОшибкеОбмена("Не удалось получить параметры обмена с сервера.", Истина);
        Возврат Ложь;
    КонецЕсли;
        
    ZIPФайлыРазрешены = Ложь;
    ОграничениеРазмераФрагментаФайлаОбмена = 0;
                    
    Если СтрЧислоСтрок(ОтветСервера) <> 2 тогда    
        СообщитьОбОшибкеОбмена("Не удалось прочитать ответ сервера. Параметры обмена не получены.", Истина);
        Возврат Ложь;
    КонецЕсли;
        
    ZIPФайлыРазрешены = НРег(СтрПолучитьСтроку(ОтветСервера,1)) = ОтветСервера_ZIPРазрешен;

    Попытка
        ОграничениеРазмераФрагментаФайлаОбмена = Число(СтрЗаменить(НРег(СтрПолучитьСтроку(ОтветСервера,2)), ОтветСервера_ОграничениеРазмераФрагментаФайлаОбмена, ""));
    Исключение
        СообщитьОбИсключительнойОшибке(Истина);
        ОграничениеРазмераФрагментаФайлаОбмена = -1;
    КонецПопытки;    
            
    МассивИсходныхCMLФайлов = НайтиФайлы(КаталогОбмена, "*.xml");
    СписокФайловДляОтправки = ПолучитьСписокФайловДляОтправки(КаталогОбмена, МассивПодкаталогов);
    
    Если ZIPФайлыРазрешены Тогда
        ОтобразитьСостояние("Подготовка ZIP-архива...");
        СписокФайловДляОтправки = ПодготовитьZIPАрхивы(СписокФайловДляОтправки, КаталогОбмена);
    КонецЕсли;    
    
    Если ОграничениеРазмераФрагментаФайлаОбмена > 0 Тогда
        СписокФайловДляОтправки = РазделитьФайлыНаФрагменты(СписокФайловДляОтправки, ОграничениеРазмераФрагментаФайлаОбмена);
    КонецЕсли;    
    
    ВсегоФайлов = СписокФайловДляОтправки.Количество();
    
    Для Каждого ТекФайл Из СписокФайловДляОтправки цикл
        
        ОтобразитьСостояние("Идет отправка файла на сервер (" + Строка(СписокФайловДляОтправки.Индекс(ТекФайл) + 1) + " из " + Строка(ВсегоФайлов) + "): " + ТекФайл.Значение);
        
        ОтветСервера = HTTPОтправитьФайлНаСервер(ТекФайл.Значение, Соединение, АдресДляРаботы + ПараметрЗапросаHTTP_ПередачаФайла + ТекФайл.Представление, ЗаголовкиЗапросов);
        
        Если ZIPФайлыРазрешены Тогда
            Попытка
                УдалитьФайлы(ТекФайл.Значение);
            Исключение
            КонецПопытки;    
        КонецЕсли;    
        
        Если ОтветСервера = Неопределено Тогда
            СообщитьОбОшибкеОбмена("Не удалось получить ответ сервера. Файл не отправлен (" + ТекФайл.Значение + ").", Истина);
            Возврат Ложь;
        КонецЕсли;
            
        СостояниеОбмена = НРег(СтрПолучитьСтроку(ОтветСервера,1));
        
        Если СостояниеОбмена = ОтветСервера_АварийноеЗавершениеТекущейОперации Тогда
            
            СообщитьОбОшибкеОбмена("Произошла ошибка на стороне сервера. Файл не отправлен (" + ТекФайл.Значение + ").", Истина);
            СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера);
            Возврат Ложь;
            
        ИначеЕсли СостояниеОбмена = ОтветСервера_УспешноеЗавершениеТекущейОперации Тогда
            
            Если СтрЧислоСтрок(ОтветСервера) > 1 Тогда
                СообщитьПользователю("Получен расширенный статус успешного завершения сеанса", Истина, СтатусСообщения.Информация);
                СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера);    
            КонецЕсли;
            
        Иначе
            
            СообщитьОбОшибкеОбмена("Произошла ошибка на стороне сервера. Не получен статус завершения операции. Файл не отправлен (" + ТекФайл.Значение + ").", Истина);
            СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера);
            Возврат Ложь;
            
        КонецЕсли;        
        
    КонецЦикла;
    
    ИмпортУспешноЗавершен = Ложь;
    
    Если ОжидатьЗавершенияИмпортаФайловСервером Тогда
                            
        Для Каждого ТекФайл Из МассивИсходныхCMLФайлов Цикл
            
            ИмпортПродолжается = Истина;
            ТекущееСостояние = "";
        
            Пока ИмпортПродолжается Цикл
                
                ИмпортПродолжается = Ложь;
                
                ОтобразитьСостояние("Ожидание окончания загрузки данных сервером: " + ТекущееСостояние);
                ТекущееСостояние = "";
                
                ОтветСервера = ПроцедурыОбменаССайтом.HTTPПолучитьДанныеССервера(Соединение, АдресДляРаботы + ПараметрЗапросаHTTP_ИмпортФайлаСервером + ТекФайл.Имя, ЗаголовкиЗапросов);
                
                Если ОтветСервера = Неопределено Тогда
                    
                    Успешно = Ложь;
                    СообщитьОбОшибкеОбмена("Не удалось получить текущее состояние процесса обмена. Данные обмена отправлены, но не загружены.", Истина);
                    
                ИначеЕсли СтрЧислоСтрок(ОтветСервера) = 0 Тогда
                    Успешно = Ложь;
                    СообщитьОбОшибкеОбмена("Не удалось прочитать данные о текущем состоянии процесса обмена. Данные обмена отправлены, но не загружены.", Истина);    
                Иначе
                    
                    СостояниеОбмена = НРег(СтрПолучитьСтроку(ОтветСервера,1));
                    Если СостояниеОбмена = ОтветСервера_АварийноеЗавершениеТекущейОперации Тогда
                        Успешно = Ложь;
                        СообщитьОбОшибкеОбмена("Произошла ошибка на стороне сервера.", Истина);
                        СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера);
                    ИначеЕсли СостояниеОбмена = ОтветСервера_УспешноеЗавершениеТекущейОперации Тогда
                        ИмпортУспешноЗавершен = Истина;
                    ИначеЕсли СостояниеОбмена = ОтветСервера_ВыполнениеТекущейОперации Тогда
                        ТекущееСостояние = ТекущееСостояние + СтрПолучитьСтроку(ОтветСервера, 2);
                        ИмпортПродолжается = Истина;
                    Иначе
                        Успешно = Ложь;
                        СообщитьОбОшибкеОбмена("Произошла ошибка на стороне сервера. Получен неизвестный статус импорта.", Истина);
                        СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера);
                    КонецЕсли;
                    
                КонецЕсли;                    
                
            КонецЦикла;    //Импорт
            
            Если НЕ ИмпортУспешноЗавершен Тогда
                Прервать;
            КонецЕсли;    
            
        КонецЦикла;    
        
    КонецЕсли;                                
    
    Возврат Успешно;
    
КонецФункции    

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


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ НАСТРОЙКИ ПОСТРОИТЕЛЯ


Процедура ДобавитьФильтрыВПостроительОтчета(МассивИзмененийНоменклатуры)
    
    ТекстПоиска = "ГДЕ Истина";
    ТекстЗамены = "ГДЕ (Товары.НоменклатураСсылка В (&МассивИзмененийНоменклатуры))";
    
    СтрокаТекста = ПостроительЗапроса.Текст;
    СтрокаТекста = СтрЗаменить(СтрокаТекста, ТекстПоиска, ТекстЗамены);
    
    ПостроительЗапроса.Текст = СтрокаТекста;
    ПостроительЗапроса.Параметры.Вставить("МассивИзмененийНоменклатуры", МассивИзмененийНоменклатуры);
    
КонецПроцедуры    

Процедура УдалитьФильтрыИзПостроителяОтчета()
    
    ТекстПоиска = "ГДЕ (Товары.НоменклатураСсылка В (&МассивИзмененийНоменклатуры))";
    ТекстЗамены = "ГДЕ Истина ";
    
    СтрокаТекста = ПостроительЗапроса.Текст;
    СтрокаТекста = СтрЗаменить(СтрокаТекста, ТекстПоиска, ТекстЗамены);
    
    ПостроительЗапроса.Текст = СтрокаТекста;
    ПостроительЗапроса.Параметры.Удалить("МассивИзмененийНоменклатуры");
    
КонецПроцедуры    

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ ФОРМИРОВАНИЯ CML ИЗ СПИСКА ЗНАЧЕНИЙ





Процедура ЗаписатьCMLПоСпискуЗначений(ОбъектCML, СписокЗначений);
    
    Для Каждого Элемент Из СписокЗначений Цикл
        Если Элемент.Представление = КонецЭлементаCML Тогда
            ОбъектCML.ЗаписатьКонецЭлемента();
        ИначеЕсли Элемент.Представление = НачалоЭлементаCML Тогда    
            ОбъектCML.ЗаписатьНачалоЭлемента(Элемент.Значение);
        ИначеЕсли Элемент.Представление = "" Тогда
            ОбъектCML.ЗаписатьТекст(Элемент.Значение);
        ИначеЕсли Найти(Элемент.Представление, ПрефиксУзлаCML) > 0 Тогда
            ИмяУзла = СтрЗаменить(Элемент.Представление, ПрефиксУзлаCML, "");
            ЗаписатьТекстовойУзел(ОбъектCML, ИмяУзла, Элемент.Значение);    
        ИначеЕсли Найти(Элемент.Представление, ПрефиксАтрибутаCML) > 0 Тогда
            ИмяАтрибута = СтрЗаменить(Элемент.Представление, ПрефиксАтрибутаCML, "");
            ОбъектCML.ЗаписатьАтрибут(ИмяАтрибута, Элемент.Значение);
        КонецЕсли;
    КонецЦикла;    
    
КонецПроцедуры    

Процедура ДобавитьУзелCML(СписокЗначений, НаименованиеУзла, Значение);
    СписокЗначений.Добавить(Значение, ПрефиксУзлаCML + НаименованиеУзла);
КонецПроцедуры    

Процедура ДобавитьАтрибутCML(СписокЗначений, НаименованиеАтрибута, Значение)
    СписокЗначений.Добавить(Значение, ПрефиксАтрибутаCML + НаименованиеАтрибута);
КонецПроцедуры    

Процедура ДобавитьТекстCML(СписокЗначений, Значение)
    СписокЗначений.Добавить(Значение, "");
КонецПроцедуры    

Процедура ДобавитьНачалоЭлементаCML(СписокЗначений, НаименованиеЭлемента);
    СписокЗначений.Добавить(НаименованиеЭлемента, НачалоЭлементаCML);
КонецПроцедуры    

Процедура ДобавитьКонецЭлементаCML(СписокЗначений);
    СписокЗначений.Добавить("", КонецЭлементаCML);
КонецПроцедуры    

Процедура ЗаполнитьСписокЗначенийОсновныхРеквизитовТовара(СписокЗначенийCML, Товар)
    
    ИдТовара = СформироватьИдентификаторТовара(Товар.НоменклатураСсылка, Товар.ХарактеристикаСсылка);
    
    ДобавитьУзелCML(СписокЗначенийCML, "Ид"                   , ИдТовара);
    ДобавитьУзелCML(СписокЗначенийCML, "ШтрихКод"           , Товар.ШтрихКод);
    ДобавитьУзелCML(СписокЗначенийCML, "Артикул"           , Товар.НоменклатураСсылка.Артикул);
    ДобавитьУзелCML(СписокЗначенийCML, "Наименование"       , ФорматНаименованияДляCML(Товар.НоменклатураСсылка.Наименование));
    
    ДобавитьНачалоЭлементаCML(СписокЗначенийCML, "БазоваяЕдиница");    
    ДобавитьАтрибутCML(СписокЗначенийCML, "Код"                       , Товар.ЕдиницаИзмерения.Код);
    ДобавитьАтрибутCML(СписокЗначенийCML, "НаименованиеПолное"       , Товар.ЕдиницаИзмерения.НаименованиеПолное);
    ДобавитьАтрибутCML(СписокЗначенийCML, "МеждународноеСокращение", Лев(Товар.ЕдиницаИзмерения.МеждународноеСокращение, 3));
    ДобавитьТекстCML(СписокЗначенийCML, Строка(Товар.ЕдиницаИзмерения));
    ДобавитьКонецЭлементаCML(СписокЗначенийCML);    
    
КонецПроцедуры

Процедура ДобавитьЗначениеРеквизитаВСписок(СписокЗначенийCML, Наименование, Значение)
    
    ДобавитьНачалоЭлементаCML(СписокЗначенийCML, "ЗначениеРеквизита");
    ДобавитьУзелCML(СписокЗначенийCML, "Наименование", Наименование);
    ДобавитьУзелCML(СписокЗначенийCML, "Значение"   , Значение);
    ДобавитьКонецЭлементаCML(СписокЗначенийCML);
    
КонецПроцедуры

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

Функция ЗаполнитьСписокЗначенийПредложения(СписокЗначенийCML, Товар)

    
    
    ДобавитьНачалоЭлементаCML(СписокЗначенийCML, "Цены");
    
    ТаблицаЦен = Новый ТаблицаЗначений;
    ТаблицаЦен.Колонки.Добавить("ТипЦен");
    ТаблицаЦен.Колонки.Добавить("Валюта");
    ТаблицаЦен.Колонки.Добавить("Цена");
    ТаблицаЦен.Колонки.Добавить("ЕдиницаИзмеренияЦены");
    
    Для Каждого СтрокаСвойствоХарактеристики Из Товар.Строки Цикл
        Для Каждого СтрокаСвойствоНоменклатуры Из СтрокаСвойствоХарактеристики.Строки Цикл
            Для Каждого СтрокаТипаЦен Из СтрокаСвойствоНоменклатуры.Строки Цикл
                Если НЕ СтрокаТипаЦен.ТипЦен = NULL Тогда
                    НовСтрока = ТаблицаЦен.Добавить();
                    ЗаполнитьЗначенияСвойств(НовСтрока, СтрокаТипаЦен);
                КонецЕсли;    
            КонецЦикла;    
            
            
            // Забираем из первой ветки,
            // а дальше цены дублируются
            
            Прервать;
            Прервать;
            
        КонецЦикла;    
    КонецЦикла;    
    
    ТаблицаЦен.Свернуть("ТипЦен,Валюта,Цена,ЕдиницаИзмеренияЦены");
    
    Для Каждого СтрокаЦены Из ТаблицаЦен Цикл
        
        ДобавитьНачалоЭлементаCML(СписокЗначенийCML, "Цена");
        
        ИдТипаЦены = Строка(СтрокаЦены.ТипЦен.УникальныйИдентификатор());
        
        
                // Передаем значение валюты выбраной цены в переменную - ТекТипЦены
    //ТекТипЦены = ПостроительЗапроса.Отбор.ТипЦен.Значение.ВалютаЦены.Ссылка;    
      
    
    //Мой код для конвертации цены номенклатуры, в валюту цены, выбранной в отборе
        Если ТекТипЦены <> Неопределено Тогда
            
            Если СтрокаЦены.Валюта <> ТекТипЦены Тогда
                НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
                СтрокаЦены.Цена = НовЦена;
                СтрокаЦены.Валюта = ТекТипЦены;
                             КонецЕсли;

        КонецЕсли;
            //Конец кода
    
                
        ПредставлениеЦены = СокрЛП(СтрокаЦены.Цена) + " " + СокрЛП(СтрокаЦены.Валюта) + " за " + СокрЛП(СтрокаЦены.ЕдиницаИзмеренияЦены);
        ДобавитьУзелCML(СписокЗначенийCML, "Представление", ПредставлениеЦены);
        ДобавитьУзелCML(СписокЗначенийCML, "ИдТипаЦены",    ИдТипаЦены);
        ДобавитьУзелCML(СписокЗначенийCML, "ЦенаЗаЕдиницу", СтрокаЦены.Цена);
        ДобавитьУзелCML(СписокЗначенийCML, "Валюта",        ФорматВалютыДляCML(СтрокаЦены.Валюта));
        ДобавитьУзелCML(СписокЗначенийCML, "Единица",       СтрокаЦены.ЕдиницаИзмеренияЦены);
        ДобавитьУзелCML(СписокЗначенийCML, "Коэффициент",   СтрокаЦены.ЕдиницаИзмеренияЦены.Коэффициент);
        
        ДобавитьКонецЭлементаCML(СписокЗначенийCML);
        
    КонецЦикла;
    
    ДобавитьКонецЭлементаCML(СписокЗначенийCML);
    ДобавитьУзелCML(СписокЗначенийCML, "Количество", Товар.Остаток);
    
    Возврат ТаблицаЦен.Количество();
    
КонецФункции


Вторая часть
// ПРОЦЕДУРЫ И ФУНКЦИИ ЗАПИСИ ДАННЫХ В CML


Процедура ЗаписатьТекстовойУзел(ОбъектXML, Имя, Значение, ОбязательнаяПроверкаНаПустуюСтроку = Истина)

    СтрокаЗаписи = Строка(Значение);
    Если ОбязательнаяПроверкаНаПустуюСтроку
        И НЕ ЗначениеЗаполнено(СтрокаЗаписи) Тогда
        
        Возврат;        
        
    КонецЕсли;
    
    Если ТипЗнч(Значение) = Тип("Число") Тогда
        
        СтрокаЗаписи = СтрЗаменить(СтрокаЗаписи, Символы.НПП, "");
        СтрокаЗаписи = СтрЗаменить(СтрокаЗаписи, ",", ".");
        
    ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
        
        Если Значение Тогда
            СтрокаЗаписи = "true";
        Иначе
            СтрокаЗаписи = "false";
        КонецЕсли;
        
    КонецЕсли;
    
    ОбъектXML.ЗаписатьНачалоЭлемента(Имя);
    ОбъектXML.ЗаписатьТекст(СтрокаЗаписи);
    ОбъектXML.ЗаписатьКонецЭлемента();

КонецПроцедуры

Процедура ВыгрузитьОсновныеРеквизитыСвойстваДляКлассификатора(ОбъектCML, СвойствоНоменклатуры)
    
    Ид = СвойствоНоменклатуры.УникальныйИдентификатор();
    ЗаписатьТекстовойУзел(ОбъектCML, "Ид", Ид);
    
    Наименование = СвойствоНоменклатуры.Наименование;
    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование", ФорматНаименованияДляCML(Наименование));
    
    ЗаписатьТекстовойУзел(ОбъектCML, "Обязательное", Ложь);
    ЗаписатьТекстовойУзел(ОбъектCML, "Множественное", Ложь);
    ЗаписатьТекстовойУзел(ОбъектCML, "ИспользованиеСвойства", Истина);

КонецПроцедуры

Процедура ВыгрузитьОсновныеРеквизитыГруппыДляКлассификатора(ОбъектCML, Группа)
    
    ИдГруппы = СформироватьИдентификаторТовара(Группа.Ссылка);
    ЗаписатьТекстовойУзел(ОбъектCML, "Ид", ИдГруппы);
    ИмяГруппы = Группа.Наименование;
    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование", ФорматНаименованияДляCML(ИмяГруппы));
    
КонецПроцедуры

Процедура ВыгрузитьГруппыРекурсивно(ОбъектCML, ДеревоГрупп);
    
    НужноВыгружатьГруппы = Ложь;
    
    Для Каждого СтрокаДерева Из ДеревоГрупп Цикл
    
        Если НЕ СтрокаДерева.ЭтоГруппа Тогда
            Продолжить;
        КонецЕсли;
        
        Если Не НужноВыгружатьГруппы Тогда
            
            ОбъектCML.ЗаписатьНачалоЭлемента("Группы");
            НужноВыгружатьГруппы = Истина;
            
        КонецЕсли;
        
        ОбъектCML.ЗаписатьНачалоЭлемента("Группа");
        ВыгрузитьОсновныеРеквизитыГруппыДляКлассификатора(ОбъектCML, СтрокаДерева);
        
        Если СтрокаДерева.Строки.Количество() > 0 Тогда
            ВыгрузитьГруппыРекурсивно(ОбъектCML, СтрокаДерева.Строки);
        КонецЕсли;    
        ОбъектCML.ЗаписатьКонецЭлемента();
        
    КонецЦикла;    
    
    Если НужноВыгружатьГруппы Тогда
        ОбъектCML.ЗаписатьКонецЭлемента();
    КонецЕсли;
    
КонецПроцедуры

Процедура ВыгрузитьСвойства(ОбъектCML, ВыбранныеСвойства)
    
    Если ВыбранныеСвойства.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ОбъектCML.ЗаписатьНачалоЭлемента("Свойства");
    Для Каждого Свойство Из ВыбранныеСвойства Цикл  
        
        ОбъектCML.ЗаписатьНачалоЭлемента("СвойствоНоменклатуры");
        ВыгрузитьОсновныеРеквизитыСвойстваДляКлассификатора(ОбъектCML, Свойство);
        ОбъектCML.ЗаписатьКонецЭлемента();
        
    КонецЦикла;    
    ОбъектCML.ЗаписатьКонецЭлемента();
    
КонецПроцедуры    

Процедура ВыгрузитьКлассификатор(ОбъектCML, МассивНоменклатуры, ИдКаталога, ВыбранныеСвойства)

    ОбъектCML.ЗаписатьНачалоЭлемента("Классификатор");
    ЗаписатьТекстовойУзел(ОбъектCML, "Ид", Строка(ИдКаталога));
    ИмяКлассификатора = "Классификатор (" + НаименованиеКаталогаТоваровCML + ")";
    
    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование", ФорматНаименованияДляCML(ИмяКлассификатора));

    ЗапросПоГруппам = Новый Запрос(
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Ссылка,
        |    Номенклатура.Наименование,
        |    Номенклатура.ЭтоГруппа
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка В(&МассивНоменклатуры)
        |
        |Итоги ПО
        |    Ссылка ИЕРАРХИЯ");
        
    ЗапросПоГруппам.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
        
    ДеревоГрупп = ЗапросПоГруппам.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    ВыгрузитьГруппыРекурсивно(ОбъектCML, ДеревоГрупп.Строки);
    ВыгрузитьСвойства(ОбъектCML, ВыбранныеСвойства);
    
    ОбъектCML.ЗаписатьКонецЭлемента();
    
КонецПроцедуры

Процедура ВыгрузитьРеквизитыКонтрагентаВCML(ОбъектCML, Контрагент)
    
    ОбъектCML.ЗаписатьНачалоЭлемента("Контрагенты");
    ОбъектCML.ЗаписатьНачалоЭлемента("Контрагент");

    ЗаписатьТекстовойУзел(ОбъектCML, "Ид"                , Строка(Контрагент.УникальныйИдентификатор()));
    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование"        , ФорматНаименованияДляCML(Контрагент.Наименование));
    ЗаписатьТекстовойУзел(ОбъектCML, "Комментарий"        , ФорматКомментарияДляCML(Контрагент.Комментарий));
    ЗаписатьТекстовойУзел(ОбъектCML, "Роль"                , "Покупатель");    
    
    Если Контрагент.ЮрФизЛицо = перечисления.ЮрФизЛицо.ФизЛицо Тогда
        
        ОбъектCML.ЗаписатьНачалоЭлемента("РеквизитыФизЛица");
        ЗаписатьТекстовойУзел(ОбъектCML, "ПолноеНаименование", Контрагент.НаименованиеПолное);    
        ЗаписатьТекстовойУзел(ОбъектCML, "ИНН", Контрагент.КодПоЕДРПОУ);    
        ОбъектCML.ЗаписатьКонецЭлемента();    
        
    Иначе    
        
        ОбъектCML.ЗаписатьНачалоЭлемента("РеквизитыЮрЛица");
        ЗаписатьТекстовойУзел(ОбъектCML, "ОфициальноеНаименование", Контрагент.НаименованиеПолное);    
        ЗаписатьТекстовойУзел(ОбъектCML, "ИНН", Контрагент.КодПоЕДРПОУ);
              
        ОбъектCML.ЗаписатьКонецЭлемента();    
              
    КонецЕсли;          
    
    ОбъектCML.ЗаписатьКонецЭлемента();
    ОбъектCML.ЗаписатьКонецЭлемента();
    
КонецПроцедуры    

Процедура ВыгрузитьТоварыУслугиЗаказаВCML(ОбъектCML, Док)
    
    ОбъектCML.ЗаписатьНачалоЭлемента("Товары");
    
    Для Каждого СтрокаТЧ Из Док.Товары Цикл
        ВыгрузитьТоварДляЗаказаВCML(ОбъектCML, Док, СтрокаТЧ);
    КонецЦикла;     
    
    //Для Каждого СтрокаТЧ Из Док.Услуги Цикл
    //    ВыгрузитьТоварДляЗаказаВCML(ОбъектCML, Док, СтрокаТЧ, Истина);
    //КонецЦикла;     
    
    ОбъектCML.ЗаписатьКонецЭлемента();
    
КонецПроцедуры    

Процедура ВыгрузитьТоварДляЗаказаВCML(ОбъектCML, Док, СтрокаТЧ, ТЧУслуги = Ложь)

    ОбъектCML.ЗаписатьНачалоЭлемента("Товар");
    
    Если ТЧУслуги Тогда
        ИдТовара = СформироватьИдентификаторТовара(СтрокаТЧ.Номенклатура);
    Иначе
        ИдТовара = СформироватьИдентификаторТовара(СтрокаТЧ.Номенклатура, СтрокаТЧ.ХарактеристикаНоменклатуры);
    КонецЕсли;    
    
    ЗаписатьТекстовойУзел(ОбъектCML, "Ид"            , ИдТовара);
    ЗаписатьТекстовойУзел(ОбъектCML, "Артикул"        , СтрокаТЧ.Номенклатура.Артикул);
    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование"    , ФорматНаименованияДляCML(СтрокаТЧ.Номенклатура.Наименование));
    
    ОбъектCML.ЗаписатьНачалоЭлемента("БазоваяЕдиница");
    ОбъектCML.ЗаписатьАтрибут("Код"                       , СтрокаТЧ.Номенклатура.БазоваяЕдиницаИзмерения.Код);
    ОбъектCML.ЗаписатьАтрибут("НаименованиеПолное"       , ФорматНаименованияДляCML(СтрокаТЧ.Номенклатура.БазоваяЕдиницаИзмерения.НаименованиеПолное));
    ОбъектCML.ЗаписатьАтрибут("МеждународноеСокращение", СтрокаТЧ.Номенклатура.БазоваяЕдиницаИзмерения.МеждународноеСокращение);
    ОбъектCML.ЗаписатьТекст(Строка(СтрокаТЧ.Номенклатура.БазоваяЕдиницаИзмерения));
    ОбъектCML.ЗаписатьКонецЭлемента();
    
    Если НЕ ТЧУслуги Тогда
        
        Если СтрокаТЧ.ХарактеристикаНоменклатуры <> ПустаяХарактеристикаСсылка Тогда
            
            Запрос = Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ
                           |    ЗначенияСвойствОбъектов.Свойство,
                           |    ЗначенияСвойствОбъектов.Значение
                           |ИЗ
                           |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                           |ГДЕ
                           |    ЗначенияСвойствОбъектов.Объект = &Объект";
                          
            Запрос.УстановитьПараметр("Объект", СтрокаТЧ.ХарактеристикаНоменклатуры);               
            РезультатЗапроса = Запрос.Выполнить();
            Если НЕ РезультатЗапроса.Пустой() Тогда
                
                ОбъектCML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара");
                Выборка = РезультатЗапроса.Выбрать();
                
                Пока Выборка.Следующий() Цикл
                    ОбъектCML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара");
                    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование"    , ФорматНаименованияДляCML(Выборка.Свойство));
                    ЗаписатьТекстовойУзел(ОбъектCML, "Значение"        , Выборка.Значение);
                    ОбъектCML.ЗаписатьКонецЭлемента();    
                КонецЦикла;
                
                ОбъектCML.ЗаписатьКонецЭлемента();
                
            КонецЕсли;
            
        КонецЕсли;    
        
    КонецЕсли;    

    //
    
    ОбъектCML.ЗаписатьНачалоЭлемента("ЗначенияРеквизитов");
    
    ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "ВидНоменклатуры", СтрокаТЧ.Номенклатура.ВидНоменклатуры);
    ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "ТипНоменклатуры", СтрокаТЧ.Номенклатура.ВидНоменклатуры.ТипНоменклатуры);
        
    ОбъектCML.ЗаписатьКонецЭлемента();        

    //

    Если СтрокаТЧ.Номенклатура.СтавкаНДС <> Перечисления.СтавкиНДС.БезНДС Тогда
        
        ОбъектCML.ЗаписатьНачалоЭлемента("СтавкиНалогов");
        ОбъектCML.ЗаписатьНачалоЭлемента("СтавкаНалога");
        ЗаписатьТекстовойУзел(ОбъектCML, "Наименование", НаименованиеНалога);
        ЗаписатьТекстовойУзел(ОбъектCML, "Ставка"      , ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(СтрокаТЧ.Номенклатура.СтавкаНДС));
        ОбъектCML.ЗаписатьКонецЭлемента();
        ОбъектCML.ЗаписатьКонецЭлемента();
        
    КонецЕсли;    

    //
    
    ЗаписатьТекстовойУзел(ОбъектCML, "ЦенаЗаЕдиницу", СтрокаТЧ.Цена);
    ЗаписатьТекстовойУзел(ОбъектCML, "Количество", СтрокаТЧ.Количество);
    ЗаписатьТекстовойУзел(ОбъектCML, "Сумма", СтрокаТЧ.Сумма);
    
    Если ТЧУслуги Тогда
        ЗаписатьТекстовойУзел(ОбъектCML, "Единица", СтрокаТЧ.Номенклатура.БазоваяЕдиницаИзмерения);
        ЗаписатьТекстовойУзел(ОбъектCML, "Коэффициент", "1");
    Иначе    
        ЗаписатьТекстовойУзел(ОбъектCML, "Единица", СтрокаТЧ.ЕдиницаИзмерения);
        ЗаписатьТекстовойУзел(ОбъектCML, "Коэффициент", СтрокаТЧ.Коэффициент);
    КонецЕсли;    
    
    ОбъектCML.ЗаписатьНачалоЭлемента("Налоги");
    ОбъектCML.ЗаписатьНачалоЭлемента("Налог");
    ЗаписатьТекстовойУзел(ОбъектCML, "Наименование", НаименованиеНалога);
    ЗаписатьТекстовойУзел(ОбъектCML, "Ставка"      , ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(СтрокаТЧ.СтавкаНДС));
    ЗаписатьТекстовойУзел(ОбъектCML, "УчтеноВСумме", Док.СуммаВключаетНДС);
    ЗаписатьТекстовойУзел(ОбъектCML, "Сумма"       , СтрокаТЧ.СуммаНДС);
    ОбъектCML.ЗаписатьКонецЭлемента();
    ОбъектCML.ЗаписатьКонецЭлемента();
    
    Если СтрокаТЧ.ПроцентСкидкиНаценки <> 0 Тогда
    
        ОбъектCML.ЗаписатьНачалоЭлемента("Скидки");
        ОбъектCML.ЗаписатьНачалоЭлемента("Скидка");
        ЗаписатьТекстовойУзел(ОбъектCML, "Процент"     , СтрокаТЧ.ПроцентСкидкиНаценки);
        ЗаписатьТекстовойУзел(ОбъектCML, "УчтеноВСумме", Истина);
        ОбъектCML.ЗаписатьКонецЭлемента();
        ОбъектCML.ЗаписатьКонецЭлемента();
        
    КонецЕсли;    
    
    ОбъектCML.ЗаписатьКонецЭлемента();

КонецПроцедуры

Процедура ВыгрузитьЗаказВCML(ОбъектCML, Док);
    
    ЗаписатьТекстовойУзел(ОбъектCML, "Ид"    , Строка(Док.УникальныйИдентификатор()));
    ЗаписатьТекстовойУзел(ОбъектCML, "Номер", Док.НомерВходящегоДокументаЭлектронногоОбмена);
    ЗаписатьТекстовойУзел(ОбъектCML, "Дата" , ФорматДатыДляCML(Док.ДатаВходящегоДокументаЭлектронногоОбмена, Истина, Ложь));
    ЗаписатьТекстовойУзел(ОбъектCML, "Время", ФорматДатыДляCML(Док.ДатаВходящегоДокументаЭлектронногоОбмена, Ложь, Истина));
    
    ЗаписатьТекстовойУзел(ОбъектCML, "ХозОперация", "Заказ товара");
    ЗаписатьТекстовойУзел(ОбъектCML, "Роль"          , "Продавец");
    ЗаписатьТекстовойУзел(ОбъектCML, "Валюта"      , ФорматВалютыДляCML(Док.ВалютаДокумента));
    ЗаписатьТекстовойУзел(ОбъектCML, "Курс"          , Док.КурсВзаиморасчетов);
    ЗаписатьТекстовойУзел(ОбъектCML, "Сумма"      , Док.СуммаДокумента);
    ЗаписатьТекстовойУзел(ОбъектCML, "СрокПлатежа", ФорматДатыДляCML(Док.ДатаОплаты, Истина, Ложь));
    
    ВыгрузитьРеквизитыКонтрагентаВCML(ОбъектCML, Док.Контрагент);
    
    ЗаписатьТекстовойУзел(ОбъектCML, "Комментарий", ФорматКомментарияДляCML(Док.Комментарий));
    
    Если Док.УчитыватьНДС Тогда
        
        ОбъектCML.ЗаписатьНачалоЭлемента("Налоги");
        ОбъектCML.ЗаписатьНачалоЭлемента("Налог");
        ЗаписатьТекстовойУзел(ОбъектCML, "Наименование", НаименованиеНалога);
        ЗаписатьТекстовойУзел(ОбъектCML, "УчтеноВСумме", Док.СуммаВключаетНДС);
        ОбъектCML.ЗаписатьКонецЭлемента();
        ОбъектCML.ЗаписатьКонецЭлемента();
        
    КонецЕсли;

    ВыгрузитьТоварыУслугиЗаказаВCML(ОбъектCML, Док);
    
КонецПроцедуры

Функция СформироватьИдентификаторТовара(Номенклатура, Характеристика = Неопределено)

    Если Характеристика = Неопределено
     ИЛИ Характеристика = ПустаяХарактеристикаСсылка Тогда
        Возврат Строка(Номенклатура.УникальныйИдентификатор());
    Иначе    
        Возврат Строка(Номенклатура.УникальныйИдентификатор()) + "#" + Строка(Характеристика.УникальныйИдентификатор());
    КонецЕсли;

КонецФункции

Функция ВыгрузитьКартинку(Номенклатура, КаталогНаДиске)
    
    СтруктураРезультата = Новый Структура;
    СтруктураРезультата.Вставить("Адрес",  "");
    СтруктураРезультата.Вставить("Размер", "0");
            
    Картинка = Номенклатура.ОсновноеИзображение.Хранилище.Получить();
    Если ТипЗнч(Картинка) <> Тип("Картинка") Тогда
        Возврат СтруктураРезультата;
    КонецЕсли;
    
    ФорматКартинкиРазрешен  = Истина;
    РасширениеФайлаКартинки = "";
    
#Если Клиент Тогда
        
    ФорматКартинкиОбъекта = Картинка.Формат();
    Если ФорматКартинкиОбъекта = ФорматКартинки.НеизвестныйФормат Тогда
        ФорматКартинкиРазрешен = Ложь;
    Иначе
        Если НЕ (ФорматКартинкиОбъекта = ФорматКартинки.GIF
             ИЛИ ФорматКартинкиОбъекта = ФорматКартинки.JPEG
             ИЛИ ФорматКартинкиОбъекта = ФорматКартинки.PNG) Тогда
            Попытка
                ФорматКартинкиОбъекта   = Картинка.Преобразовать(ФорматКартинки.JPEG);
            Исключение
                СообщитьОбИсключительнойОшибке(Истина, "Не удалось преобразовать формат картинки. Номенклатура: " + Номенклатура + ". Преобразование из " + Строка(ФорматКартинкиОбъекта) + " в JPEG");        
                Возврат СтруктураРезультата;
            КонецПопытки;
        КонецЕсли;
        РасширениеФайлаКартинки = Строка(ФорматКартинкиОбъекта);
    КонецЕсли;

#Иначе // СЕРВЕР
        
    // На сервере проверка формата файла по сигнатуре файла:
    // JPEG: FF D8 xx xx xx xx 4A 46 49 46 00
    // GIF:  47 49 46
    // PNG:  89 50 4e 47 0d 0a 1a 0a
    //
    // -1 - значит байт игнорируется.
    // Код должен быть не более 127(dec) для совместимости Unicode-ASCII
    
    СигнатураJPEG = Новый Массив;
    СигнатураJPEG.Добавить(-1);
    СигнатураJPEG.Добавить(-1);
    СигнатураJPEG.Добавить(-1);
    СигнатураJPEG.Добавить(-1);
    СигнатураJPEG.Добавить(-1);
    СигнатураJPEG.Добавить(-1);
    СигнатураJPEG.Добавить(74);
    СигнатураJPEG.Добавить(70);
    СигнатураJPEG.Добавить(73);
    СигнатураJPEG.Добавить(70);
    СигнатураJPEG.Добавить(0);

    СигнатураGIF = Новый Массив;
    СигнатураGIF.Добавить(71);
    СигнатураGIF.Добавить(73);
    СигнатураGIF.Добавить(70);
    
    СигнатураPNG = Новый Массив;
    СигнатураPNG.Добавить(-1);        
    СигнатураPNG.Добавить(80);
    СигнатураPNG.Добавить(78);
    СигнатураPNG.Добавить(71);
    СигнатураPNG.Добавить(13);
    СигнатураPNG.Добавить(10);
    СигнатураPNG.Добавить(26);
    СигнатураPNG.Добавить(10);
    
    РазрешенныеСигнатуры = Новый Соответствие;
    РазрешенныеСигнатуры.Вставить("GIF" , СигнатураGIF);
    РазрешенныеСигнатуры.Вставить("JPEG", СигнатураJPEG);
    РазрешенныеСигнатуры.Вставить("PNG" , СигнатураPNG);
    
    МаксДлинаСигнатуры = 0;
    Для каждого Сигнатура Из РазрешенныеСигнатуры Цикл
        ДлинаСигнатуры = Сигнатура.Значение.Количество();
        Если МаксДлинаСигнатуры < ДлинаСигнатуры Тогда
            МаксДлинаСигнатуры = ДлинаСигнатуры;    
        КонецЕсли;    
    КонецЦикла;
    
    ИмяВремФайла = ПолучитьИмяВременногоФайла();
    Попытка
        Картинка.Записать(ИмяВремФайла);
    Исключение
        СообщитьОбИсключительнойОшибке(Истина, "Не удалось записать файл " + ИмяВремФайла + " для определения формата картинки. Номенклатура: " + Номенклатура);
        Возврат СтруктураРезультата;
    КонецПопытки;
    
    ТекстФайлКартинки = Новый ЧтениеТекста;
    Попытка
        ТекстФайлКартинки.Открыть(ИмяВремФайла,,,Символы.ПС);
    Исключение
        СообщитьОбИсключительнойОшибке(Истина, "Не удалось прочитать файл " + ИмяВремФайла + " для определения формата картинки. Номенклатура: " + Номенклатура);
        Возврат СтруктураРезультата;
    КонецПопытки;    
    
    ТекстКартинки = ТекстФайлКартинки.Прочитать(МаксДлинаСигнатуры);
    ТекстФайлКартинки.Закрыть();
    
    Если ТекстКартинки = "" Тогда
        СообщитьПользователю("Не удалось получить сигнатуру файла картинки. Номенклатура: " + Номенклатура, Истина, СтатусСообщения.Информация);
        Возврат СтруктураРезультата;
    КонецЕсли;
    
    ФорматКартинкиРазрешен = Ложь;
    
    Для каждого Сигнатура Из РазрешенныеСигнатуры Цикл
        
        ДлинаСигнатуры = Сигнатура.Значение.Количество();
        СигнатураРаспознана = Истина;
        
        Для Сч = 1 По ДлинаСигнатуры Цикл
            ТекБайтСигнатуры = Сигнатура.Значение[Сч - 1];
            Если ТекБайтСигнатуры = -1 Тогда
                Продолжить;
            КонецЕсли;    
            ТекБайтФайла = КодСимвола(ТекстКартинки, Сч);    
            Если НЕ ТекБайтСигнатуры = ТекБайтФайла Тогда
                СигнатураРаспознана = Ложь;
                Прервать;
            КонецЕсли;    
        КонецЦикла;    
        
        Если СигнатураРаспознана Тогда
            ФорматКартинкиРазрешен = Истина;
            РасширениеФайлаКартинки = Сигнатура.Ключ;
            Прервать;
        КонецЕсли;
    
    КонецЦикла;
        
#КонецЕсли
    
    Если НЕ ФорматКартинкиРазрешен Тогда
        СообщитьПользователю("Формат основного изображения неизвестен или запрещен. Номенклатура: " + Номенклатура, Истина, СтатусСообщения.Информация);        
        Возврат СтруктураРезультата;
    КонецЕсли;    
        
    ИмяФайлаКартинки           = Строка(Номенклатура.УникальныйИдентификатор()) + "." + НРег(РасширениеФайлаКартинки);
    КаталогПоИмени               = Лев(ИмяФайлаКартинки, 2);
    КаталогКартинки               = КаталогНаДиске + "\" + ПодкаталогКартинок + "\" + КаталогПоИмени;
    СоздатьКаталог(КаталогКартинки);
    ПолноеИмяФайлаКартинки     = КаталогКартинки + "\" + ИмяФайлаКартинки;
    ФайлКартинкиНаДиске        = Новый Файл(ПолноеИмяФайлаКартинки);
    
    Попытка
        Картинка.Записать(ПолноеИмяФайлаКартинки);        
    Исключение
        СообщитьОбИсключительнойОшибке(Истина, "Не удалось записать файл картинки на диск. Номенклатура: " + Номенклатура);
        Возврат СтруктураРезультата;
    КонецПопытки;    
    
    СтруктураРезультата.Адрес  = ПодкаталогКартинок + "/" + КаталогПоИмени + "/" + ИмяФайлаКартинки;
    СтруктураРезультата.Размер = Формат(ФайлКартинкиНаДиске.Размер(), "ЧГ=");
    
    Возврат СтруктураРезультата;
    
КонецФункции    

Процедура ДобавитьНовоеЗначениеРеквизита(ОбъектXML, Наименование, Значение, ПустоеЗначение = "", ИмяГруппыЭлементов = "ЗначениеРеквизита")
    
    ЗначениеДляЗаписи = Значение;
    Если ЗначениеДляЗаписи = Null Тогда
        ЗначениеДляЗаписи = ПустоеЗначение;
    КонецЕсли;
    
    Если ЗначениеДляЗаписи = "" Тогда
        Возврат;
    КонецЕсли;
    
    ОбъектXML.ЗаписатьНачалоЭлемента(ИмяГруппыЭлементов);
    
    ЗаписатьТекстовойУзел(ОбъектXML, "Наименование",  Наименование, Ложь);
    ЗаписатьТекстовойУзел(ОбъектXML, "Значение",  ЗначениеДляЗаписи, Ложь);
    
    ОбъектXML.ЗаписатьКонецЭлемента();
    
КонецПроцедуры

Функция СформироватьCMLСРанееЗагруженнымиЗаказами(СтрокаCML, МассивИзменений)
    
    ОтобразитьСостояние("Поиск открытых заказов, загруженных с " + HTTPОбменСервер + "...");
    
    ТаблицаДокументов = ПроцедурыОбменаССайтом.ПолучитьЗаказыСОплатойИОтгрузкойПоКатегориям(МассивИзменений, мМассивЗагруженныхДокументов);
    
    Если ТаблицаДокументов.Количество() = 0 Тогда  
        Возврат ТаблицаДокументов;
    КонецЕсли;
    
    ДатаФормирования = ТекущаяДата();
    ОбъектCML = ПолучитьОбъектДляЗаписиXML("", ДатаФормирования);
        
    Для Каждого СтрокаТД Из ТаблицаДокументов Цикл
        
        ОбъектCML.ЗаписатьНачалоЭлемента("Документ");
        
        Док = СтрокаТД.ДокументСсылка;
        
        ВыгрузитьЗаказВCML(ОбъектCML, Док);
                    
        ОбъектCML.ЗаписатьНачалоЭлемента("ЗначенияРеквизитов");
        
        ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Номер по 1С", Док.Номер);
        ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Дата по 1С", ФорматДатыДляCML(Док.Дата));
        ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "ПометкаУдаления", Док.ПометкаУдаления);
        ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Проведен", Док.Проведен);
                                
        Если СтрокаТД.Оплачен ИЛИ СтрокаТД.Отгружен Тогда
            
            Если СтрокаТД.Оплачен Тогда
                ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Номер оплаты по 1С", СтрокаТД.НомерОплаты);
                ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Дата оплаты по 1С", ФорматДатыДляCML(СтрокаТД.ДатаОплаты, Истина, Истина));
            КонецЕсли;    
            
            Если СтрокаТД.Отгружен Тогда
                ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Номер отгрузки по 1С", СтрокаТД.НомерОтгрузки);
                ДобавитьНовоеЗначениеРеквизита(ОбъектCML, "Дата отгрузки по 1С", ФорматДатыДляCML(СтрокаТД.ДатаОтгрузки, Истина, Истина));
            КонецЕсли;    
            
        КонецЕсли;
        
        ОбъектCML.ЗаписатьКонецЭлемента();
        ОбъектCML.ЗаписатьКонецЭлемента();
        
    КонецЦикла;    
    
    ОбъектCML.ЗаписатьКонецЭлемента();
    СтрокаCML = ОбъектCML.Закрыть();
        
    Возврат ТаблицаДокументов;
    
КонецФункции    


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ФОРМАТИРОВАНИЯ ЗНАЧЕНИЙ CML


Функция ФорматКомментарияДляCML(Комментарий)
    Возврат Лев(Комментарий, 3000);
КонецФункции    

Функция ФорматНаименованияДляCML(Наименование)
    Возврат Лев(Наименование, 250);
КонецФункции    

Функция ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(СтавкаНДС)
    
    Если СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
        ЗначениеНалога = "Без налога";
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда        
        ЗначениеНалога = "0";
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда        
        ЗначениеНалога = "20";
    Иначе
        ЗначениеНалога = "";    
    КонецЕсли;
    
    Возврат ЗначениеНалога;
    
КонецФункции

Функция ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(ЗначениеНалога)
    
    Если ЗначениеНалога = "0" Тогда        
        СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
    ИначеЕсли ЗначениеНалога = "20" Тогда        
        СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    Иначе
        СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    КонецЕсли;
    
    Возврат СтавкаНДС;
    
КонецФункции



Функция ФорматВалютыДляCML(ВалютаСсылка)
    
    ТекстВалюты = "???";
    
    Если ТипЗнч(ВалютаСсылка) = Тип("СправочникСсылка.Валюты") Тогда
        ТекстВалюты = ВалютаСсылка.Наименование;
    КонецЕсли;    
        
    Возврат Лев(ТекстВалюты, 3);
    
КонецФункции    

Функция ФорматДатыДляCML(ЗначениеДата, ВернутьДату = Истина, ВернутьВремя = Ложь)
    
    ДатаСтрока  = Формат(ЗначениеДата, "ДФ=yyyy-MM-dd");
    ВремяСтрока = Формат(ЗначениеДата, "ДЛФ=T");    
    Результат   = "";
    
    Если ВернутьДату И ВернутьВремя Тогда
        Результат = ДатаСтрока + "T" + ВремяСтрока;
    ИначеЕсли ВернутьДату И (НЕ ВернутьВремя) Тогда    
        Результат = ДатаСтрока;
    ИначеЕсли (НЕ ВернутьДату) И ВернутьВремя Тогда        
        Результат = ВремяСтрока;
    КонецЕсли;    
    
    Возврат Результат;
        
КонецФункции    


////////////////////////////////////////////////////////////////////////////////
// СЕРВИСНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ УПРАВЛЕНИЯ ВЫГРУЗКОЙ ДАННЫХ
Процедура ВыгрузитьДанные() Экспорт
    
    мСтруктураИнформацииИсторииОбмена = ПолучитьСтруктуруИнформацииДляИстории();
    
    мСтруктураИнформацииИсторииОбмена.ДатаНачалаПоследнейВыгрузки = ТекущаяДата();
        
    ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкаСсылка);
    
    НачалоАдресаСкрипта = НастройкаСсылка.HTTPОбменАдресСайта;
    СтруктураАдреса = ПроцедурыОбменаССайтом.РазобратьАдресСайта(НачалоАдресаСкрипта);
    
    HTTPОбменПорт = СтруктураАдреса.HTTPПорт;
    HTTPОбменСервер = СтруктураАдреса.HTTPСервер;
    НачалоАдресаСкрипта = СтруктураАдреса.HTTPАдресСкрипта;
    
    
    Если Не ПустаяСтрока(КаталогВыгрузки) Тогда
        
        ФайлЗагрузки = КаталогВыгрузки + "\order.xml";
        
    КонецЕсли;
    
    Если ВыгружатьТолькоИзменения Тогда
        СтруктураИзменений = ПолучитьВсеИзмененияИзПланаОбмена();
    КонецЕсли;
    
    Если ОбменТоварами Тогда
        
        ТоварыУспешноВыгружены = ВыгрузитьТовары(СтруктураИзменений);
        
        Если ВыгружатьТолькоИзменения
            И ТоварыУспешноВыгружены Тогда
            
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбменаТоварами, СтруктураИзменений.НомерСообщенияТовары);
            
        КонецЕсли;
        
    Иначе
        ТоварыУспешноВыгружены = Истина;
    КонецЕсли;
    
    Если ОбменЗаказами Тогда
        
        ЗаказыУспешноВыгружены = ВыполнитьОбменЗаказами(СтруктураИзменений);
        
        Если ВыгружатьТолькоИзменения
            И ЗаказыУспешноВыгружены Тогда
            
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбменаЗаказами, СтруктураИзменений.НомерСообщенияЗаказы);
            
        КонецЕсли;
        
    Иначе
        ЗаказыУспешноВыгружены = Истина;
    КонецЕсли;
    
    мСтруктураИнформацииИсторииОбмена.ДатаПоследнейВыгрузки = ТекущаяДата();
    мСтруктураИнформацииИсторииОбмена.РезультатПоследнейВыгрузки = ТоварыУспешноВыгружены И ЗаказыУспешноВыгружены;
            
    ЗаписатьИнформациюВПротоколОбмена(мСтруктураИнформацииИсторииОбмена);
        
КонецПроцедуры

Функция ВыгрузитьТовары(СтруктураИзменений)
    
    Если НЕ ОпределитьМожноВыгрузитьТовары() Тогда
        
        СообщитьПользователю("Выгрузка товаров не произведена.", Истина);
        Возврат Истина;
        
    КонецЕсли;
    
    HTTPОбменАдресСкрипта = НачалоАдресаСкрипта;
    
    Если ПустаяСтрока(КаталогВыгрузки) Тогда
        КаталогВыгрузки = КаталогВременныхФайлов();
    Иначе
        ПоследнийСимвол = Сред(КаталогВыгрузки, СтрДлина(КаталогВыгрузки), 1);
        Если ПоследнийСимвол <> "\" Тогда
            КаталогВыгрузки = КаталогВыгрузки + "\";            
        КонецЕсли;
    КонецЕсли;
    
    КаталогВыгрузкиЗащищенный = КаталогВыгрузки + ПодкаталогБезопасностиКаталогаВыгрузки;
    
    СтруктураРезультата = ВыгрузитьТоварыВКаталогНаДиске(СтруктураИзменений, КаталогВыгрузкиЗащищенный);
    
    ВыгруженоОбъектов = СтруктураРезультата.ВыгруженоТоваров
                          + СтруктураРезультата.ВыгруженоКартинок
                          + СтруктураРезультата.ВыгруженоПредложений;
                          
    Если ВыгруженоОбъектов > 0 Тогда                      
                          
        СообщениеПользователю = "Выгружено товаров: " + СтруктураРезультата.ВыгруженоТоваров;
        
        Если ВыгружатьКартинки Тогда
            СообщениеПользователю = СообщениеПользователю + Символы.ПС + "Выгружено картинок: " + СтруктураРезультата.ВыгруженоКартинок;
        КонецЕсли;
        
    Иначе        
        
        СообщениеПользователю = "Изменения товаров не зарегистрированы. Выгрузка товаров не произведена.";    
        
    КонецЕсли;
    
    СообщитьПользователю(СообщениеПользователю, Истина);
    
    Успешно = Истина;                  
    
    Если ВыгружатьНаСайт
        И ВыгруженоОбъектов > 0 Тогда
        
        Успешно = ВыгрузитьКаталогПредложенияНаСайт(КаталогВыгрузкиЗащищенный);            
                
    КонецЕсли;
    
    Если Успешно Тогда
        
        Если ВыгруженоОбъектов > 0 Тогда
            СообщитьПользователю("Выгрузка товаров успешно завершена", Истина);
        КонецЕсли;
        
    Иначе
        
        СообщитьПользователю("Выгрузка товаров завершена с ошибками!!!", Истина);
        
    КонецЕсли;
    
    Возврат Успешно;
        
КонецФункции

Функция ПолучитьОбъектДляЗаписиXML(ИмяФайла, ДатаФормирования)
    
    ЗаписьXML = Новый ЗаписьXML;
    
    Если ПустаяСтрока(ИмяФайла) Тогда
        ЗаписьXML.УстановитьСтроку("UTF-8");
    Иначе
        ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
    КонецЕсли;
    
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("КоммерческаяИнформация");
    ЗаписьXML.ЗаписатьАтрибут("ВерсияСхемы", "2.03");
    ЗаписьXML.ЗаписатьАтрибут("ДатаФормирования", ФорматДатыДляCML(ДатаФормирования));    
    
    Возврат ЗаписьXML;
    
КонецФункции

Функция ВыгрузитьТоварыВКаталогНаДиске(СтруктураИзменений, КаталогНаДиске)
    
    ПроцедурыОбменаССайтом.НастроитьПостроительОтчета(ПостроительЗапроса);
    
    ТаблицаОтбора = СохраненныеНастройкиПостроителя.Получить();
    Если ТаблицаОтбора <> Неопределено Тогда
        ОбщегоНазначения.ЗаполнитьОтборПоТаблицеЗначений(ПостроительЗапроса.Отбор, ТаблицаОтбора);
    КонецЕсли;
        
    Если ВыгружатьТолькоИзменения Тогда
        
        МассивИзмененийНоменклатуры = СтруктураИзменений.Товары;
            
        Если МассивИзмененийНоменклатуры.Количество() = 0 Тогда
            
            Возврат Новый Структура("ВыгруженоТоваров,ВыгруженоКартинок,ВыгруженоПредложений", 0, 0, 0);
            
        КонецЕсли;
            
        ДобавитьФильтрыВПостроительОтчета(МассивИзмененийНоменклатуры);            
                    
    Иначе    
        
        УдалитьФильтрыИзПостроителяОтчета();
        
    КонецЕсли;
    
    // Передаем значение валюты выбраной цены в переменную - ТекТипЦены
    //ТекТипЦены = ПостроительЗапроса.Отбор.ТипЦен.Значение.ВалютаЦеныПоУмолчанию.Ссылка;
    // Выгрузка
    
    ИмяФайлаКаталога = КаталогНаДиске + "\import.xml";
    ИмяФайлаПрайса     = КаталогНаДиске + "\offers.xml";
    
    СоздатьКаталог(КаталогНаДиске);
    
    Попытка
        УдалитьФайлы(КаталогНаДиске, "*.*");
    Исключение
        СообщитьОбИсключительнойОшибке(Истина, );
    КонецПопытки;    
    
    ДатаОтчета = ТекущаяДата();
    
    ПостроительЗапроса.Параметры.Вставить("ДатаОтчета", ДатаОтчета);
    ПостроительЗапроса.Выполнить();
    
    ОтобразитьСостояние("Подготовка данных...");
    
    ВыбранныеСвойства = Новый СписокЗначений;
    
    ТаблицаРезультатаЗапроса = ПостроительЗапроса.Результат.Выгрузить();
    
    ТабСвойств = ТаблицаРезультатаЗапроса.Скопировать();
    ТабСвойств.Свернуть("СвойствоНоменклатуры");
    
    ВыбранныеСвойства = ТабСвойств.ВыгрузитьКолонку("СвойствоНоменклатуры");
    ЭлементNULL = ВыбранныеСвойства.Найти(NULL);    
    Если ЭлементNULL <> Неопределено Тогда
        ВыбранныеСвойства.Удалить(ЭлементNULL);
    КонецЕсли;
    
    ТабСвойств = Неопределено;
    
    // требуетя неизменный UUID каталога для проекта.
    // По организации взять UUID не можем, поскольку не ограничиваем
    // выгрузку рамками одной организации, выгружаем по предприятию в целом.
    // Поэтому, чтобы нигде не хранить UUID, получаем его из валюты
    // регламентированного учета, считая ее самой "стабильной" единицей
    // данных в рамках ИБ.
    
    ИдКаталога   = Строка(Константы.ВалютаРегламентированногоУчета.Получить().УникальныйИдентификатор());
    
    ОтобразитьСостояние("Выгрузка классификатора...");
    
    ОбъектCMLКаталог = ПолучитьОбъектДляЗаписиXML(ИмяФайлаКаталога, ДатаОтчета);
    
    ТаблицаНоменклатуры = ТаблицаРезультатаЗапроса.Скопировать();
    ТаблицаНоменклатуры.Свернуть("НоменклатураСсылка");
    
    МассивНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("НоменклатураСсылка");
    
    ВыгрузитьКлассификатор(ОбъектCMLКаталог, МассивНоменклатуры, ИдКаталога, ВыбранныеСвойства);
    
    ОтобразитьСостояние("Подготовка данных...");
    
    ОбъектCMLПакетПредложений = ПолучитьОбъектДляЗаписиXML(ИмяФайлаПрайса, ДатаОтчета);
    СтруктураРезультата = СформироватьCMLКаталогаПредложений(СтруктураИзменений, ОбъектCMLКаталог, ОбъектCMLПакетПредложений, ИдКаталога,
        ПостроительЗапроса.Результат, КаталогНаДиске);
    
    ОбъектCMLКаталог.ЗаписатьКонецЭлемента();
    ОбъектCMLКаталог.Закрыть();
    
    ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();
    ОбъектCMLПакетПредложений.Закрыть();

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

Функция ВыгрузитьКаталогПредложенияНаСайт(КаталогНаДиске)
    
    СтруктураПараметровСайта = ПроцедурыОбменаССайтом.ПолучитьСтруктуруПараметровДляСоединения(ЭтотОбъект);
        
    МассивПодкаталогов = Новый Массив;
    Если ВыгружатьКартинки Тогда
        МассивПодкаталогов.Добавить(ПодкаталогКартинок);
    КонецЕсли;    
    
    Успешно = HTTPВыгрузитьНаСервер(СтруктураПараметровСайта, КаталогНаДиске, МассивПодкаталогов, Истина, "catalog");
        
    Попытка
        УдалитьФайлы(КаталогНаДиске, "*.*");
    Исключение
        СообщитьОбИсключительнойОшибке(Истина, );
    КонецПопытки;
    
    Возврат Успешно;
    
КонецФункции    

Функция СформироватьCMLКаталогаПредложений(СтруктураИзменений, ОбъектCMLКаталог, ОбъектCMLПакетПредложений, ИдКаталога,
    ПостроительОтчетаРезультат, КаталогНаДиске)
    
    // Заголовок каталога
    ОбъектCMLКаталог.ЗаписатьНачалоЭлемента("Каталог");
    ЗаписатьТекстовойУзел(ОбъектCMLКаталог, "Ид", Строка(ИдКаталога));
    ЗаписатьТекстовойУзел(ОбъектCMLКаталог, "ИдКлассификатора", Строка(ИдКаталога));
    ЗаписатьТекстовойУзел(ОбъектCMLКаталог, "Наименование", НаименованиеКаталогаТоваровCML);
    
    // Заголовок пакета предложений
    ОбъектCMLПакетПредложений.ЗаписатьНачалоЭлемента("ПакетПредложений");
    ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "Ид", Строка(ИдКаталога) + "#");
    ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "Наименование"       , НаименованиеПакетаПредложенийCML);
    ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "ИдКаталога"       , Строка(ИдКаталога));
    ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "ИдКлассификатора", Строка(ИдКаталога));
    
    // Типы цен для пакета предложений
    ТаблицаТиповЦен = ПостроительОтчетаРезультат.Выгрузить();
    ТаблицаТиповЦен.Свернуть("ТипЦен");
    СтрокаNULL = ТаблицаТиповЦен.Найти(NULL, "ТипЦен");
    Если СтрокаNULL <> Неопределено Тогда
        ТаблицаТиповЦен.Удалить(СтрокаNULL);
    КонецЕсли;    
    
    Если ТаблицаТиповЦен.Количество()>0 Тогда
        
        ОбъектCMLПакетПредложений.ЗаписатьНачалоЭлемента("ТипыЦен");
        Для Каждого СтрокаТипЦены Из ТаблицаТиповЦен Цикл
            
            ОбъектCMLПакетПредложений.ЗаписатьНачалоЭлемента("ТипЦены");
            Ид = Строка(СтрокаТипЦены.ТипЦен.УникальныйИдентификатор());
            ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "Ид", Ид);
            ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "Наименование", ФорматНаименованияДляCML(СтрокаТипЦены.ТипЦен));
            ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "Валюта",       СтрокаТипЦены.ТипЦен.ВалютаЦены);
            ОбъектCMLПакетПредложений.ЗаписатьНачалоЭлемента("Налог");
            ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "Наименование", НаименованиеНалога);
            ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "УчтеноВСумме", СтрокаТипЦены.ТипЦен.ЦенаВключаетНДС);
            ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();
            ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();
            
        КонецЦикла;
        ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();
        
    КонецЕсли;    
    
    
    РезультатДерево = ПостроительОтчетаРезультат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Всего                            = РезультатДерево.Строки.Количество();
    Выгружено                        = 0;
    ВыгруженоКартинок              = 0;
    ВыгруженоПредложений         = 0;
    
    Если Всего > 0 Тогда
        
        ОбъектCMLКаталог.ЗаписатьНачалоЭлемента("Товары");
        ОбъектCMLПакетПредложений.ЗаписатьНачалоЭлемента("Предложения");
        
        Для Каждого СтрокаГруппировкиНоменклатураСсылка Из РезультатДерево.Строки  Цикл
            
            Для Каждого СтрокаГруппировкиХарактеристикаСсылка Из СтрокаГруппировкиНоменклатураСсылка.Строки  Цикл
                
                // Каталог
                СписокЗначенийCML = Новый СписокЗначений;
                ЗаполнитьСписокЗначенийОсновныхРеквизитовТовара(СписокЗначенийCML, СтрокаГруппировкиХарактеристикаСсылка);
                ЗаполнитьСписокЗначенийРеквизитовТовара(СтруктураИзменений, СписокЗначенийCML, СтрокаГруппировкиХарактеристикаСсылка, КаталогНаДиске, ВыгруженоКартинок);
                Выгружено = Выгружено + 1;
                
                ОбъектCMLКаталог.ЗаписатьНачалоЭлемента("Товар");
                ЗаписатьCMLПоСпискуЗначений(ОбъектCMLКаталог, СписокЗначенийCML);
                ОбъектCMLКаталог.ЗаписатьКонецЭлемента();    
                
                #Если Клиент Тогда
                Если Выгружено % 100 = 0 Тогда
                        
                    ОтобразитьСостояние("Выгружено объектов: " + Выгружено + ". Выгружается: " + СтрокаГруппировкиХарактеристикаСсылка.НоменклатураСсылка);
                    
                КонецЕсли;
                #КонецЕсли
                
                // Предожения
                СписокЗначенийCML = Новый СписокЗначений;
                Кратко = Истина;
                ЗаполнитьСписокЗначенийОсновныхРеквизитовТовара(СписокЗначенийCML, СтрокаГруппировкиХарактеристикаСсылка);
                КоличествоЦен = ЗаполнитьСписокЗначенийПредложения(СписокЗначенийCML, СтрокаГруппировкиХарактеристикаСсылка);
                
                Если КоличествоЦен > 0 Тогда
                    ВыгруженоПредложений = ВыгруженоПредложений + 1;
                    ОбъектCMLПакетПредложений.ЗаписатьНачалоЭлемента("Предложение");
                    ЗаписатьCMLПоСпискуЗначений(ОбъектCMLПакетПредложений, СписокЗначенийCML);
                    ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();
                КонецЕсли;    
                
            КонецЦикла;    
            
        КонецЦикла;
        
        ОбъектCMLКаталог.ЗаписатьКонецЭлемента();
        ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();
        
    КонецЕсли;
    
    // Завершаем каталог
    ЗаписатьТекстовойУзел(ОбъектCMLКаталог, "СодержитТолькоИзменения", ВыгружатьТолькоИзменения);
    ОбъектCMLКаталог.ЗаписатьКонецЭлемента();
    
    // Завершаем пакет предложений
    ЗаписатьТекстовойУзел(ОбъектCMLПакетПредложений, "СодержитТолькоИзменения", ВыгружатьТолькоИзменения);
    ОбъектCMLПакетПредложений.ЗаписатьКонецЭлемента();

    СтруктураВозврата = Новый Структура("ВыгруженоТоваров,ВыгруженоКартинок,ВыгруженоПредложений", Выгружено, ВыгруженоКартинок, ВыгруженоПредложений);
    
    Возврат СтруктураВозврата;
    
КонецФункции


Третья часть
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ УПРАВЛЕНИЯ ОБМЕНОМ ЗАКЗАМИ


Функция ВыполнитьОбменЗаказами(СтруктураИзменений)
    
    Если НЕ ОпределитьМожноВыгружатьЗаказы() Тогда
        
        СообщитьПользователю("Выгрузка заказов не произведена.", Истина);
        Возврат Истина;
        
    КонецЕсли;
    
    мМассивЗагруженныхДокументов = Новый Массив();
    КоличествоОбработанныхДокументовНаЗагрузке = 0;
    КоличествоОбработанныхДокументовНаВыгрузке = 0;
    
    Если ВыгружатьНаСайт Тогда
        
        HTTPОбменАдресСкрипта = НачалоАдресаСкрипта;
        СтруктураПараметровСайта = ПроцедурыОбменаССайтом.ПолучитьСтруктуруПараметровДляСоединения(ЭтотОбъект);        
        
        мСтруктураИнформацииИсторииОбмена.ДатаПоследнейЗагрузки = Текущаядата();
        
        УспешноЗагружено = HTTPЗагрузитьССервера(СтруктураПараметровСайта, "sale", КоличествоОбработанныхДокументовНаЗагрузке);
        
        мСтруктураИнформацииИсторииОбмена.РезультатПоследнейЗагрузки = УспешноЗагружено;
        мСтруктураИнформацииИсторииОбмена.ДатаПоследнейЗагрузки = Текущаядата();
        
        УспешноВыгружено = ВыгрузитьЗаказыНаСайт(СтруктураИзменений, СтруктураПараметровСайта, КоличествоОбработанныхДокументовНаВыгрузке);
        
    Иначе
        
        УспешноЗагружено = ЗагрузитьЗаказыИзФайла(КоличествоОбработанныхДокументовНаЗагрузке);
        УспешноВыгружено = ВыгрузитьЗаказыВФайл(СтруктураИзменений, СтруктураПараметровСайта, КаталогВыгрузки, КоличествоОбработанныхДокументовНаВыгрузке);
        
    КонецЕсли;    
    
    Успешно = УспешноЗагружено И УспешноВыгружено;
    
    Если Успешно Тогда
        
        Если КоличествоОбработанныхДокументовНаЗагрузке + КоличествоОбработанныхДокументовНаВыгрузке > 0 Тогда
            СообщитьПользователю("Обмен заказами успешно завершен", Истина);
        КонецЕсли;
        
    Иначе
        СообщитьПользователю("Обмен заказами завершен с ошибками!!!", Истина);
    КонецЕсли;
    
    Возврат Успешно;
    
КонецФункции    

Функция ВыгрузитьЗаказыНаСайт(СтруктураИзменений, СтруктураПараметровСайта, КоличествоОбработанныхДокументовНаВыгрузке)
    
    КаталогОбмена = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор);
    
    КоличествоОбработанныхДокументовНаВыгрузке = 0;
    Успешно = ВыгрузитьЗаказыВФайл(СтруктураИзменений, СтруктураПараметровСайта, КаталогОбмена, КоличествоОбработанныхДокументовНаВыгрузке);
    
    Если Не Успешно    Тогда
        Возврат Ложь;
    ИначеЕсли КоличествоОбработанныхДокументовНаВыгрузке = 0 Тогда
        Возврат Истина;
    КонецЕсли;
    
    Успешно = HTTPВыгрузитьНаСервер(СтруктураПараметровСайта, КаталогОбмена, , , "sale");
    
    Попытка
        УдалитьФайлы(КаталогОбмена);
    Исключение
    КонецПопытки;
        
    Возврат Успешно;
    
КонецФункции

Функция ЗагрузитьЗаказыИзФайла(КоличествоОбработанныхДокументов)
    
    КоличествоОбработанныхДокументов = 0;
    
    Файл = Новый Файл(ФайлЗагрузки);
    Если НЕ Файл.Существует()
        ИЛИ Файл.ЭтоКаталог() Тогда
        
        Возврат Истина;
        
    КонецЕсли;
    
    мСтруктураИнформацииИсторииОбмена.ДатаПоследнейЗагрузки = Текущаядата();
    
    ФайлCML = Новый ТекстовыйДокумент;
    ФайлCML.Прочитать(ФайлЗагрузки);
    СтрокаCML = ФайлCML.ПолучитьТекст();
    ДеревоДокументов = РазобратьCML(СтрокаCML);
    
    Если ДеревоДокументов = Неопределено Тогда
        
        мСтруктураИнформацииИсторииОбмена.РезультатПоследнейЗагрузки = Истина;
        мСтруктураИнформацииИсторииОбмена.ДатаПоследнейЗагрузки = Текущаядата();
        Возврат Истина;
        
    КонецЕсли;
        
    Успешно = ОбработатьДокументы(ДеревоДокументов, КоличествоОбработанныхДокументов);
    Если НЕ Успешно Тогда
        СообщитьОбОшибкеОбмена("Не удалось обработать документы, загруженные из файла.", Ложь);        
    КонецЕсли;    
    
    мСтруктураИнформацииИсторииОбмена.РезультатПоследнейЗагрузки = Успешно;
    мСтруктураИнформацииИсторииОбмена.ДатаПоследнейЗагрузки = Текущаядата();
        
    Возврат Успешно;
    
КонецФункции    

Функция ВыгрузитьЗаказыВФайл(СтруктураИзменений, СтруктураПараметровСайта, Знач КаталогДляВыгрузки = "", КоличествоВыгруженныхЗаказов = 0)
    
    Успешно = Истина;
    КоличествоВыгруженныхЗаказов = 0;
    
    МассивИзменений   = Новый Массив;
    
    Если ВыгружатьТолькоИзменения Тогда
        
        МассивИзменений = СтруктураИзменений.Заказы;
        
        // из этого массива нужно удалить все только что загруженные заказы
        Для Каждого Эл Из мМассивЗагруженныхДокументов Цикл
            
            ИндексЭлемента = МассивИзменений.Найти(Эл);
            Если ИндексЭлемента <> Неопределено Тогда
                МассивИзменений.Удалить(ИндексЭлемента);
            КонецЕсли;
            
        КонецЦикла;
        
        Если МассивИзменений.Количество() = 0 Тогда
                
            СообщитьПользователю("Изменения заказов не зарегистрированы. Выгрузка заказов не произведена.", Истина);
            Возврат Истина;
            
        КонецЕсли;    
            
    КонецЕсли;
    
    ОбъектCMLСтрока   = "";
    ТаблицаДокументов = СформироватьCMLСРанееЗагруженнымиЗаказами(ОбъектCMLСтрока, МассивИзменений);
    
    КоличествоВыгруженныхЗаказов = ТаблицаДокументов.Количество();
    
    Если КоличествоВыгруженныхЗаказов = 0 Тогда
        
        СообщитьПользователю("Не выгружен ни один заказ.", Истина);
        Возврат Успешно;
        
    КонецЕсли;
    
    Если ПустаяСтрока(КаталогДляВыгрузки) Тогда
        Возврат Ложь;
    КонецЕсли;
        
    ИмяФайлаОбмена          = "1cbitrix-" + Строка(Новый УникальныйИдентификатор) + ".xml";
    ПолноеИмяФайлаОбмена = КаталогДляВыгрузки + "\" + ИмяФайлаОбмена;
    
    СоздатьКаталог(КаталогДляВыгрузки);
    
    ФайлCMLНаДиске = Новый ТекстовыйДокумент;
    ФайлCMLНаДиске.УстановитьТекст(ОбъектCMLСтрока);
    
    Попытка
        ФайлCMLНаДиске.Записать(ПолноеИмяФайлаОбмена);
    Исключение
        СообщитьОбИсключительнойОшибке(Истина, "Не удалось записать CML файл на диск.");
        Возврат Ложь;
    КонецПопытки;
    
    СообщитьПользователю("Выгружено заказов: " + ТаблицаДокументов.Количество(), Истина);    
    Возврат Истина;
    
КонецФункции


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ УПРАВЛЕНИЯ ПРОФИЛЯМИ (НАСТРОЙКАМИ)

Функция ОпределитьМожноВыгрузитьТовары()
    
    ЕстьКаталогВыгрузки   = ЗначениеЗаполнено(КаталогВыгрузки);
    ЕстьСайт              = ЗначениеЗаполнено(HTTPОбменСервер);
    
    Если ВыгружатьНаСайт Тогда
        Возврат ЕстьСайт;
    Иначе
        Возврат ЕстьКаталогВыгрузки;
    КонецЕсли;
    
КонецФункции

Функция ОпределитьМожноВыгружатьЗаказы()
    
    ЕстьФайлЗагрузки             = ЗначениеЗаполнено(ФайлЗагрузки);
    ЕстьСайт                      = ЗначениеЗаполнено(HTTPОбменСервер);    

    ЕстьОрганизация              = ЗначениеЗаполнено(Организация);
    ЕстьПараметрыИдентификации  = ЗначениеЗаполнено(СпособИдентификацииКонтрагентов);
    ЕстьЕдиницаИзмерения        = ЗначениеЗаполнено(ЕдиницаИзмеренияНовойНоменклатуры);
    
    Если ВыгружатьНаСайт Тогда
        Возврат    ЕстьСайт И ЕстьОрганизация И ЕстьПараметрыИдентификации И ЕстьЕдиницаИзмерения;
    Иначе
        Возврат ЕстьФайлЗагрузки;
    КонецЕсли;    
    
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ОБРАБОТКИ ФАЙЛОВ


Функция РаспаковатьZIPАрхив(СтрокаZIP)
    
    СтрокаСодержимого = "ZIP_ERROR";
    
    ИмяФайла    = ПолучитьИмяВременногоФайла("zip");
    ИмяКаталога = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор);
    СоздатьКаталог(ИмяКаталога);
    
    СтрокаВФайл = Новый ТекстовыйДокумент;
    СтрокаВФайл.УстановитьТекст(СтрокаZIP);
    Попытка
        СтрокаВФайл.Записать(ИмяФайла);
    Исключение
    КонецПопытки;
    
    ЧтениеZIP = Новый ЧтениеZIPФайла(ИмяФайла);
    ЧтениеZIP.ИзвлечьВсе(ИмяКаталога);
    ЧтениеZIP.Закрыть();
    
    РаспакованныеФайлы = НайтиФайлы(ИмяКаталога, "*.xml");
    
    Если РаспакованныеФайлы.Количество() = 1 Тогда
        СтрокаИзФайла       = Новый ТекстовыйДокумент;
        СтрокаИзФайла.Прочитать(РаспакованныеФайлы[0].ПолноеИмя);
        СтрокаСодержимого = СтрокаИзФайла.ПолучитьТекст();
    КонецЕсли;
    
    Попытка
        УдалитьФайлы(ИмяФайла);
        УдалитьФайлы(ИмяКаталога);
    Исключение
    КонецПопытки;
    
    Возврат СтрокаСодержимого;
    
КонецФункции    

Функция РазделитьФайлыНаФрагменты(СписокФайлов, ОграничениеРазмераФрагмента)
    
    НовыйСписокФайлов = Новый СписокЗначений;
    Для Каждого ТекФайл Из СписокФайлов цикл
        
        ФайлНаДиске = Новый Файл(ТекФайл.Значение);
        Если ФайлНаДиске.Размер() > ОграничениеРазмераФрагмента Тогда
            МассивФрагментов = РазделитьФайл(ФайлНаДиске.ПолноеИмя, ОграничениеРазмераФрагмента);
            Для Каждого НовыйФайл Из МассивФрагментов Цикл
                НовыйСписокФайлов.Добавить(НовыйФайл, ТекФайл.Представление);
            КонецЦикла;    
            УдалитьФайлы(ФайлНаДиске.ПолноеИмя);
        Иначе
            НовыйСписокФайлов.Добавить(ТекФайл.Значение, ТекФайл.Представление);    
        КонецЕсли;    
        
    КонецЦикла;
    Возврат НовыйСписокФайлов;
    
КонецФункции

Функция ПодготовитьZIPАрхивы(СписокФайлов, КаталогОбмена)
    
    ПолноеИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip");
    ЗаписьАрхива            = Новый ЗаписьZipФайла(ПолноеИмяФайлаАрхива);
    
    СоздатьКаталог(КаталогОбмена);
    
    ЗаписьАрхива.Добавить(КаталогОбмена + "\*.*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
    ЗаписьАрхива.Записать();
    
    НовыйСписокФайлов = Новый СписокЗначений;
    НовыйСписокФайлов.Добавить(ПолноеИмяФайлаАрхива, ПолучитьИмяФайла(ПолноеИмяФайлаАрхива));
    
    Возврат НовыйСписокФайлов;
    
КонецФункции

Функция ПолучитьИмяФайла(ПолноеИмяФайла)
    
    ИмяФайла = "";
        
    ПромТекст = СтрЗаменить(ПолноеИмяФайла, "/", "\");
    ПромТекст = СтрЗаменить(ПолноеИмяФайла, "\", Символы.ПС);
        
    КоличествоЭлементов = СтрЧислоСтрок(ПромТекст);
    Для Счетчик = 1 По КоличествоЭлементов Цикл
        ИмяФайла = СтрПолучитьСтроку(ПромТекст, Счетчик);
    КонецЦикла;    
        
    Возврат ИмяФайла;
    
КонецФункции

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

Функция УдалитьДополнительныеРасширенияФайла(ИсходноеИмяФайла)

    ПозицияТочки               = Найти(ИсходноеИмяФайла, ".");
    ИмяФайла                  = Лев(ИсходноеИмяФайла, ПозицияТочки - 1);
    ПраваяЧастьИсходногоИмени = Прав(ИсходноеИмяФайла, СтрДлина(ИсходноеИмяФайла) - ПозицияТочки);
    ПозицияТочки               = Найти(ПраваяЧастьИсходногоИмени, ".");
    Расширение                   = ПраваяЧастьИсходногоИмени;
    Если ПозицияТочки > 0 Тогда
        Расширение = Лев(ПраваяЧастьИсходногоИмени, ПозицияТочки - 1);    
    КонецЕсли;    
    
    Возврат ИмяФайла + "." + Расширение;
    
КонецФункции    

Функция ПолучитьСписокФайловДляОтправки(КаталогОбмена, МассивПодкаталогов);
    
    СписокФайлов = Новый СписокЗначений;
    Маска         = "*.*";
    
    ВсеФайлыДляВыгрузки = НайтиФайлы(КаталогОбмена, Маска);
    
    Если МассивПодкаталогов <> Неопределено Тогда
        
        Для Каждого Подкаталог Из МассивПодкаталогов Цикл
            
            ФайлыВПодкаталоге = НайтиФайлы(КаталогОбмена + "\" + Подкаталог, Маска);
            Для Каждого ТекФайл Из ФайлыВПодкаталоге Цикл
                
                Если ТекФайл.ЭтоКаталог() Тогда
                    
                    ФайлыВДобавочномПодкаталоге = НайтиФайлы(ТекФайл.ПолноеИмя, Маска);
                    Для Каждого ТекФайлВПодкаталоге Из ФайлыВДобавочномПодкаталоге Цикл
                        
                        Если НЕ ТекФайлВПодкаталоге.ЭтоКаталог() Тогда    
                            ВсеФайлыДляВыгрузки.Добавить(ТекФайлВПодкаталоге);                                  
                        КонецЕсли;    
                        
                    КонецЦикла;    
                    
                Иначе    
                    ВсеФайлыДляВыгрузки.Добавить(ТекФайл);  
                КонецЕсли;    
                
            КонецЦикла;    
            
        КонецЦикла;            
                
    КонецЕсли;
    
    Для Каждого ТекФайл Из ВсеФайлыДляВыгрузки цикл
        
        Если НЕ ТекФайл.ЭтоКаталог() Тогда
            ПолноеИмяФайлаДляСервера = ПодготовитьИмяФайлаДляСервера(ТекФайл, КаталогОбмена);
            СписокФайлов.Добавить(ТекФайл.ПолноеИмя, ПолноеИмяФайлаДляСервера);
        КонецЕсли;    
        
    КонецЦикла;    
    
    Возврат СписокФайлов;
    
КонецФункции        


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОПИСАНИЯ И ВЫВОДА ОШИБОК И СООБЩЕНИЙ

Функция ПолучитьСтруктуруИнформацииДляИстории()
    
    СтруктураДляИстории = Новый Структура("ДатаПоследнейЗагрузки,ДатаПоследнейВыгрузки,ДатаНачалаПоследнейЗагрузки,
        |ДатаНачалаПоследнейВыгрузки,РезультатПоследнейЗагрузки,РезультатПоследнейВыгрузки,
        |КомментарийКЗагрузкеДанных,КомментарийКВыгрузкеДанных");
        
    СтруктураДляИстории.КомментарийКЗагрузкеДанных = "";
    СтруктураДляИстории.КомментарийКВыгрузкеДанных = "";
    
    Возврат СтруктураДляИстории;
    
КонецФункции

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

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

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

Процедура ДобавитьТекстКСообщениюДляПользователя(ТекущееСообщение, ДобавляемоеСообщение)
    
    ТекущееСообщение = СокрЛП(ТекущееСообщение + Символы.ПС + ДобавляемоеСообщение);    
    
КонецПроцедуры

Процедура СообщитьПользователю(ТекстСообщения, ИнформацияОВыгрузке, Статус = Неопределено)
    
    Если ИнформацияОВыгрузке Тогда
        ДобавитьТекстКСообщениюДляПользователя(мСтруктураИнформацииИсторииОбмена.КомментарийКВыгрузкеДанных, ТекстСообщения);
    Иначе
        ДобавитьТекстКСообщениюДляПользователя(мСтруктураИнформацииИсторииОбмена.КомментарийКЗагрузкеДанных, ТекстСообщения);
    КонецЕсли;
    
    #Если Клиент Тогда
        Если Статус = Неопределено Тогда
            Статус = СтатусСообщения.Обычное;    
        КонецЕсли;
        Сообщить(ТекстСообщения, Статус);    
    #КонецЕсли
    
КонецПроцедуры    

// Процедура выводит текст ответа сервера, если в нем имеется
// расширенное описание ошибки (строки, начиная со 2-й)
//
// Параметры:
//  ОтветСервера - строка, текст ответа сервера
//
Процедура СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера)
    
    ТекстСообщения = "Ответ сервера:" + Символы.ПС;
    
    Если СтрЧислоСтрок(ОтветСервера) > 1 Тогда
        Для ТекСтрока = 2 по СтрЧислоСтрок(ОтветСервера) Цикл
            ТекстСообщения = ТекстСообщения + СтрПолучитьСтроку(ОтветСервера, ТекСтрока) + Символы.ПС;
        КонецЦикла;    
    КонецЕсли;
    
    СообщитьПользователю(ТекстСообщения, Истина, СтатусСообщения.Информация);    

КонецПроцедуры    

// Процедура выводит текст сообщения об ошибке обмена
// и текст "Обмен не выполнен."
//
// Параметры:
//  ТекстСообщения - строка, текст сообщения
//
Процедура СообщитьОбОшибкеОбмена(ТекстСообщения, ИнформацияОВыгрузке)
    
    ТекстСообщения = ТекстСообщения + Символы.ПС + "Обмен не выполнен";
    СообщитьПользователю(ТекстСообщения, ИнформацияОВыгрузке, СтатусСообщения.Важное);    
    
КонецПроцедуры    

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


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ ОБРАБОТКИ ЗАГРУЖЕННЫХ ДАННЫХ


Функция ОбработатьНачалоЭлемента(ОбъектCML, Знач ИмяЭлемента, ДеревоДокументов);
    
    Успешно = Истина;
    
    ТекущаяСтрокаДерева        = Неопределено;
    ТекущаяСтрокаТоваровУслуг = Неопределено;
    
    КоличествоДокументов       = ДеревоДокументов.Строки.Количество();
    Если КоличествоДокументов > 0 Тогда
        
        ТекущаяСтрокаДерева    = ДеревоДокументов.Строки[КоличествоДокументов - 1];
        КоличествоТоваровУслуг = ТекущаяСтрокаДерева.Строки.Количество();
        
        Если КоличествоТоваровУслуг > 0 Тогда
            ТекущаяСтрокаТоваровУслуг = ТекущаяСтрокаДерева.Строки[КоличествоТоваровУслуг - 1];
        КонецЕсли;    
        
    КонецЕсли;    
    
    Если ИмяЭлемента = "Документ" Тогда
        
        НовыйДокумент                    = Документы.ЗаказПокупателя.СоздатьДокумент();
        НовыйДокумент.УчитыватьНДС       = Истина;
        НовыйДокумент.СуммаВключаетНДС = Истина;
        НовСтрокаДерева                = ДеревоДокументов.Строки.Добавить();
        НовСтрокаДерева.ДокументОбъект = НовыйДокумент;
        НовСтрокаДерева.СтавкаНДС        = Перечисления.СтавкиНДС.БезНДС;
        НовСтрокаДерева.СтруктураДанныхКонтрагента = Новый Структура;
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент" Тогда
        
        ДеревоАдресов = Новый ДеревоЗначений;
        ДеревоАдресов.Колонки.Добавить("ВидАдреса");
        ДеревоАдресов.Колонки.Добавить("Представление");
        ДеревоАдресов.Колонки.Добавить("Комментарий");
        ДеревоАдресов.Колонки.Добавить("ПолеТип");
        ДеревоАдресов.Колонки.Добавить("ПолеЗначение");
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
        ТаблицаКонтактов = Новый ТаблицаЗначений;
        ТаблицаКонтактов.Колонки.Добавить("КонтактТип");
        ТаблицаКонтактов.Колонки.Добавить("КонтактЗначение");
        ТаблицаКонтактов.Колонки.Добавить("КонтактКомментарий");
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактов", ТаблицаКонтактов);
        
        ТаблицаКонтактныхЛиц = Новый ТаблицаЗначений;
        ТаблицаКонтактныхЛиц.Колонки.Добавить("Наименование");
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц);
        
    //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности" Тогда        
    
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации" Тогда
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
        НовСтрокаДерева    = ДеревоАдресов.Строки.Добавить();
        НовСтрокаДерева.ВидАдреса = "АдресРегистрации";
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.АдресноеПоле" Тогда
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
        СтрокаДерева     = ДеревоАдресов.Строки.Найти("АдресРегистрации", "ВидАдреса");
        НовСтрокаДерева = СтрокаДерева.Строки.Добавить();
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
    //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Организация.Контрагент" Тогда    
    //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы" Тогда        
    
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес" Тогда
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
        НовСтрокаДерева    = ДеревоАдресов.Строки.Добавить();
        НовСтрокаДерева.ВидАдреса = "ЮридическийАдрес";
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.АдресноеПоле" Тогда
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
        СтрокаДерева     = ДеревоАдресов.Строки.Найти("ЮридическийАдрес", "ВидАдреса");
        НовСтрокаДерева = СтрокаДерева.Строки.Добавить();
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет" Тогда
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк" Тогда    
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес" Тогда    
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.АдресноеПоле" Тогда    
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк" Тогда
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес" Тогда    
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.АдресноеПоле" Тогда        
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес" Тогда    
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
        НовСтрокаДерева    = ДеревоАдресов.Строки.Добавить();
        НовСтрокаДерева.ВидАдреса = "Адрес";
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле" Тогда        
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
        СтрокаДерева     = ДеревоАдресов.Строки.Найти("Адрес", "ВидАдреса");
        НовСтрокаДерева = СтрокаДерева.Строки.Добавить();
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт" Тогда
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактов", ТаблицаКонтактов);
        ТаблицаКонтактов.Добавить();
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактов", ТаблицаКонтактов);
        
    ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Представители.Представитель.Контрагент" Тогда    
        
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц);
        ТаблицаКонтактныхЛиц.Добавить();
        ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц);
        
    //ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог" Тогда
    //ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка" Тогда
    //ИначеЕсли ИмяЭлемента = "Документ.ДопРасходы.ДопРасход" Тогда
        
    ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар" Тогда
        
        НовСтрокаДерева = ТекущаяСтрокаДерева.Строки.Добавить();
        
    ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.БазоваяЕдиница" Тогда        
        
        Пока ОбъектCML.ПрочитатьАтрибут() Цикл
            Если ОбъектCML.Имя = "Код" Тогда
                КодБазовойЕдиницы = ОбъектCML.Значение;
                ТекущаяСтрокаТоваровУслуг.ТоварУслугаБазоваяЕдиницаКод = КодБазовойЕдиницы;
                Прервать;
            КонецЕсли;    
        КонецЦикла
        
    ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.ЗначенияРеквизитов.ЗначениеРеквизита" Тогда
        
        ТекущаяСтрокаТоваровУслуг.Строки.Добавить();
        
    ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка" Тогда
        
        ТекущаяСтрокаТоваровУслуг.Строки.Добавить();
        
    ИначеЕсли ИмяЭлемента = "Документ.ЗначенияРеквизитов.ЗначениеРеквизита" Тогда
        
        НовСтрокаДерева = ТекущаяСтрокаДерева.Строки.Добавить();
        
    КонецЕсли;
    
    Возврат Успешно;
    
КонецФункции                      

Функция ОбработатьЗначениеЭлемента(Знач ИмяЭлемента, Знач ЗначениеЭлемента, ДеревоДокументов);
    
    Успешно              = Истина;
    КоличествоДокументов = ДеревоДокументов.Строки.Количество();
    ИмяТекущегоЭлемента  = ПолучитьИмяЭлементаИзПоследовательности(ИмяЭлемента);
    ДеревоАдресов         = Неопределено;
    ТаблицаКонтактов     = Неопределено;
    ТаблицаКонтактныхЛиц = Неопределено;
    
    Если КоличествоДокументов > 0 Тогда
        
        ТекущаяСтрокаДерева       = ДеревоДокументов.Строки[КоличествоДокументов - 1];
        ТекущийДокумент           = ТекущаяСтрокаДерева.ДокументОбъект;
        
        ТекущаяСтрокаТоваровУслуг = Неопределено;
        ТекущаяСтрокаСкидок       = Неопределено;
        
        КоличествоТоваровУслуг    = ТекущаяСтрокаДерева.Строки.Количество();
        
        Если КоличествоТоваровУслуг > 0 Тогда
            
            ТекущаяСтрокаТоваровУслуг = ТекущаяСтрокаДерева.Строки[КоличествоТоваровУслуг - 1];    
            
            КоличествоСкидок          = ТекущаяСтрокаТоваровУслуг.Строки.Количество();
            
            Если КоличествоСкидок > 0 Тогда
                ТекущаяСтрокаСкидок = ТекущаяСтрокаТоваровУслуг.Строки[КоличествоСкидок - 1];    
            КонецЕсли;
            
        КонецЕсли;    
                            
        Если ИмяЭлемента = "Документ.Номер" Тогда
            
            ТекущийДокумент.Организация   = Организация;
            ТекущийДокумент.Ответственный = Ответственный;
            ТекущийДокумент.Подразделение = Подразделение;
            ТекущийДокумент.Комментарий   = "№ " + ЗначениеЭлемента + " " + HTTPОбменСервер;
            
            ТекущийДокумент.НомерВходящегоДокументаЭлектронногоОбмена = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.НомерВходящий = ЗначениеЭлемента;
            
            ОтобразитьСостояние("Обработка документа CML: " + ТекущаяСтрокаДерева.НомерВходящий);
            
        ИначеЕсли ИмяЭлемента = "Документ.Дата" Тогда
            
            ДатаВремя = ОбработатьДатуВремяCML(ЗначениеЭлемента);
            
            Если ЗаписыватьДокументыТекущейДатой Тогда
                ТекущийДокумент.Дата = ТекущаяДата();
            Иначе    
                ТекущийДокумент.Дата = ДатаВремя;
            КонецЕсли;    
            
            ТекущийДокумент.ДатаВходящегоДокументаЭлектронногоОбмена = ДатаВремя;
            
        ИначеЕсли ИмяЭлемента = "Документ.Время" Тогда
            
            Если НЕ ЗаписыватьДокументыТекущейДатой Тогда
                ТекущийДокумент.Дата = ОбработатьДатуВремяCML(ЗначениеЭлемента, ТекущийДокумент.Дата);
            КонецЕсли;    
            
            ТекущийДокумент.ДатаВходящегоДокументаЭлектронногоОбмена = ОбработатьДатуВремяCML(ЗначениеЭлемента, ТекущийДокумент.ДатаВходящегоДокументаЭлектронногоОбмена);
                                                
        ИначеЕсли ИмяЭлемента = "Документ.ХозОперация" Тогда
            
            Если НЕ ЗначениеЭлемента = "Заказ товара" Тогда    
                СообщитьОбОшибкеОбмена("Ошибка в значении узла <Документ>.<ХозОперация> документа CML (" + ЗначениеЭлемента + ").", Ложь);
                Успешно = Ложь;
            КонецЕсли;    
                            
        ИначеЕсли ИмяЭлемента = "Документ.Валюта" Тогда
            
            ТекущийДокумент.ВалютаДокумента = ОбработатьВалютуCML(ЗначениеЭлемента);
            Если НЕ ЗначениеЗаполнено(ТекущийДокумент.ВалютаДокумента) Тогда
                СообщитьОбОшибкеОбмена("Ошибка в значении узла <Документ>.<Валюта> документа CML (" + ЗначениеЭлемента + ").", Ложь);
                Успешно = Ложь;
            КонецЕсли;    
            
        ИначеЕсли ИмяЭлемента = "Документ.Курс" Тогда
            
            КурсCML = Число(ЗначениеЭлемента);
            ТекущийДокумент.КурсВзаиморасчетов      = КурсCML;
            ТекущийДокумент.КратностьВзаиморасчетов = 1;
                            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Наименование" Тогда
            
              ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Наименование", ЗначениеЭлемента);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Комментарий" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Комментарий", ЗначениеЭлемента);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ПолноеНаименование"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.ОфициальноеНаименование" Тогда

            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("НаименованиеПолное", ЗначениеЭлемента);
            
            Если ИмяЭлемента = "Документ.Контрагенты.Контрагент.ПолноеНаименование" Тогда
                ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ЮрФизЛицо", Перечисления.ЮрФизЛицо.ФизЛицо);
            Иначе
                ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ЮрФизЛицо", Перечисления.ЮрФизЛицо.ЮрЛицо);
            КонецЕсли;
            
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Обращение" Тогда    
            //Не обрабатываем            
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Фамилия" Тогда
            //Не обрабатываем, это полное наименование            
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Имя" Тогда
            //Не обрабатываем, это полное наименование
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Отчество" Тогда
            //Не обрабатываем, это полное наименование
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ДатаРождения" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДатаРождения", ЗначениеЭлемента);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРождения" Тогда    
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("МестоРождения", ЗначениеЭлемента);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Пол" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Пол", ЗначениеЭлемента);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ИНН" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ИНН", ЗначениеЭлемента);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.ВидДокумента"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.Серия"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.Номер"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.ДатаВыдачи"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.КемВыдан" Тогда        
            
            СохраненноеЗначение = "";
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДокументУдостоверяющийЛичность", СохраненноеЗначение);
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДокументУдостоверяющийЛичность", СохраненноеЗначение + ЗначениеЭлемента + " ");
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.Представление"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.Комментарий" Тогда
              
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
            СтрокаДерева = ДеревоАдресов.Строки.Найти("АдресРегистрации", "ВидАдреса");
            СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.АдресноеПоле.Тип"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.АдресноеПоле.Значение" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
            СтрокаДерева = ДеревоАдресов.Строки.Найти("АдресРегистрации", "ВидАдреса");
            СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 1];
            СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
            
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Организация.Контрагент.Ид" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Организация.Контрагент.Наименование" Тогда        
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Должность" Тогда        
        
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.Представление"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.Комментарий" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
            СтрокаДерева = ДеревоАдресов.Строки.Найти("ЮридическийАдрес", "ВидАдреса");
            СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.АдресноеПоле.Тип"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.АдресноеПоле.Значение" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
            СтрокаДерева = ДеревоАдресов.Строки.Найти("ЮридическийАдрес", "ВидАдреса");
            СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 1];
            СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ОсновнойВидДеятельности" Тогда
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ОсновнойВидДеятельности", ЗначениеЭлемента);
            
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.НомерСчета" Тогда
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Комментарий" Тогда    
        //    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.СчетКорреспондентский" Тогда
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Наименование" Тогда
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.БИК" Тогда
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.SWIFT" Тогда    
        //    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.Представление" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.Комментарий" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.АдресноеПоле.Тип" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.АдресноеПоле.Значение" Тогда        
        //    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.СчетКорреспондентский" Тогда
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Наименование" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.БИК" Тогда
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.SWIFT" Тогда    
        //    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.Представление" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.Комментарий" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.АдресноеПоле.Тип" Тогда    
        //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.АдресноеПоле.Значение" Тогда        
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.Представление"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.Комментарий" Тогда    
              
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
            СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес", "ВидАдреса");
            СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле.Тип"    
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле.Значение" Тогда    
            
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов);
            СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес", "ВидАдреса");
            СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 1];
            СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт.Тип"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт.Значение"
              ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт.Комментарий" Тогда        
              
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактов", ТаблицаКонтактов);
            СтрокаТаблицы = ТаблицаКонтактов[ТаблицаКонтактов.Количество() - 1];
            СтрокаТаблицы["Контакт" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактов", ТаблицаКонтактов);
            
        ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Представители.Представитель.Контрагент.Наименование" Тогда        
              
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц);
            СтрокаТаблицы = ТаблицаКонтактныхЛиц[ТаблицаКонтактныхЛиц.Количество() - 1];
            СтрокаТаблицы["Наименование"] = ЗначениеЭлемента;
            ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц);
            
        ИначеЕсли ИмяЭлемента = "Документ.Комментарий" Тогда    
            
            ТекущийДокумент.Комментарий = ТекущийДокумент.Комментарий + ": " + ЗначениеЭлемента;
            
        //ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог.Наименование" Тогда
            // Не обрабатываем, это может быть только НДС
        ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог.УчтеноВСумме" Тогда
            
            ТекущийДокумент.СуммаВключаетНДС = Ложь;
            Если ЗначениеЭлемента = БулевоЗначениеCML_Истина Тогда
                ТекущийДокумент.СуммаВключаетНДС = Истина;
            КонецЕсли;    
            
        ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог.Ставка" Тогда
            
            ТекущийДокумент.УчитыватьНДС = ЗначениеЗаполнено(ЗначениеЭлемента);
            
            Если ТекущийДокумент.УчитыватьНДС Тогда
                
                ТекущаяСтрокаДерева.СтавкаНДС = ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(ЗначениеЭлемента);
                                
            КонецЕсли;    
            
        //ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка.Наименование" Тогда
            // Не обрабатываем, т.к. есть у товара
        ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка.Сумма" Тогда
            
            СуммаЧисло = Число(ЗначениеЭлемента);
            ТекущаяСтрокаДерева.СуммаСкидки = СуммаЧисло;
            
        ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка.УчтеноВСумме" Тогда
            
            ТекущаяСтрокаДерева.СкидкаВСумме = Ложь;
            Если ЗначениеЭлемента = БулевоЗначениеCML_Истина Тогда
                ТекущаяСтрокаДерева.СкидкаВСумме = Истина;
            КонецЕсли;
            
        ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Ид"
              ИЛИ ИмяЭлемента = "Документ.Товары.Товар.БазоваяЕдиница"
              ИЛИ ИмяЭлемента = "Документ.Товары.Товар.Наименование" Тогда
              
            ТекущаяСтрокаТоваровУслуг["ТоварУслуга" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            
        ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.ЦенаЗаЕдиницу"
              ИЛИ ИмяЭлемента = "Документ.Товары.Товар.Сумма"
              ИЛИ ИмяЭлемента = "Документ.Товары.Товар.Количество" Тогда
              
            ТекущаяСтрокаТоваровУслуг["ТоварУслуга" + ИмяТекущегоЭлемента] = Число(ЗначениеЭлемента);              
            
        //ИначеЕсли ИмяЭлемента = "Документ.ДопРасходы.ДопРасход.УчтеноВСумме" Тогда
            // Не обрабатываем
        //ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка.Наименование" Тогда
            // Не обрабатываем
            
        ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.ЗначенияРеквизитов.ЗначениеРеквизита.Наименование"
              ИЛИ ИмяЭлемента = "Документ.Товары.Товар.ЗначенияРеквизитов.ЗначениеРеквизита.Значение" Тогда
              
            ТекущаяСтрокаСкидок["ЗначениеРеквизита" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
              
        ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка.Сумма" Тогда
            
            СуммаЧисло = Число(ЗначениеЭлемента);
            ТекущаяСтрокаСкидок.СуммаСкидки = СуммаЧисло;
            
        ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка.УчтеноВСумме" Тогда
            
            ТекущаяСтрокаСкидок.СкидкаВСумме = Ложь;
            Если ЗначениеЭлемента = БулевоЗначениеCML_Истина Тогда
                ТекущаяСтрокаСкидок.СкидкаВСумме = Истина;
            КонецЕсли;    
            
        ИначеЕсли ИмяЭлемента = "Документ.ЗначенияРеквизитов.ЗначениеРеквизита.Наименование"
              ИЛИ ИмяЭлемента = "Документ.ЗначенияРеквизитов.ЗначениеРеквизита.Значение" Тогда
            
            ТекущаяСтрокаТоваровУслуг["Свойство" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
            
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат Успешно;

КонецФункции

Функция РазобратьCML(СтрокаCML)
    
    Успешно = Истина;
    
    ОбъектCML = Новый ЧтениеXML;
    
    Попытка
        ОбъектCML.УстановитьСтроку(СтрокаCML);
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь);
        Возврат Неопределено;
    КонецПопытки;
    
    ПоследовательностьЭлементов = "";
    
    ДеревоДокументов = Новый ДеревоЗначений;
    
    ДеревоДокументов.Колонки.Добавить("ДокументОбъект");
    ДеревоДокументов.Колонки.Добавить("НомерВходящий");
    ДеревоДокументов.Колонки.Добавить("РанееЗагруженныйДокументСсылка", Новый ОписаниеТипов("ДокументСсылка.ЗаказПокупателя"));
    ДеревоДокументов.Колонки.Добавить("ЕстьСсылкиНаРанееЗагруженныйДокумент", Новый ОписаниеТипов("Булево"));
    ДеревоДокументов.Колонки.Добавить("СтруктураДанныхКонтрагента");
    ДеревоДокументов.Колонки.Добавить("СтавкаНДС");
    
    // Подчинение документу
    
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаТипНоменклатуры");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаНаименование");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаБазоваяЕдиницаКод");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаБазоваяЕдиница");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаСумма");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаКомментарий");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаЦенаЗаЕдиницу");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаКоличество");
    ДеревоДокументов.Колонки.Добавить("ТоварУслугаИд");
    
    ДеревоДокументов.Колонки.Добавить("СвойствоНаименование");
    ДеревоДокументов.Колонки.Добавить("СвойствоЗначение");
    
    // Подчинение товарам/услугам
    
    ДеревоДокументов.Колонки.Добавить("СуммаСкидки");
    ДеревоДокументов.Колонки.Добавить("СкидкаВСумме");
    
    ДеревоДокументов.Колонки.Добавить("ЗначениеРеквизитаНаименование");
    ДеревоДокументов.Колонки.Добавить("ЗначениеРеквизитаЗначение");
    
    Пока Истина Цикл
        
        ОчереднойУзелCMLПрочитан = Ложь;
        
        Попытка
            ОчереднойУзелCMLПрочитан = ОбъектCML.Прочитать();
        Исключение
            Успешно = Ложь;
            СообщитьОбИсключительнойОшибке(Ложь);
            Прервать;
        КонецПопытки;    
        
        Если НЕ ОчереднойУзелCMLПрочитан Тогда
            Прервать;
        КонецЕсли;    
        
        ТипУзла = ОбъектCML.ТипУзла;
        ИмяУзла = ОбъектCML.Имя;
        
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            
            ПоследовательностьЭлементов = ДобавитьЭлементКПоследовательности(ПоследовательностьЭлементов, ИмяУзла);
            Успешно = ОбработатьНачалоЭлемента(ОбъектCML, ПоследовательностьЭлементов, ДеревоДокументов);
            Если НЕ Успешно Тогда
                СообщитьПользователю("Не удалось обработать начало элемента (" + ПоследовательностьЭлементов + ").", Ложь);
                Прервать;
            КонецЕсли;    
            
        ИначеЕсли ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

            ПоследовательностьЭлементов = УдалитьПоследнийЭлементИзПоследовательности(ПоследовательностьЭлементов);
            
        ИначеЕсли ТипУзла = ТипУзлаXML.Текст Тогда    
            
            ЗначениеЭлемента = ОбъектCML.Значение;  
            Успешно = ОбработатьЗначениеЭлемента(ПоследовательностьЭлементов, ЗначениеЭлемента, ДеревоДокументов);
            Если НЕ Успешно Тогда
                СообщитьПользователю("Не удалось обработать значение элемента (" + ПоследовательностьЭлементов + ") = (" + ЗначениеЭлемента + ").", Ложь);
                Прервать;
            КонецЕсли;    
            
        КонецЕсли;
        
    КонецЦикла;
    
    ОбъектCML.Закрыть();
    
    Если НЕ Успешно Тогда
        ДеревоДокументов = Неопределено;
    КонецЕсли;    
        
    Возврат ДеревоДокументов;
    
КонецФункции    

Функция ДобавитьЭлементКПоследовательности(Знач ПоследовательностьЭлементов, Знач ИмяУзла)
    
    ИсключатьИзПоследовательности = Новый Массив;
    ИсключатьИзПоследовательности.Добавить("КоммерческаяИнформация");
    
    Если ИсключатьИзПоследовательности.Найти(ИмяУзла) = Неопределено Тогда
        
        Если НЕ ПоследовательностьЭлементов = "" Тогда
            ПоследовательностьЭлементов = ПоследовательностьЭлементов + ".";    
        КонецЕсли;    
        ПоследовательностьЭлементов = ПоследовательностьЭлементов + ИмяУзла;
        
    КонецЕсли;
    
    Возврат ПоследовательностьЭлементов;

КонецФункции    
            
Функция УдалитьПоследнийЭлементИзПоследовательности(Знач ПоследовательностьЭлементов);
    
    ПромСтрока             = СтрЗаменить(ПоследовательностьЭлементов, ".", Символы.ПС);
    КоличествоЭлементов = СтрЧислоСтрок(ПромСтрока);
    
    ПоследовательностьЭлементов    = "";
    Если КоличествоЭлементов > 0 Тогда
        КоличествоЭлементов = КоличествоЭлементов - 1;
        Для Счетчик = 1 По КоличествоЭлементов Цикл
            ПоследовательностьЭлементов    = ПоследовательностьЭлементов + "." + СтрПолучитьСтроку(ПромСтрока, Счетчик);
        КонецЦикла;    
        ПоследовательностьЭлементов = Прав(ПоследовательностьЭлементов, СтрДлина(ПоследовательностьЭлементов) - 1);
    КонецЕсли;
    
    Возврат ПоследовательностьЭлементов;
КонецФункции    

Функция ПолучитьИмяЭлементаИзПоследовательности(Знач ПоследовательностьЭлементов)
    
    ПромСтрока             = СтрЗаменить(ПоследовательностьЭлементов, ".", Символы.ПС);
    КоличествоЭлементов = СтрЧислоСтрок(ПромСтрока);
    
    ИмяПоследнегоЭлемента = "";
    Если КоличествоЭлементов > 0 Тогда
        ИмяПоследнегоЭлемента = СтрПолучитьСтроку(ПромСтрока, КоличествоЭлементов);
    КонецЕсли;
    
    Возврат ИмяПоследнегоЭлемента;
    
КонецФункции    

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

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

Процедура ПолучитьРанееЗагруженныеДокументы(ДеревоДокументов)
    
    МассивНомеров = ДеревоДокументов.Строки.ВыгрузитьКолонку("НомерВходящий");
    
    Запрос = Новый Запрос();
    Запрос.УстановитьПараметр("Категория"     , Справочники.КатегорииОбъектов.ЗаказСWEBСайта);
    Запрос.УстановитьПараметр("МассивНомеров", МассивНомеров);
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Заказ.Ссылка КАК ДокументСсылка
        |ИЗ
        |   Документ.ЗаказПокупателя КАК Заказ
        |   Внутреннее соединение РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
        |        ПО (КатегорииОбъектов.Объект = Заказ.Ссылка)
        |            И КатегорииОбъектов.Категория = Значение(Справочник.КатегорииОбъектов.ЗаказСWEBСайта)
        |ГДЕ
        |    Заказ.НомерВходящегоДокументаЭлектронногоОбмена В (&МассивНомеров)";        
        
    РезультатЗапроса = Запрос.Выполнить();    
    Если РезультатЗапроса.Пустой() Тогда
        Возврат;
    КонецЕсли;
    
    МассивНайденныхСсылокНаДокументы = Новый Массив();
    
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        СтрокаДД = ДеревоДокументов.Строки.Найти(Выборка.ДокументСсылка.НомерВходящегоДокументаЭлектронногоОбмена, "НомерВходящий");
        СтрокаДД.РанееЗагруженныйДокументСсылка = Выборка.ДокументСсылка;            
        
        МассивНайденныхСсылокНаДокументы.Добавить(Выборка.ДокументСсылка);
        
    КонецЦикла;
    
    
    // ищем ссылки на ранее загруженные документы
    ТаблицаСсылок = НайтиПоСсылкам(МассивНайденныхСсылокНаДокументы);
        
    Для Каждого СтрокаТС Из ТаблицаСсылок Цикл
        
        Если Метаданные.РегистрыСведений.Содержит(СтрокаТС.Метаданные)
            ИЛИ СтрокаТС.Данные = СтрокаТС.Ссылка Тогда
            
            Продолжить;
            
        КонецЕсли;
        
        СтрокаДД = ДеревоДокументов.Строки.Найти(СтрокаТС.Ссылка, "РанееЗагруженныйДокументСсылка");
        СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент = Истина;
        
    КонецЦикла;    
    
    
    Для Каждого СтрокаДД Из ДеревоДокументов.Строки Цикл
        
        Если НЕ ЗначениеЗаполнено(СтрокаДД.РанееЗагруженныйДокументСсылка) Тогда
            Продолжить;
        КонецЕсли;
            
        ДокументОбъект = СтрокаДД.РанееЗагруженныйДокументСсылка.ПолучитьОбъект();

        Если НЕ СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда
            
            ЗаполнитьЗначенияСвойств(ДокументОбъект, СтрокаДД.ДокументОбъект, , "Номер");
            ДокументОбъект.Товары.Очистить();
            ДокументОбъект.Услуги.Очистить();
            
        КонецЕсли;    
        
        СтрокаДД.ДокументОбъект = ДокументОбъект;        
        
    КонецЦикла;
    
КонецПроцедуры    

Функция ОбработатьДатуВремяCML(ДатаВремяСтрока, НачальнаяДата = Неопределено)
    
    ДатаВремя = Неопределено;
    
    Если ЗначениеЗаполнено(НачальнаяДата) Тогда
        Время       = СтрЗаменить(ДатаВремяСтрока, ":", "");
        ДатаВремя = Дата(Формат(НачальнаяДата, "ДФ=yyyyMMdd") + Время);
    Иначе    
        ДатаВремя = Дата(СтрЗаменить(ДатаВремяСтрока, "-", "") + "000000");    
    КонецЕсли;    
    
    Возврат ДатаВремя;
КонецФункции

Функция ОбработатьВалютуCML(КодВалютыСтрока)
    Валюта = Справочники.Валюты.НайтиПоНаименованию(КодВалютыСтрока);
    Возврат Валюта;
КонецФункции    
    
Функция СоздатьОбновитьДокументы(ДеревоДокументов, СтруктураСтатистики, МассивДокументовДляПроведения, МассивЗагруженныхДокументов)
    
    Успешно = Истина;
    
    Для Каждого Док Из ДеревоДокументов.Строки Цикл
        
        // если на документ есть ссылки, то он вообще пропускается и не загружается
        Если Док.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда
            СтруктураСтатистики.Пропущено = СтруктураСтатистики.Пропущено + 1;
            Продолжить;
        КонецЕсли;
        
        Если ЗначениеЗаполнено(Док.РанееЗагруженныйДокументСсылка) Тогда
            СтруктураСтатистики.Обновлено = СтруктураСтатистики.Обновлено + 1;
        Иначе
            СтруктураСтатистики.Создано   = СтруктураСтатистики.Создано + 1;
        КонецЕсли;    
        
        Попытка
            
            Док.ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
            
            СсылкаНаДокумент = Док.ДокументОбъект.Ссылка;
            
            МассивЗагруженныхДокументов.Добавить(СсылкаНаДокумент);
            
            Если ПроводитьДокументы
                ИЛИ Док.ДокументОбъект.Проведен Тогда
                
                МассивДокументовДляПроведения.Добавить(Док.ДокументОбъект);    
                
            КонецЕсли;
            
        Исключение
            
            СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки());
            Возврат Ложь;
            
        КонецПопытки;
        
    КонецЦикла;    
    
    Возврат Успешно;
    
КонецФункции    

Функция ЗаписатьСвойстваДокументов(ДеревоДокументов, СтруктураСтатистики, МассивОтклоненныхДокументов)
    
    Успешно = Истина;
    
    Для Каждого СтрокаДД Из ДеревоДокументов.Строки Цикл
        
        Успешно = УстановитьКатегориюДокумента(СтрокаДД.ДокументОбъект.Ссылка, Справочники.КатегорииОбъектов.ЗаказСWEBСайта, Истина);
        
        Если НЕ Успешно Тогда
            СообщитьПользователю("Не удалось установить категорию документа ""Заказ с WEB-сайта""", Ложь);
            Прервать;
        КонецЕсли;    
                        
        Для Каждого ТоварУслугаСвойство Из СтрокаДД.Строки Цикл
        
            Если НЕ ЗначениеЗаполнено(ТоварУслугаСвойство.СвойствоНаименование) Тогда
                Продолжить;
            КонецЕсли;
                
            КатегорияСсылка = мСоответствиеНаименованийКатегорийДокумента[ТоварУслугаСвойство.СвойствоНаименование];
            
            Если КатегорияСсылка <> Неопределено Тогда
            
                ОбъектПринадлежитКатегории = (ТоварУслугаСвойство.СвойствоЗначение = БулевоЗначениеCML_Истина)
                    ИЛИ (ТоварУслугаСвойство.СвойствоЗначение = БулевоЗначениеCML_Да);
                                
                Успешно = УстановитьКатегориюДокумента(СтрокаДД.ДокументОбъект.Ссылка, КатегорияСсылка, ОбъектПринадлежитКатегории);
                    
                Если НЕ Успешно Тогда
                    
                    СообщитьПользователю("Не удалось установить категорию документа - " + Строка(КатегорияСсылка), Ложь);
                    Прервать;
                    
                КонецЕсли;
                    
                Если ОбъектПринадлежитКатегории Тогда
                    
                    Если КатегорияСсылка = Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеОплачен Тогда
                        СтруктураСтатистики.ОплаченСписок.Добавить(СтрокаДД.ДокументОбъект.Ссылка);
                    ИначеЕсли КатегорияСсылка = Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеДоставкаРазрешена Тогда
                        СтруктураСтатистики.ДоставкаРазрешенаСписок.Добавить(СтрокаДД.ДокументОбъект.Ссылка);
                    ИначеЕсли КатегорияСсылка = Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеЗавершен Тогда
                        СтруктураСтатистики.ФинальныйСтатусСписок.Добавить(СтрокаДД.ДокументОбъект.Ссылка);
                    ИначеЕсли КатегорияСсылка = Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеОтменен Тогда
                        МассивОтклоненныхДокументов.Добавить(СтрокаДД.ДокументОбъект.Ссылка);
                    КонецЕСли;    
                    
                КонецЕсли;
                
            Иначе
            
                ИмяСвойства      = ТоварУслугаСвойство.СвойствоНаименование;
                ЗначениеСвойства = ТоварУслугаСвойство.СвойствоЗначение;
                
                Если ЗначениеЗаполнено(ИмяСвойства)
                   И ЗначениеЗаполнено(ЗначениеСвойства) Тогда
                  
                    Успешно = НайтиСоздатьУстановитьСвойствоДокумента(СтрокаДД.ДокументОбъект.Ссылка, ИмяСвойства, ЗначениеСвойства);
                    
                    Если НЕ Успешно Тогда
                        СообщитьПользователю("Не удалось установить свойство документа - " + ИмяСвойства, Ложь);
                        Прервать;
                    КонецЕсли;    
                  
                КонецЕсли;
                
            КонецЕсли;    
            
        КонецЦикла;
        
    КонецЦикла;    
    
    Возврат Успешно;
    
КонецФункции    

Функция УстановитьКатегориюДокумента(ОбъектСсылка, КатегорияСсылка, ОбъектПринадлежитКатегории);
    
    НаборЗаписей = РегистрыСведений.КатегорииОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(ОбъектСсылка);
    НаборЗаписей.Отбор.Категория.Установить(КатегорияСсылка);
    
    Если ОбъектПринадлежитКатегории Тогда
        
        Запись = НаборЗаписей.Добавить();
        Запись.Объект = ОбъектСсылка;
        Запись.Категория = КатегорияСсылка;
        
    КонецЕсли;    
    
    Попытка
        
        НаборЗаписей.Записать();
        
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь, "Не удалось установить/снять категорию """ + КатегорияСсылка.Наименование + """ документу " + Строка(ОбъектСсылка));
        Возврат Ложь;
    КонецПопытки;
    
    Возврат Истина;
    
КонецФункции    

Функция НайтиСоздатьУстановитьСвойствоДокумента(ОбъектСсылка, ИмяСвойства, ЗначениеСвойства);
    
    Успешно = Истина;
    
    СвойствоСсылка      = ПланыВидовХарактеристик.СвойстваОбъектов.ПустаяСсылка();
    НазначениеСсылка = ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документ_ЗаказПокупателя;
    
    ТипНазначенияСвойств = Новый ОписаниеТипов("ДокументСсылка.ЗаказПокупателя");
    
    Запрос = Новый Запрос();
    Запрос.УстановитьПараметр("Назначение" , НазначениеСсылка);
    Запрос.УстановитьПараметр("ИмяСвойства", ИмяСвойства);
    
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    СвойстваОбъектов.Ссылка Как СвойствоСсылка
        |ИЗ
        |    ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
        |ГДЕ
        |    СвойстваОбъектов.НазначениеСвойства = &Назначение
        |    И СвойстваОбъектов.Наименование = &ИмяСвойства";
        
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        СвойствоСсылка = Выборка.СвойствоСсылка;    
    КонецЕсли;    
    
    Если СвойствоСсылка = ПланыВидовХарактеристик.СвойстваОбъектов.ПустаяСсылка() Тогда
        
        НовоеСвойство = ПланыВидовХарактеристик.СвойстваОбъектов.СоздатьЭлемент();
        НовоеСвойство.НазначениеСвойства = НазначениеСсылка;
        НовоеСвойство.Наименование          = ИмяСвойства;
        ОписаниеТипов                      = Новый ОписаниеТипов(Строка(ТипЗнч(ЗначениеСвойства)));
        НовоеСвойство.ТипЗначения          = ОписаниеТипов;    

        Попытка
            НовоеСвойство.Записать();
        Исключение
            СообщитьОбИсключительнойОшибке(Ложь, "Не удалось записать свойство документа " + ИмяСвойства);
            Возврат Ложь;
        КонецПопытки;    
        
        СвойствоСсылка = НовоеСвойство.Ссылка;
        
    КонецЕсли;    
    
    Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    Запись.Значение = ЗначениеСвойства;
    Запись.Объект    = ОбъектСсылка;
    Запись.Свойство = СвойствоСсылка;
    
    Попытка
        Запись.Записать();
    Исключение
        Успешно = Ложь;
        СообщитьОбИсключительнойОшибке(Ложь, "Не удалось записать значение свойства " + ЗначениеСвойства);
    КонецПопытки;    
    
    Возврат Успешно;
    
КонецФункции    

Функция ИдентифицироватьКонтрагентов(ДеревоДокументов)
    
    Успешно = Истина;
    
    Для Каждого СтрокаДД Из ДеревоДокументов.Строки Цикл
        
        Если СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда
            Продолжить;
        КонецЕсли;    
        
        ОтобразитьСостояние("Идентификация контрагента: " + СтрокаДД.СтруктураДанныхКонтрагента.Наименование);
        
        Запрос = Новый Запрос();
        
        ИНН = "";
        СтрокаДД.СтруктураДанныхКонтрагента.Свойство("ИНН", ИНН);
        Запрос.УстановитьПараметр("Наименование", СтрокаДД.СтруктураДанныхКонтрагента.Наименование);
        Запрос.УстановитьПараметр("ИНН", ИНН);
        
        Запрос.Текст =
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    Контрагенты.Ссылка Как Контрагент
            |ИЗ
            |    Справочник.Контрагенты КАК Контрагенты
            |ГДЕ
            |";
            
        НуженПоискПоИнн = (СпособИдентификацииКонтрагентов = "ИНН")
            И ЗначениеЗаполнено(ИНН);
            
        Если НуженПоискПоИнн Тогда
            Запрос.Текст = Запрос.Текст + " Контрагенты.КодПоЕДРПОУ = &ИНН ";            
        Иначе
            Запрос.Текст = Запрос.Текст + " Контрагенты.Наименование = &Наименование ";
        КонецЕсли;
                
        Выборка = Запрос.Выполнить().Выбрать();
        
        Если Выборка.Следующий() Тогда
            КонтрагентСсылка = Выборка.Контрагент;
        Иначе
            КонтрагентСсылка = СоздатьКонтрагента(СтрокаДД.СтруктураДанныхКонтрагента);
        КонецЕсли;
        
        Если НЕ ЗначениеЗаполнено(КонтрагентСсылка) Тогда
            
            Успешно = Ложь;
            Прервать;
            
        КонецЕсли;
        
        ЗаполнитьПодчиненныеДанныеКонтрагента(КонтрагентСсылка, СтрокаДД.СтруктураДанныхКонтрагента);
        
        Док = СтрокаДД.ДокументОбъект;
        
        Док.Контрагент = КонтрагентСсылка;
        
        Успешно = ПроверитьОсновнойДоговорКонтрагента(КонтрагентСсылка, Док);
        
        Если НЕ Успешно Тогда
            Прервать;
        КонецЕсли;
            
        мСтруктураПараметровДляПолученияДоговора = ЗаполнениеДокументов.ПолучитьСтруктуруПараметровДляПолученияДоговораЗаказаПокупателя();
        
        // нужны только договоры с покупателем и все
        мСтруктураПараметровДляПолученияДоговора.СписокДопустимыхВидовДоговоров.Очистить();
        мСтруктураПараметровДляПолученияДоговора.СписокДопустимыхВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
        
        СписокДопустимыхВидовВзаиморасчетов = Новый СписокЗначений();
        СписокДопустимыхВидовВзаиморасчетов.Добавить(Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоЗаказам);
        мСтруктураПараметровДляПолученияДоговора.Вставить("СписокДопустимыхВидовВзаиморасчетов", СписокДопустимыхВидовВзаиморасчетов);
        
        мСтруктураПараметровДляПолученияДоговора.Вставить("ВалютаВзаиморасчетовДоговора", Док.ВалютаДокумента);
        мСтруктураПараметровДляПолученияДоговора.Вставить("ВидСравненияВалютыВзаиморасчетов", "=");
        
        ЗаполнениеДокументов.ПриИзмененииЗначенияКонтрагента(Док, мСтруктураПараметровДляПолученияДоговора);                            
        
        Если Не ЗначениеЗаполнено(Док.ДоговорКонтрагента) Тогда
            
            мСтруктураПараметровДляПолученияДоговора.Удалить("ВалютаВзаиморасчетовДоговора");
            мСтруктураПараметровДляПолученияДоговора.Удалить("ВидСравненияВалютыВзаиморасчетов");
        
            ЗаполнениеДокументов.ПриИзмененииЗначенияКонтрагента(Док, мСтруктураПараметровДляПолученияДоговора);
            
            Если Не ЗначениеЗаполнено(Док.ДоговорКонтрагента) Тогда
                
                Док.ДоговорКонтрагента = СоздатьДоговорПоПараметрам(Док.Контрагент, Док.Организация, Док.ВалютаДокумента);
                
            КонецЕсли;
            
        КонецЕсли;
                
    КонецЦикла;    
    
    Возврат Успешно;
    
КонецФункции

Функция СоздатьДоговорПоПараметрам(Контрагент, Организация, ВалютаВзаиморасчетов)
    
    НайденныйДоговорОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    НайденныйДоговорОбъект.Наименование = "Договор WEB - сайт";
    
    Если НЕ ЗначениеЗаполнено(ВалютаВзаиморасчетов) Тогда
        ВалютаВзаиморасчетов = глЗначениеПеременной("ВалютаУправленческогоУчета");
    КонецЕсли;
    
    НайденныйДоговорОбъект.ВалютаВзаиморасчетов = ВалютаВзаиморасчетов;
    НайденныйДоговорОбъект.Организация = Организация;
    НайденныйДоговорОбъект.Владелец           = Контрагент;
    НайденныйДоговорОбъект.ВидУсловийДоговора = Перечисления.ВидыУсловийДоговоровВзаиморасчетов.БезДополнительныхУсловий;
    НайденныйДоговорОбъект.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
    НайденныйДоговорОбъект.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоЗаказам;
                    
    Попытка
        НайденныйДоговорОбъект.Записать();
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки(), "Не удалось записать договор контрагента.");
        Возврат Неопределено;
    КонецПопытки;
    
    Возврат НайденныйДоговорОбъект.Ссылка;
        
КонецФункции

Функция ПроверитьОсновнойДоговорКонтрагента(КонтрагентСсылка, ДокОбъект)
    
    Успешно = Истина;
    
    Если ЗначениеЗаполнено(КонтрагентСсылка.ОсновнойДоговорКонтрагента) Тогда
        Возврат Успешно;
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(ДокОбъект.Организация) Тогда
        
        СообщитьПользователю("Не удалось определить основной договор контрагента (не найдена организация).", Ложь);
        Возврат Ложь;    
        
    КонецЕсли;
    
    // ищем договр по контрагенту, организации и валюте
    Запрос = Новый Запрос();
    Запрос.Текст = "ВЫБРАТЬ
                   |    ДоговорыКонтрагентов.Ссылка КАК Ссылка,
                   |    ДоговорыКонтрагентов.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов
                   |ИЗ
                   |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                   |ГДЕ
                   |    ДоговорыКонтрагентов.Организация = &Организация
                   |    И ДоговорыКонтрагентов.ВидВзаиморасчетов = Значение(Перечисление.ВедениеВзаиморасчетовПоДоговорам.ПоЗаказам)
                   |    И ДоговорыКонтрагентов.ВидДоговора = Значение(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)";
                  
    Запрос.УстановитьПараметр("Организация", ДокОбъект.Организация);
        
    Выборка = Запрос.Выполнить().Выбрать();
    
    ТекущийДоговор = Неопределено;
    
    ВалютаВзаиморасчетов = ДокОбъект.ВалютаДокумента;
        
    Если НЕ ЗначениеЗаполнено(ВалютаВзаиморасчетов) Тогда
        ВалютаВзаиморасчетов = глЗначениеПеременной("ВалютаУправленческогоУчета");
    КонецЕсли;
    
    Пока Выборка.Следующий() Цикл
        
        ТекущийДоговор = Выборка.Ссылка;
        Если Выборка.ВалютаВзаиморасчетов = ВалютаВзаиморасчетов Тогда
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
        
    Если НЕ ЗначениеЗаполнено(ТекущийДоговор) Тогда
        
        ТекущийДоговор = СоздатьДоговорПоПараметрам(КонтрагентСсылка, ДокОбъект.Организация, ВалютаВзаиморасчетов);
        
        Если Не ЗначениеЗаполнено(ТекущийДоговор) Тогда
            Возврат Ложь;
        КонецЕсли;    
                
    КонецЕсли;
    
    Попытка
        
        КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
        КонтрагентОбъект.ОсновнойДоговорКонтрагента = ТекущийДоговор;
        КонтрагентОбъект.Записать();
        
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки(), "Не удалось записать основной договор контрагенту.");
        Успешно = Ложь;
    КонецПопытки;        
        
    Возврат Успешно;
    
КонецФункции

Функция СоздатьКонтрагента(СтруктураДанныхКонтрагента)
    
    НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
    НовыйКонтрагент.Родитель = ГруппаДляНовыхКонтрагентов;
    ЗаполнитьЗначенияСвойств(НовыйКонтрагент, СтруктураДанныхКонтрагента);
    НовыйКонтрагент.Покупатель = Истина;
    
    Попытка
        НовыйКонтрагент.Записать();
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки());
    КонецПопытки;    
    
    Возврат НовыйКонтрагент.Ссылка;
    
КонецФункции    

Функция ОпределитьВидНоменклатурыПоТипу(ТипНоменклатуры)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |ВидыНоменклатуры.Ссылка КАК ВидНоменклатуры
        |ИЗ
        |    Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
        |ГДЕ
        |    ВидыНоменклатуры.ТипНоменклатуры = &ТипНоменклатуры
        |";
    Запрос.УстановитьПараметр("ТипНоменклатуры", ТипНоменклатуры);    
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат РезультатЗапроса.Выгрузить()[0].ВидНоменклатуры;
        
КонецФункции

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


// Распределяет заданную сумму по выбранной колонке
//
// Параметры:
//  ИмяКолонки         - cтрока, имя колонки, по которой распределяется сумма ("Количество" или "Сумма");
//  СуммаРаспределения - число, распределяемая сумма
//
//
Процедура РаспределитьСуммуПоКолонке(ДокументОбъект, Товары, ИмяТабЧасти, СуммаРаспределения)    
    
    МассивДанныхКолонки = Товары.ВыгрузитьКолонку("Сумма");
    
    МассивРаспределения = ОбщегоНазначения.РаспределитьПропорционально(СуммаРаспределения, МассивДанныхКолонки);
    
    Если МассивРаспределения = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
    
    Индекс = 0;
    Для каждого СтрокаТабличнойЧасти Из Товары Цикл
        
        СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Сумма + МассивРаспределения[Индекс];
        ОбработкаТабличныхЧастей.ПриИзмененииСуммыТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект, мТекущийПользователь ,,истина, ,истина, ИмяТабЧасти);

        Индекс = Индекс + 1;
    КонецЦикла;

КонецПроцедуры


Функция ИдентифицироватьНоменклатуру(ДеревоДокументов)
    
    Успешно = Истина;
    
    Успешно = ИнициализироватьВидыНоменкалтуры();
    
    Если НЕ Успешно Тогда
        Возврат Ложь;
    КонецЕсли;    
        
    Для Каждого СтрокаДД Из ДеревоДокументов.Строки Цикл
        
        Если СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда
            Продолжить;
        КонецЕсли;    
        
        ОтобразитьСостояние("Идентификация товаров в документе: " + СтрокаДД.ДокументОбъект);
        
        Для Каждого ТоварУслугаСвойство Из СтрокаДД.Строки Цикл
            
            Если ЗначениеЗаполнено(ТоварУслугаСвойство.СвойствоНаименование) Тогда
                Продолжить;
            КонецЕсли;
            
            ТипНоменклатурыCML = "";
            
            Для Каждого ПодчиненнаяСтрокаТовараУслуги Из ТоварУслугаСвойство.Строки Цикл
                
                Если ЗначениеЗаполнено(ПодчиненнаяСтрокаТовараУслуги.ЗначениеРеквизитаНаименование)
                    И ПодчиненнаяСтрокаТовараУслуги.ЗначениеРеквизитаНаименование = ЗначениеCML_ТипНоменклатуры Тогда
                    
                    ТипНоменклатурыCML = ПодчиненнаяСтрокаТовараУслуги.ЗначениеРеквизитаЗначение;
                    Прервать;
                                        
                КонецЕсли;    
                
            КонецЦикла;    
            
            
            ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
            Если ТипНоменклатурыCML = ТипНоменклатурыCML_Услуга Тогда    
                
                Номенклатура = НайтиСоздатьНоменклатуру(ТоварУслугаСвойство, мВидНоменклатурыУслуга, СтрокаДД.СтавкаНДС);
                
            Иначе
                
                Номенклатура = НайтиСоздатьНоменклатуру(ТоварУслугаСвойство, мВидНоменклатурыТовар, СтрокаДД.СтавкаНДС, ХарактеристикаНоменклатуры);
                
            КонецЕсли;
            
            Если Номенклатура.ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
            
                НовСтрока      = СтрокаДД.ДокументОбъект.Услуги.Добавить();
                НовСтрока.Номенклатура = Номенклатура;
                НовСтрока.Содержание   = Номенклатура.НаименованиеПолное;
                НовСтрока.Количество   = 1;
                НовСтрока.Цена         = ТоварУслугаСвойство.ТоварУслугаСумма;
                НовСтрока.СтавкаНДС    = Номенклатура.СтавкаНДС;
                
                ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(НовСтрока, СтрокаДД.ДокументОбъект);
                ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НовСтрока, СтрокаДД.ДокументОбъект);
                
            Иначе    
                
                НовСтрока = СтрокаДД.ДокументОбъект.Товары.Добавить();
                НовСтрока.Номенклатура                  = Номенклатура;
                НовСтрока.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры;
                НовСтрока.ЕдиницаИзмерения              = Номенклатура.ЕдиницаХраненияОстатков;
                НовСтрока.Количество                       = ТоварУслугаСвойство.ТоварУслугаКоличество;
                НовСтрока.Коэффициент                   = Номенклатура.ЕдиницаХраненияОстатков.Коэффициент;
                НовСтрока.СтавкаНДС                     = Номенклатура.СтавкаНДС;
                
                НовСтрока.Сумма                          = РассчитатьСуммуСУчетомСкидок(ТоварУслугаСвойство);
                
                ОбработкаТабличныхЧастей.ПриИзмененииСуммыТабЧасти(НовСтрока, СтрокаДД.ДокументОбъект, глЗначениеПеременной("глТекущийПользователь"),,истина, ,истина, "Товары");
                ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НовСтрока, СтрокаДД.ДокументОбъект);
                
            КонецЕсли;
            
        КонецЦикла;
        
        Если СтрокаДД.СкидкаВСумме = Истина Тогда
            
            СуммаСкидки = СтрокаДД.СуммаСкидки;
            
            Если СуммаСкидки <> 0 Тогда
                
                Если СтрокаДД.ДокументОбъект.Товары.Количество() > 0 Тогда
                    РаспределитьСуммуПоКолонке(СтрокаДД.ДокументОбъект, СтрокаДД.ДокументОбъект.Товары, "Товары", -СуммаСкидки);
                Иначе
                    РаспределитьСуммуПоКолонке(СтрокаДД.ДокументОбъект, СтрокаДД.ДокументОбъект.Услуги, "Услуги", -СуммаСкидки);
                КонецЕсли;                    
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;    
    
    Возврат Успешно;
    
КонецФункции    

Функция РассчитатьСуммуСУчетомСкидок(СтрокаТовара);
    
    Сумма         = СтрокаТовара.ТоварУслугаСумма;
    СуммаСкидки = 0;
    
    Для Каждого СтрокаСкидки Из СтрокаТовара.Строки Цикл
        
        Если ЗначениеЗаполнено(СтрокаСкидки.СуммаСкидки)
            И НЕ СтрокаСкидки.СкидкаВСумме Тогда
            
            СуммаСкидки = СуммаСкидки + СтрокаСкидки.СуммаСкидки;
            
        КонецЕсли;    
        
    КонецЦикла;
    
    Сумма = Сумма - СуммаСкидки;        
    Возврат Сумма;
    
КонецФункции

Функция ПолучитьИдНоменклатуры(Знач Ид)
    
    ПозицияРазделителя = Найти(Ид, "#");
    Если ПозицияРазделителя > 0 Тогда
        ИдНоменклатуры = Лев(Ид, ПозицияРазделителя - 1);
    Иначе
        ИдНоменклатуры = Ид;
    КонецЕсли;    
    
    Возврат ИдНоменклатуры;
    
КонецФункции

Функция ПолучитьИдХарактеристики(Знач Ид)
    
    ПозицияРазделителя = Найти(Ид, "#");
    Если ПозицияРазделителя > 0 Тогда
        ИдХарактеристики = Прав(Ид, СтрДлина(Ид) - ПозицияРазделителя);
    Иначе
        ИдХарактеристики = "";
    КонецЕсли;    
    
    Возврат ИдХарактеристики;
    
КонецФункции

Функция ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ХарактеристикаНоменклатуры)
    
    Если НЕ ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаИд) Тогда
        Возврат Ложь;
    КонецЕсли;
            
    Попытка
        
        ИдНоменклатуры = ПолучитьИдНоменклатуры(СтрокаТовара.ТоварУслугаИд);
        Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры));
        Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда            
            Возврат Ложь;
        КонецЕсли;
            
        Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда
            // Объект не найден
            СообщитьПользователю("Номенклатура не найдена по уникальному идентификатору: " + ИдНоменклатуры, Ложь);
            Возврат Ложь;
        КонецЕсли;    
            
        Если НЕ Номенклатура.ВестиУчетПоХарактеристикам Тогда
            Возврат Истина;
        КонецЕсли;
        
        ИдХарактеристики = ПолучитьИдХарактеристики(СтрокаТовара.ТоварУслугаИд);
        Если ПустаяСтрока(ИдХарактеристики) Тогда
            Возврат Истина;
        КонецЕсли;
        
        ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдХарактеристики));
        
        Если ХарактеристикаНоменклатуры = ПустаяХарактеристикаСсылка Тогда
            Возврат Истина;
        КонецЕсли;
            
        Если ХарактеристикаНоменклатуры.ПолучитьОбъект() = Неопределено Тогда
            СообщитьПользователю("Объект <ХарактеристикаНоменклатуры> не найден: " + Строка(ИдХарактеристики)
                + ". Будет создан новый объект.", Ложь);
                
            Возврат Ложь;
            
        КонецЕсли;            
                        
    Исключение
        
        Возврат Ложь;
        
    КонецПопытки;
    
    Возврат Истина;
        
КонецФункции

Функция НайтиНоменклатуруПоНаименованиюИВиду(НаименованиеНоменклатуры, ВидНоменклатуры)
    
    // поиск номенклатуры по наименованию и виду
    Запрос = Новый Запрос;
                
    Запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатуры);
    Запрос.УстановитьПараметр("Наименование", НаименованиеНоменклатуры);
                
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    Номенклатура.Ссылка Как Номенклатура
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ВидНоменклатуры = &ВидНоменклатуры
        |    И Номенклатура.Наименование = &Наименование";
        
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        
        Возврат Выборка.Номенклатура;
        
    КонецЕсли;    
    
    Возврат Неопределено;
    
КонецФункции

Функция НайтиСоздатьНоменклатуру(СтрокаТовара, Знач ВидНоменклатуры, СтавкаНДС, ХарактеристикаНоменклатуры = Неопределено)
    
    Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
    ХарактеристикаНоменклатуры = Неопределено;
    
    УспешноНайдено = ВыполнитьПоискНоменклатурыХарактеристикиПоСсылкам(СтрокаТовара, Номенклатура, ХарактеристикаНоменклатуры);
    Если УспешноНайдено Тогда
        Возврат Номенклатура;
    КонецЕсли;    
    
    ХарактеристикаНоменклатуры = Неопределено;
    
    Номенклатура = НайтиНоменклатуруПоНаименованиюИВиду(СтрокаТовара.ТоварУслугаНаименование, ВидНоменклатуры);
    
    Если ЗначениеЗаполнено(Номенклатура) Тогда
        Возврат Номенклатура;
    КонецЕсли;
        
    ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка();
        
    Если ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаБазоваяЕдиницаКод) Тогда
        ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду(СтрокаТовара.ТоварУслугаБазоваяЕдиницаКод);
    КонецЕсли;    
    
    Если НЕ ЗначениеЗаполнено(ЕдиницаПоКлассификатору)
        И ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаБазоваяЕдиница) Тогда
        
        ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(СтрокаТовара.ТоварУслугаБазоваяЕдиница, Истина);
        
    КонецЕсли;
    
    Если НЕ ЗначениеЗаполнено(ЕдиницаПоКлассификатору) Тогда
        
        ЕдиницаПоКлассификатору = ЕдиницаИзмеренияНовойНоменклатуры;
        
    КонецЕсли;    
    
    Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
    
    Номенклатура.БазоваяЕдиницаИзмерения = ЕдиницаПоКлассификатору;
    Номенклатура.Родитель                 = ГруппаДляНовойНоменклатуры;
    Номенклатура.ВидНоменклатуры          = ВидНоменклатуры;
    Номенклатура.Комментарий              = СтрокаТовара.ТоварУслугаКомментарий;
    Номенклатура.Наименование              = СтрокаТовара.ТоварУслугаНаименование;
    Номенклатура.НаименованиеПолное         = СтрокаТовара.ТоварУслугаНаименование;
    Номенклатура.СтавкаНДС                  = СтавкаНДС;
    Номенклатура.Услуга                  = ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга;    
    
    Попытка
        
        Номенклатура.Записать();
        Если ВыгружатьТолькоИзменения Тогда
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбменаТоварами, Номенклатура.Ссылка);
        КонецЕсли;
        
    Исключение
        
        СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки());
        Возврат Справочники.Номенклатура.ПустаяСсылка();
        
    КонецПопытки;    
    
    ЕдиницаХраненияОстатков = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    
    ЕдиницаХраненияОстатков.Наименование            = Номенклатура.БазоваяЕдиницаИзмерения.Наименование;
    ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору = Номенклатура.БазоваяЕдиницаИзмерения;
    ЕдиницаХраненияОстатков.Коэффициент             = 1;
    ЕдиницаХраненияОстатков.Владелец                = Номенклатура.Ссылка;
    
    Попытка
        ЕдиницаХраненияОстатков.Записать();
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки());
        Возврат Справочники.Номенклатура.ПустаяСсылка();
    КонецПопытки;    
    
    Номенклатура.ЕдиницаХраненияОстатков = ЕдиницаХраненияОстатков.Ссылка;
    Номенклатура.ЕдиницаДляОтчетов          = ЕдиницаХраненияОстатков.Ссылка;
    
    Попытка
        Номенклатура.Записать();
    Исключение
        СообщитьОбИсключительнойОшибке(Ложь, ОписаниеОшибки());
        Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
    КонецПопытки;    
        
    Возврат Номенклатура.Ссылка;    
    
КонецФункции                

Функция ОпределитьПоТтипуИмяПоляКонтактнойИнформации(ИмяТипа)
    
    ИмяПоля = "Поле10";
    
    Если ИмяТипа = "Почтовый индекс"
        ИЛИ ИмяТипа = "Страна" Тогда
        ИмяПоля = "Поле1";
    ИначеЕсли ИмяТипа = "Регион" Тогда
        ИмяПоля = "Поле2";
    ИначеЕсли ИмяТипа = "Район" Тогда
        ИмяПоля = "Поле3";
    ИначеЕсли ИмяТипа = "Населенный пункт" Тогда
        ИмяПоля = "Поле4";
    ИначеЕсли ИмяТипа = "Город" Тогда
        ИмяПоля = "Поле5";
    ИначеЕсли ИмяТипа = "Улица" Тогда
        ИмяПоля = "Поле6";
    ИначеЕсли ИмяТипа = "Дом" Тогда
        ИмяПоля = "Поле7";
    ИначеЕсли ИмяТипа = "Корпус" Тогда
        ИмяПоля = "Поле8";
    ИначеЕсли ИмяТипа = "Квартира" Тогда
        ИмяПоля = "Поле9";
    Конецесли;        
    
    Возврат ИмяПоля;
    
КонецФункции

Процедура ОпределитьПоданнымТипВидКонтактнойИнформации(КонтактТип, ТипКИ, ВидКИ)
    
    Если КонтактТип = "ТелефонРабочий" Тогда
        
        ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
        ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
        
    ИначеЕсли КонтактТип = "Почта" Тогда
        
        ТипКИ = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
        ВидКИ = Справочники.ВидыКонтактнойИнформации.АдресЭлектроннойПочтыКонтрагентаДляОбменаДокументами;
        
    КонецЕсли;
    
КонецПроцедуры

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


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ АНАЛИЗА ИЗМЕНЕНИЙ ДАННЫХ

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

    Выборка = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);
    
    Пока Выборка.Следующий() Цикл
        
        #Если Клиент Тогда
        Счетчик = Счетчик + 1;
        Если Счетчик % 100 = 0 Тогда
            ОтобразитьСостояние("Обработано объектов: " + Счетчик);
        КонецЕсли;
        #КонецЕсли
        
        Данные       = Выборка.Получить();
        ТипДанных = ТипЗнч(Данные);
        
        Если ТипДанных = Тип("СправочникОбъект.Номенклатура") Тогда
            
            СтруктураВозврата.Товары.Добавить(Данные.Ссылка);
            
        ИначеЕсли ТипДанных = Тип("ДокументОбъект.ЗаказПокупателя") Тогда
            
            СтруктураВозврата.Заказы.Добавить(Данные.Ссылка);    
            
        ИначеЕсли ТипДанных = Тип("СправочникОбъект.ХранилищеДополнительнойИнформации") Тогда
            
            СтруктураВозврата.Картинки.Добавить(Данные.Ссылка);
            
        КонецЕсли;    
        
    КонецЦикла;    
    
КонецПроцедуры

Функция ПолучитьВсеИзмененияИзПланаОбмена()
    
    СтруктураВозврата = Новый Структура("Товары,Заказы,Картинки,НомерСообщенияТовары,НомерСообщенияЗаказы",
        Новый Массив(), Новый Массив(), Новый Массив());
        
    Если ОбменТоварами Тогда
        ЗаполнитьСтруктуруИзмененийДляУзла(УзелОбменаТоварами, СтруктураВозврата, Истина);
    КонецЕсли;
    
    Если ОбменЗаказами Тогда
        ЗаполнитьСтруктуруИзмененийДляУзла(УзелОбменаЗаказами, СтруктураВозврата, Ложь);
    КонецЕсли;
        
    Возврат СтруктураВозврата;
    
КонецФункции    


////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ

ПрефиксУзлаCML       = "CMLУзел.";
ПрефиксАтрибутаCML = "CMLАтрибут.";
НачалоЭлементаCML  = "CMLНачалоЭлемента";
КонецЭлементаCML   = "CMLКонецЭлемента";

ПодкаталогКартинок                        = "import_files";
ПодкаталогБезопасностиКаталогаВыгрузки = "1cbitrix";

ПараметрЗапросаHTTP_Инициализация             = "&mode=init";
ПараметрЗапросаHTTP_ПередачаФайла             = "&mode=file&filename=";
ПараметрЗапросаHTTP_ИмпортФайлаСервером          = "&mode=import&filename=";
ПараметрЗапросаHTTP_ПолучитьДанные              = "&mode=query";
ПараметрЗапросаHTTP_УспешноеЗавершениеИмпорта = "&mode=success";

ОтветСервера_ZIPРазрешен                            = "zip=yes";
ОтветСервера_ОграничениеРазмераФрагментаФайлаОбмена = "file_limit=";
ОтветСервера_УспешноеЗавершениеТекущейОперации         = "success";
ОтветСервера_АварийноеЗавершениеТекущейОперации        = "failure";
ОтветСервера_ВыполнениеТекущейОперации                 = "progress";

ПустаяХарактеристикаСсылка = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
НаименованиеНалога             = "НДС";

НаименованиеКаталогаТоваровCML   = "Каталог товаров";
НаименованиеПакетаПредложенийCML = "Пакет предложений";

БулевоЗначениеCML_Истина     = "true";
БулевоЗначениеCML_Да = "Да";

ТипНоменклатурыCML_Услуга     = "Услуга";
ТипНоменклатурыCML_Товар      = "Товар";
ЗначениеCML_ТипНоменклатуры = "ТипНоменклатуры";

мСоответствиеНаименованийКатегорийДокумента = Новый Соответствие;
мСоответствиеНаименованийКатегорийДокумента.Вставить("Заказ оплачен"     , Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеОплачен);
мСоответствиеНаименованийКатегорийДокумента.Вставить("Доставка разрешена", Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеДоставкаРазрешена);
мСоответствиеНаименованийКатегорийДокумента.Вставить("Финальный статус"     , Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеЗавершен);
мСоответствиеНаименованийКатегорийДокумента.Вставить("Отменен"             , Справочники.КатегорииОбъектов.СостояниеЗаказаНаWEBСайтеОтменен);

ПостроительЗапроса = Новый ПостроительЗапроса;

Ardi Подменю пользователя
сообщение 10.11.14, 17:46
Сообщение #14

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Цитата(r1p88@mail.ru @ 06.11.14, 14:21) *
На сайт выгружается цена в долларах. А нужно чтобы выгружалась в грн.

А в xml файл цена выгружается в долларах?


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Acid Подменю пользователя
сообщение 11.11.14, 9:31
Сообщение #15

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Проверте в этом месте какая Цена получается:
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);

Если в долларах, то укажите явно Гривну. Ну и проверте.


Signature

Документируйте Код! мать вашу...


r1p88@mail.ru Подменю пользователя
сообщение 11.11.14, 9:47
Сообщение #16

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Ardi @ 10.11.14, 18:46) *
А в xml файл цена выгружается в долларах?


Сделал выгрузку в файл. В файл делает выгрузку в разных валютах USD, EUR, ГРН. Вот кусок из файла выгрузки:
<Ид>b96aab32-eb83-11e0-a984-001fd02505d8</Ид> 
<ШтрихКод>2000000024431</ШтрихКод>
<Артикул>8973673510</Артикул>
<Наименование>бла бла бла</Наименование>
<БазоваяЕдиница МеждународноеСокращение="pcs" НаименованиеПолное="штука" Код="3 ">шт.</БазоваяЕдиница>
-<Цены> -<Цена> <Представление>37,2786 EUR за шт.</Представление>
<ИдТипаЦены>7c1de779-531e-11e0-9202-001a4d5f78b9</ИдТипаЦены>
<ЦенаЗаЕдиницу>37.2786</ЦенаЗаЕдиницу>
<Валюта>EUR</Валюта>
<Единица>шт.</Единица>
<Коэффициент>1</Коэффициент>
</Цена> </Цены>
<Количество>230</Количество>
</Предложение> -<Предложение>
<Ид>b96aab3a-eb83-11e0-a984-001fd02505d8</Ид>
<ШтрихКод>2000000024455</ШтрихКод>
<Артикул>8973673510</Артикул>
<Наименование>бла бла бла</Наименование>
<БазоваяЕдиница МеждународноеСокращение="pcs" НаименованиеПолное="штука" Код="3 ">шт.</БазоваяЕдиница>
-<Цены> -<Цена>
<Представление>38,2941 USD за шт.</Представление>
<ИдТипаЦены>7c1de779-531e-11e0-9202-001a4d5f78b9</ИдТипаЦены>
<ЦенаЗаЕдиницу>38.2941</ЦенаЗаЕдиницу>
<Валюта>USD</Валюта>
<Единица>шт.</Единица>
<Коэффициент>1</Коэффициент>
</Цена> </Цены>
<Количество>1</Количество>
</Предложение> -<Предложение>
<Ид>c70187d0-4379-11e1-b462-001fd02505d8</Ид>
<ШтрихКод>2000000099163</ШтрихКод>
<Артикул>115904</Артикул>
<Наименование>бла бла бла</Наименование>
<БазоваяЕдиница МеждународноеСокращение="pcs" НаименованиеПолное="штука" Код="3 ">шт.</БазоваяЕдиница>
-<Цены> -<Цена> <Представление>760,55 ГРН за шт.</Представление>
<ИдТипаЦены>7c1de779-531e-11e0-9202-001a4d5f78b9</ИдТипаЦены>
<ЦенаЗаЕдиницу>760.55</ЦенаЗаЕдиницу>
<Валюта>ГРН</Валюта>
<Единица>шт.</Единица>
<Коэффициент>1</Коэффициент>
</Цена> </Цены>
<Количество>2</Количество>
</Предложение> -<Предложение>


Цитата(Acid @ 11.11.14, 10:31) *
Проверте в этом месте какая Цена получается:
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);

Если в долларах, то укажите явно Гривну. Ну и проверте.


Запустил отладчик, поставил точку останова, пошагово прошёл тот кусок кода и в Переменную "НовЦена" ничего не передаётся. Значение пусто, тип Неопределенно.

Acid Подменю пользователя
сообщение 11.11.14, 11:13
Сообщение #17

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Ну смотрите, - по факту у вас в хмл-е цены во всевозможных валютах передаются.
Т.е. исправлять надо уже на стороне принимающего сайта.


Signature

Документируйте Код! мать вашу...


r1p88@mail.ru Подменю пользователя
сообщение 11.11.14, 11:26
Сообщение #18

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Acid @ 11.11.14, 12:13) *
Ну смотрите, - по факту у вас в хмл-е цены во всевозможных валютах передаются.
Т.е. исправлять надо уже на стороне принимающего сайта.


А если реально сделать изменение цены по валюте в модуле обмена с сайтом? Только пока не совсем понимаю как.

Acid Подменю пользователя
сообщение 11.11.14, 11:35
Сообщение #19

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

когда на стороне сайта делается парсинг хмл-файла, там валюта ищется по строке "EUR" либо "ГРН". А если искать надо по международному названию гривны? "UAH"
Для начала попробуйте в справочнике международное название гривны поменять. Возможно еще ошибка в верхнем/нижнем регистре.

Если не поможет, можно методом исключения действовать. Если не нужна цена в долларах, а только в гривнах, то выгружать цену только в гривне. Тогда проще будет.

В общем хочется или нет, а парсинг все равно надо будет разбирать.


Signature

Документируйте Код! мать вашу...


r1p88@mail.ru Подменю пользователя
сообщение 11.11.14, 11:47
Сообщение #20

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Acid @ 11.11.14, 12:35) *
когда на стороне сайта делается парсинг хмл-файла, там валюта ищется по строке "EUR" либо "ГРН". А если искать надо по международному названию гривны? "UAH"
Для начала попробуйте в справочнике международное название гривны поменять. Возможно еще ошибка в верхнем/нижнем регистре.

Если не поможет, можно методом исключения действовать. Если не нужна цена в долларах, а только в гривнах, то выгружать цену только в гривне. Тогда проще будет.

В общем хочется или нет, а парсинг все равно надо будет разбирать.



Вот есть код формы элемента справочника номенклатура. ПринтСкрин я вылаживал в самом начале. Так вот колонка "Цена в ГРН" считается вот так:
Процедура ОсновнаяПанельПриСменеСтраницы(Элемент, ТекущаяСтраница)
    
    УстановитьВидимость(Истина);
    
    Если ТекущаяСтраница=13 Тогда
        Запрос = Новый Запрос("
        |ВЫБРАТЬ
        |    Цены.ТипЦен КАК ТипЦен,
        |    Цены.Цена КАК Цена,
        |    Цены.СпособРасчетаЦены КАК СпособРасчетаЦены,
        |    Цены.Валюта КАК Валюта,
        |    Цены.ЦенаГРН КАК кЦенаГРН,
        |    Цены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
        |    Цены.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипыЦен)
        |       И Номенклатура = &Номенклатура И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
        |    ) КАК Цены
        |");
        
        Запрос.УстановитьПараметр("Дата", РабочаяДата);
        Запрос.УстановитьПараметр("ТипыЦен", ЦеныНоменклатуры.ВыгрузитьКолонку("ТипЦен"));
        Запрос.УстановитьПараметр("Номенклатура", Ссылка);
        
        ТЗ = Запрос.Выполнить().Выгрузить();
        Для каждого Выборка из ТЗ Цикл
            СтрокаЦен = ЦеныНоменклатуры.Найти(Выборка.ТипЦен, "ТипЦен");
            ВГРН = Константы.ВалютаРегламентированногоУчета.Получить();
            Если Выборка.Валюта<>ВГРН Тогда
                
                КурсТекВалюты = МодульВалютногоУчета.ПолучитьКурсВалюты(Выборка.Валюта, ТекущаяДата());
                КурсТекВалюты1 = МодульВалютногоУчета.ПолучитьКурсВалюты(ВГРН, ТекущаяДата());
                
               Выборка.кЦенаГРН = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту1(Выборка.Цена, КурсТекВалюты, КурсТекВалюты1, КурсТекВалюты.Курс, КурсТекВалюты1.Курс,
               КурсТекВалюты.Кратность, КурсТекВалюты1.Кратность);
            Иначе
                Выборка.кЦенаГРН = Выборка.Цена;
            КонецЕсли;    
            ЗаполнитьЗначенияСвойств(СтрокаЦен, Выборка);
        КонецЦикла;
    КонецЕсли;    
    
КонецПроцедуры // ОсновнаяПанельПриСменеСтраницы()


Я вот думаю как бы подобную схему реализовать в модуле обмена с сайтом. То есть чтобы он пересчитывал цены в грн по курсу.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 19.04.24, 8:37
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!