Обмен с сайтом
2 страниц
1 2 >
06.11.14, 17:37
Оратор
Группа: Местный
Сообщений: 328
Из: Одесса
Спасибо сказали: 144 раз
Рейтинг: 0
Цитата(Acid @ 06.11.14, 17:33)
ТИТЬКИ!
я один вижу?
Может это указание места куда катится грн. На титьки не похоже.
Вы станете богаче, лишь став умнее... Чем дальше в лес, тем толще партизаны.Нельзя недооценивать, не предсказуемость тупизны...
10.11.14, 14:35
Говорящий
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Vofka @ 10.11.14, 15:21)
r1p88@mail.ru, я боюсь, что выложенный полностью модуль вряд ли чем поможет.
Я тогда выложу часть кода, который был вставлен в стандартный модуль обмена с сайтом и если нужно выложить ещё какую нибудь часть когда, напишите какую выложу.
Код, который был вставлен:
ТекТипЦены = ПостроительЗапроса.Отбор.ТипЦен.Значение.ВалютаЦены.Ссылка;
Если ТекТипЦены <> Неопределено Тогда
Если СтрокаЦены.Валюта <> ТекТипЦены Тогда
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
СтрокаЦены.Цена = НовЦена;
СтрокаЦены.Валюта = ТекТипЦены;
КонецЕсли ;
КонецЕсли ;
С этим добавленным кодом выдаёт ошибку "Поле обьекта ВалютаЦены не найдено". В настройках модуля обмена в отборе я указал поле "ТипЦен-Валюта Цены по умолчанию" и значение поставил ГРН. Если не использовать этот кусок кода, а использовать стандартный модуль обмена с сайтом, то происходит, то что я писал в первом сообщении.
10.11.14, 16:02
Говорящий
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0
Вот модуль обмена с сайтом. Раскидал на 3 части, так как не знал, поместиться ли всё в один тег. Если неправильно написал извиняюсь.
Первая часть Перем ПрефиксУзлаCML;
Перем НачалоЭлементаCML;
Перем КонецЭлементаCML;
Перем ПрефиксАтрибутаCML;
Перем ПодкаталогКартинок;
Перем ПодкаталогБезопасностиКаталогаВыгрузки;
Перем ПараметрЗапросаHTTP_Инициализация;
Перем ПараметрЗапросаHTTP_ПередачаФайла;
Перем ПараметрЗапросаHTTP_ИмпортФайлаСервером;
Перем ПараметрЗапросаHTTP_ПолучитьДанные;
Перем ПараметрЗапросаHTTP_УспешноеЗавершениеИмпорта;
Перем ОтветСервера_ZIPРазрешен;
Перем ОтветСервера_ОграничениеРазмераФрагментаФайлаОбмена;
Перем ОтветСервера_УспешноеЗавершениеТекущейОперации;
Перем ОтветСервера_АварийноеЗавершениеТекущейОперации;
Перем ОтветСервера_ВыполнениеТекущейОперации;
Перем ПустаяХарактеристикаСсылка;
Перем НаименованиеНалога;
Перем НаименованиеКаталогаТоваровCML;
Перем НаименованиеПакетаПредложенийCML;
Перем БулевоЗначениеCML_Истина;
Перем БулевоЗначениеCML_Да;
Перем ТипНоменклатурыCML_Услуга;
Перем ТипНоменклатурыCML_Товар;
Перем ЗначениеCML_ТипНоменклатуры;
Перем мСоответствиеНаименованийКатегорийДокумента;
Перем мСтруктураИнформацииИсторииОбмена;
Перем мВидНоменклатурыУслуга;
Перем мВидНоменклатурыТовар;
Перем мМассивЗагруженныхДокументов;
Перем ТекТипЦены;
Функция 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) > 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, "Количество" , Товар.Остаток);
Возврат ТаблицаЦен.Количество();
КонецФункции
Вторая часть
Процедура ЗаписатьТекстовойУзел(Объект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, "Коэффициент" , "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 = Новый Массив;
Сигнатура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(Комментарий)
Возврат Лев(Комментарий, 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);
КонецЕсли ;
ТабСвойств = Неопределено ;
ИдКаталога = Строка(Константы.ВалютаРегламентированногоУчета.Получить().УникальныйИдентификатор());
ОтобразитьСостояние("Выгрузка классификатора..." );
Объект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 Тогда
ПолноеИмяФайлаДляСервера = ФайлОбъект.Имя;
Иначе
ПолноеИмяФайлаДляСервера = ФайлОбъект.ПолноеИмя;
ПутьДляУдаления = КаталогОбмена + "\" ;
ПолноеИмяФайлаДляСервера = СтрЗаменить(ПолноеИмяФайлаДляСервера, ПутьДляУдаления, "" );
ПолноеИмяФайлаДляСервера = СтрЗаменить(ПолноеИмяФайлаДляСервера, "\" , "/" );
КонецЕсли ;
ПолноеИмяФайлаДляСервера = УдалитьДополнительныеРасширенияФайла(ПолноеИмяФайлаДляСервера);
Возврат ПолноеИмяФайлаДляСервера;
КонецФункции
Функция УдалитьДополнительныеРасширенияФайла(ИсходноеИмяФайла)
ПозицияТочки = Найти(ИсходноеИмяФайла, "." );
ИмяФайла = Лев(ИсходноеИмяФайла, ПозицияТочки - 1 );
ПраваяЧастьИсходногоИмени = Прав(ИсходноеИмяФайла, СтрДлина(ИсходноеИмяФайла) - ПозицияТочки);
ПозицияТочки = Найти(ПраваяЧастьИсходногоИмени, "." );
Расширение = ПраваяЧастьИсходногоИмени;
Если ПозицияТочки > 0 Тогда
Расширение = Лев(ПраваяЧастьИсходногоИмени, ПозицияТочки - 1 );
КонецЕсли ;
Возврат ИмяФайла + "." + Расширение;
КонецФункции
Функция ПолучитьСписокФайловДляОтправки(КаталогОбмена, МассивПодкаталогов) ;
СписокФайлов = Новый СписокЗначений;
Маска = "*.*" ;
ВсеФайлыДляВыгрузки = НайтиФайлы(КаталогОбмена, Маска);
Если МассивПодкаталогов <> Неопределено Тогда
Для Каждого Подкаталог Из МассивПодкаталогов Цикл
ФайлыВПодкаталоге = НайтиФайлы(КаталогОбмена + "\" + Подкаталог, Маска);
Для Каждого ТекФайл Из ФайлыВПодкаталоге Цикл
Если ТекФайл.ЭтоКаталог() Тогда
ФайлыВДобавочномПодкаталоге = НайтиФайлы(ТекФайл.ПолноеИмя, Маска);
Для Каждого ТекФайлВПодкаталоге Из ФайлыВДобавочномПодкаталоге Цикл
Если НЕ ТекФайлВПодкаталоге.ЭтоКаталог() Тогда
ВсеФайлыДляВыгрузки.Добавить(ТекФайлВПодкаталоге);
КонецЕсли ;
КонецЦикла ;
Иначе
ВсеФайлыДляВыгрузки.Добавить(ТекФайл);
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
Для Каждого ТекФайл Из ВсеФайлыДляВыгрузки цикл
Если НЕ ТекФайл.ЭтоКаталог() Тогда
ПолноеИмяФайлаДляСервера = ПодготовитьИмяФайлаДляСервера(ТекФайл, КаталогОбмена);
СписокФайлов.Добавить(ТекФайл.ПолноеИмя, ПолноеИмяФайлаДляСервера);
КонецЕсли ;
КонецЦикла ;
Возврат СписокФайлов;
КонецФункции
Функция ПолучитьСтруктуруИнформацииДляИстории()
СтруктураДляИстории = Новый Структура("ДатаПоследнейЗагрузки,ДатаПоследнейВыгрузки,ДатаНачалаПоследнейЗагрузки,
|ДатаНачалаПоследнейВыгрузки,РезультатПоследнейЗагрузки,РезультатПоследнейВыгрузки,
|КомментарийКЗагрузкеДанных,КомментарийКВыгрузкеДанных" );
СтруктураДляИстории.КомментарийКЗагрузкеДанных = "" ;
СтруктураДляИстории.КомментарийКВыгрузкеДанных = "" ;
Возврат СтруктураДляИстории;
КонецФункции
Процедура ДобавитьТехническуюИнформацияВСообщение(СокращенноеСообщение, СообщениеСТехИнформацией)
Если СокращенноеСообщение = СообщениеСТехИнформацией Тогда
Возврат ;
КонецЕсли ;
СокращенноеСообщение = СокращенноеСообщение + Символы.ПС + Символы.ПС + "Техническая информация:" + Символы.ПС + СообщениеСТехИнформацией;
КонецПроцедуры
Процедура ЗаписатьИнформациюВПротоколОбмена(СтруктураИнформации)
ДатаПоследнегоОбмена = ТекущаяДата();
НаборЗаписейИстории = РегистрыСведений.ИсторияОбменаДанными.СоздатьНаборЗаписей();
НаборЗаписейИстории.Отбор.УзелИнформационнойБазы.Установить(НастройкаСсылка);
НаборЗаписейИстории.Отбор.Период.Установить(ДатаПоследнегоОбмена);
СтрокаИстории = НаборЗаписейИстории.Добавить();
СтрокаИстории.Период = ДатаПоследнегоОбмена;
СтрокаИстории.УзелИнформационнойБазы = НастройкаСсылка;
Если ЗначениеЗаполнено(СтруктураИнформации.ДатаПоследнейЗагрузки) Тогда
СтрокаИстории.ДатаПоследнейЗагрузки = СтруктураИнформации.ДатаПоследнейЗагрузки;
СтрокаИстории.ДатаНачалаПоследнейЗагрузки = СтруктураИнформации.ДатаНачалаПоследнейЗагрузки;
СтрокаИстории.РезультатПоследнейЗагрузки = СтруктураИнформации.РезультатПоследнейЗагрузки;
СтрокаИстории.КомментарийКЗагрузкеДанных = ОбщегоНазначения.СформироватьТекстСообщения(СокрЛП(СтруктураИнформации.КомментарийКЗагрузкеДанных));
Если Не ПустаяСтрока(СтрокаИстории.КомментарийКЗагрузкеДанных)
И Не ПустаяСтрока(СтруктураИнформации.КомментарийКЗагрузкеДанных) Тогда
ДобавитьТехническуюИнформацияВСообщение(СтрокаИстории.КомментарийКЗагрузкеДанных, СтруктураИнформации.КомментарийКЗагрузкеДанных);
КонецЕсли ;
КонецЕсли ;
Если ЗначениеЗаполнено(СтруктураИнформации.ДатаПоследнейВыгрузки) Тогда
СтрокаИстории.ДатаПоследнейВыгрузки = СтруктураИнформации.ДатаПоследнейВыгрузки;
СтрокаИстории.ДатаНачалаПоследнейВыгрузки = СтруктураИнформации.ДатаНачалаПоследнейВыгрузки;
СтрокаИстории.РезультатПоследнейВыгрузки = СтруктураИнформации.РезультатПоследнейВыгрузки;
СтрокаИстории.КомментарийКВыгрузкеДанных = ОбщегоНазначения.СформироватьТекстСообщения(СокрЛП(СтруктураИнформации.КомментарийКВыгрузкеДанных));
Если Не ПустаяСтрока(СтрокаИстории.КомментарийКВыгрузкеДанных)
И Не ПустаяСтрока(СтруктураИнформации.КомментарийКВыгрузкеДанных) Тогда
ДобавитьТехническуюИнформацияВСообщение(СтрокаИстории.КомментарийКВыгрузкеДанных, СтруктураИнформации.КомментарийКВыгрузкеДанных);
КонецЕсли ;
КонецЕсли ;
Попытка
НаборЗаписейИстории.Записать();
Исключение
ОбщегоНазначения.СообщитьОбОшибке("Возникла ошибка при записи истории обмена данными: " + ОписаниеОшибки());
КонецПопытки ;
КонецПроцедуры
Процедура ОтобразитьСостояние(ТекстСообщения)
#Если Клиент Тогда
Состояние(ТекстСообщения);
#КонецЕсли
КонецПроцедуры
Процедура ДобавитьТекстКСообщениюДляПользователя(ТекущееСообщение, ДобавляемоеСообщение)
ТекущееСообщение = СокрЛП(ТекущееСообщение + Символы.ПС + ДобавляемоеСообщение);
КонецПроцедуры
Процедура СообщитьПользователю(ТекстСообщения, ИнформацияОВыгрузке, Статус = Неопределено)
Если ИнформацияОВыгрузке Тогда
ДобавитьТекстКСообщениюДляПользователя(мСтруктураИнформацииИсторииОбмена.КомментарийКВыгрузкеДанных, ТекстСообщения);
Иначе
ДобавитьТекстКСообщениюДляПользователя(мСтруктураИнформацииИсторииОбмена.КомментарийКЗагрузкеДанных, ТекстСообщения);
КонецЕсли ;
#Если Клиент Тогда
Если Статус = Неопределено Тогда
Статус = СтатусСообщения.Обычное;
КонецЕсли ;
Сообщить(ТекстСообщения, Статус);
#КонецЕсли
КонецПроцедуры
Процедура СообщитьРасширенноеОписаниеОтветаСервера(ОтветСервера)
ТекстСообщения = "Ответ сервера:" + Символы.ПС;
Если СтрЧислоСтрок(ОтветСервера) > 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 ];
СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента;
ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов" , ДеревоАдресов);
ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ОсновнойВидДеятельности" Тогда
ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ОсновнойВидДеятельности" , ЗначениеЭлемента);
ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.Представление"
ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.Комментарий" Тогда
ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов" , ДеревоАдресов);
СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес" , "ВидАдреса" );
СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента;
ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов" , ДеревоАдресов);
ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле.Тип"
ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле.Значение" Тогда
ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов" , ДеревоАдресов);
СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес" , "ВидАдреса" );
СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 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 ].ВидНоменклатуры;
КонецФункции
Функция ИнициализироватьВидыНоменкалтуры()
Если ЗначениеЗаполнено(мВидНоменклатурыТовар)
И ЗначениеЗаполнено(мВидНоменклатурыУслуга) Тогда
Возврат Истина ;
КонецЕсли ;
мВидНоменклатурыТовар = ОпределитьВидНоменклатурыПоТипу(Перечисления.ТипыНоменклатуры.Товар);
мВидНоменклатурыУслуга = ОпределитьВидНоменклатурыПоТипу(Перечисления.ТипыНоменклатуры.Услуга);
Если ЗначениеЗаполнено(мВидНоменклатурыТовар)
И ЗначениеЗаполнено(мВидНоменклатурыУслуга) Тогда
Возврат Истина ;
КонецЕсли ;
Если НЕ ЗначениеЗаполнено(мВидНоменклатурыТовар) Тогда
СообщитьПользователю("Не удалось найти вид номенклатуры: Товар" , Ложь );
КонецЕсли ;
Если НЕ ЗначениеЗаполнено(мВидНоменклатурыУслуга) Тогда
СообщитьПользователю("Не удалось найти вид номенклатуры: Услуга" , Ложь );
КонецЕсли ;
Возврат Ложь ;
КонецФункции
Процедура РаспределитьСуммуПоКолонке(ДокументОбъект, Товары, ИмяТабЧасти, СуммаРаспределения)
МассивДанныхКолонки = Товары.ВыгрузитьКолонку("Сумма" );
МассивРаспределения = ОбщегоНазначения.РаспределитьПропорционально(СуммаРаспределения, МассивДанныхКолонки);
Если МассивРаспределения = Неопределено Тогда
Возврат ;
КонецЕсли ;
мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь" );
Индекс = 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СайтеОтменен);
ПостроительЗапроса = Новый ПостроительЗапроса;
11.11.14, 9:47
Говорящий
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Ardi @ 10.11.14, 18:46)
А в xml файл цена выгружается в долларах?
Сделал выгрузку в файл. В файл делает выгрузку в разных валютах USD, EUR, ГРН. Вот кусок из файла выгрузки:
<Ид>b96aab32-eb83-11 e0-a984-001 fd02505d8</Ид>
<ШтрихКод>2000000024431 </ШтрихКод>
<Артикул>8973673510 </Артикул>
<Наименование>бла бла бла</Наименование>
<БазоваяЕдиница МеждународноеСокращение="pcs" НаименованиеПолное="штука" Код="3 " >шт.</БазоваяЕдиница>
-<Цены> -<Цена> <Представление>37 ,2786 EUR за шт.</Представление>
<ИдТипаЦены>7 c1de779-531 e-11 e0-9202 -001 a4d5f78b9</ИдТипаЦены>
<ЦенаЗаЕдиницу>37.2786 </ЦенаЗаЕдиницу>
<Валюта>EUR</Валюта>
<Единица>шт.</Единица>
<Коэффициент>1 </Коэффициент>
</Цена> </Цены>
<Количество>230 </Количество>
</Предложение> -<Предложение>
<Ид>b96aab3a-eb83-11 e0-a984-001 fd02505d8</Ид>
<ШтрихКод>2000000024455 </ШтрихКод>
<Артикул>8973673510 </Артикул>
<Наименование>бла бла бла</Наименование>
<БазоваяЕдиница МеждународноеСокращение="pcs" НаименованиеПолное="штука" Код="3 " >шт.</БазоваяЕдиница>
-<Цены> -<Цена>
<Представление>38 ,2941 USD за шт.</Представление>
<ИдТипаЦены>7 c1de779-531 e-11 e0-9202 -001 a4d5f78b9</ИдТипаЦены>
<ЦенаЗаЕдиницу>38.2941 </ЦенаЗаЕдиницу>
<Валюта>USD</Валюта>
<Единица>шт.</Единица>
<Коэффициент>1 </Коэффициент>
</Цена> </Цены>
<Количество>1 </Количество>
</Предложение> -<Предложение>
<Ид>c70187d0-4379 -11 e1-b462-001 fd02505d8</Ид>
<ШтрихКод>2000000099163 </ШтрихКод>
<Артикул>115904 </Артикул>
<Наименование>бла бла бла</Наименование>
<БазоваяЕдиница МеждународноеСокращение="pcs" НаименованиеПолное="штука" Код="3 " >шт.</БазоваяЕдиница>
-<Цены> -<Цена> <Представление>760 ,55 ГРН за шт.</Представление>
<ИдТипаЦены>7 c1de779-531 e-11 e0-9202 -001 a4d5f78b9</ИдТипаЦены>
<ЦенаЗаЕдиницу>760.55 </ЦенаЗаЕдиницу>
<Валюта>ГРН</Валюта>
<Единица>шт.</Единица>
<Коэффициент>1 </Коэффициент>
</Цена> </Цены>
<Количество>2 </Количество>
</Предложение> -<Предложение>
Цитата(Acid @ 11.11.14, 10:31)
Проверте в этом месте какая Цена получается:
НовЦена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(СтрокаЦены.Цена,СтрокаЦены.Валюта,ТекТипЦены);
Если в долларах, то укажите явно Гривну. Ну и проверте.
Запустил отладчик, поставил точку останова, пошагово прошёл тот кусок кода и в Переменную "НовЦена" ничего не передаётся. Значение пусто, тип Неопределенно.
11.11.14, 11:47
Говорящий
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Acid @ 11.11.14, 12:35)
когда на стороне сайта делается парсинг хмл-файла, там валюта ищется по строке "EUR" либо "ГРН". А если искать надо по международному названию гривны? "UAH" Для начала попробуйте в справочнике международное название гривны поменять. Возможно еще ошибка в верхнем/нижнем регистре. Если не поможет, можно методом исключения действовать. Если не нужна цена в долларах, а только в гривнах, то выгружать цену только в гривне. Тогда проще будет. В общем хочется или нет, а парсинг все равно надо будет разбирать.
Вот есть код формы элемента справочника номенклатура. ПринтСкрин я вылаживал в самом начале. Так вот колонка "Цена в ГРН" считается вот так:
Процедура ОсновнаяПанельПриСменеСтраницы(Элемент, ТекущаяСтраница)
УстановитьВидимость(Истина );
Если ТекущаяСтраница=13 Тогда
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Цены.ТипЦен КАК ТипЦен,
| Цены.Цена КАК Цена,
| Цены.СпособРасчетаЦены КАК СпособРасчетаЦены,
| Цены.Валюта КАК Валюта,
| Цены.ЦенаГРН КАК кЦенаГРН,
| Цены.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Цены.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен В (&ТипыЦен)
| И Номенклатура = &Номенклатура И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
| ) КАК Цены
|" );
Запрос.УстановитьПараметр("Дата" , РабочаяДата);
Запрос.УстановитьПараметр("ТипыЦен" , ЦеныНоменклатуры.ВыгрузитьКолонку("ТипЦен" ));
Запрос.УстановитьПараметр("Номенклатура" , Ссылка);
ТЗ = Запрос.Выполнить().Выгрузить();
Для каждого Выборка из ТЗ Цикл
СтрокаЦен = ЦеныНоменклатуры.Найти(Выборка.ТипЦен, "ТипЦен" );
ВГРН = Константы.ВалютаРегламентированногоУчета.Получить();
Если Выборка.Валюта<>ВГРН Тогда
КурсТекВалюты = МодульВалютногоУчета.ПолучитьКурсВалюты(Выборка.Валюта, ТекущаяДата());
КурсТекВалюты1 = МодульВалютногоУчета.ПолучитьКурсВалюты(ВГРН, ТекущаяДата());
Выборка.кЦенаГРН = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту1 (Выборка.Цена, КурсТекВалюты, КурсТекВалюты1 , КурсТекВалюты.Курс, КурсТекВалюты1 .Курс,
КурсТекВалюты.Кратность, КурсТекВалюты1 .Кратность);
Иначе
Выборка.кЦенаГРН = Выборка.Цена;
КонецЕсли ;
ЗаполнитьЗначенияСвойств(СтрокаЦен, Выборка);
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Я вот думаю как бы подобную схему реализовать в модуле обмена с сайтом. То есть чтобы он пересчитывал цены в грн по курсу.
Не нашли ответа на свой вопрос?
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!