//////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС //////////////////////////////////////////////////////////////////////////////// // {Вызываются с клиента} //////////////////////////////////////////////////////////////////////////////// // Процедуры запуска обмена. // Выполняет запуск обмена с сайтом // // // Параметры: // УзелОбмена - ПланОбменаСсылка.ОбменаУправлениеТорговлейСайт, // РежимОбмена - строка, имя события для ЖурналаРегистрации // Процедура ВыполнитьОбмен(УзелОбмена, РежимЗапускаОбмена) Экспорт Если УзелОбмена = ПланыОбмена.ОбменУправлениеТорговлейСайт.ЭтотУзел() Тогда Возврат; КонецЕсли; ОсновныеПараметры = Новый Структура; // форматы по схеме CML 2.04 ОсновныеПараметры.Вставить("ФорматСуммы", "ЧЦ=18; ЧДЦ=2; ЧРД=.; ЧГ="); ОсновныеПараметры.Вставить("ФорматКоличества", "ЧРД=.; ЧГ=; ЧН=0"); // ЧН=0 Добавил : 11-03-2013 ОсновныеПараметры.Вставить("СписокНоменклатуры"); // Добавил : 26-10-2013 Тут я буду хранить Список номенклатуры с характеристиками и остатком ДобавитьНастройкиУзлаВПараметры(УзелОбмена, ОсновныеПараметры); ОсновныеПараметры.Вставить("РежимЗапускаОбмена", РежимЗапускаОбмена); СистемнаяИнформация = Новый СистемнаяИнформация; ПлатформаWindows = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64; ОсновныеПараметры.Вставить("ПлатформаWindows", ПлатформаWindows); ДатаФормирования = ТекущаяДата(); ОсновныеПараметры.Вставить("ДатаФормирования", ДатаФормирования); ОсновныеПараметры.Вставить("ИспользоватьХарактеристики", ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры")); ОсновныеПараметры.Вставить("ИспользоватьЗаказыКлиентов", ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыКлиентов")); ТаблицаИнформации = РегистрыСведений.СостоянияОбменовДанными.СоздатьНаборЗаписей().Выгрузить(); ТаблицаИнформации.Колонки.Добавить("Описание", Новый ОписаниеТипов("Строка")); СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.ДатаНачала = ТекущаяДата(); Если ОсновныеПараметры.ВыгружатьНаСайт Тогда ОписаниеОшибки = ""; НастройкиПодключения = Новый Структура; Если НЕ ПолучитьНастройкиПодключения(ОсновныеПараметры, НастройкиПодключения, ОписаниеОшибки) Тогда СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; СтрокаТаблицыИнформации.Описание = ОписаниеОшибки; ВыполнитьДействияПриЗавершенииОбмена(ОсновныеПараметры, ТаблицаИнформации, Истина); Возврат; КонецЕсли; ДобавитьПараметрыПротоколаОбменаВСтруктуру(НастройкиПодключения); ОсновныеПараметры.Вставить("НастройкиПодключения", НастройкиПодключения); КонецЕсли; КаталогВыгрузки = ОсновныеПараметры.КаталогВыгрузки; Если ПустаяСтрока(КаталогВыгрузки) Тогда КаталогВыгрузки = КаталогВременныхФайлов(); Иначе КаталогВыгрузки = ОсновныеПараметры.КаталогВыгрузки; ПоследнийСимвол = Прав(КаталогВыгрузки, 1); Если НЕ ПоследнийСимвол = "\" Тогда КаталогВыгрузки = КаталогВыгрузки + "\"; КонецЕсли; КонецЕсли; ПодкаталогБезопасностиКаталогаВыгрузки = "webdata"; КаталогНаДиске = КаталогВыгрузки + ПодкаталогБезопасностиКаталогаВыгрузки; КаталогНаДиске = ПолучитьПутьДляПлатформы(ПлатформаWindows, КаталогНаДиске); Попытка СоздатьКаталог(КаталогНаДиске); Исключение СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; СтрокаТаблицыИнформации.Описание = ОписаниеИсключительнойОшибки(); ВыполнитьДействияПриЗавершенииОбмена(ОсновныеПараметры, ТаблицаИнформации, Истина); Возврат; КонецПопытки; ОписаниеОшибки = ""; Если НЕ КаталогОчищен(КаталогНаДиске, ОписаниеОшибки) Тогда СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; СтрокаТаблицыИнформации.Описание = ОписаниеОшибки; ВыполнитьДействияПриЗавершенииОбмена(ОсновныеПараметры, ТаблицаИнформации, Истина); Возврат; КонецЕсли; ФайлЗагрузки = ОсновныеПараметры.ФайлЗагрузки; ФайлЗагрузки = ПолучитьПутьДляПлатформы(ПлатформаWindows, ФайлЗагрузки); ОсновныеПараметры.Вставить("ФайлЗагрузки", ФайлЗагрузки); Если ОсновныеПараметры.ВыгружатьТолькоИзменения Тогда СтруктураИзменений = ПолучитьВсеИзмененияИзПланаОбмена(УзелОбмена); КонецЕсли; ТоварыУспешноВыгружены = Истина; ОсновныеПараметры.Вставить("КаталогНаДиске", КаталогНаДиске); ОсновныеПараметры.Вставить("ПодкаталогФайлов", "import_files"); ОсновныеПараметры.Вставить("СтруктураИзменений", СтруктураИзменений); ОсновныеПараметры.Вставить("НаименованиеНалога", НСтр("ru = 'НДС'")); ОсновныеПараметры.Вставить("НаименованиеСкидки", НСтр("ru = 'Скидка'")); УдалитьРегистрациюИзмененийТовары = Ложь; УдалитьРегистрациюИзмененийЗаказы = Ложь; Если ОсновныеПараметры.ОбменТоварами Тогда СтрокаТаблицыИнформации.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных; СтрокаТаблицыИнформации.Описание = Строка(ТекущаяДата()) + " " + НСтр("ru = 'Запуск выгрузки товаров'"); /////////////////////////////////////////// ТоварыУспешноВыгружены = ТоварыВыгружены(ОсновныеПараметры, СтрокаТаблицыИнформации); /////////////////////////////////////////// Если ОсновныеПараметры.ВыгружатьТолькоИзменения И ТоварыУспешноВыгружены Тогда УдалитьРегистрациюИзмененийТовары = Истина; КонецЕсли; КонецЕсли; ЗаказыУспешноВыгружены = Истина; Если ОсновныеПараметры.ИспользоватьЗаказыКлиентов И ОсновныеПараметры.ОбменЗаказами Тогда Если НЕ ОсновныеПараметры.ОбменТоварами Тогда ТаблицаИнформации.Удалить(СтрокаТаблицыИнформации); КонецЕсли; /////////////////////////////////////////// ЗаказыУспешноВыгружены = ОбменЗаказамиВыполнен(ОсновныеПараметры, ТаблицаИнформации); /////////////////////////////////////////// Если ОсновныеПараметры.ВыгружатьТолькоИзменения И ЗаказыУспешноВыгружены Тогда УдалитьРегистрациюИзмененийЗаказы = Истина; КонецЕсли; КонецЕсли; Если УдалитьРегистрациюИзмененийТовары ИЛИ УдалитьРегистрациюИзмененийЗаказы Тогда УдалитьРегистрациюИзменений(УзелОбмена, СтруктураИзменений, УдалитьРегистрациюИзмененийТовары, УдалитьРегистрациюИзмененийЗаказы); КонецЕсли; ВыполнитьДействияПриЗавершенииОбмена(ОсновныеПараметры, ТаблицаИнформации); Если ОсновныеПараметры.ВыполнятьПолнуюВыгрузкуПринудительно И ТоварыУспешноВыгружены И ЗаказыУспешноВыгружены Тогда УзелОбъект = УзелОбмена.ПолучитьОбъект(); УзелОбъект.ВыполнятьПолнуюВыгрузкуПринудительно = Ложь; УзелОбъект.Записать(); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Экспортируемые процедуры и функции. // Возвращает результат тестового подключения к сайту // // // Параметры: // УзелОбмена // // Возвращаемое значение: // Строка // Функция ПолучитьРезультатТестовогоПодключенияКСайту(УзелОбмена) Экспорт НастройкиПодключения = Новый Структура; ТипСоединения = "catalog"; ОписаниеОшибки = ""; Если НЕ ПолучитьНастройкиПодключения(УзелОбмена, НастройкиПодключения, ОписаниеОшибки) Тогда Возврат НСтр("ru = 'Ошибка при получении параметров подключения к сайту.'") + Символы.ПС + ОписаниеОшибки; КонецЕсли; Соединение = ПолучитьСоединениеССервером(НастройкиПодключения, ОписаниеОшибки); Если Соединение = Неопределено Тогда Возврат НСтр("ru = 'Ошибка при установке соединения с сайтом.'") + Символы.ПС + ОписаниеОшибки; КонецЕсли; ОтветСервера = ""; Успешно = АвторизацияВыполнена(Соединение, НастройкиПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения); Если Успешно Тогда Возврат НСтр("ru = 'Соединение с сайтом успешно установлено.'"); Иначе Возврат НСтр("ru = 'Не удалось установить соединение.'") + Символы.ПС + ОписаниеОшибки; КонецЕсли; КонецФункции //////////////////////////////////////////////////////////////////////////////// // {Вызываются с сервера} //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции установки параметров сеанса. // Выполняет установку параметров сеанса. Вызывается из модуля сеанса // // // Параметры: // ИмяПараметра - строка с именем параметра сеанса // УстановленныеПараметры - массив всех установленных параметров сеанса // Процедура УстановитьПараметрыСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт ОбновитьПараметрыСеанса(); УстановленныеПараметры.Добавить("ОбменДаннымиССайтомВключен"); УстановленныеПараметры.Добавить("ИспользуемыеУзлыОбменаССайтом"); КонецПроцедуры // Обновляет значения параметров сеанса // // // Параметры: // Процедура ОбновитьПараметрыСеанса() Экспорт УстановитьПривилегированныйРежим(Истина); ИспользоватьОбменССайтами = ПолучитьФункциональнуюОпцию("ИспользоватьОбменССайтами"); ИспользуемыеУзлыОбменаССайтом = Новый Массив; Если ИспользоватьОбменССайтами Тогда ИспользуемыеУзлыОбменаССайтом = ПолучитьИспользуемыеУзлыОбменаССайтом(); КонецЕсли; ОбменДаннымиССайтомВключен = НЕ ИспользуемыеУзлыОбменаССайтом.Количество() = 0; ПараметрыСеанса.ОбменДаннымиССайтомВключен = ОбменДаннымиССайтомВключен; ПараметрыСеанса.ИспользуемыеУзлыОбменаССайтом = Новый ФиксированныйМассив(ИспользуемыеУзлыОбменаССайтом); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Процедуры запуска обмена. // Выполняет запуск обмена с сайтом из регламентного задания // // // Параметры: // КодНастройки - строка с кодом настройки обмена (узла плана обмена) // Процедура ЗаданиеВыполнитьОбмен(КодУзлаОбмена) Экспорт Если ПустаяСтрока(ИмяПользователя()) Тогда УстановитьПривилегированныйРежим(Истина); КонецЕсли; УзелОбмена = ПланыОбмена.ОбменУправлениеТорговлейСайт.НайтиПоКоду(КодУзлаОбмена); Если НЕ ЗначениеЗаполнено(УзелОбмена) Тогда ЗаписьЖурналаРегистрации("Обмен с сайтами", УровеньЖурналаРегистрации.Ошибка, УзелОбмена.Метаданные(), УзелОбмена, НСтр("ru = 'Не найден узел обмена с кодом'") + " " + КодУзлаОбмена); Возврат; КонецЕсли; Если УзелОбмена.ПометкаУдаления Тогда ЗаписьЖурналаРегистрации("Обмен с сайтами", УровеньЖурналаРегистрации.Информация, УзелОбмена.Метаданные(), УзелОбмена, НСтр("ru = 'Настройка обмена помечена на удаление. Обмен отменен.'")); Возврат; КонецЕсли; ВыполнитьОбмен(УзелОбмена, НСтр("ru = 'Фоновый обмен'")); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Экспортируемые процедуры и функции. // Формирует код и наименование узла этой ИБ // // // Параметры: // нет // // Возвращаемое значение: // Нет // Процедура УстановитьКодНаименованиеУзлаЭтойИБ() Экспорт УстановитьПривилегированныйРежим(Истина); ЭтотУзел = ПланыОбмена.ОбменУправлениеТорговлейСайт.ЭтотУзел(); ЭтотУзелОбъект = ЭтотУзел.ПолучитьОбъект(); ЕстьИзменения = Ложь; Если ПустаяСтрока(ЭтотУзелОбъект.Код) Тогда ЭтотУзелОбъект.УстановитьНовыйКод(); ЕстьИзменения = Истина; КонецЕсли; Если ПустаяСтрока(ЭтотУзелОбъект.Наименование) Тогда ЭтотУзелОбъект.Наименование = НСтр("ru = 'Эта информационная база'"); ЕстьИзменения = Истина; КонецЕсли; Если ЕстьИзменения Тогда ЭтотУзелОбъект.Записать(); КонецЕсли; КонецПроцедуры // Записывает в структуру сылки на измененные объекты по узлу плана обмена // // // Параметры: // УзелПланаОбмена - ПланОбмена.Ссылка // СтруктураВозврата - Структура // // Возвращаемое значение: // Нет // Процедура ЗаполнитьСтруктуруИзмененийДляУзла(УзелПланаОбмена, СтруктураВозврата) Экспорт СтруктураВозврата.Вставить("Товары", Новый Массив); СтруктураВозврата.Вставить("Заказы", Новый Массив); СтруктураВозврата.Вставить("Файлы", Новый Массив); Запрос = Новый Запрос( "ВЫБРАТЬ | НоменклатураИзменения.Ссылка, | ""Товары"" КАК ТипСсылки |ИЗ | Справочник.Номенклатура.Изменения КАК НоменклатураИзменения |ГДЕ | НоменклатураИзменения.Узел = &Узел | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ФайлыИзменения.Ссылка, | ""Файлы"" |ИЗ | Справочник.Файлы.Изменения КАК ФайлыИзменения |ГДЕ | ФайлыИзменения.Узел = &Узел | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | НоменклатураПрисоединенныеФайлыИзменения.Ссылка, | ""Файлы"" |ИЗ | Справочник.НоменклатураПрисоединенныеФайлы.Изменения КАК НоменклатураПрисоединенныеФайлыИзменения |ГДЕ | НоменклатураПрисоединенныеФайлыИзменения.Узел = &Узел | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ЗаказыИзменения.Ссылка, | ""Заказы"" |ИЗ | Документ.ЗаказКлиента.Изменения КАК ЗаказыИзменения |ГДЕ | ЗаказыИзменения.Узел = &Узел"); Запрос.УстановитьПараметр("Узел", УзелПланаОбмена); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СтруктураВозврата[Выборка.ТипСсылки].Добавить(Выборка.Ссылка); КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Служебные процедуры и функции выполнения обмена. Функция ПолучитьМассивУзловДляРегистрации(ВыбиратьУзлыОбменаТоварами = Ложь, ВыбиратьУзлыОбменаЗаказами = Ложь) Экспорт МассивУзлов = Новый Массив(); Для Каждого Элемент Из ПараметрыСеанса.ИспользуемыеУзлыОбменаССайтом Цикл Если ВыбиратьУзлыОбменаТоварами И Элемент.ОбменТоварами Тогда МассивУзлов.Добавить(Элемент); ИначеЕсли ВыбиратьУзлыОбменаЗаказами И Элемент.ОбменЗаказами Тогда МассивУзлов.Добавить(Элемент); КонецЕсли; КонецЦикла; Возврат МассивУзлов; КонецФункции Функция ПолучитьРеквизитыЗаказаНаСайте(ЗаказКлиента, ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте, ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте) Экспорт Свойства = Новый Массив; Свойства.Добавить(ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте); Свойства.Добавить(ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте); Запрос = Новый Запрос( "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ЗаказКлиентаДополнительныеРеквизиты.Свойство, | ЗаказКлиентаДополнительныеРеквизиты.Значение |ИЗ | Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказКлиентаДополнительныеРеквизиты |ГДЕ | ЗаказКлиентаДополнительныеРеквизиты.Ссылка = &ЗаказКлиента | И ЗаказКлиентаДополнительныеРеквизиты.Свойство В (&Свойства)"); Запрос.УстановитьПараметр("ЗаказКлиента", ЗаказКлиента); Запрос.УстановитьПараметр("Свойства", Свойства); Результат = Запрос.Выполнить(); Если Результат.Пустой()Тогда Возврат НеОпределено; КонецЕсли; Выборка = Результат.Выбрать(); СтруктураВозврата = Новый Структура; СтруктураВозврата.Вставить("НомерЗаказаНаСайте"); СтруктураВозврата.Вставить("ДатаЗаказаНаСайте"); Пока Выборка.Следующий() Цикл Если Выборка.Свойство = ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте Тогда СтруктураВозврата.НомерЗаказаНаСайте = Выборка.Значение; ИначеЕсли Выборка.Свойство = ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте Тогда СтруктураВозврата.ДатаЗаказаНаСайте = Выборка.Значение; КонецЕсли; КонецЦикла; Если СтруктураВозврата.НомерЗаказаНаСайте = НеОпределено ИЛИ СтруктураВозврата.ДатаЗаказаНаСайте = НеОпределено Тогда Возврат НеОпределено; КонецЕсли; Возврат СтруктураВозврата; КонецФункции //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции установки параметров сеанса. // Получает массив узлов обмена, используемых в настройках обмена // // // Параметры: // Функция ПолучитьИспользуемыеУзлыОбменаССайтом() Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ | ОбменУправлениеТорговлейСайт.Ссылка |ИЗ | ПланОбмена.ОбменУправлениеТорговлейСайт КАК ОбменУправлениеТорговлейСайт |ГДЕ | (НЕ ОбменУправлениеТорговлейСайт.ПометкаУдаления) | И ОбменУправлениеТорговлейСайт.ВыгружатьТолькоИзменения"); Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); КонецФункции //////////////////////////////////////////////////////////////////////////////// // Служебные процедуры и функции выполнения обмена. Функция ПолучитьСоединениеССервером(ПараметрыПодключения, ОписаниеОшибки) Соединение = НеОпределено; Попытка Соединение = Новый HTTPСоединение(ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, ПараметрыПодключения.ЗащищенноеСоединение); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось установить соединение с сервером %1:%2. Проверьте правильность адреса сервера, порт, имя пользователя и пароль.'"), ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт))); Соединение = Неопределено; Конецпопытки; Возврат Соединение; КонецФункции Процедура ОпределитьПоДаннымТипВидКонтактнойИнформации(КонтактТип, ТипКИ, ВидКИ) Если КонтактТип = "ТелефонРабочий" Тогда ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон; ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонПартнера; ИначеЕсли КонтактТип = "Почта" Тогда ТипКИ = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailПартнера; КонецЕсли; КонецПроцедуры Функция АвторизацияВыполнена(Соединение, ПараметрыПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения = "catalog") Соединение = ПолучитьСоединениеССервером(ПараметрыПодключения, ОписаниеОшибки); Если Соединение = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Авторизация не выполнена.'")); Возврат Ложь; КонецЕсли; ОписаниеОшибки = ""; ОтветСервера = ПолучитьДанныеССервера(Соединение, ПараметрыПодключения.АдресСкрипта + "?type=" + ТипСоединения + "&mode=checkauth", , ОписаниеОшибки); Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Авторизация не выполнена.'")); Возврат Ложь; КонецЕсли; Если СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 1))) <> "success" Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Авторизация не выполнена.'") + Символы.ПС + НСтр("ru = 'Не удалось установить соединение с сервером. Проверьте имя пользователя и пароль.'")); Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции Функция ПолучитьПутьДляПлатформы(ПлатформаWindows, Путь) Если ПлатформаWindows Тогда ЧтоМенять = "/"; НаЧтоМенять = "\"; Иначе ЧтоМенять = "\"; НаЧтоМенять = "/"; КонецЕсли; Путь = СтрЗаменить(Путь, ЧтоМенять, НаЧтоМенять); Возврат Путь; КонецФункции Процедура УстановитьПараметрИспользованияСегментовНоменклатуры(КомпоновщикНастроек) ИспользуетсяОтборПоСегментуНоменклатуры = Ложь; Отбор = КомпоновщикНастроек.Настройки.Отбор; ПолеСегмент = Новый ПолеКомпоновкиДанных("СегментНоменклатуры"); Для Каждого ЭлементОтбора Из Отбор.Элементы Цикл Если ЭлементОтбора.ЛевоеЗначение = ПолеСегмент Тогда Если ЭлементОтбора.Использование Тогда ИспользуетсяОтборПоСегментуНоменклатуры = Истина; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ИспользуетсяОтборПоСегментуНоменклатуры"); ПараметрСКД.Значение = ИспользуетсяОтборПоСегментуНоменклатуры; ПараметрСКД.Использование = Истина; КонецПроцедуры Процедура ПодготовитьДанныеДляВыгрузки(Параметры); // Компоновщик настроек КомпоновщикНастроек = ПолучитьКомпоновщикНастроекВыгрузкиТоваров(Параметры.СтрокаТаблицыКаталогов.ХранилищеНастроекКомпоновки); ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ИспользоватьХарактеристики"); ПараметрСКД.Значение = Параметры.ИспользоватьХарактеристики; ПараметрСКД.Использование = Истина; ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ОрганизацияВладелецКаталога"); ПараметрСКД.Значение = Параметры.ОрганизацияВладелецКаталога; ПараметрСКД.Использование = Истина; УстановитьПараметрИспользованияСегментовНоменклатуры(КомпоновщикНастроек); // Отборы Если Параметры.ВыгружатьТолькоИзменения И НЕ Параметры.ВыполнятьПолнуюВыгрузкуПринудительно Тогда ИзменитьОтборКомпоновщика(КомпоновщикНастроек, Параметры.СтрокаТаблицыКаталогов.Группы, Параметры.КлассифицироватьПоВидамНоменклатуры, Параметры.МассивИзмененийНоменклатуры); Иначе ИзменитьОтборКомпоновщика(КомпоновщикНастроек, Параметры.СтрокаТаблицыКаталогов.Группы, Параметры.КлассифицироватьПоВидамНоменклатуры); КонецЕсли; // Запрос Запрос = Новый Запрос; ПолучитьЗапросДляВыгрузкиТоваров(КомпоновщикНастроек, Запрос); ДобавитьЗапросыВПакет(Запрос.Текст, Параметры); // Отбор по файлам ОтбиратьФайлы = Параметры.ВыгружатьТолькоИзменения И НЕ Параметры.ВыполнятьПолнуюВыгрузкуПринудительно; Запрос.УстановитьПараметр("ОтбиратьФайлы", ОтбиратьФайлы); Запрос.УстановитьПараметр("МассивФайлов", ?(ОтбиратьФайлы, Параметры.СтруктураИзменений.Файлы, НеОпределено)); МассивРезультатовЗапроса = Запрос.ВыполнитьПакет(); ИндексПоследнегоРезультата = МассивРезультатовЗапроса.Количество() - 1; Параметры.Вставить("ВыборкаЦен", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 22].Выбрать()); // Параметры.Вставить("ВыборкаСоглашений", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 19].Выбрать()); // Параметры.Вставить("ДеревоСвойствХарактеристик", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 18].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)); // Параметры.Вставить("ВыборкаСвойствНоменклатурыДляКлассификатора", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 13].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам)); // Параметры.Вставить("ВыборкаСвойствНоменклатуры", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 12].Выбрать()); Если Параметры.ВыборкаСвойствНоменклатуры.Количество() = 0 Тогда Параметры.ВыборкаСвойствНоменклатуры = НеОпределено; Иначе Параметры.ВыборкаСвойствНоменклатуры.Следующий(); КонецЕсли; // Параметры.Вставить("ВыборкаФайлов", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 7].Выбрать()); Если Параметры.ВыборкаФайлов.Количество() = 0 Тогда Параметры.ВыборкаФайлов = НеОпределено; Иначе Параметры.ВыборкаФайлов.Следующий(); КонецЕсли; // ВыборкаДанныхОрганизацииВладельцаКаталога = МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 5].Выбрать(); Если ВыборкаДанныхОрганизацииВладельцаКаталога.Следующий() Тогда Параметры.Вставить("ДанныеОрганизацииВладельцаКаталога", ВыборкаДанныхОрганизацииВладельцаКаталога); Иначе Параметры.Вставить("ДанныеОрганизацииВладельцаКаталога", НеОпределено); КонецЕсли; // Параметры.Вставить("ВыборкаНоменклатуры", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 4].Выбрать()); // Параметры.Вставить("ДеревоГрупп", МассивРезультатовЗапроса[ИндексПоследнегоРезультата - 1].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией)); КонецПроцедуры Процедура ДобавитьНастройкиУзлаВПараметры(УзелОбмена, Параметры) Запрос = Новый Запрос( "ВЫБРАТЬ | ОбменУправлениеТорговлейСайт.Ссылка КАК УзелОбмена, | ОбменУправлениеТорговлейСайт.ПометкаУдаления, | ОбменУправлениеТорговлейСайт.ВыгружатьТолькоИзменения, | ОбменУправлениеТорговлейСайт.ВыполнятьПолнуюВыгрузкуПринудительно, | ОбменУправлениеТорговлейСайт.ОбменТоварами, | ОбменУправлениеТорговлейСайт.ОбменЗаказами, | ОбменУправлениеТорговлейСайт.ВыгружатьНаСайт, | ОбменУправлениеТорговлейСайт.КаталогВыгрузки, | ОбменУправлениеТорговлейСайт.АдресСайта, | ОбменУправлениеТорговлейСайт.ИмяПользователя, | ОбменУправлениеТорговлейСайт.Пароль, | ОбменУправлениеТорговлейСайт.ИспользоватьРегламентныеЗадания, | ОбменУправлениеТорговлейСайт.ИдентификаторРегламентногоЗадания, | ОбменУправлениеТорговлейСайт.ГруппаДляНовойНоменклатуры, | ОбменУправлениеТорговлейСайт.Организация, | ОбменУправлениеТорговлейСайт.Менеджер, | ОбменУправлениеТорговлейСайт.ЗаписыватьДокументыТекущейДатой, | ОбменУправлениеТорговлейСайт.ПроводитьДокументы, | ОбменУправлениеТорговлейСайт.ПроводитьДокументыОперативно, | ОбменУправлениеТорговлейСайт.СпособИдентификацииКонтрагентов, | ОбменУправлениеТорговлейСайт.ЕдиницаИзмеренияНовойНоменклатуры, | ОбменУправлениеТорговлейСайт.ПричинаОтменыЗаказа, | ОбменУправлениеТорговлейСайт.ВыгружатьКартинки, | ОбменУправлениеТорговлейСайт.ВыгружатьФайлы, | ОбменУправлениеТорговлейСайт.СохраненнаяТаблицаКаталогов, | ОбменУправлениеТорговлейСайт.КлассифицироватьПоВидамНоменклатуры, | ОбменУправлениеТорговлейСайт.ВидНоменклатурыТовар, | ОбменУправлениеТорговлейСайт.ВидНоменклатурыУслуга, | ОбменУправлениеТорговлейСайт.ОрганизацияВладелецКаталога, | ОбменУправлениеТорговлейСайт.КоэффициентПересчетаВеса, | ОбменУправлениеТорговлейСайт.Соглашение, | ОбменУправлениеТорговлейСайт.ФайлЗагрузки, | ОбменУправлениеТорговлейСайт.ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте, | ОбменУправлениеТорговлейСайт.ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте, | ОбменУправлениеТорговлейСайт.СтатусЗаказаОтменен, | ОбменУправлениеТорговлейСайт.ВестиНумерациюЗаказовПоДаннымСайта, | ОбменУправлениеТорговлейСайт.СоответствиеСтатусовЗаказов.( | СтатусЗаказаНаСайте КАК СтатусЗаказаНаСайте, | СтатусЗаказаКлиента КАК СтатусЗаказаКлиента | ) КАК ТаблицаСоответствияСтатусовЗаказов |ИЗ | ПланОбмена.ОбменУправлениеТорговлейСайт КАК ОбменУправлениеТорговлейСайт |ГДЕ | ОбменУправлениеТорговлейСайт.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", УзелОбмена); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат; // Неизвестная ошибка.. КонецЕсли; ТаблицаНастроек = Результат.Выгрузить(); Для Каждого Колонка Из ТаблицаНастроек.Колонки Цикл Параметры.Вставить(Колонка.Имя, ТаблицаНастроек[0][Колонка.Имя]); КонецЦикла; КонецПроцедуры Процедура ПодготовитьМассивИзмененийНоменклатуры(Параметры) МассивИзмененийНоменклатуры = Новый Массив; Если Параметры.ВыгружатьТолькоИзменения И НЕ Параметры.ВыполнятьПолнуюВыгрузкуПринудительно Тогда МассивИзмененийНоменклатуры = Параметры.СтруктураИзменений.Товары; КонецЕсли; Параметры.Вставить("МассивИзмененийНоменклатуры", МассивИзмененийНоменклатуры); КонецПроцедуры Процедура ДобавитьЗапросыВПакет(ТекстЗапроса, Параметры) ТекстЗапроса = ТекстЗапроса + Символы.ПС + ";" + Символы.ПС + "УНИЧТОЖИТЬ ВремЦеныПоСоглашениям |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремШтрихкодыДляЦен |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | ВремЦены.Соглашение КАК Соглашение, | ВремЦены.ВалютаСоглашения КАК ВалютаСоглашения, | ВремЦены.ЦенаВключаетНДС КАК ЦенаВключаетНДС |ИЗ | ВремЦены КАК ВремЦены |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | ВремЦены.Характеристика КАК Характеристика, | ХарактеристикиНоменклатурыДополнительныеРеквизиты.Свойство, | ХарактеристикиНоменклатурыДополнительныеРеквизиты.Значение |ИЗ | ВремЦены КАК ВремЦены | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатурыДополнительныеРеквизиты | ПО ВремЦены.Характеристика = ХарактеристикиНоменклатурыДополнительныеРеквизиты.Ссылка |ИТОГИ ПО | Характеристика |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремЦены |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | ВремНоменклатураХарактеристики.Номенклатура КАК Номенклатура, | ВремНоменклатураХарактеристики.ПометкаУдаления КАК ПометкаУдаления, | ВремНоменклатураХарактеристики.Родитель КАК Родитель, | ВремНоменклатураХарактеристики.Код КАК Код, | ВремНоменклатураХарактеристики.Наименование КАК Наименование, | ВремНоменклатураХарактеристики.Артикул КАК Артикул, | ВремНоменклатураХарактеристики.Производитель КАК Производитель, | ВремНоменклатураХарактеристики.ПроизводительНаименование КАК ПроизводительНаименование, | ВремНоменклатураХарактеристики.ВидНоменклатуры КАК ВидНоменклатуры, | ВремНоменклатураХарактеристики.ВидНоменклатуры.НаборСвойств КАК НаборСвойств, | ВремНоменклатураХарактеристики.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | ВремНоменклатураХарактеристики.ЕдиницаИзмерения.Код КАК ЕдиницаИзмеренияКод, | ВремНоменклатураХарактеристики.ЕдиницаИзмерения.НаименованиеПолное КАК ЕдиницаИзмеренияНаименованиеПолное, | ВремНоменклатураХарактеристики.ЕдиницаИзмерения.МеждународноеСокращение КАК ЕдиницаИзмеренияМеждународноеСокращение, | ВремНоменклатураХарактеристики.НаборУпаковок КАК НаборУпаковок, | ВремНоменклатураХарактеристики.СтавкаНДС КАК СтавкаНДС, | ВремНоменклатураХарактеристики.ТипНоменклатуры КАК ТипНоменклатуры, | ВремНоменклатураХарактеристики.ФайлКартинки КАК ФайлКартинки |ПОМЕСТИТЬ ВремНоменклатура |ИЗ | ВремНоменклатураХарактеристики КАК ВремНоменклатураХарактеристики |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремНоменклатураХарактеристики |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ДопРеквизиты.Номенклатура КАК Номенклатура, | ДопРеквизиты.Свойство КАК Свойство, | ЗначенияДопРеквизитов.Значение КАК Значение |ПОМЕСТИТЬ ВремСвойстваНоменклатуры |ИЗ | (ВЫБРАТЬ | ВремНоменклатура.Номенклатура КАК Номенклатура, | НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Свойство КАК Свойство | ИЗ | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремНоменклатура КАК ВремНоменклатура | ПО НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Ссылка = ВремНоменклатура.НаборСвойств | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВремНоменклатура.Номенклатура, | НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Свойство | ИЗ | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремНоменклатура КАК ВремНоменклатура | ПО (НаборыДополнительныхРеквизитовИСведенийДополнительныеРеквизиты.Ссылка = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура_Общие))) КАК ДопРеквизиты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ЗначенияДопРеквизитов | ПО ДопРеквизиты.Свойство = ЗначенияДопРеквизитов.Свойство | И ДопРеквизиты.Номенклатура = ЗначенияДопРеквизитов.Ссылка | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | ДопСведения.Номенклатура, | ДопСведения.Свойство, | ЗначенияДопСведений.Значение |ИЗ | (ВЫБРАТЬ | ВремНоменклатура.Номенклатура КАК Номенклатура, | НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство КАК Свойство | ИЗ | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремНоменклатура КАК ВремНоменклатура | ПО НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Ссылка = ВремНоменклатура.НаборСвойств | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВремНоменклатура.Номенклатура, | НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство | ИЗ | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремНоменклатура КАК ВремНоменклатура | ПО (НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Ссылка = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура_Общие))) КАК ДопСведения | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ЗначенияДопСведений | ПО ДопСведения.Свойство = ЗначенияДопСведений.Свойство | И ДопСведения.Номенклатура = ЗначенияДопСведений.Объект |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Свойства.Свойство КАК Свойство, | Свойства.Свойство.ТипЗначения КАК ТипЗначения, | Свойства.Значение КАК Значение |ИЗ | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ВремСвойстваНоменклатуры.Свойство КАК Свойство, | ВремСвойстваНоменклатуры.Значение КАК Значение | ИЗ | ВремСвойстваНоменклатуры КАК ВремСвойстваНоменклатуры) КАК Свойства |ИТОГИ ПО | Свойство |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Свойства.Свойство КАК Свойство, | Свойства.Значение КАК Значение, | Свойства.Номенклатура КАК Номенклатура |ИЗ | ВремСвойстваНоменклатуры КАК Свойства | |УПОРЯДОЧИТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремСвойстваНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ | Упаковки.Номенклатура КАК Номенклатура, | Упаковки.НаборУпаковок КАК НаборУпаковок, | МИНИМУМ(Упаковки.Коэффициент) КАК Коэффициент |ПОМЕСТИТЬ ВремУпаковки |ИЗ | (ВЫБРАТЬ | ВремНоменклатура.Номенклатура КАК Номенклатура, | ВремНоменклатура.НаборУпаковок КАК НаборУпаковок, | УпаковкиНоменклатуры.Коэффициент КАК Коэффициент | ИЗ | ВремНоменклатура КАК ВремНоменклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры | ПО ВремНоменклатура.НаборУпаковок = УпаковкиНоменклатуры.Владелец | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | ВремНоменклатура.Номенклатура, | ВремНоменклатура.НаборУпаковок, | УпаковкиНоменклатуры.Коэффициент | ИЗ | ВремНоменклатура КАК ВремНоменклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры | ПО (ВремНоменклатура.НаборУпаковок = ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ИндивидуальныйДляНоменклатуры)) | И ВремНоменклатура.Номенклатура = УпаковкиНоменклатуры.Владелец) КАК Упаковки | |СГРУППИРОВАТЬ ПО | Упаковки.Номенклатура, | Упаковки.НаборУпаковок |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Упаковки.Номенклатура КАК Номенклатура, | Упаковки.Упаковка КАК Упаковка, | Упаковки.Упаковка.Коэффициент КАК Коэффициент, | Упаковки.Упаковка.Вес КАК Вес, | Упаковки.Упаковка.ЕдиницаИзмерения КАК ЕдиницаИзмерения |ПОМЕСТИТЬ ВремУпаковкиНоменклатуры |ИЗ | (ВЫБРАТЬ | УпаковкиВложенный.Номенклатура КАК Номенклатура, | МАКСИМУМ(УпаковкиВложенный.Упаковка) КАК Упаковка | ИЗ | (ВЫБРАТЬ | ВремУпаковки.Номенклатура КАК Номенклатура, | УпаковкиНоменклатуры.Ссылка КАК Упаковка | ИЗ | ВремУпаковки КАК ВремУпаковки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры | ПО ВремУпаковки.Коэффициент = УпаковкиНоменклатуры.Коэффициент | И ВремУпаковки.НаборУпаковок = УпаковкиНоменклатуры.Владелец | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | ВремУпаковки.Номенклатура, | УпаковкиНоменклатуры.Ссылка | ИЗ | ВремУпаковки КАК ВремУпаковки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры | ПО ВремУпаковки.Коэффициент = УпаковкиНоменклатуры.Коэффициент | И (ВремУпаковки.НаборУпаковок = ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ИндивидуальныйДляНоменклатуры)) | И ВремУпаковки.Номенклатура = УпаковкиНоменклатуры.Владелец) КАК УпаковкиВложенный | | СГРУППИРОВАТЬ ПО | УпаковкиВложенный.Номенклатура) КАК Упаковки |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремУпаковки |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВремНоменклатура.Номенклатура КАК Номенклатура, | НоменклатураПрисоединенныеФайлы.Ссылка КАК Файл, | НоменклатураПрисоединенныеФайлы.Наименование КАК Наименование, | НоменклатураПрисоединенныеФайлы.Описание КАК Описание, | НоменклатураПрисоединенныеФайлы.Том КАК Том, | НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла, | НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение, | НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу, | ПрисоединенныеФайлы.ХранимыйФайл КАК ХранимыйФайл |ИЗ | ВремНоменклатура КАК ВремНоменклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы | ПО НоменклатураПрисоединенныеФайлы.Ссылка = ПрисоединенныеФайлы.ПрисоединенныйФайл | И (НоменклатураПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВИнформационнойБазе)) | ПО (НоменклатураПрисоединенныеФайлы.ВладелецФайла = ВремНоменклатура.Номенклатура) | И ((НЕ НоменклатураПрисоединенныеФайлы.ПометкаУдаления)) |ГДЕ | ((НЕ &ОтбиратьФайлы) | ИЛИ &ОтбиратьФайлы | И НоменклатураПрисоединенныеФайлы.Ссылка В (&МассивФайлов)) | |УПОРЯДОЧИТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВремНоменклатура.Номенклатура КАК Номенклатура, | МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод |ПОМЕСТИТЬ ВремШтрихкодыДляКаталога |ИЗ | ВремНоменклатура КАК ВремНоменклатура | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры | ПО ВремНоменклатура.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура | И (ШтрихкодыНоменклатуры.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) | |СГРУППИРОВАТЬ ПО | ВремНоменклатура.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 | Организации.Ссылка КАК Контрагент, | Организации.Наименование, | Организации.НаименованиеПолное, | Организации.ЮрФизЛицо, | Организации.ИНН, | Организации.КПП, | Организации.КодПоОКПО, | Организации.КонтактнаяИнформация.( | Тип КАК Тип, | Вид КАК Вид, | Представление КАК Представление, | ЗначенияПолей КАК ЗначенияПолей | ) |ИЗ | Справочник.Организации КАК Организации |ГДЕ | Организации.Ссылка = &ОрганизацияВладелецКаталога"; ТекстЗапроса = ТекстЗапроса + Символы.ПС + ";" + Символы.ПС + "ВЫБРАТЬ | ВремНоменклатура.Номенклатура КАК Номенклатура, | ВремНоменклатура.ПометкаУдаления КАК ПометкаУдаления, | ВремНоменклатура.Родитель КАК Родитель, | ВремНоменклатура.Код КАК Код, | ВремНоменклатура.Наименование КАК Наименование, | ВремНоменклатура.Номенклатура.НаименованиеПолное КАК НаименованиеПолное, | ВремНоменклатура.Номенклатура.Описание КАК Описание, | ВремНоменклатура.Номенклатура.ФайлОписанияДляСайта КАК ФайлОписанияДляСайта, | ВремНоменклатура.Артикул КАК Артикул, | ВремНоменклатура.Производитель КАК Производитель, | ВремНоменклатура.ПроизводительНаименование КАК ПроизводительНаименование, | ВремНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры, | ВремНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | ВремНоменклатура.ЕдиницаИзмерения.Код КАК ЕдиницаИзмеренияКод, | ВремНоменклатура.ЕдиницаИзмерения.НаименованиеПолное КАК ЕдиницаИзмеренияНаименованиеПолное, | ВремНоменклатура.ЕдиницаИзмерения.МеждународноеСокращение КАК ЕдиницаИзмеренияМеждународноеСокращение, | ВремНоменклатура.НаборУпаковок КАК НаборУпаковок, | ВремНоменклатура.СтавкаНДС КАК СтавкаНДС, | ВремНоменклатура.ТипНоменклатуры КАК ТипНоменклатуры, | ВремНоменклатура.ФайлКартинки КАК ФайлКартинки, | ЕСТЬNULL(ВремШтрихкодыДляКаталога.Штрихкод, """") КАК Штрихкод, | ВремУпаковкиНоменклатуры.Упаковка КАК Упаковка, | ВремУпаковкиНоменклатуры.Коэффициент КАК Коэффициент, | ВремУпаковкиНоменклатуры.Вес КАК Вес, | ВремУпаковкиНоменклатуры.ЕдиницаИзмерения КАК УпаковкаЕдиницаИзмерения |ИЗ | ВремНоменклатура КАК ВремНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ ВремШтрихкодыДляКаталога КАК ВремШтрихкодыДляКаталога | ПО ВремНоменклатура.Номенклатура = ВремШтрихкодыДляКаталога.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ ВремУпаковкиНоменклатуры КАК ВремУпаковкиНоменклатуры | ПО ВремНоменклатура.Номенклатура = ВремУпаковкиНоменклатуры.Номенклатура | |УПОРЯДОЧИТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремУпаковкиНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВремШтрихкодыДляКаталога"; Если Параметры.КлассифицироватьПоВидамНоменклатуры Тогда ТекстЗапросаГруппы = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВремНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры |ИЗ | ВремНоменклатура КАК ВремНоменклатура |ГДЕ | (НЕ ВремНоменклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.ПустаяСсылка)) |ИТОГИ ПО | ВидНоменклатуры ИЕРАРХИЯ |АВТОУПОРЯДОЧИВАНИЕ"; Иначе ТекстЗапросаГруппы = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВремНоменклатура.Номенклатура КАК Номенклатура, | ВремНоменклатура.Номенклатура.ЭтоГруппа КАК ЭтоГруппа |ИЗ | ВремНоменклатура КАК ВремНоменклатура |ИТОГИ ПО | Номенклатура ТОЛЬКО ИЕРАРХИЯ |АВТОУПОРЯДОЧИВАНИЕ"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + Символы.ПС + ";" + Символы.ПС + ТекстЗапросаГруппы; ТекстЗапроса = ТекстЗапроса + Символы.ПС + ";" + Символы.ПС + "УНИЧТОЖИТЬ ВремНоменклатура"; КонецПроцедуры Процедура ВыгрузитьТоварыВКаталогНаДиске(Параметры, СтрокаТаблицыИнформации, ВыгруженоОбъектов) ТаблицаКаталогов = ПолучитьТаблицуКаталогов(Параметры); ПодготовитьМассивИзмененийНоменклатуры(Параметры); ИндексФайлаОбмена = 0; ИндексФайлаОбменаСтрокой = ""; Для Каждого СтрокаТаблицыКаталогов Из ТаблицаКаталогов Цикл Параметры.Вставить("СтрокаТаблицыКаталогов", СтрокаТаблицыКаталогов); Если ИндексФайлаОбмена > 0 Тогда ИндексФайлаОбменаСтрокой = Формат(ИндексФайлаОбмена, "ЧГ="); КонецЕсли; ИндексФайлаОбмена = ИндексФайлаОбмена + 1; ИмяФайлаКаталога = ПолучитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\import" + ИндексФайлаОбменаСтрокой + ".xml"); ИмяФайлаПрайса = ПолучитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\offers" + ИндексФайлаОбменаСтрокой + ".xml"); ОбъектXMLКаталог = ПолучитьОбъектДляЗаписиXML(ИмяФайлаКаталога); ОбъектXMLПакетПредложений = ПолучитьОбъектДляЗаписиXML(ИмяФайлаПрайса); СтрокаТаблицыКаталогов.СтруктураРезультата = Новый Структура("ВыгруженоТоваров,ВыгруженоКартинок,ВыгруженоФайлов,ВыгруженоПредложений,ОписаниеОшибки", 0, 0, 0, 0, ""); ПодготовитьДанныеДляВыгрузки(Параметры); НачатьXML(ОбъектXMLКаталог, Параметры); НачатьXML(ОбъектXMLПакетПредложений, Параметры); ОписаниеОшибокXML = ""; ВыгрузитьКлассификатор(ОбъектXMLКаталог, ОписаниеОшибокXML, Параметры); ВыгрузитьКаталогПакетПредложений(ОбъектXMLКаталог, ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Параметры); Если НЕ ПустаяСтрока(ОписаниеОшибокXML) Тогда ДобавитьОписаниеОшибки( СтрокаТаблицыКаталогов.СтруктураРезультата.ОписаниеОшибки, ОписаниеОшибокXML); КонецЕсли; ЗавершитьXML(ОбъектXMLКаталог); ЗавершитьXML(ОбъектXMLПакетПредложений); ВыгруженоТоваров = 0; СтрокаТаблицыКаталогов.СтруктураРезультата.Свойство("ВыгруженоТоваров", ВыгруженоТоваров); Если ВыгруженоТоваров = 0 Тогда Попытка УдалитьФайлы(ИмяФайлаКаталога); УдалитьФайлы(ИмяФайлаПрайса); Исключение КонецПопытки; КонецЕсли; КонецЦикла; ПодготовитьИтоговуюИнформациюПоВыгрузкеТоваров(ТаблицаКаталогов, СтрокаТаблицыИнформации, ВыгруженоОбъектов); КонецПроцедуры Процедура ЗафиксироватьЗавершениеВыгрузкиТоваров(СтрокаТаблицыИнформации, Результат) ДатаОкончания = ТекущаяДата(); СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ДатаОкончания + " " + НСтр("ru = 'Завершена выгрузка товаров'"); СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Результат; СтрокаТаблицыИнформации.ДатаОкончания = ДатаОкончания; КонецПроцедуры Функция ТоварыВыгружены(Параметры, СтрокаТаблицыИнформации) ВыгруженоОбъектов = 0; ВыгрузитьТоварыВКаталогНаДиске(Параметры, СтрокаТаблицыИнформации, ВыгруженоОбъектов); Если ВыгруженоОбъектов = 0 ИЛИ (НЕ Параметры.ВыгружатьНаСайт) Тогда ЗафиксироватьЗавершениеВыгрузкиТоваров(СтрокаТаблицыИнформации, Перечисления.РезультатыВыполненияОбмена.Выполнено); Возврат Истина; КонецЕсли; Успешно = КаталогПредложенияВыгруженыНаСайт(Параметры, СтрокаТаблицыИнформации); Если Успешно Тогда ЗафиксироватьЗавершениеВыгрузкиТоваров(СтрокаТаблицыИнформации, Перечисления.РезультатыВыполненияОбмена.Выполнено); Иначе ЗафиксироватьЗавершениеВыгрузкиТоваров(СтрокаТаблицыИнформации, Перечисления.РезультатыВыполненияОбмена.Ошибка); КонецЕсли; Возврат Успешно; КонецФункции Функция КаталогПредложенияВыгруженыНаСайт(Параметры, СтрокаТаблицыИнформации) МассивПодкаталогов = Новый Массив; Если Параметры.ВыгружатьКартинки ИЛИ Параметры.ВыгружатьФайлы Тогда МассивПодкаталогов.Добавить(Параметры.ПодкаталогФайлов); КонецЕсли; ОписаниеОшибки = ""; Успешно = ДанныеВыгруженыНаСайт(Параметры, МассивПодкаталогов, ОписаниеОшибки, Истина); Если Успешно Тогда СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ТекущаяДата() + НСтр("ru = ' Товары успешно выгружены на сайт.'") + ?(ПустаяСтрока(ОписаниеОшибки), "", Символы.ПС + НСтр("ru = 'Дополнительная информация о выгрузке:'") + Символы.ПС + ОписаниеОшибки); Иначе СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ТекущаяДата() + НСтр("ru = ' Выгрузка на сайт завершилась с ошибками.'") + Символы.ПС + ОписаниеОшибки; КонецЕсли; Попытка УдалитьФайлы(Параметры.КаталогНаДиске, "*.*"); Исключение СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось очистить каталог обмена: '") + Параметры.КаталогНаДиске); КонецПопытки; Возврат Успешно; КонецФункции Функция ЗаказыЗагруженыССайта(Параметры, СтруктураСтатистики, ОписаниеОшибки) ОтветСервера = ""; Соединение = Неопределено; ТипСоединения = "sale"; АдресДляРаботы = Параметры.НастройкиПодключения.АдресСкрипта + "?type=" + ТипСоединения; ОписаниеОшибки = ""; Если Не АвторизацияВыполнена(Соединение, Параметры.НастройкиПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Загрузка заказов не выполнена.'")); Возврат Ложь; КонецЕсли; КукиИмя = СтрПолучитьСтроку(ОтветСервера, 2); КукиЗначение = СтрПолучитьСтроку(ОтветСервера, 3); ЗаголовкиЗапросов = "Cookie: " + КукиИмя + "=" + КукиЗначение; ОписаниеОшибки = ""; ОтветСервера = ПолучитьДанныеССервера(Соединение, АдресДляРаботы + Параметры.НастройкиПодключения.ПараметрЗапросаHTTP_ПолучитьДанные, ЗаголовкиЗапросов, ОписаниеОшибки); Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Загрузка заказов не выполнена.'")); Возврат Ложь; КонецЕсли; СтрокаXML = ""; Если Лев(ОтветСервера, 2) = "PK" Тогда СтрокаXML = ПолучитьСодержимоеZIPАрхива(ОтветСервера, ОписаниеОшибки); Иначе Если Лев(ОтветСервера, 5) = " Неопределено Тогда МассивИзменений.Удалить(ИндексЭлемента); КонецЕсли; КонецЦикла; Если МассивИзменений.Количество() = 0 Тогда Возврат Истина; КонецЕсли; КонецЕсли; СтрокаXML = ""; ВыгрузитьЗаказыВXML(СтрокаXML, ОписаниеОшибки, МассивИзменений, СтруктураСтатистики, Параметры); Если СтруктураСтатистики.Выгружено.Количество() = 0 Тогда Возврат Истина; КонецЕсли; ИмяФайлаОбмена = "orders-" + Строка(Новый УникальныйИдентификатор) + ".xml"; ПолноеИмяФайлаОбмена = ПолучитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\" + ИмяФайлаОбмена); ФайлXMLНаДиске = Новый ТекстовыйДокумент; ФайлXMLНаДиске.УстановитьТекст(СтрокаXML); Попытка ФайлXMLНаДиске.Записать(ПолноеИмяФайлаОбмена, "UTF-8"); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать XML файл на диск: '") + ПолноеИмяФайлаОбмена)); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции Процедура ВыгрузитьЗаказВXML(ОбъектXML, ОписаниеОшибокXML, ВыборкаДокументов, ДеревоСвойствХарактеристик, Параметры) ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид" , Строка(ВыборкаДокументов.ЗаказСсылка.УникальныйИдентификатор())); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Номер" , ВыборкаДокументов.НомерЗаказаНаСайте); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Дата" , ФорматДатыДляXML(ВыборкаДокументов.ДатаЗаказаНаСайте, Истина, Ложь)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ХозОперация" , "Заказ товара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Роль" , "Продавец"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Валюта" , ОбменССайтомПовтИсп.ПолучитьЗначениеВалютыДляXML(ВыборкаДокументов.Валюта)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Курс" , ФорматЗначенияДляXML(ВыборкаДокументов.Курс, "ЧЦ=10; ЧДЦ=4; ЧРД=.")); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Сумма" , ФорматЗначенияДляXML(ВыборкаДокументов.СуммаДокумента, Параметры.ФорматСуммы)); ОбъектXML.ЗаписатьНачалоЭлемента("Контрагенты"); ВыгрузитьКонтрагента(ОбъектXML, ОписаниеОшибокXML, ВыборкаДокументов, "Контрагент"); ОбъектXML.ЗаписатьКонецЭлемента(); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Время" , ФорматДатыДляXML(ВыборкаДокументов.ДатаЗаказаНаСайте, Ложь, Истина)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "СрокПлатежа" , ФорматДатыДляXML(ВыборкаДокументов.ДатаПлатежа, Истина, Ложь)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Комментарий" , ПолучитьЗначениеКомментарияДляXML(ВыборкаДокументов.Комментарий)); СчитатьНДС = ВыборкаДокументов.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС; Если СчитатьНДС Тогда Товары = ВыборкаДокументов.Товары.Выгрузить(); СуммаНДС = Товары.Итог("СуммаНДС"); Если СуммаНДС > 0 Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Налоги"); ОбъектXML.ЗаписатьНачалоЭлемента("Налог"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Параметры.НаименованиеНалога); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "УчтеноВСумме", ВыборкаДокументов.ЦенаВключаетНДС); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Сумма", ФорматЗначенияДляXML(СуммаНДС, Параметры.ФорматСуммы), Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЕсли; ВыгрузитьТоварыЗаказаВXML(ОбъектXML, ОписаниеОшибокXML, ВыборкаДокументов, ДеревоСвойствХарактеристик, Параметры); КонецПроцедуры Процедура ВыгрузитьТоварыЗаказаВXML(ОбъектXML, ОписаниеОшибокXML, ВыборкаДокументов, ДеревоСвойствХарактеристик, Параметры) ОбъектXML.ЗаписатьНачалоЭлемента("Товары"); ИспользоватьУпаковкиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры"); ИспользоватьРучныеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах"); ИспользоватьАвтоматическиеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьАвтоматическиеСкидкиВПродажах"); Товары = ВыборкаДокументов.Товары.Выбрать(); Пока Товары.Следующий() Цикл Если Товары.Отменено Тогда Продолжить; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("Товар"); Характеристика = НеОпределено; Если Параметры.ИспользоватьХарактеристики Тогда Характеристика = Товары.Характеристика; КонецЕсли; ИдТовара = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Товары.Номенклатура, Характеристика); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид" , ИдТовара); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Артикул" , Товары.Артикул); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование" , ФорматНаименованияДляXML(Товары.Номенклатура)); ОбъектXML.ЗаписатьНачалоЭлемента("БазоваяЕдиница"); ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "Код", Товары.ЕдиницаИзмеренияКод); ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "НаименованиеПолное", ФорматНаименованияДляXML(Товары.ЕдиницаИзмеренияНаименованиеПолное)); Если ЗначениеЗаполнено(Товары.ЕдиницаИзмеренияМеждународноеСокращение) Тогда ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "МеждународноеСокращение", Товары.ЕдиницаИзмеренияМеждународноеСокращение); КонецЕсли; СтрокаЗаписи = ПолучитьСтрокуЗаписиДляXML(Строка(Товары.ЕдиницаИзмерения), "БазоваяЕдиница", ОписаниеОшибокXML); ОбъектXML.ЗаписатьТекст(СтрокаЗаписи); ОбъектXML.ЗаписатьКонецЭлемента(); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ЦенаЗаЕдиницу", ФорматЗначенияДляXML(Товары.Цена, Параметры.ФорматСуммы)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Количество" , ФорматЗначенияДляXML(Товары.КоличествоУпаковок, Параметры.ФорматКоличества)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Сумма" , ФорматЗначенияДляXML(Товары.Сумма, Параметры.ФорматСуммы)); Если ИспользоватьУпаковкиНоменклатуры И ЗначениеЗаполнено(Товары.Упаковка) Тогда ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Единица", Товары.Упаковка); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Коэффициент", ФорматЗначенияДляXML(Товары.УпаковкаКоэффициент, Параметры.ФорматКоличества)); Иначе ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Единица", Товары.ЕдиницаИзмерения); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Коэффициент", ФорматЗначенияДляXML(1, Параметры.ФорматКоличества)); КонецЕсли; Если Товары.СуммаНДС > 0 Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Налоги"); ОбъектXML.ЗаписатьНачалоЭлемента("Налог"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Параметры.НаименованиеНалога); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "УчтеноВСумме", ВыборкаДокументов.ЦенаВключаетНДС); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Сумма" , ФорматЗначенияДляXML(Товары.СуммаНДС, Параметры.ФорматСуммы), Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ставка" , ОбменССайтомПовтИсп.ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(Товары.СтавкаНДС)); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; ПроцентРучнойСкидки = 0; СуммаРучнойСкидки = 0; Если ИспользоватьРучныеСкидкиВПродажах Тогда ПроцентРучнойСкидки = Товары.ПроцентРучнойСкидки; СуммаРучнойСкидки = Товары.СуммаРучнойСкидки; КонецЕсли; ПроцентАвтоматическойСкидки = 0; СуммаАвтоматическойСкидки = 0; Если ИспользоватьАвтоматическиеСкидкиВПродажах Тогда ПроцентАвтоматическойСкидки = Товары.ПроцентАвтоматическойСкидки; СуммаАвтоматическойСкидки = Товары.СуммаАвтоматическойСкидки; КонецЕсли; Скидка = ПроцентРучнойСкидки + ПроцентАвтоматическойСкидки; СуммаСкидки = СуммаРучнойСкидки + СуммаАвтоматическойСкидки; Если Скидка <> 0 И СуммаСкидки <> 0 Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Скидки"); ОбъектXML.ЗаписатьНачалоЭлемента("Скидка"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Параметры.НаименованиеСкидки); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Сумма", ФорматЗначенияДляXML(СуммаСкидки, Параметры.ФорматСуммы)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Процент", ФорматЗначенияДляXML(Скидка, Параметры.ФорматСуммы)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "УчтеноВСумме", Истина); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; Если Товары.НоменклатураСтавкаНДС <> Перечисления.СтавкиНДС.БезНДС Тогда ОбъектXML.ЗаписатьНачалоЭлемента("СтавкиНалогов"); ОбъектXML.ЗаписатьНачалоЭлемента("СтавкаНалога"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Параметры.НаименованиеНалога); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ставка" , ОбменССайтомПовтИсп.ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(Товары.НоменклатураСтавкаНДС)); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("ЗначенияРеквизитов"); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "ВидНоменклатуры", Товары.ВидНоменклатуры); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "ТипНоменклатуры", Товары.ТипНоменклатуры); ОбъектXML.ЗаписатьКонецЭлемента(); //Если Параметры.ИспользоватьХарактеристики Тогда // ВыгрузитьСвойстваХарактеристикиДляЗаказа(ОбъектXML, ОписаниеОшибокXML, Товары.Характеристика, ДеревоСвойствХарактеристик); //КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьСвойстваХарактеристикиДляЗаказа(ОбъектXML, ОписаниеОшибокXML, Характеристика, ДеревоСвойствХарактеристик) Если НЕ ЗначениеЗаполнено(Характеристика) Тогда Возврат; КонецЕсли; Найдено = ДеревоСвойствХарактеристик.Строки.Найти(Характеристика, "Характеристика"); Если Найдено = НеОпределено Тогда Возврат; КонецЕсли; ЗаписанЗаголовокВыгрузкиХарактеристик = Ложь; Для Каждого СтрокаСвойства Из Найдено.Строки Цикл Если НЕ ЗначениеЗаполнено(СтрокаСвойства.Значение) ИЛИ НЕ ЗначениеЗаполнено(ФорматНаименованияДляXML(СтрокаСвойства.Свойство)) Тогда Продолжить; КонецЕсли; Если НЕ ЗаписанЗаголовокВыгрузкиХарактеристик Тогда ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); ЗаписанЗаголовокВыгрузкиХарактеристик = Истина; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование" , ФорматНаименованияДляXML(СтрокаСвойства.Свойство)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение" , СтрокаСвойства.Значение); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; Если ЗаписанЗаголовокВыгрузкиХарактеристик Тогда ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецПроцедуры Процедура ВыгрузитьЗаказыВXML(СтрокаXML, ОписаниеОшибокXML, МассивИзменений, СтруктураСтатистики, Параметры) МассивРезультатов = ПолучитьЗаказыСОплатойИОтгрузкой( МассивИзменений, СтруктураСтатистики.Загружено, Параметры.ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте, Параметры.ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте); ВыборкаДокументов = МассивРезультатов[4].Выбрать(); Если ВыборкаДокументов.Количество() = 0 Тогда Возврат; КонецЕсли; ДеревоСвойствХарактеристик = МассивРезультатов[5].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); ОбъектXML = ПолучитьОбъектДляЗаписиXML(""); НачатьXML(ОбъектXML, Параметры); Пока ВыборкаДокументов.Следующий() Цикл СтруктураСтатистики.Выгружено.Добавить(ВыборкаДокументов.ЗаказСсылка); ОбъектXML.ЗаписатьНачалоЭлемента("Документ"); ВыгрузитьЗаказВXML(ОбъектXML, ОписаниеОшибокXML, ВыборкаДокументов, ДеревоСвойствХарактеристик, Параметры); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначенияРеквизитов"); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Номер по 1С", ВыборкаДокументов.Номер); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Дата по 1С", ФорматДатыДляXML(ВыборкаДокументов.Дата, Истина, Истина)); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "ПометкаУдаления", ВыборкаДокументов.ПометкаУдаления); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Проведен", ВыборкаДокументов.Проведен); Если ВыборкаДокументов.Статус <> Перечисления.СтатусыЗаказовКлиентов.НеСогласован И ВыборкаДокументов.КОплатеОстаток <= 0 Тогда ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Номер оплаты по 1С", ВыборкаДокументов.НомерОплаты); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Дата оплаты по 1С", ФорматДатыДляXML(ВыборкаДокументов.ДатаОплаты, Истина, Истина)); КонецЕсли; Если ВыборкаДокументов.Статус <> Перечисления.СтатусыЗаказовКлиентов.НеСогласован И ВыборкаДокументов.Статус <> Перечисления.СтатусыЗаказовКлиентов.Согласован И ВыборкаДокументов.КОтгрузкеОстаток >= 0 Тогда ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Номер отгрузки по 1С", ВыборкаДокументов.НомерОтгрузки); ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, "Дата отгрузки по 1С", ФорматДатыДляXML(ВыборкаДокументов.ДатаОтгрузки, Истина, Истина)); КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; СтрокаXML = ЗавершитьXML(ОбъектXML); КонецПроцедуры Функция ДанныеВыгруженыНаСайт(Параметры, МассивПодкаталогов = Неопределено, ОписаниеОшибки, ОжидатьЗавершенияИмпортаФайловСервером = Ложь, ТипСоединения = "catalog") ОтветСервера = ""; Соединение = Неопределено; НастройкиПодключения = Параметры.НастройкиПодключения; АдресДляРаботы = НастройкиПодключения.АдресСкрипта + "?type=" + ТипСоединения; ОписаниеОшибки = ""; Успешно = АвторизацияВыполнена(Соединение, НастройкиПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения); Если Не Успешно Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'")); Возврат Ложь; КонецЕсли; КукиИмя = СтрПолучитьСтроку(ОтветСервера, 2); КукиЗначение = СтрПолучитьСтроку(ОтветСервера, 3); ЗаголовкиЗапросов = "Cookie: " + КукиИмя + "=" + КукиЗначение; ОписаниеОшибки = ""; ОтветСервера = ПолучитьДанныеССервера(Соединение, АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_Инициализация, ЗаголовкиЗапросов, ОписаниеОшибки); Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'")); Возврат Ложь; КонецЕсли; ZIPФайлыРазрешены = Ложь; ОграничениеРазмераФрагментаФайлаОбмена = 0; Если СтрЧислоСтрок(ОтветСервера) <> 2 Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'") + Символы.ПС + НСтр("ru = 'Не удалось прочитать ответ сервера. Параметры обмена не получены.'")); Возврат Ложь; КонецЕсли; ZIPФайлыРазрешены = СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 1))) = НастройкиПодключения.ОтветСервера_ZIPРазрешен; Попытка ОграничениеРазмераФрагментаФайлаОбмена = Число(СтрЗаменить(СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 2))), НастройкиПодключения.ОтветСервера_ОграничениеРазмераФрагментаФайлаОбмена, "")); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Ошибка получения параметров обмена (ограничение размера файла)!'"))); ОграничениеРазмераФрагментаФайлаОбмена = -1; КонецПопытки; МассивИсходныхXMLФайлов = НайтиФайлы(Параметры.КаталогНаДиске, "*.xml"); СписокФайловДляОтправки = ПолучитьСписокФайловДляОтправки(Параметры.КаталогНаДиске, МассивПодкаталогов); Если ZIPФайлыРазрешены Тогда СписокФайловДляОтправки = ПолучитьСписокZIPАрхивов(Параметры.КаталогНаДиске, ОписаниеОшибки); Если СписокФайловДляОтправки.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; КонецЕсли; Если ОграничениеРазмераФрагментаФайлаОбмена > 0 Тогда СписокФайловДляОтправки = ПолучитьСписокФрагментовФайлов(СписокФайловДляОтправки, ОграничениеРазмераФрагментаФайлаОбмена); КонецЕсли; ВсегоФайлов = СписокФайловДляОтправки.Количество(); Для Каждого ТекФайл Из СписокФайловДляОтправки цикл ОтветСервера = ПолучитьРезультатОтправкиФайлаНаСервер(ТекФайл.Значение, Соединение, АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_ПередачаФайла + ТекФайл.Представление, ЗаголовкиЗапросов, ОписаниеОшибки); Если ZIPФайлыРазрешены Тогда Попытка УдалитьФайлы(ТекФайл.Значение); Исключение КонецПопытки; КонецЕсли; Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Не удалось получить ответ сервера. Файл не отправлен.'") + " (" + ТекФайл.Значение + ")."); Возврат Ложь; КонецЕсли; СостояниеОбмена = СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера,1))); Если СостояниеОбмена = НастройкиПодключения.ОтветСервера_АварийноеЗавершениеТекущейОперации Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Произошла ошибка на стороне сервера. Файл не отправлен.'") + " (" + ТекФайл.Значение + ")." + Символы.ПС + НСтр("ru = 'Ответ сервера: '") + Символы.ПС + ОтветСервера); Возврат Ложь; ИначеЕсли СостояниеОбмена = НастройкиПодключения.ОтветСервера_УспешноеЗавершениеТекущейОперации Тогда Если СтрЧислоСтрок(ОтветСервера) > 1 Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Получен расширенный статус успешного завершения сеанса.'") + Символы.ПС + НСтр("ru = 'Ответ сервера: '") + Символы.ПС + ОтветСервера); КонецЕсли; Иначе ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Произошла ошибка на стороне сервера. Не получен статус завершения операции. Файл не отправлен.'") + " (" + ТекФайл.Значение + ")." + Символы.ПС + НСтр("ru = 'Ответ сервера: '") + Символы.ПС + ОтветСервера); Возврат Ложь; КонецЕсли; КонецЦикла; ///////////////////////////////////////////////////// ИмпортУспешноЗавершен = Ложь; Если ОжидатьЗавершенияИмпортаФайловСервером Тогда Для Каждого ТекФайл Из МассивИсходныхXMLФайлов Цикл ИмпортПродолжается = Истина; ТекущееСостояние = ""; Пока ИмпортПродолжается Цикл ИмпортПродолжается = Ложь; ОписаниеОшибки = ""; ОтветСервера = ПолучитьДанныеССервера(Соединение, АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_ИмпортФайлаСервером + ТекФайл.Имя, ЗаголовкиЗапросов, ОписаниеОшибки); Если ОтветСервера = Неопределено Тогда Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Не удалось получить текущее состояние процесса обмена. Данные обмена отправлены, но не загружены.'")); ИначеЕсли СтрЧислоСтрок(ОтветСервера) = 0 Тогда Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Не удалось прочитать данные о текущем состоянии процесса обмена. Данные обмена отправлены, но не загружены.'")); Иначе СостояниеОбмена = СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 1))); Если СостояниеОбмена = НастройкиПодключения.ОтветСервера_АварийноеЗавершениеТекущейОперации Тогда Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Произошла ошибка на стороне сервера.'") + Символы.ПС + НСтр("ru = 'Ответ сервера'") + ": " + Символы.ПС + ОтветСервера); ИначеЕсли СостояниеОбмена = НастройкиПодключения.ОтветСервера_УспешноеЗавершениеТекущейОперации Тогда ИмпортУспешноЗавершен = Истина; ИначеЕсли СостояниеОбмена = НастройкиПодключения.ОтветСервера_ВыполнениеТекущейОперации Тогда ИмпортПродолжается = Истина; Иначе Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Произошла ошибка на стороне сервера. Получен неизвестный статус импорта.'") + Символы.ПС + НСтр("ru = 'Ответ сервера'") + ": " + Символы.ПС + ОтветСервера); КонецЕсли; КонецЕсли; КонецЦикла; Если НЕ ИмпортУспешноЗавершен Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Успешно; КонецФункции Функция ЗаказыЗагруженыИзФайла(Параметры, СтруктураСтатистики, ОписаниеОшибки) Файл = Новый Файл(Параметры.ФайлЗагрузки); Если НЕ Файл.Существует() ИЛИ Файл.ЭтоКаталог() Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Файл загрузки не найден'") + ": " + Параметры.ФайлЗагрузки); Возврат Ложь; КонецЕсли; ФайлXML = Новый ТекстовыйДокумент; ФайлXML.Прочитать(Параметры.ФайлЗагрузки); СтрокаXML = ФайлXML.ПолучитьТекст(); Возврат ЗаказыЗагружены(СтрокаXML, СтруктураСтатистики, Параметры, ОписаниеОшибки); КонецФункции Функция ЗаказыЗагружены(СтрокаXML, СтруктураСтатистики, Параметры, ОписаниеОшибки) ДеревоДокументов = ПолучитьДеревоДокументовXML(СтрокаXML, Параметры, ОписаниеОшибки); Если ДеревоДокументов = Неопределено Тогда Возврат Ложь; КонецЕсли; Если ДеревоДокументов.Строки.Количество() = 0 Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Нет документов для обработки.'")); Возврат Истина; КонецЕсли; Возврат ДокументыОбработаны(ДеревоДокументов, СтруктураСтатистики, Параметры, ОписаниеОшибки); КонецФункции Процедура ПолучитьДополнительныеДанныеДляВыгрузкиВКаталог(ДополнительныеДанные, Параметры); Номенклатура = Параметры.ВыборкаНоменклатуры.Номенклатура; // Файлы ТаблицаФайлов = Новый ТаблицаЗначений; ТаблицаФайлов.Колонки.Добавить("Файл"); ТаблицаФайлов.Колонки.Добавить("Наименование"); ТаблицаФайлов.Колонки.Добавить("Описание"); ТаблицаФайлов.Колонки.Добавить("Том"); ТаблицаФайлов.Колонки.Добавить("ХранимыйФайл"); ТаблицаФайлов.Колонки.Добавить("ТипХраненияФайла"); ТаблицаФайлов.Колонки.Добавить("Расширение"); ТаблицаФайлов.Колонки.Добавить("ПутьКФайлу"); Пока (НЕ Параметры.ВыборкаФайлов = НеОпределено) И Параметры.ВыборкаФайлов.Номенклатура = Номенклатура Цикл НоваяСтрока = ТаблицаФайлов.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Параметры.ВыборкаФайлов); Если НЕ Параметры.ВыборкаФайлов.Следующий() Тогда // Если выборка закончилась, надо завершать цикл принудительно, // иначе будет зацикливание на последней записи выборки Параметры.ВыборкаФайлов = НеОпределено; КонецЕсли; КонецЦикла; ДополнительныеДанные.Вставить("ТаблицаФайлов", ТаблицаФайлов); // Свойства ТаблицаСвойств = Новый ТаблицаЗначений; ТаблицаСвойств.Колонки.Добавить("Свойство"); ТаблицаСвойств.Колонки.Добавить("Значение"); Пока (НЕ Параметры.ВыборкаСвойствНоменклатуры = НеОпределено) И Параметры.ВыборкаСвойствНоменклатуры.Номенклатура = Номенклатура Цикл НоваяСтрока = ТаблицаСвойств.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Параметры.ВыборкаСвойствНоменклатуры); Если НЕ Параметры.ВыборкаСвойствНоменклатуры.Следующий() Тогда Параметры.ВыборкаСвойствНоменклатуры = НеОпределено; КонецЕсли; КонецЦикла; ДополнительныеДанные.Вставить("ТаблицаСвойств", ТаблицаСвойств); КонецПроцедуры Процедура ВыгрузитьТоварВКаталог(ОбъектXML, ОписаниеОшибокXML, ДополнительныеДанные, Параметры) ОбъектXML.ЗаписатьНачалоЭлемента("Товар"); ВыгрузитьОсновныеРеквизитыТовара(ОбъектXML, ОписаниеОшибокXML, Параметры); ВыгрузитьРеквизитыТовара(ОбъектXML, ОписаниеОшибокXML, ДополнительныеДанные, Параметры); Параметры.СтрокаТаблицыКаталогов.СтруктураРезультата.ВыгруженоТоваров = Параметры.СтрокаТаблицыКаталогов.СтруктураРезультата.ВыгруженоТоваров + 1; ВыгрузитьХарактеристики(ОбъектXML, ОписаниеОшибокXML, Параметры); //Добавил : 28-03-2013 (Для выгрузки характеристик номенклатуры с ценами) ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьКаталогПакетПредложений(ОбъектXMLКаталог, ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Параметры) ПараметрыКаталога = Параметры.СтрокаТаблицыКаталогов; // Заголовок каталога ОбъектXMLКаталог.ЗаписатьНачалоЭлемента("Каталог"); ЗаписатьАтрибут(ОбъектXMLКаталог, ОписаниеОшибокXML, "СодержитТолькоИзменения", Параметры.ВыгружатьТолькоИзменения И НЕ Параметры.ВыполнятьПолнуюВыгрузкуПринудительно); ЗаписатьТекстовыйУзел(ОбъектXMLКаталог, ОписаниеОшибокXML, "Ид", ПараметрыКаталога.ИдентификаторКаталога); ЗаписатьТекстовыйУзел(ОбъектXMLКаталог, ОписаниеОшибокXML, "ИдКлассификатора", ПараметрыКаталога.ИдентификаторКаталога); ЗаписатьТекстовыйУзел(ОбъектXMLКаталог, ОписаниеОшибокXML, "Наименование", ПараметрыКаталога.Каталог); ВыгрузитьКонтрагента(ОбъектXMLКаталог, ОписаниеОшибокXML, Параметры.ДанныеОрганизацииВладельцаКаталога); // Заголовок пакета предложений ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("ПакетПредложений"); ЗаписатьАтрибут(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "СодержитТолькоИзменения", Параметры.ВыгружатьТолькоИзменения И НЕ Параметры.ВыполнятьПолнуюВыгрузкуПринудительно); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Ид", ПараметрыКаталога.ИдентификаторКаталога + "#"); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Наименование" , "Пакет предложений (" + ПараметрыКаталога.Каталог + ")"); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "ИдКаталога" , ПараметрыКаталога.ИдентификаторКаталога); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "ИдКлассификатора", ПараметрыКаталога.ИдентификаторКаталога); ВыгрузитьКонтрагента(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Параметры.ДанныеОрганизацииВладельцаКаталога); ВыгрузитьВидыЦенВПакетПредложений(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Параметры); Если Параметры.ВыборкаНоменклатуры.Количество() > 0 Тогда СоздатьСписокНоменклатуры(Параметры); // Добавил : 26-10-2013 (Создам список номенклатуры с характеристиками и остатками) ОбъектXMLКаталог.ЗаписатьНачалоЭлемента("Товары"); Пока Параметры.ВыборкаНоменклатуры.Следующий() Цикл ДополнительныеДанные = Новый Структура; ПолучитьДополнительныеДанныеДляВыгрузкиВКаталог(ДополнительныеДанные, Параметры); ВыгрузитьТоварВКаталог(ОбъектXMLКаталог, ОписаниеОшибокXML, ДополнительныеДанные, Параметры); КонецЦикла; ОбъектXMLКаталог.ЗаписатьКонецЭлемента(); КонецЕсли; ОбъектXMLКаталог.ЗаписатьКонецЭлемента(); // Завершаем каталог //////////////////////////////////////////////////////////////////////////// Если Параметры.ВыборкаЦен.Количество() = 0 Тогда ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); Возврат; КонецЕсли; ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("Предложения"); Параметры.ВыборкаЦен.Сбросить(); ТекНоменклатура = НеОпределено; ТекХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(); ПервоеПредложение = Истина; Остаток = 0; Пока Параметры.ВыборкаЦен.Следующий() Цикл Если Параметры.ИспользоватьХарактеристики Тогда ВыборкаЦенХарактеристика = Параметры.ВыборкаЦен.Характеристика; Иначе ВыборкаЦенХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(); КонецЕсли; Если Параметры.ВыборкаЦен.Номенклатура = ТекНоменклатура И ВыборкаЦенХарактеристика = ТекХарактеристика Тогда ВыгрузитьЦену(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Остаток, Параметры); Иначе ТекНоменклатура = Параметры.ВыборкаЦен.Номенклатура; ТекХарактеристика = ВыборкаЦенХарактеристика; Если ПервоеПредложение Тогда ПервоеПредложение = Ложь; Иначе // Завершаем предыдущее предложение ЗавершитьПредложение(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Остаток, Параметры); КонецЕсли; ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("Предложение"); ПараметрыКаталога.СтруктураРезультата.ВыгруженоПредложений = ПараметрыКаталога.СтруктураРезультата.ВыгруженоПредложений + 1; ВыгрузитьРеквизитыТовараДляПакетаПредложений(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, ВыборкаЦенХарактеристика, Параметры); ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("Цены"); ВыгрузитьЦену(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Остаток, Параметры); КонецЕсли; КонецЦикла; Если НЕ ПервоеПредложение Тогда ЗавершитьПредложение(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Остаток, Параметры); КонецЕсли; ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ЗавершитьПредложение(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Количество, Параметры); ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); // Цены //Если Количество > 0 Тогда ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Количество", ФорматЗначенияДляXML(Количество, Параметры.ФорматКоличества)); //КонецЕсли; ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); // Предложение КонецПроцедуры Процедура ВыгрузитьЦену(ОбъектXML, ОписаниеОшибокXML, Остаток, Параметры) ОбъектXML.ЗаписатьНачалоЭлемента("Цена"); ИдТипаЦены = Строка(Параметры.ВыборкаЦен.Соглашение.УникальныйИдентификатор()); Если ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры") И ЗначениеЗаполнено(Параметры.ВыборкаЦен.Упаковка) Тогда Единица = Параметры.ВыборкаЦен.Упаковка; Коэффициент = Параметры.ВыборкаЦен.УпаковкаКоэффициент; Иначе Единица = Параметры.ВыборкаЦен.ЕдиницаИзмерения; Коэффициент = 1; КонецЕсли; ПредставлениеЦены = СокрЛП(Параметры.ВыборкаЦен.Цена) + " " + СокрЛП(Параметры.ВыборкаЦен.ВалютаСоглашения) + " за " + СокрЛП(Единица); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Представление", ПредставлениеЦены); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ИдТипаЦены", ИдТипаЦены); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ЦенаЗаЕдиницу", ФорматЗначенияДляXML(Параметры.ВыборкаЦен.Цена, Параметры.ФорматСуммы)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Валюта", ОбменССайтомПовтИсп.ПолучитьЗначениеВалютыДляXML(Параметры.ВыборкаЦен.ВалютаСоглашения)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Единица", Единица); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Коэффициент", ФорматЗначенияДляXML(Коэффициент, Параметры.ФорматКоличества)); ОбъектXML.ЗаписатьКонецЭлемента(); Остаток = Параметры.ВыборкаЦен.Остаток; КонецПроцедуры Процедура ВыгрузитьРеквизитыТовараДляПакетаПредложений(ОбъектXML, ОписаниеОшибокXML, ВыборкаХарактеристика, Параметры) Ид = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Параметры.ВыборкаЦен.Номенклатура, ВыборкаХарактеристика); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", Ид); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Штрихкод", Параметры.ВыборкаЦен.ШтрихКод); Наименование = Параметры.ВыборкаЦен.Наименование; Если ЗначениеЗаполнено(ВыборкаХарактеристика) Тогда Наименование = Наименование + " (" + ВыборкаХарактеристика + ")"; КонецЕсли; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML(Наименование)); // ОбъектXML.ЗаписатьНачалоЭлемента("БазоваяЕдиница"); ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "Код", Параметры.ВыборкаЦен.ЕдиницаИзмеренияКод); Если НЕ ПустаяСтрока(Параметры.ВыборкаЦен.ЕдиницаИзмеренияНаименованиеПолное) Тогда ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "НаименованиеПолное", Параметры.ВыборкаЦен.ЕдиницаИзмеренияНаименованиеПолное); КонецЕсли; Если НЕ ПустаяСтрока(Параметры.ВыборкаЦен.ЕдиницаИзмеренияМеждународноеСокращение) Тогда ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "МеждународноеСокращение", Лев(Параметры.ВыборкаЦен.ЕдиницаИзмеренияМеждународноеСокращение, 3)); КонецЕсли; СтрокаЗаписи = ПолучитьСтрокуЗаписиДляXML(СокрЛП(Параметры.ВыборкаЦен.ЕдиницаИзмерения), "БазоваяЕдиница", ОписаниеОшибокXML); ОбъектXML.ЗаписатьТекст(СтрокаЗаписи); ОбъектXML.ЗаписатьКонецЭлемента(); // СтатусУдаления = ""; Если Параметры.ВыборкаЦен.ИспользоватьХарактеристики И ЗначениеЗаполнено(ВыборкаХарактеристика) Тогда ЗаписанЗаголовокВыгрузкиХарактеристик = Ложь; Найдено = Параметры.ДеревоСвойствХарактеристик.Строки.Найти(ВыборкаХарактеристика, "Характеристика"); Если НЕ Найдено = НеОпределено Тогда Для Каждого СтрокаСвойства Из Найдено.Строки Цикл Если НЕ ЗначениеЗаполнено(СтрокаСвойства.Свойство) ИЛИ НЕ ЗначениеЗаполнено(СтрокаСвойства.Значение) Тогда Продолжить; КонецЕсли; Если НЕ ЗаписанЗаголовокВыгрузкиХарактеристик Тогда ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); ЗаписанЗаголовокВыгрузкиХарактеристик = Истина; КонецЕсли; // Добавил : 25-04-2017 (Для нового поля Size) ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Size"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение" , ФорматНаименованияДляXML(СтрокаСвойства.Характеристика)); ОбъектXML.ЗаписатьКонецЭлемента(); //**************************************************************** ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML(СтрокаСвойства.Свойство)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение" , СтрокаСвойства.Значение); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; КонецЕсли; Если ЗаписанЗаголовокВыгрузкиХарактеристик Тогда ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; Если Параметры.ВыборкаЦен.ХарактеристикаПометкаУдаления Тогда СтатусУдаления = "Удален"; КонецЕсли; КонецЕсли; // Если Параметры.ВыборкаЦен.ПометкаУдаления Тогда СтатусУдаления = "Удален"; КонецЕсли; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Статус", СтатусУдаления); КонецПроцедуры Процедура ВыгрузитьРеквизитыТовара(ОбъектXML, ОписаниеОшибокXML, ДополнительныеДанные, Параметры) СтруктураРезультата = Параметры.СтрокаТаблицыКаталогов.СтруктураРезультата; ИдГруппы = ""; Если Параметры.КлассифицироватьПоВидамНоменклатуры Тогда Если ЗначениеЗаполнено(Параметры.ВыборкаНоменклатуры.ВидНоменклатуры) Тогда ИдГруппы = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Параметры.ВыборкаНоменклатуры.ВидНоменклатуры); КонецЕсли; Иначе Если ЗначениеЗаполнено(Параметры.ВыборкаНоменклатуры.Родитель) Тогда ИдГруппы = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Параметры.ВыборкаНоменклатуры.Родитель); КонецЕсли; КонецЕсли; Если НЕ ПустаяСтрока(ИдГруппы) Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Группы"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", ИдГруппы); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; //Добавил : 25-05-2013 (Расширенное описание на сайт) ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Описание", ПолучитьЗначениеКомментарияДляXML(Параметры.ВыборкаНоменклатуры.Номенклатура.ДополнительноеОписание)); Файлы = Новый Массив; ОписанияФайлов = Новый Соответствие; ВыгрузитьФайлы(ОбъектXML, ОписаниеОшибокXML, ДополнительныеДанные.ТаблицаФайлов, Параметры, Файлы, ОписанияФайлов); Если ЗначениеЗаполнено(Параметры.ВыборкаНоменклатуры.Производитель) Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Изготовитель"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Параметры.ВыборкаНоменклатуры.Производитель)); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Параметры.ВыборкаНоменклатуры.ПроизводительНаименование); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ОфициальноеНаименование", Параметры.ВыборкаНоменклатуры.ПроизводительНаименование); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; ВыгрузитьСвойстваНоменклатуры(ОбъектXML, ОписаниеОшибокXML, ДополнительныеДанные.ТаблицаСвойств, Параметры); ОбъектXML.ЗаписатьНачалоЭлемента("СтавкиНалогов"); ОбъектXML.ЗаписатьНачалоЭлемента("СтавкаНалога"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Параметры.НаименованиеНалога); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ставка" , ОбменССайтомПовтИсп.ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(Параметры.ВыборкаНоменклатуры.СтавкаНДС)); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначенияРеквизитов"); //Добавил : 18-03-2013 (Для выгрузки свойств НоваяКоллекция, распродажа, скидка) ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "НоваяКоллекция"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.Номенклатура.НоваяКоллекция); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Распродажа"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.Номенклатура.Распродажа); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Скидка"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.Номенклатура.Скидка); ОбъектXML.ЗаписатьКонецЭлемента(); //********************************** ОписаниеВФорматеHTML = ПолучитьТекстHTMLИзФайла(Параметры.ВыборкаНоменклатуры.ФайлОписанияДляСайта); Если НЕ ПустаяСтрока(ОписаниеВФорматеHTML) Тогда ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "ОписаниеВФорматеHTML"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", ОписаниеВФорматеHTML); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; Для Каждого Файл Из Файлы Цикл ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Файл"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Файл); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; Для Каждого ОписаниеФайла Из ОписанияФайлов Цикл Файл = ОписаниеФайла.Ключ; Описание = ОписаниеФайла.Значение; ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "ОписаниеФайла"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Файл + "#" + Описание); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "ВидНоменклатуры"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.ВидНоменклатуры); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "ТипНоменклатуры"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.ТипНоменклатуры); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Код"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", СокрЛП(Параметры.ВыборкаНоменклатуры.Код)); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Полное наименование"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.НаименованиеПолное); ОбъектXML.ЗаписатьКонецЭлемента(); Если ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры") И ЗначениеЗаполнено(Параметры.ВыборкаНоменклатуры.НаборУпаковок) И ЗначениеЗаполнено(Параметры.ВыборкаНоменклатуры.Упаковка) Тогда Вес = Параметры.ВыборкаНоменклатуры.Вес * Параметры.КоэффициентПересчетаВеса; Если Вес > 0 Тогда ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Упаковка"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.Упаковка); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "ЕдиницаИзмеренияУпаковки"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Параметры.ВыборкаНоменклатуры.УпаковкаЕдиницаИзмерения); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "КоэффициентУпаковки"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", ФорматЗначенияДляXML(Параметры.ВыборкаНоменклатуры.Коэффициент, Параметры.ФорматКоличества)); ОбъектXML.ЗаписатьКонецЭлемента(); ОбъектXML.ЗаписатьНачалоЭлемента("ЗначениеРеквизита"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Вес"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", ФорматЗначенияДляXML(Вес, Параметры.ФорматКоличества)); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); Если Параметры.ВыборкаНоменклатуры.ПометкаУдаления Тогда ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Статус", "Удален"); КонецЕсли; КонецПроцедуры Процедура ВыгрузитьСвойстваНоменклатуры(ОбъектXML, ОписаниеОшибокXML, ТаблицаСвойств, Параметры) Если ТаблицаСвойств.Количество() = 0 Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("ЗначенияСвойств"); Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойств Цикл ОбъектXML.ЗаписатьНачалоЭлемента("ЗначенияСвойства"); Ид = Строка(СтрокаТаблицыСвойств.Свойство.УникальныйИдентификатор()); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", Ид); Если СтрокаТаблицыСвойств.Значение = NULL Тогда // Если Значение = NULL, значит значение свойства пустое // и в XML выводим пустую строку, чтобы в БУС очистилось соотв. свойство ЗначениеСвойства = ""; Иначе ТипЗначенияСвойства = ТипЗнч(СтрокаТаблицыСвойств.Значение); Если ТипЗначенияСвойства = Тип("Дата") Тогда ЗначениеСвойства = ФорматДатыДляXML(СтрокаТаблицыСвойств.Значение); ИначеЕсли ТипЗначенияСправочник(ТипЗначенияСвойства) Тогда ЗначениеСвойства = Строка(СтрокаТаблицыСвойств.Значение.УникальныйИдентификатор()); Иначе ЗначениеСвойства = Строка(СтрокаТаблицыСвойств.Значение); КонецЕсли; КонецЕсли; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", ЗначениеСвойства, Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьФайлы(ОбъектXML, ОписаниеОшибокXML, ТаблицаФайлов, Параметры, Файлы, ОписанияФайлов); СтруктураРезультата = Параметры.СтрокаТаблицыКаталогов.СтруктураРезультата; Если НЕ (Параметры.ВыгружатьКартинки ИЛИ Параметры.ВыгружатьФайлы) Тогда Возврат; КонецЕсли; // Основное изображение надо выгрузить первым ТаблицаФайлов.Колонки.Добавить("Сортировка"); ОсновнаяКартинка = Параметры.ВыборкаНоменклатуры.ФайлКартинки; ТаблицаФайлов.ЗаполнитьЗначения(1, "Сортировка"); Если ЗначениеЗаполнено(ОсновнаяКартинка) Тогда Найдено = ТаблицаФайлов.Найти(ОсновнаяКартинка, "Файл"); Если НЕ Найдено = НеОпределено Тогда ИндексОсновногоИзображения = ТаблицаФайлов.Индекс(Найдено); Если ИндексОсновногоИзображения > 0 Тогда Найдено.Сортировка = 0; ТаблицаФайлов.Сортировать("Сортировка"); КонецЕсли; КонецЕсли; КонецЕсли; // Для Каждого ТекФайл Из ТаблицаФайлов Цикл ОписаниеОшибки = ""; ДанныеФайла = ПолучитьСтруктуруДляВыгрузкиФайла(ТекФайл, Параметры, ОписаниеОшибки); Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда СтруктураРезультата.ОписаниеОшибки = СтруктураРезультата.ОписаниеОшибки + Символы.ПС + ТекущаяДата() + ": " + ОписаниеОшибки; Иначе Если ЗначениеЗаполнено(ДанныеФайла.Адрес) Тогда Если ДанныеФайла.ЭтоКартинка Тогда СтруктураРезультата.ВыгруженоКартинок = СтруктураРезультата.ВыгруженоКартинок + 1; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Картинка", ДанныеФайла.Адрес); Иначе СтруктураРезультата.ВыгруженоФайлов = СтруктураРезультата.ВыгруженоФайлов + 1; Файлы.Добавить(ДанныеФайла.Адрес); КонецЕсли; Описание = ?(ПустаяСтрока(ТекФайл.Описание), ТекФайл.Наименование, ТекФайл.Описание); Если НЕ ПустаяСтрока(Описание) Тогда ОписанияФайлов.Вставить(ДанныеФайла.Адрес, Описание); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Функция ПолучитьСтруктуруДляВыгрузкиФайла(ДанныеФайла, Параметры, ОписаниеОшибки) СтруктураВозврата = Новый Структура; СтруктураВозврата.Вставить("Адрес", ""); СтруктураВозврата.Вставить("ЭтоКартинка", Ложь); ФайлВХранилище = ДанныеФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; Если ФайлВХранилище Тогда Если ДанныеФайла.ХранимыйФайл = NULL Тогда ДвоичныеДанныеФайла = НеОпределено; Иначе ДвоичныеДанныеФайла = ДанныеФайла.ХранимыйФайл.Получить(); КонецЕсли; Если ДвоичныеДанныеФайла = НеОпределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось получить данные файла %1 номенклатуры %2'"), ДанныеФайла.Файл, Параметры.ВыборкаНоменклатуры.Номенклатура)); Возврат СтруктураВозврата; КонецЕсли; Иначе ИмяФайла = ПолучитьПутьДляПлатформы(Параметры.ПлатформаWindows, ПолучитьПутьТомаДляПлатформы(Параметры.ПлатформаWindows, ДанныеФайла.Том) + "\" + ДанныеФайла.ПутьКФайлу); Попытка ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Выгрузка файла номенклатуры: '") + Параметры.ВыборкаНоменклатуры.Номенклатура)); Возврат СтруктураВозврата; КонецПопытки; КонецЕсли; РасширениеФайла = НРег(ДанныеФайла.Расширение); РазрешенныеТипыКартинок = Новый Массив; РазрешенныеТипыКартинок.Добавить("gif"); РазрешенныеТипыКартинок.Добавить("jpg"); РазрешенныеТипыКартинок.Добавить("jpeg"); РазрешенныеТипыКартинок.Добавить("png"); ЭтоКартинка = НЕ РазрешенныеТипыКартинок.Найти(РасширениеФайла) = НеОпределено; СтруктураВозврата.ЭтоКартинка = ЭтоКартинка; Если НЕ (ЭтоКартинка И Параметры.ВыгружатьКартинки ИЛИ (НЕ ЭтоКартинка) И Параметры.ВыгружатьФайлы) Тогда Возврат СтруктураВозврата; КонецЕсли; Если НЕ ЭтоКартинка Тогда РасширениеФайла = "file"; КонецЕсли; ИмяПоНоменклатуре = СтрЗаменить(Параметры.ВыборкаНоменклатуры.Номенклатура.УникальныйИдентификатор(), "-", ""); ИмяПоХранилищу = СтрЗаменить(ДанныеФайла.Файл.УникальныйИдентификатор(), "-", ""); ПодкаталогФайлов = Параметры.ПодкаталогФайлов; ИмяФайла = ИмяПоНоменклатуре + "_" + ИмяПоХранилищу + "." + НРег(РасширениеФайла); КаталогПоИмени = Лев(ИмяПоНоменклатуре, 2); КаталогФайла = ПолучитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\" + ПодкаталогФайлов + "\" + КаталогПоИмени); Попытка СоздатьКаталог(КаталогФайла); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось создать каталог %1. Номенклатура: %2'"), КаталогФайла, Параметры.ВыборкаНоменклатуры.Номенклатура))); Возврат СтруктураВозврата; КонецПопытки; ПолноеИмяФайла = ПолучитьПутьДляПлатформы(Параметры.ПлатформаWindows, КаталогФайла + "\" + ИмяФайла); Попытка ДвоичныеДанныеФайла.Записать(ПолноеИмяФайла); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось записать файл %1 на диск. Номенклатура: %2'"), ПолноеИмяФайла, Параметры.ВыборкаНоменклатуры.Номенклатура))); Возврат СтруктураВозврата; КонецПопытки; СтруктураВозврата.Адрес = ПодкаталогФайлов + "/" + КаталогПоИмени + "/" + ИмяФайла; Возврат СтруктураВозврата; КонецФункции Процедура ВыгрузитьОсновныеРеквизитыТовара(ОбъектXML, ОписаниеОшибокXML, Параметры) Ид = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Параметры.ВыборкаНоменклатуры.Номенклатура); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", Ид); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Штрихкод", Параметры.ВыборкаНоменклатуры.ШтрихКод); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Артикул", Параметры.ВыборкаНоменклатуры.Артикул); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование" , ФорматНаименованияДляXML(Параметры.ВыборкаНоменклатуры.Наименование)); ОбъектXML.ЗаписатьНачалоЭлемента("БазоваяЕдиница"); ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "Код", Параметры.ВыборкаНоменклатуры.ЕдиницаИзмеренияКод); Если НЕ ПустаяСтрока(Параметры.ВыборкаНоменклатуры.ЕдиницаИзмеренияНаименованиеПолное) Тогда ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "НаименованиеПолное", Параметры.ВыборкаНоменклатуры.ЕдиницаИзмеренияНаименованиеПолное); КонецЕсли; Если НЕ ПустаяСтрока(Параметры.ВыборкаНоменклатуры.ЕдиницаИзмеренияМеждународноеСокращение) Тогда ЗаписатьАтрибут(ОбъектXML, ОписаниеОшибокXML, "МеждународноеСокращение", Лев(Параметры.ВыборкаНоменклатуры.ЕдиницаИзмеренияМеждународноеСокращение, 3)); КонецЕсли; СтрокаЗаписи = ПолучитьСтрокуЗаписиДляXML(СокрЛП(Параметры.ВыборкаНоменклатуры.ЕдиницаИзмерения), "БазоваяЕдиница", ОписаниеОшибокXML); ОбъектXML.ЗаписатьТекст(СтрокаЗаписи); ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьВидыЦенВПакетПредложений(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, Параметры) Если Параметры.ВыборкаСоглашений.Количество() = 0 Тогда Возврат; КонецЕсли; ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("ТипыЦен"); Пока Параметры.ВыборкаСоглашений.Следующий() Цикл ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("ТипЦены"); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Ид", ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Параметры.ВыборкаСоглашений.Соглашение)); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML(Параметры.ВыборкаСоглашений.Соглашение)); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Валюта", ОбменССайтомПовтИсп.ПолучитьЗначениеВалютыДляXML(Параметры.ВыборкаСоглашений.ВалютаСоглашения)); ОбъектXMLПакетПредложений.ЗаписатьНачалоЭлемента("Налог"); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "Наименование", Параметры.НаименованиеНалога); ЗаписатьТекстовыйУзел(ОбъектXMLПакетПредложений, ОписаниеОшибокXML, "УчтеноВСумме", Параметры.ВыборкаСоглашений.ЦенаВключаетНДС); ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); КонецЦикла; ОбъектXMLПакетПредложений.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьКлассификатор(ОбъектXML, ОписаниеОшибокXML, Параметры) ПараметрыКаталога = Параметры.СтрокаТаблицыКаталогов; ОбъектXML.ЗаписатьНачалоЭлемента("Классификатор"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", ПараметрыКаталога.ИдентификаторКаталога); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML("Классификатор (" + ПараметрыКаталога.Каталог + ")")); ВыгрузитьКонтрагента(ОбъектXML, ОписаниеОшибокXML, Параметры.ДанныеОрганизацииВладельцаКаталога); Если Параметры.КлассифицироватьПоВидамНоменклатуры Тогда ВыгрузитьГруппыРекурсивноПоВидамНоменклатуры(ОбъектXML, ОписаниеОшибокXML, Параметры.КлассифицироватьПоВидамНоменклатуры, Параметры.ДеревоГрупп.Строки, ПараметрыКаталога.Группы); Иначе ВыгрузитьГруппыРекурсивно(ОбъектXML, ОписаниеОшибокXML, Параметры.КлассифицироватьПоВидамНоменклатуры, Параметры.ДеревоГрупп.Строки, ПараметрыКаталога.Группы); КонецЕсли; ВыгрузитьСвойства(ОбъектXML, ОписаниеОшибокXML, Параметры); ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьСвойства(ОбъектXML, ОписаниеОшибокXML, Параметры) Если Параметры.ВыборкаСвойствНоменклатурыДляКлассификатора.Количество() = 0 Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("Свойства"); Пока Параметры.ВыборкаСвойствНоменклатурыДляКлассификатора.Следующий() Цикл ОбъектXML.ЗаписатьНачалоЭлемента("Свойство"); ВыгрузитьОсновныеРеквизитыСвойстваДляКлассификатора(ОбъектXML, ОписаниеОшибокXML, Параметры.ВыборкаСвойствНоменклатурыДляКлассификатора); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьОсновныеРеквизитыСвойстваДляКлассификатора(ОбъектXML, ОписаниеОшибокXML, Выборка) Ид = Выборка.Свойство.УникальныйИдентификатор(); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", Ид); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML(Выборка.Свойство)); Типы = Выборка.ТипЗначения.Типы(); ТипXML = "Строка"; Если Типы.Количество() <> 1 Тогда // По схеме CML можно выгрузить только один тип значений. // Выгружаем "Строка", как универсальный тип. ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ТипЗначений", ТипXML); Возврат; КонецЕсли; Тип = Типы[0]; Если Тип = Тип("Число") Тогда ТипXML = "Число"; ИначеЕсли Тип = Тип("Дата") Тогда ТипXML = "Время"; Иначе Если ТипЗначенияСправочник(Тип) Тогда ТипXML = "Справочник"; КонецЕсли; КонецЕсли; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ТипЗначений", ТипXML); Если ТипXML = "Справочник" Тогда ОбъектXML.ЗаписатьНачалоЭлемента("ВариантыЗначений"); ВариантыЗначений = ПолучитьВариантыЗначенийСвойстваПоТипу(Выборка, Тип); Для Каждого ВариантЗначения Из ВариантыЗначений Цикл ОбъектXML.ЗаписатьНачалоЭлемента("Справочник"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ИдЗначения", Строка(ВариантЗначения.УникальныйИдентификатор())); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", ФорматЗначенияДляXML(ВариантЗначения, 1000)); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецПроцедуры Процедура ВыгрузитьГруппыРекурсивно(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, ДеревоГрупп, СписокГрупп, СоздаватьНовыйУровеньГрупп = Истина, ТекущийРодитель = НеОпределено); Если СоздаватьНовыйУровеньГрупп Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Группы"); КонецЕсли; Для Каждого СтрокаДерева Из ДеревоГрупп Цикл Если СтрокаДерева.ЭтоГруппа = Null ИЛИ НЕ СтрокаДерева.ЭтоГруппа Тогда Продолжить; КонецЕсли; Если СтрокаДерева.Номенклатура = ТекущийРодитель Тогда Продолжить; КонецЕсли; Если ЭтоГруппаВерхнегоУровня(СтрокаДерева.Номенклатура, СписокГрупп) Тогда Если СтрокаДерева.Строки.Количество() > 0 Тогда ВыгрузитьГруппыРекурсивно(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, СтрокаДерева.Строки, СписокГрупп, Ложь); КонецЕсли; Иначе ОбъектXML.ЗаписатьНачалоЭлемента("Группа"); ВыгрузитьОсновныеРеквизитыГруппыДляКлассификатора(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, СтрокаДерева); Если СтрокаДерева.Строки.Количество() > 0 Тогда ВыгрузитьГруппыРекурсивно(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, СтрокаДерева.Строки, СписокГрупп,, СтрокаДерева.Номенклатура); КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЦикла; Если СоздаватьНовыйУровеньГрупп Тогда ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецПроцедуры Процедура ВыгрузитьГруппыРекурсивноПоВидамНоменклатуры(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, ДеревоГрупп, СписокГрупп, СоздаватьНовыйУровеньГрупп = Истина, ТекущийРодитель = НеОпределено); Если СоздаватьНовыйУровеньГрупп Тогда ОбъектXML.ЗаписатьНачалоЭлемента("Группы"); КонецЕсли; Для Каждого СтрокаДерева Из ДеревоГрупп Цикл Если СтрокаДерева.ВидНоменклатуры = ТекущийРодитель Тогда Продолжить; КонецЕсли; Если ЭтоГруппаВерхнегоУровня(СтрокаДерева.ВидНоменклатуры, СписокГрупп) Тогда Если СтрокаДерева.Строки.Количество() > 0 Тогда ВыгрузитьГруппыРекурсивноПоВидамНоменклатуры(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, СтрокаДерева.Строки, СписокГрупп, Ложь); КонецЕсли; Иначе ОбъектXML.ЗаписатьНачалоЭлемента("Группа"); ВыгрузитьОсновныеРеквизитыГруппыДляКлассификатора(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, СтрокаДерева); Если СтрокаДерева.Строки.Количество() > 0 Тогда ВыгрузитьГруппыРекурсивноПоВидамНоменклатуры(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, СтрокаДерева.Строки, СписокГрупп,, СтрокаДерева.ВидНоменклатуры); КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецЦикла; Если СоздаватьНовыйУровеньГрупп Тогда ОбъектXML.ЗаписатьКонецЭлемента(); КонецЕсли; КонецПроцедуры Процедура ВыгрузитьКонтрагента(ОбъектXML, ОписаниеОшибокXML, ДанныеКонтрагента, ИмяЭлементаXML = "Владелец") Если ДанныеКонтрагента = НеОпределено Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента(ИмяЭлементаXML); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", ДанныеКонтрагента.Контрагент.УникальныйИдентификатор()); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ДанныеКонтрагента.Наименование); Если ДанныеКонтрагента.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ОфициальноеНаименование", ДанныеКонтрагента.НаименованиеПолное); Если ТипЗнч(ДанныеКонтрагента.Контрагент) = Тип("СправочникСсылка.Организации") Тогда ВыгрузитьЮрАдресОрганизации(ОбъектXML, ОписаниеОшибокXML, ДанныеКонтрагента.КонтактнаяИнформация); КонецЕсли; Иначе ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ПолноеНаименование", ДанныеКонтрагента.НаименованиеПолное); КонецЕсли; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ИНН" , ДанныеКонтрагента.ИНН); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "КПП" , ДанныеКонтрагента.КПП); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "ОКПО" , ДанныеКонтрагента.КодПоОКПО); ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьЮрАдресОрганизации(ОбъектXML, ОписаниеОшибокXML, КонтактнаяИнформация) ВыборкаКИ = КонтактнаяИнформация.Выбрать(); СтруктураПоиска = Новый Структура("Тип,Вид", Перечисления.ТипыКонтактнойИнформации.Адрес, Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации); Если НЕ ВыборкаКИ.НайтиСледующий(СтруктураПоиска) Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("ЮридическийАдрес"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Представление", ВыборкаКИ.Представление); СписокПолей = ПолучитьСписокПолейПоСтроке(ВыборкаКИ.ЗначенияПолей); Для Каждого ПолеКИ Из СписокПолей Цикл Если ПолеКИ.Представление = "Индекс" Тогда ВыгрузитьАдресноеПоле(ОбъектXML, ОписаниеОшибокXML, "Почтовый индекс", ПолеКИ.Значение); ИначеЕсли ПолеКИ.Представление = "НаселенныйПункт" Тогда ВыгрузитьАдресноеПоле(ОбъектXML, ОписаниеОшибокXML, "Населенный пункт", ПолеКИ.Значение); ИначеЕсли ПолеКИ.Представление = "Регион" ИЛИ ПолеКИ.Представление = "Район" ИЛИ ПолеКИ.Представление = "Город" ИЛИ ПолеКИ.Представление = "Улица" ИЛИ ПолеКИ.Представление = "Дом" ИЛИ ПолеКИ.Представление = "Корпус" ИЛИ ПолеКИ.Представление = "Квартира" ИЛИ ПолеКИ.Представление = "Страна" Тогда ВыгрузитьАдресноеПоле(ОбъектXML, ОписаниеОшибокXML, ПолеКИ.Представление, ПолеКИ.Значение); КонецЕсли; КонецЦикла; ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ВыгрузитьОсновныеРеквизитыГруппыДляКлассификатора(ОбъектXML, ОписаниеОшибокXML, КлассифицироватьПоВидамНоменклатуры, Группа) Если КлассифицироватьПоВидамНоменклатуры Тогда ИдГруппы = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Группа.ВидНоменклатуры); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", ИдГруппы); ИмяГруппы = Группа.ВидНоменклатуры.Наименование; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML(ИмяГруппы)); Иначе ИдГруппы = ОбменССайтомПовтИсп.ПолучитьУникальныйИдентификаторОбъекта(Группа.Номенклатура); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Ид", ИдГруппы); ИмяГруппы = Группа.Номенклатура.Наименование; ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML(ИмяГруппы)); КонецЕсли; КонецПроцедуры Процедура ВыгрузитьАдресноеПоле(ОбъектXML, ОписаниеОшибокXML, ИмяПоля, Значение) Если Не ЗначениеЗаполнено(Значение) Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента("АдресноеПоле"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Тип", ИмяПоля); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Значение); ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Функция ТипЗначенияСправочник(Тип) ТипЗначенияСправочник = Ложь; Попытка ОбъектПоТипу = Новый(Тип); ТипЗначенияСправочник = Метаданные.Справочники.Содержит(ОбъектПоТипу.Метаданные()); Исключение КонецПопытки; Возврат ТипЗначенияСправочник; КонецФункции Функция ПолучитьЗначениеКомментарияДляXML(Комментарий) Возврат Лев(Комментарий, 3000); КонецФункции Процедура ДобавитьОтборПоЗаказам(КомпоновщикНастроек, МассивОграничения, ВидСравнения) Отбор = КомпоновщикНастроек.Настройки.Отбор; НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЗаказКлиента"); НовыйЭлемент.ВидСравнения = ВидСравнения; СписокЗначенийОграничения = Новый СписокЗначений; СписокЗначенийОграничения.ЗагрузитьЗначения(МассивОграничения); НовыйЭлемент.ПравоеЗначение = СписокЗначенийОграничения; НовыйЭлемент.Использование = Истина; КонецПроцедуры Функция ПолучитьЗаказыСОплатойИОтгрузкой(МассивИзменений, МассивЗагруженныхДокументов, ДопРеквизитНомерЗаказаНаСайте, ДопРеквизитДатаЗаказаНаСайте) СхемаКомпоновки = ПланыОбмена.ОбменУправлениеТорговлейСайт.ПолучитьМакет("СхемаВыгрузкиЗаказов"); КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки)); КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию); Если МассивИзменений.Количество() > 0 Тогда // только измененные ДобавитьОтборПоЗаказам(КомпоновщикНастроек, МассивИзменений, ВидСравненияКомпоновкиДанных.ВСписке); КонецЕсли; Если МассивЗагруженныхДокументов.Количество() > 0 Тогда // исключить только что загруженные ДобавитьОтборПоЗаказам(КомпоновщикНастроек, МассивЗагруженныхДокументов, ВидСравненияКомпоновкиДанных.НеВСписке); КонецЕсли; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновки, КомпоновщикНастроек.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); Запрос = Новый Запрос(МакетКомпоновкиДанных.НаборыДанных.ОсновнойНаборДанных.Запрос); Для каждого Параметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл Запрос.Параметры.Вставить(Параметр.Имя, Параметр.Значение); КонецЦикла; Запрос.Параметры.Вставить("ДопРеквизитНомерЗаказаНаСайте", ДопРеквизитНомерЗаказаНаСайте); Запрос.Параметры.Вставить("ДопРеквизитДатаЗаказаНаСайте", ДопРеквизитДатаЗаказаНаСайте); Запрос.Текст = Запрос.Текст + Символы.ПС + ";" + Символы.ПС + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ХарактеристикиНоменклатурыДополнительныеРеквизиты.Ссылка КАК Характеристика, | ХарактеристикиНоменклатурыДополнительныеРеквизиты.Свойство КАК Свойство, | ХарактеристикиНоменклатурыДополнительныеРеквизиты.Значение КАК Значение |ИЗ | Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатурыДополнительныеРеквизиты | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремЗаказы КАК ВремЗаказы | ПО ЗаказКлиентаТовары.Ссылка = ВремЗаказы.ЗаказСсылка | ПО ХарактеристикиНоменклатурыДополнительныеРеквизиты.Ссылка = ЗаказКлиентаТовары.Характеристика |ИТОГИ ПО | Характеристика"; МассивРезультатов = Запрос.ВыполнитьПакет(); Возврат МассивРезультатов; КонецФункции Функция ФорматДатыДляXML(ЗначениеДата, ВернутьДату = Истина, ВернутьВремя = Ложь) ФорматДаты = "ДФ=yyyy-MM-dd; ДЛФ=D"; ФорматВремени = "ДЛФ=T"; РазделительДатаВремя = "T"; ДатаСтрока = Формат(ЗначениеДата, ФорматДаты); ВремяСтрока = Формат(ЗначениеДата, ФорматВремени); Результат = ""; Если ВернутьДату И ВернутьВремя Тогда Результат = ДатаСтрока + РазделительДатаВремя + ВремяСтрока; ИначеЕсли ВернутьДату И (НЕ ВернутьВремя) Тогда Результат = ДатаСтрока; ИначеЕсли (НЕ ВернутьДату) И ВернутьВремя Тогда Результат = ВремяСтрока; КонецЕсли; Возврат Результат; КонецФункции Функция ФорматЗначенияДляXML(Значение, Формат) Результат = ""; Если ТипЗнч(Формат) = Тип("Строка") Тогда Результат = Формат(Значение, Формат); ИначеЕсли ТипЗнч(Формат) = Тип("Число") Тогда Результат = Лев(СокрЛП(Значение), Формат); КонецЕсли; Возврат Результат; КонецФункции Процедура ЗаписатьРеквизит(ОбъектXML, ОписаниеОшибокXML, Наименование, Значение, ПустоеЗначение = "", ИмяГруппыЭлементов = "ЗначениеРеквизита") ЗначениеДляЗаписи = Значение; Если ЗначениеДляЗаписи = Null Тогда ЗначениеДляЗаписи = ПустоеЗначение; КонецЕсли; Если ЗначениеДляЗаписи = "" Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента(ИмяГруппыЭлементов); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Наименование, Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", ЗначениеДляЗаписи, Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ЗаписатьИнформациюПоЗаказамВТаблицуИнформации(ТаблицаИнформации, ДатаНачала, Действие, Успех, СтруктураСтатистики, Параметры, ОписаниеОшибки); СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.ДатаНачала = ДатаНачала; СтрокаТаблицыИнформации.ДатаОкончания = ТекущаяДата(); СтрокаТаблицыИнформации.ДействиеПриОбмене = Действие; Если Действие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда Описание = Строка(ДатаНачала) + " " + НСтр("ru = 'Запуск загрузки заказов'") + Символы.ПС + НСтр("ru = 'Обработано: '") + СтруктураСтатистики.ОбработаноНаЗагрузке + Символы.ПС + НСтр("ru = 'Загружено: '") + СтруктураСтатистики.Загружено.Количество(); ВывестиСписокДокументовДляПротокола(Описание, СтруктураСтатистики.Загружено, Параметры); Описание = Описание + Символы.ПС + НСтр("ru = 'Пропущено: '") + СтруктураСтатистики.Пропущено.Количество(); ВывестиСписокДокументовДляПротокола(Описание, СтруктураСтатистики.Пропущено, Параметры); Описание = Описание + Символы.ПС + НСтр("ru = 'Обновлено: '") + СтруктураСтатистики.Обновлено.Количество(); ВывестиСписокДокументовДляПротокола(Описание, СтруктураСтатистики.Обновлено, Параметры); Описание = Описание + Символы.ПС + НСтр("ru = 'Создано: '") + СтруктураСтатистики.Создано.Количество(); ВывестиСписокДокументовДляПротокола(Описание, СтруктураСтатистики.Создано, Параметры); Описание = Описание + Символы.ПС + СтрокаТаблицыИнформации.ДатаОкончания + " " + НСтр("ru = 'Завершена загрузка заказов'"); Иначе Описание = Строка(ДатаНачала) + " " + НСтр("ru = 'Запуск выгрузки заказов'") + Символы.ПС + НСтр("ru = 'Выгружено: '") + СтруктураСтатистики.Выгружено.Количество(); ВывестиСписокДокументовДляПротокола(Описание, СтруктураСтатистики.Выгружено, Параметры); Описание = Описание + Символы.ПС + СтрокаТаблицыИнформации.ДатаОкончания + " " + НСтр("ru = 'Завершена выгрузка заказов'"); КонецЕсли; СтрокаТаблицыИнформации.Описание = Описание; Если Успех Тогда СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено; Иначе СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; КонецЕсли; Если ПустаяСтрока(ОписаниеОшибки) Тогда Возврат; КонецЕсли; СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + НСтр("ru = 'Дополнительная информация:'") + ОписаниеОшибки; КонецПроцедуры Процедура ВывестиСписокДокументовДляПротокола(Описание, МассивДокументов, Параметры) Если МассивДокументов.Количество() = 0 Тогда Возврат; КонецЕсли; Описание = Описание + ". " + НСтр("ru = 'Список документов:'"); Для Каждого Док Из МассивДокументов Цикл СтруктураРеквизитовЗаказаНаСайте = ПолучитьРеквизитыЗаказаНаСайте(Док.Ссылка, Параметры.ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте, Параметры.ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте); Если СтруктураРеквизитовЗаказаНаСайте = НеОпределено Тогда НомерЗаказаНаСайте = ""; ДатаЗаказаНаСайте = ""; Иначе НомерЗаказаНаСайте = СтруктураРеквизитовЗаказаНаСайте.НомерЗаказаНаСайте; ДатаЗаказаНаСайте = СтруктураРеквизитовЗаказаНаСайте.ДатаЗаказаНаСайте; КонецЕсли; Описание = Описание + Символы.ПС + Символы.НПП + Символы.НПП + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '№ %1 от %2 (№ %3 от %4 на сайте)'"), Док.Номер, Док.Дата, НомерЗаказаНаСайте, ДатаЗаказаНаСайте); КонецЦикла; КонецПроцедуры Функция ПолучитьСодержимоеZIPАрхива(СтрокаZIP, ОписаниеОшибки) СтрокаСодержимого = ""; ИмяФайла = ПолучитьИмяВременногоФайла("zip"); ИмяКаталога = КаталогВременныхФайлов() + Строка(Новый УникальныйИдентификатор); Попытка СоздатьКаталог(ИмяКаталога); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось распаковать архив с заказами!'"))); Возврат ""; КонецПопытки; СтрокаВФайл = Новый ТекстовыйДокумент; СтрокаВФайл.УстановитьТекст(СтрокаZIP); Попытка СтрокаВФайл.Записать(ИмяФайла); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать архив с заказами: '") + ИмяФайла)); Возврат ""; КонецПопытки; Попытка ЧтениеZIP = Новый ЧтениеZIPФайла(ИмяФайла); ЧтениеZIP.ИзвлечьВсе(ИмяКаталога); ЧтениеZIP.Закрыть(); РаспакованныеФайлы = НайтиФайлы(ИмяКаталога, "*.xml"); Если РаспакованныеФайлы.Количество() = 1 Тогда СтрокаИзФайла = Новый ТекстовыйДокумент; СтрокаИзФайла.Прочитать(РаспакованныеФайлы[0].ПолноеИмя); СтрокаСодержимого = СтрокаИзФайла.ПолучитьТекст(); КонецЕсли; УдалитьФайлы(ИмяФайла); УдалитьФайлы(ИмяКаталога); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось распаковать архив с заказами: '") + ИмяФайла)); Возврат ""; КонецПопытки; Возврат СтрокаСодержимого; КонецФункции Процедура ПолучитьРанееЗагруженныеДокументы(ДеревоДокументов, Параметры) МассивНомеров = ДеревоДокументов.Строки.ВыгрузитьКолонку("НомерВходящий"); Запрос = Новый Запрос(); Запрос.УстановитьПараметр("МассивНомеров", МассивНомеров); Запрос.УстановитьПараметр("ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте", Параметры.ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте); Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ЗаказКлиентаДополнительныеРеквизиты.Ссылка КАК ЗаказКлиента, | ЗаказКлиентаДополнительныеРеквизиты.Значение КАК НомерЗаказаНаСайте |ПОМЕСТИТЬ ВремЗаказы |ИЗ | Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказКлиентаДополнительныеРеквизиты |ГДЕ | ЗаказКлиентаДополнительныеРеквизиты.Свойство = &ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте | И ЗаказКлиентаДополнительныеРеквизиты.Значение В(&МассивНомеров) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ВремЗаказы.ЗаказКлиента КАК ЗаказКлиента |ПОМЕСТИТЬ ВремЗаказыСоСсылками |ИЗ | Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремЗаказы КАК ВремЗаказы | ПО ПриходныйКассовыйОрдер.ДокументОснование = ВремЗаказы.ЗаказКлиента | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВремЗаказы.ЗаказКлиента |ИЗ | Документ.СчетНаОплатуКлиенту КАК СчетНаОплатуКлиенту | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремЗаказы КАК ВремЗаказы | ПО СчетНаОплатуКлиенту.ДокументОснование = ВремЗаказы.ЗаказКлиента | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВремЗаказы.ЗаказКлиента |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремЗаказы КАК ВремЗаказы | ПО РеализацияТоваровУслуг.ЗаказКлиента = ВремЗаказы.ЗаказКлиента | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВремЗаказы.ЗаказКлиента |ИЗ | Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремЗаказы КАК ВремЗаказы | ПО ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Заказ = ВремЗаказы.ЗаказКлиента | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВремЗаказы.ЗаказКлиента |ИЗ | Документ.ОперацияПоПлатежнойКарте.РасшифровкаПлатежа КАК ОперацияПоПлатежнойКартеРасшифровкаПлатежа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремЗаказы КАК ВремЗаказы | ПО ОперацияПоПлатежнойКартеРасшифровкаПлатежа.Заказ = ВремЗаказы.ЗаказКлиента |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВремЗаказы.ЗаказКлиента, | ВремЗаказы.НомерЗаказаНаСайте, | ВЫБОР | КОГДА ВремЗаказыСоСсылками.ЗаказКлиента ЕСТЬ NULL | ТОГДА ЛОЖЬ | ИНАЧЕ ИСТИНА | КОНЕЦ КАК ЕстьСсылки |ИЗ | ВремЗаказы КАК ВремЗаказы | ЛЕВОЕ СОЕДИНЕНИЕ ВремЗаказыСоСсылками КАК ВремЗаказыСоСсылками | ПО ВремЗаказы.ЗаказКлиента = ВремЗаказыСоСсылками.ЗаказКлиента"; РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Возврат; КонецЕсли; Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл СтрокаДД = ДеревоДокументов.Строки.Найти(Выборка.НомерЗаказаНаСайте, "НомерВходящий"); Если СтрокаДД = НеОпределено Тогда // Неизвестная ошибка.. Продолжить; КонецЕсли; СтрокаДД.РанееЗагруженныйДокументСсылка = Выборка.ЗаказКлиента; СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент = Выборка.ЕстьСсылки; ДокументОбъект = СтрокаДД.РанееЗагруженныйДокументСсылка.ПолучитьОбъект(); Если НЕ СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда // Документ-объект в БД заполняется данными XML ЗаполнитьЗначенияСвойств(ДокументОбъект, СтрокаДД.ДокументОбъект, , "Номер"); // ТЧ будут загружены из XML ДокументОбъект.Товары.Очистить(); КонецЕсли; // Заменяем объект нового документа объектом БД. СтрокаДД.ДокументОбъект = ДокументОбъект; КонецЦикла; КонецПроцедуры Функция КонтрагентыИдентифицированы(ДеревоДокументов, Параметры, ОписаниеОшибки) Для Каждого СтрокаДД Из ДеревоДокументов.Строки Цикл Если СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда Продолжить; КонецЕсли; Если НЕ СтрокаДД.СтруктураДанныхКонтрагента.Свойство("ЮрФизЛицо") Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Не удалось определить юр./физ. лицо контрагента!'")); Возврат Ложь; КонецЕсли; ИНН = ""; Если НЕ СтрокаДД.СтруктураДанныхКонтрагента.Свойство("ИНН", ИНН) Тогда ИНН = ""; КонецЕсли; КПП = ""; Если НЕ СтрокаДД.СтруктураДанныхКонтрагента.Свойство("КПП", КПП) Тогда КПП = ""; КонецЕсли; Наименование = ""; Если НЕ СтрокаДД.СтруктураДанныхКонтрагента.Свойство("Наименование", Наименование) Тогда Наименование = ""; КонецЕсли; Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Контрагенты.Ссылка КАК Контрагент |ИЗ | Справочник.Контрагенты КАК Контрагенты"; Если ПустаяСтрока(Наименование) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Наименование контрагента должно быть заполнено!'")); Возврат Ложь; КонецЕсли; ТекстСообщенияНайденоНесколькоКонтрагентов = ""; Если Параметры.СпособИдентификацииКонтрагентов = Перечисления.СпособыИдентификацииКонтрагентов.Наименование Тогда ТекстСообщенияНайденоНесколькоКонтрагентов = НСтр("ru = ' по наименованию: '") + Наименование; Запрос.Текст = Запрос.Текст + " ГДЕ Контрагенты.Наименование = &Наименование "; Запрос.УстановитьПараметр("Наименование", Наименование); ИначеЕсли Параметры.СпособИдентификацииКонтрагентов = Перечисления.СпособыИдентификацииКонтрагентов.ИННКПП Тогда Если ПустаяСтрока(ИНН) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'ИНН контрагента должен быть заполнен!'")); Возврат Ложь; КонецЕсли; ТекстСообщенияНайденоНесколькоКонтрагентов = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = ' по ИНН: %1, КПП: %2'"), ИНН, КПП); Запрос.Текст = Запрос.Текст + " ГДЕ Контрагенты.ИНН = &ИНН И Контрагенты.КПП = &КПП "; Запрос.УстановитьПараметр("ИНН", ИНН); Запрос.УстановитьПараметр("КПП", КПП); КонецЕсли; КонтрагентСсылка = НеОпределено; РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда КонтрагентСсылка = ПолучитьКонтрагента(СтрокаДД, Параметры, ОписаниеОшибки); Иначе Контрагенты = РезультатЗапроса.Выгрузить(); Если Контрагенты.Количество() = 1 Тогда КонтрагентСсылка = Контрагенты[0].Контрагент; Иначе ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Не удалось однозначно определить контрагента'") + ТекстСообщенияНайденоНесколькоКонтрагентов); Возврат Ложь; КонецЕсли; КонецЕсли; Если НЕ ЗначениеЗаполнено(КонтрагентСсылка) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Не удалось найти или создать контрагента!'")); Возврат Ложь; КонецЕсли; Док = СтрокаДД.ДокументОбъект; Док.Контрагент = КонтрагентСсылка; Док.Партнер = Док.Контрагент.Партнер; КонецЦикла; Возврат Истина; КонецФункции Функция СтрокаПоСпискуПолей(СоответствиеПолей) Результат = ""; Для Каждого Элемент Из СоответствиеПолей Цикл Значение = Элемент.Значение; Если ПустаяСтрока(Значение) Тогда Продолжить; КонецЕсли; Результат = Результат + ?(Результат = "", "", Символы.ПС) + Элемент.Ключ + "=" + СтрЗаменить(Значение, Символы.ПС, Символы.ПС + Символы.Таб); КонецЦикла; Возврат Результат; КонецФункции Процедура ЗаполнитьПодчиненныеДанныеКонтрагентаПартнера(КонтрагентОбъект, ПартнерОбъект, СтруктураДанныхКонтрагента, ОписаниеОшибки) ДеревоАдресов = СтруктураДанныхКонтрагента.ДеревоАдресов; СтруктураПоиска = Новый Структура("Тип, Вид"); СтруктураПоиска.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес; Для Каждого СтрокаДерева Из ДеревоАдресов.Строки Цикл Если СтрокаДерева.ВидАдреса = "Адрес" Тогда ВидАдреса = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента; Иначе ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента; КонецЕсли; СтруктураПоиска.Вид = ВидАдреса; ОчиститьКонтактнуюИнформациюКонтрагентаПартнера(КонтрагентОбъект, СтруктураПоиска); СтрокаКИ = КонтрагентОбъект.КонтактнаяИнформация.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаКИ, СтруктураПоиска); СтрокаКИ.Представление = СтрокаДерева.Представление; СоответствиеПолей = Новый Соответствие; Для Каждого СтрокаУточнения Из СтрокаДерева.Строки Цикл ИмяПоля = ОбменССайтомПовтИсп.ПолучитьПоТипуИмяПоляКонтактнойИнформации(СтрокаУточнения.ПолеТип); СоответствиеПолей.Вставить(ИмяПоля, СтрокаУточнения.ПолеЗначение); Если ИмяПоля = "Страна" Тогда СтрокаКИ.Страна = СтрокаУточнения.ПолеЗначение; ИначеЕсли ИмяПоля = "Регион" Тогда СтрокаКИ.Регион = СтрокаУточнения.ПолеЗначение; ИначеЕсли ИмяПоля = "Город" Тогда СтрокаКИ.Город = СтрокаУточнения.ПолеЗначение; КонецЕсли; КонецЦикла; СтрокаКИ.ЗначенияПолей = СтрокаПоСпискуПолей(СоответствиеПолей); Если ПустаяСтрока(СтрокаКИ.Представление) И ПустаяСтрока(СтрокаКИ.ЗначенияПолей) Тогда Продолжить; КонецЕсли; Если ПартнерОбъект = НеОпределено Тогда Продолжить; КонецЕсли; СтруктураПоиска.Вид = Справочники.ВидыКонтактнойИнформации.АдресПартнера; ОчиститьКонтактнуюИнформациюКонтрагентаПартнера(ПартнерОбъект, СтруктураПоиска); СтрокаКИПартнера = ПартнерОбъект.КонтактнаяИнформация.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаКИПартнера, СтрокаКИ); ЗаполнитьЗначенияСвойств(СтрокаКИПартнера, СтруктураПоиска); КонецЦикла; // контакты Если НЕ ПартнерОбъект = НеОпределено Тогда ТаблицаКонтактов = СтруктураДанныхКонтрагента.ТаблицаКонтактов; Для Каждого СтрокаДерева Из ТаблицаКонтактов Цикл ТипКИ = Неопределено; ВидКИ = Неопределено; ОпределитьПоданнымТипВидКонтактнойИнформации(СтрокаДерева.КонтактТип, ТипКИ, ВидКИ); Если Не ЗначениеЗаполнено(ТипКИ) ИЛИ Не ЗначениеЗаполнено(ВидКИ) Тогда Продолжить; КонецЕсли; СтруктураПоиска.Тип = ТипКИ; СтруктураПоиска.Вид = ВидКИ; ОчиститьКонтактнуюИнформациюКонтрагентаПартнера(ПартнерОбъект, СтруктураПоиска); СтрокаКИ = ПартнерОбъект.КонтактнаяИнформация.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаКИ, СтруктураПоиска); СтрокаКИ.Представление = СтрокаДерева.КонтактЗначение; КонецЦикла; // контактные лица ТаблицаКонтактныхЛиц = СтруктураДанныхКонтрагента.ТаблицаКонтактныхЛиц; ТаблицаКонтактныхЛиц.Свернуть("Наименование"); Для Каждого СтрокаКЛ Из ТаблицаКонтактныхЛиц Цикл КонтактноеЛицо = Справочники.КонтактныеЛицаПартнеров.НайтиПоНаименованию(СтрокаКЛ.Наименование, Истина, , ПартнерОбъект.ПолучитьСсылкуНового()); Если ЗначениеЗаполнено(КонтактноеЛицо) Тогда Продолжить; КонецЕсли; Элемент = Справочники.КонтактныеЛицаПартнеров.СоздатьЭлемент(); Элемент.Владелец = ПартнерОбъект.ПолучитьСсылкуНового(); Элемент.Наименование = СтрокаКЛ.Наименование; Элемент.Комментарий = НСтр("ru = 'Создан автоматически при импорте заказа с сайта '") + ТекущаяДата(); Элемент.Записать(); КонецЦикла; КонецЕсли; //Банк ТаблицаБанковскихРеквизитов = СтруктураДанныхКонтрагента.ТаблицаБанковскихРеквизитов; Для Каждого СтрокаТаблицыБанковскихРеквизитов Из ТаблицаБанковскихРеквизитов Цикл НомерСчета = СтрЗаменить(СтрокаТаблицыБанковскихРеквизитов.НомерСчета, " ", ""); Если ПустаяСтрока(НомерСчета) Тогда Продолжить; КонецЕсли; БИК = СтрЗаменить(СтрокаТаблицыБанковскихРеквизитов.Банк.БИК, " ", ""); Если ПустаяСтрока(БИК) Тогда Продолжить; КонецЕсли; Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | Банки.Ссылка |ИЗ | Справочник.КлассификаторБанковРФ КАК Банки |ГДЕ | Банки.Код = &БИК"); Запрос.УстановитьПараметр("БИК", БИК); БанкСсылка = НеОпределено; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда БанкСсылка = Выборка.Ссылка; КонецЕсли; // счет Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | БанковскиеСчета.Ссылка |ИЗ | Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчета |ГДЕ | БанковскиеСчета.Владелец = &Владелец | И БанковскиеСчета.НомерСчета = &НомерСчета"); Запрос.УстановитьПараметр("Владелец", КонтрагентОбъект.ПолучитьСсылкуНового()); Запрос.УстановитьПараметр("НомерСчета", НомерСчета); Если БанкСсылка = НеОпределено Тогда Запрос.Текст = Запрос.Текст + " И БанковскиеСчета.БИКБанка = &БИК | И БанковскиеСчета.РучноеИзменениеРеквизитовБанка "; Запрос.УстановитьПараметр("БИК", БИК); Иначе Запрос.Текст = Запрос.Текст + " И БанковскиеСчета.Банк = &Банк "; Запрос.УстановитьПараметр("Банк", БанкСсылка); КонецЕсли; Если НЕ Запрос.Выполнить().Пустой() Тогда Продолжить; КонецЕсли; Валюта = ДенежныеСредстваСервер.ПолучитьВалютуПоНомеруСчета(НомерСчета); Если НЕ ЗначениеЗаполнено(Валюта) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось определить валюту банковского счета: '") + НомерСчета)); Продолжить; КонецЕсли; СчетОбъект = Справочники.БанковскиеСчетаКонтрагентов.СоздатьЭлемент(); СчетОбъект.ВалютаДенежныхСредств = Валюта; СчетОбъект.Владелец = КонтрагентОбъект.ПолучитьСсылкуНового(); СчетОбъект.НомерСчета = НомерСчета; СчетОбъект.Наименование = НомерСчета; Если БанкСсылка = НеОпределено Тогда СчетОбъект.РучноеИзменениеРеквизитовБанка = Истина; СчетОбъект.НаименованиеБанка = СокрЛП(СтрокаТаблицыБанковскихРеквизитов.Банк.Наименование); СчетОбъект.БИКБанка = БИК; СчетОбъект.АдресБанка = СокрЛП(СтрокаТаблицыБанковскихРеквизитов.Банк.Адрес.Представление); СчетОбъект.ГородБанка = ПолучитьГородБанка(СтрокаТаблицыБанковскихРеквизитов.Банк.Адрес.ТаблицаАдресныхПолей); СчетОбъект.КоррСчетБанка = СтрЗаменить(СтрокаТаблицыБанковскихРеквизитов.Банк.СчетКорреспондентский, " ", ""); Иначе СчетОбъект.Банк = БанкСсылка; КонецЕсли; СчетОбъект.Записать(); КонецЦикла; КонецПроцедуры Функция ПолучитьГородБанка(ТаблицаАдресныхПолей) Город = ""; Найдено = ТаблицаАдресныхПолей.Найти("Город", "ПолеТип"); Если НЕ Найдено = НеОпределено Тогда Город = СокрЛП(Найдено.ПолеЗначение); КонецЕсли; Возврат Город; КонецФункции Функция ПолучитьКонтрагента(СтрокаДереваДокументов, Параметры, ОписаниеОшибки) СтруктураДанныхКонтрагента = СтрокаДереваДокументов.СтруктураДанныхКонтрагента; НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент(); ЗаполнитьЗначенияСвойств(НовыйКонтрагент, СтруктураДанныхКонтрагента); СтрокаФИО = ПолучитьПоСтруктуреСтрокиСФИО(СтруктураДанныхКонтрагента); Если Не ПустаяСтрока(СтрокаФИО) И СтрокаФИО <> НовыйКонтрагент.НаименованиеПолное Тогда НовыйКонтрагент.НаименованиеПолное = НовыйКонтрагент.НаименованиеПолное + " [" + СтрокаФИО + "]"; КонецЕсли; ПартнерОбъект = НеОпределено; НаименованиеПартнера = НовыйКонтрагент.Наименование; НаименованиеПартнераПолное = НовыйКонтрагент.НаименованиеПолное; Если ПолучитьФункциональнуюОпцию("ИспользоватьПартнеровКакКонтрагентов") Тогда ПартнерОбъект = ПолучитьНовогоПартнера(НаименованиеПартнера, НаименованиеПартнераПолное, Параметры); НовыйКонтрагент.Партнер = ПартнерОбъект.ПолучитьСсылкуНового(); Иначе Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | Партнеры.Ссылка |ИЗ | Справочник.Партнеры КАК Партнеры |ГДЕ | Партнеры.Наименование = &Наименование | И (НЕ Партнеры.ПометкаУдаления)"); Запрос.УстановитьПараметр("Наименование", НаименованиеПартнера); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда ПартнерОбъект = ПолучитьНовогоПартнера(НаименованиеПартнера, НаименованиеПартнераПолное, Параметры); НовыйКонтрагент.Партнер = ПартнерОбъект.ПолучитьСсылкуНового(); Иначе ПартнерСсылка = Результат.Выгрузить()[0][0]; НовыйКонтрагент.Партнер = ПартнерСсылка; КонецЕсли; КонецЕсли; СсылкаНового = Справочники.Контрагенты.ПолучитьСсылку(); НовыйКонтрагент.УстановитьСсылкуНового(СсылкаНового); ЗаполнитьПодчиненныеДанныеКонтрагентаПартнера(НовыйКонтрагент, ПартнерОбъект, СтруктураДанныхКонтрагента, ОписаниеОшибки); Если НЕ ПартнерОбъект = НеОпределено Тогда ПартнерОбъект.Записать(); КонецЕсли; НовыйКонтрагент.Записать(); Возврат НовыйКонтрагент.Ссылка; КонецФункции Функция ПолучитьПоСтруктуреСтрокиСФИО(СтруктураДанныхКонтрагента) ТекущаяСтрока = ""; Фамилия = ""; Имя = ""; Отчество = ""; СтруктураДанныхКонтрагента.Свойство("Фамилия", Фамилия); СтруктураДанныхКонтрагента.Свойство("Имя", Имя); СтруктураДанныхКонтрагента.Свойство("Отчество", Отчество); Если ЗначениеЗаполнено(Фамилия) Тогда ТекущаяСтрока = Фамилия; КонецЕсли; Если ЗначениеЗаполнено(Имя) Тогда ТекущаяСтрока = СокрЛП(ТекущаяСтрока + " " + Имя); КонецЕсли; Если ЗначениеЗаполнено(Отчество) Тогда ТекущаяСтрока = СокрЛП(ТекущаяСтрока + " " + Отчество); КонецЕсли; Возврат ТекущаяСтрока; КонецФункции Функция ДокументыОбработаны(ДеревоДокументов, СтруктураСтатистики, Параметры, ОписаниеОшибки) ПолучитьРанееЗагруженныеДокументы(ДеревоДокументов, Параметры); НачатьТранзакцию(); Если НЕ КонтрагентыИдентифицированы(ДеревоДокументов, Параметры, ОписаниеОшибки) Тогда ОтменитьТранзакцию(); Возврат Ложь; КонецЕсли; Если НЕ НоменклатураИдентифицирована(ДеревоДокументов, Параметры, ОписаниеОшибки) Тогда ОтменитьТранзакцию(); Возврат Ложь; КонецЕсли; СтруктураСтатистики.ОбработаноНаЗагрузке = ДеревоДокументов.Строки.Количество(); ЗафиксироватьТранзакциюДляОбновленияСвойств = Ложь; СоздатьОбновитьДокументы(ДеревоДокументов, Параметры, СтруктураСтатистики, ЗафиксироватьТранзакциюДляОбновленияСвойств, ОписаниеОшибки); Если СтруктураСтатистики.Загружено.Количество() = 0 Тогда Если НЕ ЗафиксироватьТранзакциюДляОбновленияСвойств Тогда ОтменитьТранзакцию(); Возврат Истина; КонецЕсли; КонецЕсли; //////////////////////////////////////////////// ЗафиксироватьТранзакцию(); //////////////////////////////////////////////// // Отменить НаименованиеСвойстваЗаказОтменен = Параметры.СтатусЗаказаОтменен; Для Каждого ДокСсылка Из СтруктураСтатистики.Загружено Цикл ЗначениеСвойстваЗаказОтменен = ПолучитьЗначениеСвойстваЗаказа(ДокСсылка, НаименованиеСвойстваЗаказОтменен); Если НЕ НРег(ЗначениеСвойстваЗаказОтменен) = "true" Тогда Продолжить; КонецЕсли; ДокОбъект = ДокСсылка.ПолучитьОбъект(); ТаблицаТоваровДокумента = ДокОбъект.Товары.Выгрузить(); ТаблицаТоваровДокумента.ЗаполнитьЗначения(Истина, "Отменено"); ЗначениеСвойстваПричинаОтмены = ПолучитьЗначениеСвойстваЗаказа(ДокСсылка, "Причина отмены"); ПричинаОтмены = ПолучитьЗначениеПричиныОтменыЗаказа(ЗначениеСвойстваПричинаОтмены); Если ПричинаОтмены = НеОпределено Тогда ТаблицаТоваровДокумента.ЗаполнитьЗначения(Параметры.ПричинаОтменыЗаказа, "ПричинаОтмены"); Иначе ТаблицаТоваровДокумента.ЗаполнитьЗначения(ПричинаОтмены, "ПричинаОтмены"); КонецЕсли; ДокОбъект.Товары.Загрузить(ТаблицаТоваровДокумента); Попытка ДокОбъект.Записать(РежимЗаписиДокумента.Запись); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось отменить заказ: '") + ДокСсылка)); КонецПопытки; КонецЦикла; //////////////////////////////////////////////// Если Параметры.ПроводитьДокументы Тогда ПровестиЗаказы(СтруктураСтатистики.Загружено, Параметры.ПроводитьДокументыОперативно, ОписаниеОшибки); КонецЕсли; //////////////////////////////////////////////// МассивУзлов = ПолучитьМассивУзловДляРегистрации(, Истина); Для Каждого СсылкаНаДокумент Из СтруктураСтатистики.Загружено Цикл ПланыОбмена.УдалитьРегистрациюИзменений(МассивУзлов, СсылкаНаДокумент); КонецЦикла; //////////////////////////////////////////////// Возврат Истина; КонецФункции Функция ПолучитьЗначениеПричиныОтменыЗаказа(ЗначениеПричиныОтменыСтрокой) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 | ПричиныОтменыЗаказовКлиентов.Ссылка |ИЗ | Справочник.ПричиныОтменыЗаказовКлиентов КАК ПричиныОтменыЗаказовКлиентов |ГДЕ | ПричиныОтменыЗаказовКлиентов.Наименование ПОДОБНО &Наименование | И (НЕ ПричиныОтменыЗаказовКлиентов.ПометкаУдаления)"; Запрос.УстановитьПараметр("Наименование", ЗначениеПричиныОтменыСтрокой); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Ссылка; КонецЕсли; Возврат НеОпределено; КонецФункции Функция ПолучитьЗначениеСвойстваЗаказа(Объект, НаименованиеСвойства) Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | ДополнительныеСведения.Значение |ИЗ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения | ПО ДополнительныеСведения.Свойство = НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство | И (НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Ссылка = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Документ_ЗаказКлиента)) |ГДЕ | ДополнительныеСведения.Объект = &Объект | И ДополнительныеСведения.Свойство.Наименование = &Наименование"); Запрос.УстановитьПараметр("Объект", Объект); Запрос.УстановитьПараметр("Наименование", НаименованиеСвойства); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат ""; КонецЕсли; Возврат Строка(Результат.Выгрузить()[0].Значение); КонецФункции Процедура ПровестиЗаказы(МассивЗагруженныхДокументов, ПроводитьОперативно, ОписаниеОшибки) Для Каждого ДокСсылка Из МассивЗагруженныхДокументов Цикл Проведен = ДокСсылка.Проведен; Попытка ДокОбъект = ДокСсылка.ПолучитьОбъект(); ДокОбъект.ПометкаУдаления = Ложь; ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, ?(ПроводитьОперативно И (НЕ Проведен), РежимПроведенияДокумента.Оперативный, РежимПроведенияДокумента.Неоперативный)); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Ошибка при проведении документа: '") + ДокСсылка)); КонецПопытки; КонецЦикла; КонецПроцедуры Процедура СоздатьОбновитьДокументы(ДеревоДокументов, Параметры, СтруктураСтатистики, ЗафиксироватьТранзакциюДляОбновленияСвойств, ОписаниеОшибки) Для Каждого Док Из ДеревоДокументов.Строки Цикл Если Док.ДокументОбъект.Статус = Перечисления.СтатусыЗаказовКлиентов.Закрыт Тогда СтруктураСтатистики.Пропущено.Добавить(Док.ДокументОбъект.Ссылка); ДобавитьОписаниеОшибки(ОписаниеОшибки, Строка(Док.ДокументОбъект.Ссылка) + НСтр("ru = ' пропущен по причине:'") + Символы.ПС + НСтр("ru = 'Статус заказа - ""Закрыт"".'")); Продолжить; КонецЕсли; // свойства и статусы СвойстваЗаказа = Новый Соответствие; Для Каждого ТоварУслугаСвойство Из Док.Строки Цикл Если ПустаяСтрока(ТоварУслугаСвойство.СвойствоНаименование) ИЛИ ПустаяСтрока(ТоварУслугаСвойство.СвойствоЗначение) Тогда Продолжить; КонецЕсли; Реквизит = ТоварУслугаСвойство.СвойствоНаименование; Значение = ТоварУслугаСвойство.СвойствоЗначение; СвойстваЗаказа.Вставить(Реквизит, Значение); КонецЦикла; Если Док.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда // пропускаем, обновляя только статусы и свойства СтруктураСтатистики.Пропущено.Добавить(Док.ДокументОбъект.Ссылка); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 пропущен, т.к. существуют документы, введенные на основании заказа.'"), Док.ДокументОбъект.Ссылка); ДобавитьОписаниеОшибки(ОписаниеОшибки, Сообщение); Если СвойстваЗаказаОбновлены(Док.ДокументОбъект.Ссылка, СвойстваЗаказа, ОписаниеОшибки) Тогда Сообщение = НСтр("ru = 'Статусы и свойства обновлены.'"); ДобавитьОписаниеОшибки(ОписаниеОшибки, Сообщение); ЗафиксироватьТранзакциюДляОбновленияСвойств = Истина; КонецЕсли; Продолжить; КонецЕсли; УстановитьСтатусЗаказа(Док.ДокументОбъект, СвойстваЗаказа, Параметры.ТаблицаСоответствияСтатусовЗаказов); НовыйДокумент = НЕ ЗначениеЗаполнено(Док.РанееЗагруженныйДокументСсылка); Если НовыйДокумент Тогда СтрокаДопРеквизита = Док.ДокументОбъект.ДополнительныеРеквизиты.Добавить(); СтрокаДопРеквизита.Свойство = Параметры.ДополнительныйРеквизитЗаказаКлиентаНомерЗаказаНаСайте; СтрокаДопРеквизита.Значение = Док.НомерВходящий; СтрокаДопРеквизита = Док.ДокументОбъект.ДополнительныеРеквизиты.Добавить(); СтрокаДопРеквизита.Свойство = Параметры.ДополнительныйРеквизитЗаказаКлиентаДатаЗаказаНаСайте; СтрокаДопРеквизита.Значение = Док.ДатаВходящая; Если Параметры.ВестиНумерациюЗаказовПоДаннымСайта Тогда Док.ДокументОбъект.Номер = Док.НомерВходящий; КонецЕсли; КонецЕсли; Попытка Док.ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); Если НовыйДокумент Тогда СтруктураСтатистики.Создано.Добавить(Док.ДокументОбъект.Ссылка); Иначе СтруктураСтатистики.Обновлено.Добавить(Док.ДокументОбъект.Ссылка); КонецЕсли; Исключение СтруктураСтатистики.Пропущено.Добавить(Док.ДокументОбъект); ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать заказ №'") + Док.ДокументОбъект.Номер)); Продолжить; КонецПопытки; СсылкаНаДокумент = Док.ДокументОбъект.Ссылка; СтруктураСтатистики.Загружено.Добавить(СсылкаНаДокумент); СвойстваЗаказаОбновлены(СсылкаНаДокумент, СвойстваЗаказа, ОписаниеОшибки); КонецЦикла; КонецПроцедуры Процедура УстановитьСтатусЗаказа(ДокументОбъект, СвойстваЗаказа, ТаблицаСоответствияСтатусовЗаказов) Для Каждого СтрокаТаблицыСоответствий Из ТаблицаСоответствияСтатусовЗаказов Цикл ЗначениеСтатуса = СвойстваЗаказа[СтрокаТаблицыСоответствий.СтатусЗаказаНаСайте]; Если НЕ ЗначениеСтатуса = НеОпределено И НРег(ЗначениеСтатуса) = "true" Тогда ДокументОбъект.Статус = СтрокаТаблицыСоответствий.СтатусЗаказаКлиента; КонецЕсли; КонецЦикла; КонецПроцедуры Функция СвойстваЗаказаОбновлены(ЗаказКлиента, СвойстваЗаказа, ОписаниеОшибки) Если СвойстваЗаказа.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; Если НЕ ЗначениеЗаполнено(ЗаказКлиента) Тогда Возврат Ложь; КонецЕсли; ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(ЗаказКлиента, Ложь, Истина); ТаблицаСвойств.Колонки.Добавить("СвойствоСтрокой"); Для Каждого СтрокаСвойства Из ТаблицаСвойств Цикл СтрокаСвойства.СвойствоСтрокой = Строка(СтрокаСвойства.Свойство); КонецЦикла; МассивСоздатьОбновить = Новый Массив; Для Каждого СвойствоЗаказа Из СвойстваЗаказа Цикл СтруктураПоиска = Новый Структура("СвойствоСтрокой, Значение", СвойствоЗаказа.Ключ, СвойствоЗаказа.Значение); Найдено = ТаблицаСвойств.НайтиСтроки(СтруктураПоиска); Если Найдено.Количество() = 0 Тогда МассивСоздатьОбновить.Добавить(СвойствоЗаказа); КонецЕсли; КонецЦикла; Если МассивСоздатьОбновить.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; // ЗапросПВХ = Новый Запрос( "ВЫБРАТЬ | ДополнительныеРеквизитыИСведения.Ссылка, | ДополнительныеРеквизитыИСведения.ТипЗначения |ИЗ | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения |ГДЕ | ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение | И (НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления) | И ДополнительныеРеквизитыИСведения.Наименование = &Наименование"); ЗапросНаборы = Новый Запрос( "ВЫБРАТЬ | НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство |ИЗ | Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения |ГДЕ | НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Ссылка = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Документ_ЗаказКлиента) | И НаборыДополнительныхРеквизитовИСведенийДополнительныеСведения.Свойство = &Свойство"); Для Каждого СвойствоЗаказа Из МассивСоздатьОбновить Цикл СвойствоСтрокой = СвойствоЗаказа.Ключ; Значение = СвойствоЗаказа.Значение; ЗапросПВХ.УстановитьПараметр("Наименование", СвойствоСтрокой); Свойство = НеОпределено; Выборка = ЗапросПВХ.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ТипЗначения = Новый ОписаниеТипов("Строка") Тогда Свойство = Выборка.Ссылка; Прервать; КонецЕсли; КонецЦикла; Если Свойство = НеОпределено Тогда СвойствоОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент(); СвойствоОбъект.Комментарий = НСтр("ru = 'Создано автоматически при загрузке заказа с сайта'"); СвойствоОбъект.Наименование = СвойствоСтрокой; СвойствоОбъект.ТипЗначения = Новый ОписаниеТипов("Строка"); СвойствоОбъект.ЭтоДополнительноеСведение = Истина; СвойствоОбъект.Записать(); Свойство = СвойствоОбъект.Ссылка; КонецЕсли; ЗапросНаборы.УстановитьПараметр("Свойство", Свойство); Если ЗапросНаборы.Выполнить().Пустой() Тогда ЗаписьНабора = Справочники.НаборыДополнительныхРеквизитовИСведений.Документ_ЗаказКлиента.ПолучитьОбъект(); НовСвойство = ЗаписьНабора.ДополнительныеСведения.Добавить(); НовСвойство.Свойство = Свойство; ЗаписьНабора.Записать(); КонецЕсли; НоваяЗапись = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи(); НоваяЗапись.Объект = ЗаказКлиента; НоваяЗапись.Значение = Значение; НоваяЗапись.Свойство = Свойство; НоваяЗапись.Записать(); КонецЦикла; Возврат Истина; КонецФункции Функция НоменклатураИдентифицирована(ДеревоДокументов, Параметры, ОписаниеОшибки) Успешно = Истина; Для Каждого СтрокаДД Из ДеревоДокументов.Строки Цикл Если СтрокаДД.ЕстьСсылкиНаРанееЗагруженныйДокумент Тогда Продолжить; КонецЕсли; Для Каждого ТоварУслугаСвойство Из СтрокаДД.Строки Цикл Если ЗначениеЗаполнено(ТоварУслугаСвойство.СвойствоНаименование) Тогда Продолжить; КонецЕсли; ТипНоменклатурыXML = ""; Для Каждого ПодчиненнаяСтрокаТовараУслуги Из ТоварУслугаСвойство.Строки Цикл Если ЗначениеЗаполнено(ПодчиненнаяСтрокаТовараУслуги.ЗначениеРеквизитаНаименование) И ПодчиненнаяСтрокаТовараУслуги.ЗначениеРеквизитаНаименование = "ТипНоменклатуры" Тогда ТипНоменклатурыXML = ПодчиненнаяСтрокаТовараУслуги.ЗначениеРеквизитаЗначение; Прервать; КонецЕсли; КонецЦикла; ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(); СтавкаНДСНоменклатуры = ?(ЗначениеЗаполнено(ТоварУслугаСвойство.СтавкаНДС), ТоварУслугаСвойство.СтавкаНДС, СтрокаДД.СтавкаНДС); Если ТипНоменклатурыXML = "Услуга" Тогда Номенклатура = ПолучитьНоменклатуру(ТоварУслугаСвойство, Истина, // услуга Параметры, ОписаниеОшибки, СтавкаНДСНоменклатуры); Иначе Номенклатура = ПолучитьНоменклатуру(ТоварУслугаСвойство, Ложь, Параметры, ОписаниеОшибки, СтавкаНДСНоменклатуры, ХарактеристикаНоменклатуры); КонецЕсли; Если НЕ ЗначениеЗаполнено(Номенклатура) Тогда Продолжить; КонецЕсли; Если ТоварУслугаСвойство.ТоварУслугаКоличество = 0 Тогда Продолжить; КонецЕсли; // Новая строка ТЧ НовСтрока = СтрокаДД.ДокументОбъект.Товары.Добавить(); НовСтрока.Номенклатура = Номенклатура; НовСтрока.Характеристика = ХарактеристикаНоменклатуры; НовСтрока.Количество = ТоварУслугаСвойство.ТоварУслугаКоличество; НовСтрока.КоличествоУпаковок = НовСтрока.Количество; Если ЗначениеЗаполнено(ТоварУслугаСвойство.СтавкаНДС) Тогда НовСтрока.СтавкаНДС = ТоварУслугаСвойство.СтавкаНДС; Иначе НовСтрока.СтавкаНДС = Номенклатура.СтавкаНДС; КонецЕсли; НовСтрока.Сумма = ПолучитьСуммуСУчетомСкидок(ТоварУслугаСвойство); Если ЗначениеЗаполнено(ТоварУслугаСвойство.ТоварУслугаЦенаЗаЕдиницу) Тогда НовСтрока.Цена = ТоварУслугаСвойство.ТоварУслугаЦенаЗаЕдиницу; КонецЕсли; Если НовСтрока.Цена = 0 Тогда НовСтрока.Цена = НовСтрока.Сумма / НовСтрока.Количество; КонецЕсли; ПересчитатьСтрокуЗаказа(СтрокаДД.ДокументОбъект, НовСтрока); КонецЦикла; // + Скидка на документ Если НЕ СтрокаДД.СкидкаВСумме Тогда СуммаСкидки = СтрокаДД.СуммаСкидки; Если СуммаСкидки <> 0 Тогда РаспределитьСуммуПоКолонке(СтрокаДД.ДокументОбъект, СтрокаДД.ДокументОбъект.Товары, -СуммаСкидки); КонецЕсли; КонецЕсли; СтрокаДД.ДокументОбъект.СуммаДокумента = СтрокаДД.ДокументОбъект.Товары.Итог("Сумма"); ПродажиСервер.ЗаполнитьЭтапыГрафикаОплаты(СтрокаДД.ДокументОбъект, СтрокаДД.ДокументОбъект.СуммаДокумента); СтрокаДД.ДокументОбъект.БанковскийСчет = ЗначениеНастроекПовтИсп.ПолучитьБанковскийСчетОрганизацииПоУмолчанию(СтрокаДД.ДокументОбъект.Организация, , СтрокаДД.ДокументОбъект.БанковскийСчет); СтрокаДД.ДокументОбъект.Касса = ЗначениеНастроекПовтИсп.ПолучитьКассуОрганизацииПоУмолчанию(СтрокаДД.ДокументОбъект.Организация, СтрокаДД.ДокументОбъект.ФормаОплаты, СтрокаДД.ДокументОбъект.Касса); КонецЦикла; Возврат Успешно; КонецФункции Процедура ПересчитатьСтрокуЗаказа(Док, СтрокаТЧ) СуммаБезСкидки = СтрокаТЧ.Цена * СтрокаТЧ.Количество; СуммаСкидки = СуммаБезСкидки - СтрокаТЧ.Сумма; СтрокаТЧ.СуммаРучнойСкидки = СуммаСкидки; Если СтрокаТЧ.СуммаРучнойСкидки <> 0 Тогда СтрокаТЧ.ПроцентРучнойСкидки = 100 * СуммаСкидки / СуммаБезСкидки; КонецЕсли; Если Док.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС Тогда ТекПроцентНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(СтрокаТЧ.СтавкаНДС); СтрокаТЧ.СуммаНДС = Ценообразование.РассчитатьСуммуНДС(СтрокаТЧ.Сумма, СтрокаТЧ.СтавкаНДС, Док.ЦенаВключаетНДС); Иначе СтрокаТЧ.СуммаНДС = 0; КонецЕсли; СтрокаТЧ.СуммаСНДС = ?(Док.ЦенаВключаетНДС, СтрокаТЧ.Сумма, СтрокаТЧ.Сумма + СтрокаТЧ.СуммаНДС); КонецПроцедуры Процедура РаспределитьСуммуПоКолонке(ДокументОбъект, Товары, СуммаРаспределения) МассивДанныхКолонки = Товары.ВыгрузитьКолонку("Сумма"); МассивРаспределения = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(СуммаРаспределения, МассивДанныхКолонки); Если МассивРаспределения = Неопределено Тогда Возврат; КонецЕсли; Индекс = 0; Для каждого СтрокаТабличнойЧасти Из Товары Цикл СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Сумма + МассивРаспределения[Индекс]; Индекс = Индекс + 1; ПересчитатьСтрокуЗаказа(ДокументОбъект, СтрокаТабличнойЧасти); КонецЦикла; КонецПроцедуры Функция ПолучитьСуммуСУчетомСкидок(СтрокаТовара); Сумма = СтрокаТовара.ТоварУслугаСумма; СуммаСкидки = 0; Для Каждого СтрокаСкидки Из СтрокаТовара.Строки Цикл Если ЗначениеЗаполнено(СтрокаСкидки.СуммаСкидки) И НЕ СтрокаСкидки.СкидкаВСумме Тогда СуммаСкидки = СуммаСкидки + СтрокаСкидки.СуммаСкидки; КонецЕсли; КонецЦикла; Сумма = Сумма - СуммаСкидки; Возврат Сумма; КонецФункции Функция ПолучитьИдНоменклатуры(Знач Ид) ПозицияРазделителя = Найти(Ид, "#"); Если ПозицияРазделителя > 0 Тогда ИдНоменклатуры = Лев(Ид, ПозицияРазделителя - 1); Иначе ИдНоменклатуры = Ид; КонецЕсли; Возврат ИдНоменклатуры; КонецФункции Функция ТоварНайденПоСсылкам(СтрокаТовара, Номенклатура, ХарактеристикаНоменклатуры, ЭтоУслуга, ИспользоватьХарактеристики, ОписаниеОшибки) Если НЕ ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаИд) Тогда Возврат Ложь; КонецЕсли; Попытка ИдНоменклатуры = ПолучитьИдНоменклатуры(СтрокаТовара.ТоварУслугаИд); Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдНоменклатуры)); Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда Возврат Ложь; КонецЕсли; Если Номенклатура.ПолучитьОбъект() = Неопределено Тогда // Объект не найден ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Номенклатура не найдена по уникальному идентификатору: '") + ИдНоменклатуры + Символы.ПС + НСтр("ru = 'Будет создан новый объект.'")); Возврат Ложь; КонецЕсли; Если ЭтоУслуга ИЛИ НЕ (ИспользоватьХарактеристики И (НЕ Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать) ) Тогда Возврат Истина; КонецЕсли; ИдХарактеристики = ПолучитьИдХарактеристики(СтрокаТовара.ТоварУслугаИд); Если ПустаяСтрока(ИдХарактеристики) Тогда Возврат Истина; КонецЕсли; ХарактеристикаНоменклатуры = Справочники.ХарактеристикиНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдХарактеристики)); Если НЕ ЗначениеЗаполнено(ХарактеристикаНоменклатуры) Тогда Возврат Ложь; КонецЕсли; Если ХарактеристикаНоменклатуры.ПолучитьОбъект() = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Характеристика номенклатуры не найдена: '") + Строка(ИдХарактеристики) + Символы.ПС + НСтр("ru = 'Будет создан новый объект.'")); Возврат Ложь; КонецЕсли; Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось выполнить поиск номенклатуры: '") + СтрокаТовара.ТоварУслугаИд)); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции Функция ПолучитьИдХарактеристики(Знач Ид) ПозицияРазделителя = Найти(Ид, "#"); Если ПозицияРазделителя > 0 Тогда ИдХарактеристики = Сред(Ид, ПозицияРазделителя + 1); Иначе ИдХарактеристики = ""; КонецЕсли; Возврат ИдХарактеристики; КонецФункции Функция ПолучитьНоменклатуру(СтрокаТовара, ЭтоУслуга, Параметры, ОписаниеОшибки, СтавкаНДС, ХарактеристикаНоменклатуры = Неопределено) Номенклатура = Справочники.Номенклатура.ПустаяСсылка(); УспешноНайдено = ТоварНайденПоСсылкам(СтрокаТовара, Номенклатура, ХарактеристикаНоменклатуры, ЭтоУслуга, Параметры.ИспользоватьХарактеристики, ОписаниеОшибки); Если УспешноНайдено Тогда Возврат Номенклатура; КонецЕсли; ////////////////////////////////////// ВидНоменклатуры = ?(ЭтоУслуга, Параметры.ВидНоменклатурыУслуга, Параметры.ВидНоменклатурыТовар); Номенклатура = ПолучитьНоменклатуруПоНаименованиюИВиду(СтрокаТовара.ТоварУслугаНаименование, ВидНоменклатуры); Если ЗначениеЗаполнено(Номенклатура) Тогда Возврат Номенклатура; КонецЕсли; ЕдиницаПоКлассификатору = НеОпределено; Если ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаБазоваяЕдиницаКод) Тогда ЕдиницаПоКлассификатору = Справочники.ЕдиницыИзмерения.НайтиПоКоду(СтрокаТовара.ТоварУслугаБазоваяЕдиницаКод); КонецЕсли; Если НЕ ЗначениеЗаполнено(ЕдиницаПоКлассификатору) И ЗначениеЗаполнено(СтрокаТовара.ТоварУслугаБазоваяЕдиница) Тогда ЕдиницаПоКлассификатору = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(СтрокаТовара.ТоварУслугаБазоваяЕдиница, Истина); КонецЕсли; Если НЕ ЗначениеЗаполнено(ЕдиницаПоКлассификатору) Тогда ЕдиницаПоКлассификатору = Параметры.ЕдиницаИзмеренияНовойНоменклатуры; КонецЕсли; Номенклатура = Справочники.Номенклатура.СоздатьЭлемент(); Номенклатура.ЕдиницаИзмерения = ЕдиницаПоКлассификатору; Номенклатура.Родитель = Параметры.ГруппаДляНовойНоменклатуры; Номенклатура.ВидНоменклатуры = ВидНоменклатуры; Номенклатура.ТипНоменклатуры = ВидНоменклатуры.ТипНоменклатуры; Номенклатура.Наименование = СтрокаТовара.ТоварУслугаНаименование; Номенклатура.НаименованиеПолное = СтрокаТовара.ТоварУслугаНаименование; Номенклатура.СтавкаНДС = СтавкаНДС; Номенклатура.Записать(); Если Параметры.ОбменТоварами И Параметры.ВыгружатьТолькоИзменения Тогда ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, Номенклатура.Ссылка); КонецЕсли; Возврат Номенклатура.Ссылка; КонецФункции Функция ПолучитьНоменклатуруПоНаименованиюИВиду(Наименование, ВидНоменклатуры) Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Наименование = &Наименование | И Номенклатура.ВидНоменклатуры = &ВидНоменклатуры"); Запрос.УстановитьПараметр("Наименование", Наименование); Запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатуры); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат НеОпределено; КонецЕсли; Возврат Результат.Выгрузить()[0][0]; КонецФункции Процедура ОбработатьНачалоЭлемента(ОбъектXML, Знач ИмяЭлемента, ДеревоДокументов, Параметры); ТекущаяСтрокаДерева = Неопределено; ТекущаяСтрокаТоваровУслуг = Неопределено; КоличествоДокументов = ДеревоДокументов.Строки.Количество(); Если КоличествоДокументов > 0 Тогда ТекущаяСтрокаДерева = ДеревоДокументов.Строки[КоличествоДокументов - 1]; КоличествоТоваровУслуг = ТекущаяСтрокаДерева.Строки.Количество(); Если КоличествоТоваровУслуг > 0 Тогда ТекущаяСтрокаТоваровУслуг = ТекущаяСтрокаДерева.Строки[КоличествоТоваровУслуг - 1]; КонецЕсли; КонецЕсли; Если ИмяЭлемента = "Документ" Тогда НовыйДокумент = Документы.ЗаказКлиента.СоздатьДокумент(); НовыйДокумент.Валюта = Константы.ВалютаРегламентированногоУчета.Получить(); НовыйДокумент.Менеджер = ?(ЗначениеЗаполнено(Параметры.Менеджер), Параметры.Менеджер, Параметры.Соглашение.Менеджер); НовыйДокумент.НалогообложениеНДС = Параметры.Соглашение.НалогообложениеНДС; НовыйДокумент.Организация = ?(ЗначениеЗаполнено(Параметры.Организация), Параметры.Организация, Параметры.Соглашение.Организация); НовыйДокумент.Приоритет = Перечисления.Приоритеты.Средний; НовыйДокумент.Склад = Параметры.Соглашение.Склад; НовыйДокумент.Согласован = Ложь; НовыйДокумент.Соглашение = Параметры.Соглашение; НовыйДокумент.ГрафикОплаты = Параметры.Соглашение.ГрафикОплаты; НовыйДокумент.Статус = Перечисления.СтатусыЗаказовКлиентов.НеСогласован; НовыйДокумент.ХозяйственнаяОперация = Параметры.Соглашение.ХозяйственнаяОперация; НовыйДокумент.ЦенаВключаетНДС = Параметры.Соглашение.ЦенаВключаетНДС; НовСтрокаДерева = ДеревоДокументов.Строки.Добавить(); НовСтрокаДерева.ДокументОбъект = НовыйДокумент; НовСтрокаДерева.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; НовСтрокаДерева.СтруктураДанныхКонтрагента = Новый Структура; ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент" Тогда ДеревоАдресов = Новый ДеревоЗначений; ДеревоАдресов.Колонки.Добавить("ВидАдреса"); ДеревоАдресов.Колонки.Добавить("Представление"); ДеревоАдресов.Колонки.Добавить("Комментарий"); ДеревоАдресов.Колонки.Добавить("ПолеТип"); ДеревоАдресов.Колонки.Добавить("ПолеЗначение"); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ТаблицаКонтактов = Новый ТаблицаЗначений; ТаблицаКонтактов.Колонки.Добавить("КонтактТип"); ТаблицаКонтактов.Колонки.Добавить("КонтактЗначение"); ТаблицаКонтактов.Колонки.Добавить("КонтактКомментарий"); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактов", ТаблицаКонтактов); ТаблицаКонтактныхЛиц = Новый ТаблицаЗначений; ТаблицаКонтактныхЛиц.Колонки.Добавить("Наименование"); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц); ТаблицаБанковскихРеквизитов = Новый ТаблицаЗначений; ТаблицаБанковскихРеквизитов.Колонки.Добавить("НомерСчета"); ТаблицаБанковскихРеквизитов.Колонки.Добавить("Комментарий"); ТаблицаБанковскихРеквизитов.Колонки.Добавить("Банк"); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности" Тогда ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); НовСтрокаДерева = ДеревоАдресов.Строки.Добавить(); НовСтрокаДерева.ВидАдреса = "АдресРегистрации"; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.АдресноеПоле" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("АдресРегистрации", "ВидАдреса"); НовСтрокаДерева = СтрокаДерева.Строки.Добавить(); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); НовСтрокаДерева = ДеревоАдресов.Строки.Добавить(); НовСтрокаДерева.ВидАдреса = "ЮридическийАдрес"; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.АдресноеПоле" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("ЮридическийАдрес", "ВидАдреса"); НовСтрокаДерева = СтрокаДерева.Строки.Добавить(); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); НоваяСтрокаТаблицыБанковскихРеквизитов = ТаблицаБанковскихРеквизитов.Добавить(); НоваяСтрокаТаблицыБанковскихРеквизитов.Банк = Новый Структура(" | СчетКорреспондентский, | Наименование, | Адрес, | БИК, | SWIFT"); НоваяСтрокаТаблицыБанковскихРеквизитов.Банк.Адрес = Новый Структура; НоваяСтрокаТаблицыБанковскихРеквизитов.Банк.Адрес.Вставить("Представление"); ТаблицаАдресныхПолей = Новый ТаблицаЗначений; ТаблицаАдресныхПолей.Колонки.Добавить("ПолеТип"); ТаблицаАдресныхПолей.Колонки.Добавить("ПолеЗначение"); НоваяСтрокаТаблицыБанковскихРеквизитов.Банк.Адрес.Вставить("ТаблицаАдресныхПолей", ТаблицаАдресныхПолей); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.АдресноеПоле" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес" Тогда ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.АдресноеПоле" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); СтрокаТаблицыБанковскихРеквизитов = ТаблицаБанковскихРеквизитов[ТаблицаБанковскихРеквизитов.Количество() - 1]; СтруктураДанныхБанка = СтрокаТаблицыБанковскихРеквизитов.Банк; СтруктураДанныхБанка.Адрес.ТаблицаАдресныхПолей.Добавить(); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); НовСтрокаДерева = ДеревоАдресов.Строки.Добавить(); НовСтрокаДерева.ВидАдреса = "Адрес"; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес", "ВидАдреса"); НовСтрокаДерева = СтрокаДерева.Строки.Добавить(); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактов", ТаблицаКонтактов); ТаблицаКонтактов.Добавить(); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактов", ТаблицаКонтактов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Представители.Представитель.Контрагент" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц); ТаблицаКонтактныхЛиц.Добавить(); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц); //ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка" Тогда //ИначеЕсли ИмяЭлемента = "Документ.ДопРасходы.ДопРасход" Тогда ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар" Тогда НовСтрокаДерева = ТекущаяСтрокаДерева.Строки.Добавить(); ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.БазоваяЕдиница" Тогда Пока ОбъектXML.ПрочитатьАтрибут() Цикл Если ОбъектXML.Имя = "Код" Тогда КодБазовойЕдиницы = ОбъектXML.Значение; ТекущаяСтрокаТоваровУслуг.ТоварУслугаБазоваяЕдиницаКод = КодБазовойЕдиницы; Прервать; КонецЕсли; КонецЦикла ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.ЗначенияРеквизитов.ЗначениеРеквизита" Тогда ТекущаяСтрокаТоваровУслуг.Строки.Добавить(); ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка" Тогда ТекущаяСтрокаТоваровУслуг.Строки.Добавить(); ИначеЕсли ИмяЭлемента = "Документ.ЗначенияРеквизитов.ЗначениеРеквизита" Тогда НовСтрокаДерева = ТекущаяСтрокаДерева.Строки.Добавить(); КонецЕсли; КонецПроцедуры Функция ЗначениеЭлементаОбработано(Знач ИмяЭлемента, Знач ЗначениеЭлемента, ДеревоДокументов, Параметры, ОписаниеОшибки); Успешно = Истина; КоличествоДокументов = ДеревоДокументов.Строки.Количество(); ИмяТекущегоЭлемента = ПолучитьИмяЭлементаИзПоследовательности(ИмяЭлемента); ДеревоАдресов = Неопределено; ТаблицаКонтактов = Неопределено; ТаблицаКонтактныхЛиц = Неопределено; ТаблицаБанковскихРеквизитов = НеОпределено; Если КоличествоДокументов > 0 Тогда ТекущаяСтрокаДерева = ДеревоДокументов.Строки[КоличествоДокументов - 1]; ТекущийДокумент = ТекущаяСтрокаДерева.ДокументОбъект; ТекущаяСтрокаТоваровУслуг = Неопределено; ТекущаяСтрокаСкидок = Неопределено; КоличествоТоваровУслуг = ТекущаяСтрокаДерева.Строки.Количество(); Если КоличествоТоваровУслуг > 0 Тогда ТекущаяСтрокаТоваровУслуг = ТекущаяСтрокаДерева.Строки[КоличествоТоваровУслуг - 1]; КоличествоСкидок = ТекущаяСтрокаТоваровУслуг.Строки.Количество(); Если КоличествоСкидок > 0 Тогда ТекущаяСтрокаСкидок = ТекущаяСтрокаТоваровУслуг.Строки[КоличествоСкидок - 1]; КонецЕсли; КонецЕсли; Если ИмяЭлемента = "Документ.Номер" Тогда ТекущийДокумент.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '№ %1 %2'"), ЗначениеЭлемента, ?(Параметры.ВыгружатьНаСайт, Параметры.НастройкиПодключения.Сервер, "(сайт)")); ТекущаяСтрокаДерева.НомерВходящий = ЗначениеЭлемента; ИначеЕсли ИмяЭлемента = "Документ.Дата" Тогда ДатаВремя = ПолучитьДатуВремяXML(ЗначениеЭлемента); Если Параметры.ЗаписыватьДокументыТекущейДатой Тогда ТекущийДокумент.Дата = ТекущаяДата(); Иначе ТекущийДокумент.Дата = ДатаВремя; КонецЕсли; ТекущаяСтрокаДерева.ДатаВходящая = ДатаВремя; ИначеЕсли ИмяЭлемента = "Документ.Время" Тогда Если НЕ Параметры.ЗаписыватьДокументыТекущейДатой Тогда ТекущийДокумент.Дата = ПолучитьДатуВремяXML(ЗначениеЭлемента, ТекущийДокумент.Дата); КонецЕсли; ТекущаяСтрокаДерева.ДатаВходящая = ПолучитьДатуВремяXML(ЗначениеЭлемента, ТекущаяСтрокаДерева.ДатаВходящая); ИначеЕсли ИмяЭлемента = "Документ.ХозОперация" Тогда Если НЕ ЗначениеЭлемента = "Заказ товара" Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка в значении узла <Документ>.<ХозОперация> документа XML (%1)'"), ЗначениеЭлемента)); Успешно = Ложь; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Валюта" Тогда ТекущийДокумент.Валюта = ОбменССайтомПовтИсп.ПолучитьВалютуПоКодуXML(ЗначениеЭлемента); Если НЕ ЗначениеЗаполнено(ТекущийДокумент.Валюта) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка в значении узла <Документ>.<Валюта> документа XML (%1)'"), ЗначениеЭлемента)); Успешно = Ложь; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Наименование" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Наименование", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Комментарий" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Комментарий", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ПолноеНаименование" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.ОфициальноеНаименование" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("НаименованиеПолное", ЗначениеЭлемента); Если ИмяЭлемента = "Документ.Контрагенты.Контрагент.ПолноеНаименование" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ЮрФизЛицо", Перечисления.ЮрФизЛицо.ФизЛицо); Иначе ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ЮрФизЛицо", Перечисления.ЮрФизЛицо.ЮрЛицо); КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Фамилия" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Фамилия", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Имя" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Имя", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Отчество" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Отчество", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ДатаРождения" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДатаРождения", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРождения" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("МестоРождения", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Пол" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("Пол", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ИНН" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ИНН", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.КПП" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("КПП", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.ВидДокумента" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.Серия" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.Номер" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.ДатаВыдачи" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.УдостоверениеЛичности.КемВыдан" Тогда СохраненноеЗначение = ""; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДокументУдостоверяющийЛичность", СохраненноеЗначение); ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДокументУдостоверяющийЛичность", СохраненноеЗначение + ЗначениеЭлемента + " "); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.Представление" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.Комментарий" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("АдресРегистрации", "ВидАдреса"); СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.АдресноеПоле.Тип" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.АдресРегистрации.АдресноеПоле.Значение" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("АдресРегистрации", "ВидАдреса"); СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 1]; СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Организация.Контрагент.Ид" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Организация.Контрагент.Наименование" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.МестоРаботы.Должность" Тогда ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.Представление" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.Комментарий" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("ЮридическийАдрес", "ВидАдреса"); СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.АдресноеПоле.Тип" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.ЮридическийАдрес.АдресноеПоле.Значение" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("ЮридическийАдрес", "ВидАдреса"); СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 1]; СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.КПП" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("КПП", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.ОсновнойВидДеятельности" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ОсновнойВидДеятельности", ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.НомерСчета" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Комментарий" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); СтрокаТаблицы = ТаблицаБанковскихРеквизитов[ТаблицаБанковскихРеквизитов.Количество() - 1]; СтрокаТаблицы[ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.СчетКорреспондентский" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Наименование" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.БИК" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.SWIFT" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); СтрокаТаблицы = ТаблицаБанковскихРеквизитов[ТаблицаБанковскихРеквизитов.Количество() - 1]; СтрокаТаблицы.Банк[ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.Представление" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); СтрокаТаблицы = ТаблицаБанковскихРеквизитов[ТаблицаБанковскихРеквизитов.Количество() - 1]; СтрокаТаблицы.Банк.Адрес[ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.АдресноеПоле.Тип" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.Банк.Адрес.АдресноеПоле.Значение" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); СтрокаТаблицы = ТаблицаБанковскихРеквизитов[ТаблицаБанковскихРеквизитов.Количество() - 1]; СтрокаАдреса = СтрокаТаблицы.Банк.Адрес.ТаблицаАдресныхПолей[СтрокаТаблицы.Банк.Адрес.ТаблицаАдресныхПолей.Количество() - 1]; СтрокаАдреса["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаБанковскихРеквизитов", ТаблицаБанковскихРеквизитов); //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.СчетКорреспондентский" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Наименование" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.БИК" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.SWIFT" Тогда // //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.Представление" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.Комментарий" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.АдресноеПоле.Тип" Тогда //ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.РасчетныеСчета.РасчетныйСчет.БанкКорреспондент.Банк.Адрес.АдресноеПоле.Значение" Тогда ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.Представление" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.Комментарий" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес", "ВидАдреса"); СтрокаДерева[ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле.Тип" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Адрес.АдресноеПоле.Значение" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ДеревоАдресов", ДеревоАдресов); СтрокаДерева = ДеревоАдресов.Строки.Найти("Адрес", "ВидАдреса"); СтрокаАдресногоПоля = СтрокаДерева.Строки[СтрокаДерева.Строки.Количество() - 1]; СтрокаАдресногоПоля["Поле" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ДеревоАдресов", ДеревоАдресов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт.Тип" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт.Значение" ИЛИ ИмяЭлемента = "Документ.Контрагенты.Контрагент.Контакты.Контакт.Комментарий" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактов", ТаблицаКонтактов); СтрокаТаблицы = ТаблицаКонтактов[ТаблицаКонтактов.Количество() - 1]; СтрокаТаблицы["Контакт" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактов", ТаблицаКонтактов); ИначеЕсли ИмяЭлемента = "Документ.Контрагенты.Контрагент.Представители.Представитель.Контрагент.Наименование" Тогда ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Свойство("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц); СтрокаТаблицы = ТаблицаКонтактныхЛиц[ТаблицаКонтактныхЛиц.Количество() - 1]; СтрокаТаблицы["Наименование"] = ЗначениеЭлемента; ТекущаяСтрокаДерева.СтруктураДанныхКонтрагента.Вставить("ТаблицаКонтактныхЛиц", ТаблицаКонтактныхЛиц); ИначеЕсли ИмяЭлемента = "Документ.Комментарий" Тогда ТекущийДокумент.Комментарий = ТекущийДокумент.Комментарий + ": " + ЗначениеЭлемента; ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог.УчтеноВСумме" Тогда ТекущийДокумент.ЦенаВключаетНДС = Ложь; Если ЗначениеЭлемента = "true" Тогда ТекущийДокумент.ЦенаВключаетНДС = Истина; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Налоги.Налог.Ставка" Тогда Если ЗначениеЗаполнено(ЗначениеЭлемента) Тогда ТекущаяСтрокаДерева.СтавкаНДС = ОбменССайтомПовтИсп.ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(ЗначениеЭлемента); Иначе ТекущаяСтрокаДерева.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.СтавкиНалогов.СтавкаНалога.Ставка" Тогда Если ЗначениеЗаполнено(ЗначениеЭлемента) Тогда ТекущаяСтрокаТоваровУслуг.СтавкаНДС = ОбменССайтомПовтИсп.ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(ЗначениеЭлемента); Иначе ТекущаяСтрокаТоваровУслуг.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка.Сумма" Тогда СуммаЧисло = Число(ЗначениеЭлемента); ТекущаяСтрокаДерева.СуммаСкидки = СуммаЧисло; ИначеЕсли ИмяЭлемента = "Документ.Скидки.Скидка.УчтеноВСумме" Тогда ТекущаяСтрокаДерева.СкидкаВСумме = Ложь; Если ЗначениеЭлемента = "true" Тогда ТекущаяСтрокаДерева.СкидкаВСумме = Истина; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Ид" ИЛИ ИмяЭлемента = "Документ.Товары.Товар.БазоваяЕдиница" ИЛИ ИмяЭлемента = "Документ.Товары.Товар.Наименование" Тогда ТекущаяСтрокаТоваровУслуг["ТоварУслуга" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.ЦенаЗаЕдиницу" ИЛИ ИмяЭлемента = "Документ.Товары.Товар.Сумма" ИЛИ ИмяЭлемента = "Документ.Товары.Товар.Количество" Тогда ТекущаяСтрокаТоваровУслуг["ТоварУслуга" + ИмяТекущегоЭлемента] = Число(ЗначениеЭлемента); ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.ЗначенияРеквизитов.ЗначениеРеквизита.Наименование" ИЛИ ИмяЭлемента = "Документ.Товары.Товар.ЗначенияРеквизитов.ЗначениеРеквизита.Значение" Тогда ТекущаяСтрокаСкидок["ЗначениеРеквизита" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка.Сумма" Тогда СуммаЧисло = Число(ЗначениеЭлемента); ТекущаяСтрокаСкидок.СуммаСкидки = СуммаЧисло; ИначеЕсли ИмяЭлемента = "Документ.Товары.Товар.Скидки.Скидка.УчтеноВСумме" Тогда ТекущаяСтрокаСкидок.СкидкаВСумме = Ложь; Если ЗначениеЭлемента = "true" Тогда ТекущаяСтрокаСкидок.СкидкаВСумме = Истина; КонецЕсли; ИначеЕсли ИмяЭлемента = "Документ.ЗначенияРеквизитов.ЗначениеРеквизита.Наименование" ИЛИ ИмяЭлемента = "Документ.ЗначенияРеквизитов.ЗначениеРеквизита.Значение" Тогда ТекущаяСтрокаТоваровУслуг["Свойство" + ИмяТекущегоЭлемента] = ЗначениеЭлемента; КонецЕсли; КонецЕсли; Возврат Успешно; КонецФункции Функция ПолучитьДатуВремяXML(ДатаВремяСтрока, НачальнаяДата = Неопределено) ДатаВремя = Неопределено; Если ЗначениеЗаполнено(НачальнаяДата) Тогда Время = СтрЗаменить(ДатаВремяСтрока, ":", ""); ДатаВремя = Дата(Формат(НачальнаяДата, "ДФ=yyyyMMdd") + Время); Иначе ДатаВремя = Дата(СтрЗаменить(ДатаВремяСтрока, "-", "") + "000000"); КонецЕсли; Возврат ДатаВремя; КонецФункции Функция ПолучитьДеревоДокументовXML(СтрокаXML, Параметры, ОписаниеОшибки) Успешно = Истина; ОбъектXML = Новый ЧтениеXML; Попытка ОбъектXML.УстановитьСтроку(СтрокаXML); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось разобрать XML'"))); Возврат Неопределено; КонецПопытки; ПоследовательностьЭлементов = ""; ДеревоДокументов = Новый ДеревоЗначений; ДеревоДокументов.Колонки.Добавить("ДокументОбъект"); ДеревоДокументов.Колонки.Добавить("НомерВходящий"); ДеревоДокументов.Колонки.Добавить("ДатаВходящая", Новый ОписаниеТипов("Дата")); ДеревоДокументов.Колонки.Добавить("РанееЗагруженныйДокументСсылка", Новый ОписаниеТипов("ДокументСсылка.ЗаказКлиента")); ДеревоДокументов.Колонки.Добавить("ЕстьСсылкиНаРанееЗагруженныйДокумент", Новый ОписаниеТипов("Булево")); ДеревоДокументов.Колонки.Добавить("СтруктураДанныхКонтрагента"); ДеревоДокументов.Колонки.Добавить("СтавкаНДС"); // Подчинение документу ДеревоДокументов.Колонки.Добавить("ТоварУслугаТипНоменклатуры"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаНаименование"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаБазоваяЕдиницаКод"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаБазоваяЕдиница"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаСумма"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаКомментарий"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаЦенаЗаЕдиницу"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаКоличество"); ДеревоДокументов.Колонки.Добавить("ТоварУслугаИд"); ДеревоДокументов.Колонки.Добавить("СвойствоНаименование"); ДеревоДокументов.Колонки.Добавить("СвойствоЗначение"); // Подчинение товарам/услугам ДеревоДокументов.Колонки.Добавить("СуммаСкидки", Новый ОписаниеТипов("Число")); ДеревоДокументов.Колонки.Добавить("СкидкаВСумме", Новый ОписаниеТипов("Булево")); ДеревоДокументов.Колонки.Добавить("ЗначениеРеквизитаНаименование"); ДеревоДокументов.Колонки.Добавить("ЗначениеРеквизитаЗначение"); Пока Истина Цикл ОчереднойУзелXMLПрочитан = Ложь; Попытка ОчереднойУзелXMLПрочитан = ОбъектXML.Прочитать(); Исключение Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось прочитать узел XML'"))); Прервать; КонецПопытки; Если НЕ ОчереднойУзелXMLПрочитан Тогда Прервать; КонецЕсли; ТипУзла = ОбъектXML.ТипУзла; ИмяУзла = ОбъектXML.Имя; Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ПоследовательностьЭлементов = ДобавитьЭлементКПоследовательности(ПоследовательностьЭлементов, ИмяУзла); ОбработатьНачалоЭлемента(ОбъектXML, ПоследовательностьЭлементов, ДеревоДокументов, Параметры); ИначеЕсли ТипУзла = ТипУзлаXML.КонецЭлемента Тогда ПоследовательностьЭлементов = УдалитьПоследнийЭлементИзПоследовательности(ПоследовательностьЭлементов); ИначеЕсли ТипУзла = ТипУзлаXML.Текст Тогда ЗначениеЭлемента = ОбъектXML.Значение; Успешно = ЗначениеЭлементаОбработано(ПоследовательностьЭлементов, ЗначениеЭлемента, ДеревоДокументов, Параметры, ОписаниеОшибки); Если НЕ Успешно Тогда ОписаниеОщибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось обработать значение элемента (%1) = (%2)'"), ПоследовательностьЭлементов, ЗначениеЭлемента) + Символы.ПС + ОписаниеОшибки; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; ОбъектXML.Закрыть(); Если НЕ Успешно Тогда ДеревоДокументов = Неопределено; КонецЕсли; Возврат ДеревоДокументов; КонецФункции Функция ДобавитьЭлементКПоследовательности(Знач ПоследовательностьЭлементов, Знач ИмяУзла) ИсключатьИзПоследовательности = Новый Массив; ИсключатьИзПоследовательности.Добавить("КоммерческаяИнформация"); Если ИсключатьИзПоследовательности.Найти(ИмяУзла) = Неопределено Тогда Если НЕ ПоследовательностьЭлементов = "" Тогда ПоследовательностьЭлементов = ПоследовательностьЭлементов + "."; КонецЕсли; ПоследовательностьЭлементов = ПоследовательностьЭлементов + ИмяУзла; КонецЕсли; Возврат ПоследовательностьЭлементов; КонецФункции Функция УдалитьПоследнийЭлементИзПоследовательности(Знач ПоследовательностьЭлементов); ПромСтрока = СтрЗаменить(ПоследовательностьЭлементов, ".", Символы.ПС); КоличествоЭлементов = СтрЧислоСтрок(ПромСтрока); ПоследовательностьЭлементов = ""; Если КоличествоЭлементов > 0 Тогда КоличествоЭлементов = КоличествоЭлементов - 1; Для Счетчик = 1 По КоличествоЭлементов Цикл ПоследовательностьЭлементов = ПоследовательностьЭлементов + "." + СтрПолучитьСтроку(ПромСтрока, Счетчик); КонецЦикла; ПоследовательностьЭлементов = Прав(ПоследовательностьЭлементов, СтрДлина(ПоследовательностьЭлементов) - 1); КонецЕсли; Возврат ПоследовательностьЭлементов; КонецФункции Функция ПолучитьИмяЭлементаИзПоследовательности(Знач ПоследовательностьЭлементов) ПромСтрока = СтрЗаменить(ПоследовательностьЭлементов, ".", Символы.ПС); КоличествоЭлементов = СтрЧислоСтрок(ПромСтрока); ИмяПоследнегоЭлемента = ""; Если КоличествоЭлементов > 0 Тогда ИмяПоследнегоЭлемента = СтрПолучитьСтроку(ПромСтрока, КоличествоЭлементов); КонецЕсли; Возврат ИмяПоследнегоЭлемента; КонецФункции Процедура ДобавитьПараметрыПротоколаОбменаВСтруктуру(СтруктураПараметров) СтруктураПараметров.Вставить("ПараметрЗапроса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"); КонецПроцедуры Функция ПолучитьРезультатОтправкиФайлаНаСервер(ПолноеИмяФайла, Соединение, ПараметрыЗапроса="", Заголовки="", ОписаниеОшибки) ОтветСервера = Неопределено; ИмяФайлаОтвета = ПолучитьИмяВременногоФайла(); Попытка Соединение.ОтправитьДляОбработки(ПолноеИмяФайла, СокрЛП(ПараметрыЗапроса), ИмяФайлаОтвета, СокрЛП(Заголовки)); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки()); КонецПопытки; ФайлОтвета = Новый Файл(ИмяФайлаОтвета); Если ФайлОтвета.Существует() Тогда ТекстОтвета = Новый ТекстовыйДокумент(); ТекстОтвета.Прочитать(ИмяФайлаОтвета); Если ТекстОтвета.КоличествоСтрок()>0 Тогда ОтветСервера = ТекстОтвета.ПолучитьТекст(); Иначе ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Отправка файла на сервер: Получен пустой ответ сервера.'")); КонецЕсли; Иначе ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Отправка файла на сервер: Ответ сервера не получен.'")); КонецЕсли; Попытка УдалитьФайлы(КаталогВременныхФайлов(), ИмяФайлаОтвета); Исключение КонецПопытки; Возврат ОтветСервера; КонецФункции Функция ПолучитьСписокФрагментовФайлов(СписокФайлов, ОграничениеРазмераФрагмента) НовыйСписокФайлов = Новый СписокЗначений; Для Каждого ТекФайл Из СписокФайлов цикл ФайлНаДиске = Новый Файл(ТекФайл.Значение); Если ФайлНаДиске.Размер() > ОграничениеРазмераФрагмента Тогда МассивФрагментов = РазделитьФайл(ФайлНаДиске.ПолноеИмя, ОграничениеРазмераФрагмента); Для Каждого НовыйФайл Из МассивФрагментов Цикл НовыйСписокФайлов.Добавить(НовыйФайл, ТекФайл.Представление); КонецЦикла; УдалитьФайлы(ФайлНаДиске.ПолноеИмя); Иначе НовыйСписокФайлов.Добавить(ТекФайл.Значение, ТекФайл.Представление); КонецЕсли; КонецЦикла; Возврат НовыйСписокФайлов; КонецФункции Функция ПолучитьСписокZIPАрхивов(КаталогНаДиске, ОписаниеОшибки) ПолноеИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip"); ЗаписьАрхива = Новый ЗаписьZipФайла(ПолноеИмяФайлаАрхива); НовыйСписокФайлов = Новый СписокЗначений; ЗаписьАрхива.Добавить(КаталогНаДиске + "\*.*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); Попытка ЗаписьАрхива.Записать(); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать zip-архив на диск!'"))); Возврат НовыйСписокФайлов; КонецПопытки; ФайлАрхива = Новый Файл(ПолноеИмяФайлаАрхива); НовыйСписокФайлов.Добавить(ПолноеИмяФайлаАрхива, ФайлАрхива.Имя); Возврат НовыйСписокФайлов; КонецФункции Функция ПолучитьСписокФайловДляОтправки(КаталогНаДиске, МассивПодкаталогов); СписокФайлов = Новый СписокЗначений; Маска = "*.*"; ВсеФайлыДляВыгрузки = НайтиФайлы(КаталогНаДиске, Маска); Если МассивПодкаталогов <> Неопределено Тогда Для Каждого Подкаталог Из МассивПодкаталогов Цикл ФайлыВПодкаталоге = НайтиФайлы(КаталогНаДиске + "\" + Подкаталог, Маска); Для Каждого ТекФайл Из ФайлыВПодкаталоге Цикл Если ТекФайл.ЭтоКаталог() Тогда ФайлыВДобавочномПодкаталоге = НайтиФайлы(ТекФайл.ПолноеИмя, Маска); Для Каждого ТекФайлВПодкаталоге Из ФайлыВДобавочномПодкаталоге Цикл Если НЕ ТекФайлВПодкаталоге.ЭтоКаталог() Тогда ВсеФайлыДляВыгрузки.Добавить(ТекФайлВПодкаталоге); КонецЕсли; КонецЦикла; Иначе ВсеФайлыДляВыгрузки.Добавить(ТекФайл); КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; Для Каждого ТекФайл Из ВсеФайлыДляВыгрузки цикл Если НЕ ТекФайл.ЭтоКаталог() Тогда ПолноеИмяФайлаДляСервера = ПолучитьИмяФайлаДляСервера(КаталогНаДиске, ТекФайл); СписокФайлов.Добавить(ТекФайл.ПолноеИмя, ПолноеИмяФайлаДляСервера); КонецЕсли; КонецЦикла; Возврат СписокФайлов; КонецФункции Функция ПолучитьИмяФайлаДляСервера(КаталогНаДиске, ФайлОбъект) ПолноеИмяФайлаДляСервера = ""; Если Найти(ФайлОбъект.Имя, ".xml") > 0 Тогда ПолноеИмяФайлаДляСервера = ФайлОбъект.Имя; Иначе //у картинки надо оставить 2 папки и развернуть слэши ПолноеИмяФайлаДляСервера = ФайлОбъект.ПолноеИмя; ПутьДляУдаления = КаталогНаДиске + "\"; ПолноеИмяФайлаДляСервера = СтрЗаменить(ПолноеИмяФайлаДляСервера, ПутьДляУдаления, ""); ПолноеИмяФайлаДляСервера = СтрЗаменить(ПолноеИмяФайлаДляСервера, "\", "/"); КонецЕсли; ПолноеИмяФайлаДляСервера = ПолучитьИмяФайлаБезДополнительныхРасширений(КаталогНаДиске, ПолноеИмяФайлаДляСервера); Возврат ПолноеИмяФайлаДляСервера; КонецФункции Функция ПолучитьИмяФайлаБезДополнительныхРасширений(КаталогНаДиске, ИсходноеИмяФайла) ПозицияТочки = Найти(ИсходноеИмяФайла, "."); ИмяФайла = Лев(ИсходноеИмяФайла, ПозицияТочки - 1); ПраваяЧастьИсходногоИмени = Прав(ИсходноеИмяФайла, СтрДлина(ИсходноеИмяФайла) - ПозицияТочки); ПозицияТочки = Найти(ПраваяЧастьИсходногоИмени, "."); Расширение = ПраваяЧастьИсходногоИмени; Если ПозицияТочки > 0 Тогда Расширение = Лев(ПраваяЧастьИсходногоИмени, ПозицияТочки - 1); КонецЕсли; Возврат ИмяФайла + "." + Расширение; КонецФункции Процедура ДобавитьОписаниеОшибки(Описание, Дополнение) Если ПустаяСтрока(Описание) Тогда Описание = Дополнение; Иначе Описание = Описание + Символы.ПС + Дополнение; КонецЕсли; КонецПроцедуры Функция ПолучитьДанныеССервера(Соединение, ПараметрыЗапроса = "", Заголовки = "", ОписаниеОшибки) ИмяФайлаОтвета = ПолучитьИмяВременногоФайла(); Попытка Соединение.Получить(СокрЛП(ПараметрыЗапроса), ИмяФайлаОтвета, СокрЛП(Заголовки)); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось получить данные с сервера. Проверьте правильность адреса сервера, порт, имя пользователя и пароль,'") + Символы.ПС + НСтр("ru = 'а также настройки подключения к Интернет.'"))); КонецПопытки; ФайлОтвета = Новый Файл(ИмяФайлаОтвета); ОтветСервера = НеОпределено; Если ФайлОтвета.Существует() Тогда ТекстОтвета = Новый ТекстовыйДокумент(); ТекстОтвета.Прочитать(ИмяФайлаОтвета); Если ТекстОтвета.КоличествоСтрок()>0 Тогда ОтветСервера = ТекстОтвета.ПолучитьТекст(); Иначе ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Получение данных с сервера: Получен пустой ответ сервера.'")); КонецЕсли; Иначе ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Получение данных с сервера: Ответ сервера не получен.'")); КонецЕсли; Попытка УдалитьФайлы(КаталогВременныхФайлов(), ИмяФайлаОтвета); Исключение КонецПопытки; Возврат ОтветСервера; КонецФункции Процедура ПодготовитьИтоговуюИнформациюПоВыгрузкеТоваров(ТаблицаКаталогов, СтрокаТаблицыИнформации, ВыгруженоОбъектов) СтруктураРезультата = Новый Структура("ВыгруженоТоваров,ВыгруженоКартинок,ВыгруженоФайлов,ВыгруженоПредложений,ОписаниеОшибки", 0, 0, 0, 0, ""); СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ТекущаяДата() + НСтр("ru = ' Завершено формирование файлов выгрузки товаров'"); Для Каждого Каталог Из ТаблицаКаталогов Цикл СтруктураРезультата.ВыгруженоТоваров = СтруктураРезультата.ВыгруженоТоваров + Каталог.СтруктураРезультата.ВыгруженоТоваров; СтруктураРезультата.ВыгруженоПредложений = СтруктураРезультата.ВыгруженоПредложений + Каталог.СтруктураРезультата.ВыгруженоПредложений; СтруктураРезультата.ВыгруженоКартинок = СтруктураРезультата.ВыгруженоКартинок + Каталог.СтруктураРезультата.ВыгруженоКартинок; СтруктураРезультата.ВыгруженоФайлов = СтруктураРезультата.ВыгруженоФайлов + Каталог.СтруктураРезультата.ВыгруженоФайлов; КонецЦикла; ВыгруженоОбъектов = СтруктураРезультата.ВыгруженоТоваров + СтруктураРезультата.ВыгруженоПредложений + СтруктураРезультата.ВыгруженоКартинок + СтруктураРезультата.ВыгруженоФайлов; СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + НСтр("ru = 'Выгружено товаров: '") + СтруктураРезультата.ВыгруженоТоваров + Символы.ПС + НСтр("ru = 'предложений: '") + СтруктураРезультата.ВыгруженоПредложений + Символы.ПС + НСтр("ru = 'картинок: '") + СтруктураРезультата.ВыгруженоКартинок + Символы.ПС + НСтр("ru = 'файлов: '") + СтруктураРезультата.ВыгруженоФайлов + Символы.ПС; Для Каждого Каталог Из ТаблицаКаталогов Цикл СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + НСтр("ru = 'В том числе для каталога '") + Каталог.Каталог + ":" + Символы.ПС + НСтр("ru = 'товаров: '") + Каталог.СтруктураРезультата.ВыгруженоТоваров + Символы.ПС + НСтр("ru = 'предложений: '") + Каталог.СтруктураРезультата.ВыгруженоПредложений + Символы.ПС + НСтр("ru = 'картинок: '") + Каталог.СтруктураРезультата.ВыгруженоКартинок + Символы.ПС + НСтр("ru = 'файлов: '") + Каталог.СтруктураРезультата.ВыгруженоФайлов + Символы.ПС; Если ПустаяСтрока(Каталог.СтруктураРезультата.ОписаниеОшибки) Тогда Продолжить; КонецЕсли; СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + НСтр("ru = 'Ошибки в процессе выгрузки каталога '") + Каталог.Каталог + ":" + Каталог.СтруктураРезультата.ОписаниеОшибки + Символы.ПС; КонецЦикла; КонецПроцедуры Процедура ЗаписатьАтрибут(ОбъектЗаписи, ОписаниеОшибки, ИмяАтрибута, ЗначениеАтрибута) СтрокаЗаписи = ПолучитьСтрокуЗаписиДляXML(ЗначениеАтрибута, ИмяАтрибута, ОписаниеОшибки); ОбъектЗаписи.ЗаписатьАтрибут(ИмяАтрибута, СтрокаЗаписи); КонецПроцедуры Функция ПолучитьПутьТомаДляПлатформы(ПлатформаWindows, Том) Если ПлатформаWindows Тогда Возврат Том.ПолныйПутьWindows Иначе Возврат Том.ПолныйПутьLinux КонецЕсли; КонецФункции Функция ПолучитьТаблицуКаталогов(Параметры) ТаблицаКаталогов = Параметры.СохраненнаяТаблицаКаталогов.Получить(); Для Каждого ДанныеКаталога Из ТаблицаКаталогов Цикл МассивУдалить = Новый Массив; Для Каждого Группа Из ДанныеКаталога.Группы Цикл Если НЕ ЗначениеЗаполнено(Группа.Значение) Тогда МассивУдалить.Добавить(Группа); КонецЕсли; КонецЦикла; Для Каждого УдалитьЭлемент Из МассивУдалить Цикл ДанныеКаталога.Группы.Удалить(УдалитьЭлемент); КонецЦикла; КонецЦикла; ТаблицаКаталогов.Колонки.Добавить("СтруктураРезультата"); Возврат ТаблицаКаталогов; КонецФункции Процедура НачатьXML(ЗаписьXML, Параметры); ЗаписьXML.ЗаписатьНачалоЭлемента("КоммерческаяИнформация"); ЗаписьXML.ЗаписатьАтрибут("ВерсияСхемы", "2.05"); ЗаписьXML.ЗаписатьАтрибут("ДатаФормирования", ФорматДатыДляXML(Параметры.ДатаФормирования, Истина, Истина)); КонецПроцедуры Функция ЗавершитьXML(ЗаписьXML) ЗаписьXML.ЗаписатьКонецЭлемента(); Возврат ЗаписьXML.Закрыть(); КонецФункции Функция ЭтоГруппаВерхнегоУровня(Элемент, СписокГрупп) Если ТипЗнч(СписокГрупп) = Тип("СписокЗначений") Тогда Для Каждого Группа Из СписокГрупп Цикл Если Группа.Значение.ПринадлежитЭлементу(Элемент) Тогда Возврат Истина; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Ложь; КонецФункции Функция ФорматНаименованияДляXML(Наименование) Возврат Лев(Наименование, 250); КонецФункции Функция ПолучитьВариантыЗначенийСвойстваПоТипу(Выборка, Тип) ВариантыЗначений = Новый Массив; ВыборкаЗначений = Выборка.Выбрать(); Пока ВыборкаЗначений.Следующий() Цикл Если ТипЗнч(ВыборкаЗначений.Значение) = Тип Тогда ВариантыЗначений.Добавить(ВыборкаЗначений.Значение); КонецЕсли; КонецЦикла; Возврат ВариантыЗначений; КонецФункции Процедура ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибки, Имя, Значение, ОбязательнаяПроверкаНаПустуюСтроку = Истина) СтрокаЗаписи = ПолучитьСтрокуЗаписиДляXML(Значение, Имя, ОписаниеОшибки); Если ОбязательнаяПроверкаНаПустуюСтроку И НЕ ЗначениеЗаполнено(СтрокаЗаписи) Тогда Возврат; КонецЕсли; ОбъектXML.ЗаписатьНачалоЭлемента(Имя); ОбъектXML.ЗаписатьТекст(СтрокаЗаписи); ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Функция ПолучитьСтрокуЗаписиДляXML(Значение, ИмяЭлемента, ОписаниеОшибки) СтрокаЗаписи = Строка(Значение); Если ТипЗнч(Значение) = Тип("Число") Тогда СтрокаЗаписи = СтрЗаменить(СтрокаЗаписи, Символы.НПП, ""); СтрокаЗаписи = СтрЗаменить(СтрокаЗаписи, ",", "."); ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда Если Значение Тогда СтрокаЗаписи = "true"; Иначе СтрокаЗаписи = "false"; КонецЕсли; КонецЕсли; ПозицияНедопустимогоСимвола = НайтиНедопустимыеСимволыXML(СтрокаЗаписи); Если ПозицияНедопустимогоСимвола > 0 Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Строка XML ""%1"" содержит недопустимый символ ""%2"" в позиции %3. Значение элемента XML ""%4"" не выгружено.'"), СтрокаЗаписи, Сред(СтрокаЗаписи, ПозицияНедопустимогоСимвола, 1), ПозицияНедопустимогоСимвола, ИмяЭлемента)); СтрокаЗаписи = ""; КонецЕсли; Возврат СтрокаЗаписи; КонецФункции Функция ПолучитьСписокПолейПоСтроке(СтрокаПолей) Результат = Новый СписокЗначений; ПоследнийЭлемент = Неопределено; Для Сч = 1 По СтрЧислоСтрок(СтрокаПолей) Цикл Стр = СтрПолучитьСтроку(СтрокаПолей, Сч); Если Лев(Стр, 1) = Символы.Таб Тогда Если ПоследнийЭлемент <> Неопределено Тогда ПоследнийЭлемент.Значение = ПоследнийЭлемент.Значение + Символы.ПС + Сред(Стр, 2); КонецЕсли; Иначе Поз = Найти(Стр, "="); Если Поз <> 0 Тогда ПоследнийЭлемент = Результат.Добавить(Сред(Стр, Поз+1), Лев(Стр, Поз-1)); КонецЕсли; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции Процедура ИзменитьОтборКомпоновщика(КомпоновщикНастроек, СписокГруппКаталога, КлассифицироватьПоВидамНоменклатуры, МассивИзмененийНоменклатуры = НеОпределено) Отбор = КомпоновщикНастроек.Настройки.Отбор; ОтборПоКаталогу = "ПрограммныйОтборПоКаталогу"; ОтборПоИзменениям = "ПрограммныйОтборПоИзменениям"; // Удаляем программные отборы, если были МассивУдалить = Новый Массив; Для Каждого ЭлементОтбора Из Отбор.Элементы Цикл Если ЭлементОтбора.ИдентификаторПользовательскойНастройки = ОтборПоКаталогу ИЛИ ЭлементОтбора.ИдентификаторПользовательскойНастройки = ОтборПоИзменениям Тогда МассивУдалить.Добавить(ЭлементОтбора); КонецЕсли; КонецЦикла; Для Каждого УдалитьЭлемент Из МассивУдалить Цикл Отбор.Элементы.Удалить(УдалитьЭлемент); КонецЦикла; // Добавим отбор по каталогу Если СписокГруппКаталога.Количество() > 0 Тогда НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ИдентификаторПользовательскойНастройки = ОтборПоКаталогу; Если КлассифицироватьПоВидамНоменклатуры Тогда НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.ВидНоменклатуры"); Иначе НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура"); КонецЕсли; НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии; НовыйЭлемент.ПравоеЗначение = СписокГруппКаталога; НовыйЭлемент.Использование = Истина; КонецЕсли; // Отбор по изменениям Если НЕ МассивИзмененийНоменклатуры = НеОпределено Тогда СписокГруппОтбора = Новый СписокЗначений; СписокГруппОтбора.ЗагрузитьЗначения(МассивИзмененийНоменклатуры); НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ИдентификаторПользовательскойНастройки = ОтборПоИзменениям; НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура"); НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии; НовыйЭлемент.ПравоеЗначение = СписокГруппОтбора; НовыйЭлемент.Использование = Истина; КонецЕсли; //Добавил : 11-03-2013 (Для отбора) // Отбор по галке "Выгружать на сайт" НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.ВыгружатьНаСайт"); НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; НовыйЭлемент.ПравоеЗначение = Истина; НовыйЭлемент.Использование = Истина; //********************************** КонецПроцедуры Функция ПолучитьОбъектДляЗаписиXML(ИмяФайла) ЗаписьXML = Новый ЗаписьXML; Если ПустаяСтрока(ИмяФайла) Тогда ЗаписьXML.УстановитьСтроку("UTF-8"); Иначе ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8"); КонецЕсли; ЗаписьXML.ЗаписатьОбъявлениеXML(); Возврат ЗаписьXML; КонецФункции Функция ПолучитьКомпоновщикНастроекВыгрузкиТоваров(ХранилищеНастроекВыгрузки) СхемаВыгрузкиТоваров = ПланыОбмена.ОбменУправлениеТорговлейСайт.ПолучитьМакет("СхемаВыгрузкиТоваров"); КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаВыгрузкиТоваров)); НастройкиКомпоновщикаИзНастройкиОбмена = ХранилищеНастроекВыгрузки.Получить(); Если ЗначениеЗаполнено(НастройкиКомпоновщикаИзНастройкиОбмена) Тогда КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновщикаИзНастройкиОбмена); КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность); Иначе КомпоновщикНастроек.ЗагрузитьНастройки(СхемаВыгрузкиТоваров.НастройкиПоУмолчанию); КонецЕсли; Возврат КомпоновщикНастроек; КонецФункции Процедура ПолучитьЗапросДляВыгрузкиТоваров(КомпоновщикНастроек, Запрос) СхемаВыгрузкиТоваров = ПланыОбмена.ОбменУправлениеТорговлейСайт.ПолучитьМакет("СхемаВыгрузкиТоваров"); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаВыгрузкиТоваров, КомпоновщикНастроек.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); Запрос.Текст = МакетКомпоновкиДанных.НаборыДанных.ОсновнойНаборДанных.Запрос; Для каждого Параметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл Запрос.Параметры.Вставить(Параметр.Имя, Параметр.Значение); КонецЦикла; КонецПроцедуры Функция КаталогОчищен(Каталог, ОписаниеОшибки) Попытка УдалитьФайлы(Каталог, "*.*"); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось очистить каталог обмена: ") + " (" + Каталог + ")")); Возврат Ложь; КонецПопытки; Возврат Истина; КонецФункции Функция ОписаниеИсключительнойОшибки(ТекстНачалаСообщения = "", ТекстОкончанияСообщения = "") ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстСообщения = ""; Если НЕ ПустаяСтрока(ТекстНачалаСообщения) Тогда ТекстСообщения = ТекстНачалаСообщения + Символы.ПС; КонецЕсли; ТекстСообщения = ТекстСообщения + НСтр("ru = 'Произошла ошибка: '") + ПодробноеПредставлениеОшибки; Если НЕ ПустаяСтрока(ТекстОкончанияСообщения) Тогда ТекстСообщения = ТекстСообщения + Символы.ПС + ТекстОкончанияСообщения; КонецЕсли; Возврат ТекстСообщения; КонецФункции Функция ПолучитьВсеИзмененияИзПланаОбмена(УзелОбмена) СтруктураВозврата = Новый Структура; ЗаполнитьСтруктуруИзмененийДляУзла(УзелОбмена.Ссылка, СтруктураВозврата); Возврат СтруктураВозврата; КонецФункции Функция АдресСайтаРазобран(Знач АдресСайта, НастройкиПодключения, ОписаниеОшибки) АдресСайта = СокрЛП(АдресСайта); Сервер = ""; Порт = 0; АдресСкрипта = ""; ЗащищенноеСоединение = Ложь; Если НЕ ПустаяСтрока(АдресСайта) Тогда АдресСайта = СтрЗаменить(АдресСайта, "\", "/"); АдресСайта = СтрЗаменить(АдресСайта, " ", ""); Если НРег(Лев(АдресСайта, 7)) = "http://" Тогда АдресСайта = Сред(АдресСайта, 8); ИначеЕсли НРег(Лев(АдресСайта, 8)) = "https://" Тогда АдресСайта = Сред(АдресСайта, 9); ЗащищенноеСоединение = Истина; КонецЕсли; ПозицияСлэша = Найти(АдресСайта, "/"); Если ПозицияСлэша > 0 Тогда Сервер = Лев(АдресСайта, ПозицияСлэша - 1); АдресСкрипта = Прав(АдресСайта, СтрДлина(АдресСайта) - ПозицияСлэша); Иначе Сервер = АдресСайта; АдресСкрипта = ""; КонецЕсли; ПозицияДвоеточия = Найти(Сервер, ":"); ПортСтрока = "0"; Если ПозицияДвоеточия > 0 Тогда СерверСПортом = Сервер; Сервер = Лев(СерверСПортом, ПозицияДвоеточия - 1); ПортСтрока = Прав(СерверСПортом, СтрДлина(СерверСПортом) - ПозицияДвоеточия); КонецЕсли; Попытка Порт = Число(ПортСтрока); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось получить номер порта: '") + ПортСтрока + Символы.ПС + НСтр("ru = 'Проверьте правильность ввода адреса сайта.'"))); Возврат Ложь; КонецПопытки; Если Порт = 0 Тогда Порт = ?(ЗащищенноеСоединение, 443, 80); КонецЕсли; КонецЕсли; НастройкиПодключения.Вставить("Сервер", Сервер); НастройкиПодключения.Вставить("Порт", Порт); НастройкиПодключения.Вставить("АдресСкрипта", АдресСкрипта); НастройкиПодключения.Вставить("ЗащищенноеСоединение", ЗащищенноеСоединение); Возврат Истина; КонецФункции Функция ПолучитьНастройкиПодключения(УзелОбмена, НастройкиПодключения, ОписаниеОшибки) НастройкиПодключения.Вставить("Пользователь", УзелОбмена.ИмяПользователя); НастройкиПодключения.Вставить("Пароль", УзелОбмена.Пароль); ОписаниеОшибки = ""; Если НЕ АдресСайтаРазобран(УзелОбмена.АдресСайта, НастройкиПодключения, ОписаниеОшибки) Тогда Возврат Ложь; КонецЕсли; НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); Если НастройкаПроксиСервера <> Неопределено И НастройкаПроксиСервера["ИспользоватьПрокси"] = Ложь Тогда НастройкаПроксиСервера = Неопределено; КонецЕсли; Протокол = ?(НастройкиПодключения.ЗащищенноеСоединение, "https", "http"); Прокси = ?(НастройкаПроксиСервера = Неопределено, Неопределено, ОбменССайтомПовтИсп.ПолучитьПрокси(Прокси, Протокол)); НастройкиПодключения.Вставить("Прокси", Прокси); Возврат Истина; КонецФункции Процедура ВыполнитьДействияПриЗавершенииОбмена(Параметры, ТаблицаИнформации, Ошибка = Ложь) ТаблицаИнформации.ЗаполнитьЗначения(Параметры.УзелОбмена, "УзелИнформационнойБазы"); // Записываем информацию по каждому действию в журнал регистрации Для Каждого СтрокаТаблицыИнформации Из ТаблицаИнформации Цикл СобытиеЖурнала = ОбменДаннымиСервер.ПолучитьКлючСообщенияЖурналаРегистрации(Параметры.УзелОбмена, СтрокаТаблицыИнформации.ДействиеПриОбмене); Если СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено Тогда УровеньЖурнала = УровеньЖурналаРегистрации.Информация; Иначе УровеньЖурнала = УровеньЖурналаРегистрации.Ошибка; КонецЕсли; Если Ошибка Тогда УровеньЖурнала = УровеньЖурналаРегистрации.Ошибка; КонецЕсли; ЗаписьЖурналаРегистрации(СобытиеЖурнала, УровеньЖурнала, Параметры.УзелОбмена.Метаданные(), Параметры.УзелОбмена, Параметры.РежимЗапускаОбмена + Символы.ПС + СтрокаТаблицыИнформации.Описание); КонецЦикла; // Объединяем 2 строки информации по выгрузке (товары и заказы) в одну (ВыгрузкаДанных), СтрокиВыгрузки = ТаблицаИнформации.НайтиСтроки(Новый Структура("ДействиеПриОбмене", Перечисления.ДействияПриОбмене.ВыгрузкаДанных)); Если СтрокиВыгрузки.Количество() = 2 Тогда Если СтрокиВыгрузки[1].РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка Тогда СтрокиВыгрузки[0].РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка; КонецЕсли; ТаблицаИнформации.Удалить(СтрокиВыгрузки[1]); КонецЕсли; // Записываем состояния обмена Для Каждого СтрокаТаблицыИнформации Из ТаблицаИнформации Цикл ЗаписьСостояния = РегистрыСведений.СостоянияОбменовДанными.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(ЗаписьСостояния, СтрокаТаблицыИнформации); // Даты записываем по границам сеанса, чтобы работал отбор журнала ЗаписьСостояния.ДатаНачала = Параметры.ДатаФормирования; ЗаписьСостояния.ДатаОкончания = ТекущаяДата(); ЗаписьСостояния.Записать(); Если ЗначениеЗаполнено(ЗаписьСостояния.ДействиеПриОбмене) И (ЗаписьСостояния.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Выполнено ИЛИ ЗаписьСостояния.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями) Тогда ЗаписьУспешногоСостояния = РегистрыСведений.СостоянияУспешныхОбменовДанными.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(ЗаписьУспешногоСостояния, ЗаписьСостояния); ЗаписьУспешногоСостояния.Записать(); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура УдалитьРегистрациюИзменений(УзелОбмена, СтруктураИзменений, ОбменТоварами, ОбменЗаказами) Если ОбменТоварами Тогда Для Каждого Данные Из СтруктураИзменений.Товары Цикл ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Данные); КонецЦикла; Для Каждого Данные Из СтруктураИзменений.Файлы Цикл ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Данные); КонецЦикла; КонецЕсли; Если ОбменЗаказами Тогда Для Каждого Данные Из СтруктураИзменений.Заказы Цикл ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Данные); КонецЦикла; КонецЕсли; КонецПроцедуры Функция ПолучитьТекстHTMLИзФайла(ФайлСсылка) Если НЕ ЗначениеЗаполнено(ФайлСсылка) Тогда Возврат ""; КонецЕсли; СтруктураДанныхФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ФайлСсылка); ДвоичныеДанныеСсылкаВХ = СтруктураДанныхФайла.СсылкаНаДвоичныеДанныеФайла; Если ДвоичныеДанныеСсылкаВХ = НеОпределено Тогда Возврат ""; КонецЕсли; ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ДвоичныеДанныеСсылкаВХ); ИмяВремФайла = ПолучитьИмяВременногоФайла(); ТекстФайла = Новый ТекстовыйДокумент; ДвоичныеДанныеФайла.Записать(ИмяВремФайла); ТекстФайла.Прочитать(ИмяВремФайла); Возврат ТекстФайла.ПолучитьТекст(); КонецФункции Процедура ОчиститьКонтактнуюИнформациюКонтрагентаПартнера(Объект, Знач СтруктураПоиска) Найдено = Объект.КонтактнаяИнформация.НайтиСтроки(СтруктураПоиска); Для Каждого СтрокаНайдено Из Найдено Цикл Объект.КонтактнаяИнформация.Удалить(СтрокаНайдено); КонецЦикла; КонецПроцедуры Функция ПолучитьНовогоПартнера(НаименованиеПартнера, НаименованиеПартнераПолное, Параметры) ПартнерОбъект = Справочники.Партнеры.СоздатьЭлемент(); ПартнерОбъект.Клиент = Истина; ПартнерОбъект.ДатаРегистрации = ТекущаяДата(); ПартнерОбъект.Комментарий = НСтр("ru = 'Создан автоматически при импорте заказов с сайта'"); ПартнерОбъект.Наименование = НаименованиеПартнера; ПартнерОбъект.НаименованиеПолное = НаименованиеПартнераПолное; ПартнерОбъект.ОсновнойМенеджер = Параметры.Менеджер; СсылкаНового = Справочники.Партнеры.ПолучитьСсылку(); ПартнерОбъект.УстановитьСсылкуНового(СсылкаНового); Возврат ПартнерОбъект; КонецФункции //Добавил : 25-05-2013 Процедура _ВыгрузитьХарактеристики(ОбъектXML, ОписаниеОшибокXML, Номенклатура) Запрос = Новый Запрос(); Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата())); Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("продажная")); Запрос.УстановитьПараметр("Номенклатура", Номенклатура); Если НЕ Номенклатура.ВидНоменклатуры.ИспользоватьХарактеристики Тогда Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(СвободныеОстатки.ВНаличии, 0) КАК Остаток, | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена, | ЕСТЬNULL(СвободныеОстатки.Склад, ""Отсутствует"") КАК Склад |ИЗ | Справочник.Номенклатура КАК Товар | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних | ПО Товар.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки КАК СвободныеОстатки | ПО Товар.Ссылка = СвободныеОстатки.Номенклатура |ГДЕ | Товар.Ссылка = &Номенклатура"; ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Характеристика", "Без характеристики", Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Цена", Результат.Цена, Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Остаток", Результат.Остаток, Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Склад", Результат.Склад, Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; Иначе Запрос.Текст = "ВЫБРАТЬ | ХарактеристикиНоменклатуры.Ссылка КАК Характеристика, | ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена, | ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК Остаток, | ЕСТЬNULL(СвободныеОстаткиОстатки.Склад, ""Отсутствует"") КАК Склад |ИЗ | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ТекущаяДата, ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры | ПО ХарактеристикиНоменклатуры.Владелец = ЦеныНоменклатуры.Номенклатура | И ХарактеристикиНоменклатуры.Ссылка = ЦеныНоменклатуры.Характеристика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&ТекущаяДата, ) КАК СвободныеОстаткиОстатки | ПО ХарактеристикиНоменклатуры.Владелец = СвободныеОстаткиОстатки.Номенклатура | И ХарактеристикиНоменклатуры.Ссылка = СвободныеОстаткиОстатки.Характеристика |ГДЕ | ХарактеристикиНоменклатуры.Владелец = &Номенклатура"; ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", Результат.Характеристика, Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Строка(Результат.Цена) + "; " + Строка(Результат.Остаток) + "; " + Строка(Результат.Склад), Ложь); // ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Остаток", , Ложь); //ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Склад", , Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры // 26-10-2013 Процедура СоздатьСписокНоменклатуры(Параметры) // Получу список выгружаемой номенклатуры Запрос = Новый Запрос( "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ВыгружатьНаСайт"); СписокВыгружаемойНоменклатуры = Запрос.Выполнить().Выгрузить(); // Получу характеристики и остатки для выгружаемого товара Запрос.Текст = "ВЫБРАТЬ | ХарактеристикиНоменклатуры.Владелец КАК Номенклатура, | ХарактеристикиНоменклатуры.Ссылка КАК Характеристика, | ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена, | ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК Остаток, | ЕСТЬNULL(СвободныеОстаткиОстатки.Склад, ""Отсутствует"") КАК Склад |ИЗ | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ТекущаяДата, ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры | ПО ХарактеристикиНоменклатуры.Владелец = ЦеныНоменклатуры.Номенклатура | И ХарактеристикиНоменклатуры.Ссылка = ЦеныНоменклатуры.Характеристика | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&ТекущаяДата, ) КАК СвободныеОстаткиОстатки | ПО ХарактеристикиНоменклатуры.Владелец = СвободныеОстаткиОстатки.Номенклатура | И ХарактеристикиНоменклатуры.Ссылка = СвободныеОстаткиОстатки.Характеристика |ГДЕ | ХарактеристикиНоменклатуры.Владелец В(&СписокНоменклатура)"; Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата())); Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("продажная")); Запрос.УстановитьПараметр("СписокНоменклатура", СписокВыгружаемойНоменклатуры); Параметры.СписокНоменклатуры = Запрос.Выполнить().Выгрузить(); КонецПроцедуры Процедура ВыгрузитьХарактеристики(ОбъектXML, ОписаниеОшибокXML, Параметры) ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикиТовара"); Номенклатура = Параметры.ВыборкаНоменклатуры.Номенклатура; Запрос = Новый Запрос(); Запрос.УстановитьПараметр("ТекущаяДата", КонецДня(ТекущаяДата())); Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("продажная")); Запрос.УстановитьПараметр("Номенклатура", Номенклатура); Если НЕ Номенклатура.ВидНоменклатуры.ИспользоватьХарактеристики Тогда Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(СвободныеОстатки.ВНаличии, 0) КАК Остаток, | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена, | ЕСТЬNULL(СвободныеОстатки.Склад, ""Отсутствует"") КАК Склад |ИЗ | Справочник.Номенклатура КАК Товар | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних | ПО Товар.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки КАК СвободныеОстатки | ПО Товар.Ссылка = СвободныеОстатки.Номенклатура |ГДЕ | Товар.Ссылка = &Номенклатура"; Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл // Добавил : 17-04-2017 (для выгрузки характеристики в отдельное поле) ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Size"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", 0); ОбъектXML.ЗаписатьКонецЭлемента(); // ******************************************************************************* ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Характеристика", "Без характеристики", Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Цена", Формат(Результат.Цена, "ЧГ="), Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Остаток", Результат.Остаток, Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Склад", Результат.Склад, Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; Иначе Отбор = Новый Структура("Номенклатура", Номенклатура); НайденныеСтроки = Параметры.СписокНоменклатуры.НайтиСтроки(Отбор); Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл // Добавил : 17-04-2017 (для выгрузки характеристики в отдельное поле) ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", "Size"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", СтрокаТЧ.Характеристика, Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); // ******************************************************************************* ОбъектXML.ЗаписатьНачалоЭлемента("ХарактеристикаТовара"); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Значение", СтрокаТЧ.Характеристика, Ложь); ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Наименование", Формат(СтрокаТЧ.Цена, "ЧГ=") + "; " + Строка(СтрокаТЧ.Остаток) + "; " + Строка(СтрокаТЧ.Склад), Ложь); // ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Остаток", , Ложь); //ЗаписатьТекстовыйУзел(ОбъектXML, ОписаниеОшибокXML, "Склад", , Ложь); ОбъектXML.ЗаписатьКонецЭлемента(); КонецЦикла; КонецЕсли; ОбъектXML.ЗаписатьКонецЭлемента(); КонецПроцедуры //**********************************