Добрый день. Подскажите пожалуйста как решить мою проблему. Есть сайт на OpenCart, есть подключенный к нему модуль OpenCart Exchange 1C . Модуль на сайте настроен. Обмен с сайтом настроен. Всё выгружается, НО, есть одно но. На сайт выгружается цена в долларах. А нужно чтобы выгружалась в грн. Для примера показываю на картинке что конкретно я имею ввиду:
Каким образом настроить так, чтобы выгружалась нужная цена? Я облазил уже весь модуль "Обмена с сайтом".
Может пусть еще кто-нибудь облазит модуль?
ТИТЬКИ! я один вижу?
И всё таки, может кто поможет? Вместо того чтобы прикалываться?
покажите модуль обмена.
Он слишком большой. Меня админы будут бить если я его добавлю)))) Один раз уже предупреждали. А функции раскрывающегося списка я здесь не нашёл. Как быть? кинуть весь модуль?
// Передаем значение валюты выбраной цены в переменную - ТекТипЦены
ТекТипЦены = ПостроительЗапроса.Отбор.ТипЦен.Значение.ВалютаЦены.Ссылка;
//Мой код для конвертации цены номенклатуры, в валюту цены, выбранной в отборе
Если ТекТипЦены <> Неопределено Тогда
Если СтрокаЦены.Валюта <> ТекТипЦены Тогда
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
СтрокаЦены.Цена = НовЦена;
СтрокаЦены.Валюта = ТекТипЦены;
КонецЕсли;
КонецЕсли;
//Конец кода
Текст запроса покажите
плохо. давайте 1-ый по очереди
Вот модуль обмена с сайтом. Раскидал на 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СайтеОтменен);
ПостроительЗапроса = Новый ПостроительЗапроса;
Проверте в этом месте какая Цена получается:
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
Ну смотрите, - по факту у вас в хмл-е цены во всевозможных валютах передаются.
Т.е. исправлять надо уже на стороне принимающего сайта.
когда на стороне сайта делается парсинг хмл-файла, там валюта ищется по строке "EUR" либо "ГРН". А если искать надо по международному названию гривны? "UAH"
Для начала попробуйте в справочнике международное название гривны поменять. Возможно еще ошибка в верхнем/нижнем регистре.
Если не поможет, можно методом исключения действовать. Если не нужна цена в долларах, а только в гривнах, то выгружать цену только в гривне. Тогда проще будет.
В общем хочется или нет, а парсинг все равно надо будет разбирать.
Процедура ОсновнаяПанельПриСменеСтраницы(Элемент, ТекущаяСтраница)
УстановитьВидимость(Истина);
Если ТекущаяСтраница=13 Тогда
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Цены.ТипЦен КАК ТипЦен,
| Цены.Цена КАК Цена,
| Цены.СпособРасчетаЦены КАК СпособРасчетаЦены,
| Цены.Валюта КАК Валюта,
| Цены.ЦенаГРН КАК кЦенаГРН,
| Цены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Цены.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипыЦен)
| И Номенклатура = &Номенклатура И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
| ) КАК Цены
|");
Запрос.УстановитьПараметр("Дата", РабочаяДата);
Запрос.УстановитьПараметр("ТипыЦен", ЦеныНоменклатуры.ВыгрузитьКолонку("ТипЦен"));
Запрос.УстановитьПараметр("Номенклатура", Ссылка);
ТЗ = Запрос.Выполнить().Выгрузить();
Для каждого Выборка из ТЗ Цикл
СтрокаЦен = ЦеныНоменклатуры.Найти(Выборка.ТипЦен, "ТипЦен");
ВГРН = Константы.ВалютаРегламентированногоУчета.Получить();
Если Выборка.Валюта<>ВГРН Тогда
КурсТекВалюты = МодульВалютногоУчета.ПолучитьКурсВалюты(Выборка.Валюта, ТекущаяДата());
КурсТекВалюты1 = МодульВалютногоУчета.ПолучитьКурсВалюты(ВГРН, ТекущаяДата());
Выборка.кЦенаГРН = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту1(Выборка.Цена, КурсТекВалюты, КурсТекВалюты1, КурсТекВалюты.Курс, КурсТекВалюты1.Курс,
КурсТекВалюты.Кратность, КурсТекВалюты1.Кратность);
Иначе
Выборка.кЦенаГРН = Выборка.Цена;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаЦен, Выборка);
КонецЦикла;
КонецЕсли;
КонецПроцедуры // ОсновнаяПанельПриСменеСтраницы()
В условие добавляете отбор по валюте Доллар, а дальше у вас есть
ЦенаГРН = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
Всем кто пытался помочь спасибо. Решил проблему. Добавил в обмен с сайтом код:
ВГРН = Константы.ВалютаРегламентированногоУчета.Получить();
Если СтрокаЦены.Валюта<>ВГРН Тогда
КурсТекВалюты = МодульВалютногоУчета.ПолучитьКурсВалюты(СтрокаЦены.Валюта, ТекущаяДата());
КурсТекВалюты1 = МодульВалютногоУчета.ПолучитьКурсВалюты(ВГРН, ТекущаяДата());
СтрокаЦены.Цена = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту1(СтрокаЦены.Цена, КурсТекВалюты, КурсТекВалюты1, КурсТекВалюты.Курс, КурсТекВалюты1.Курс,
КурсТекВалюты.Кратность, КурсТекВалюты1.Кратность);
КонецЕсли;
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua