//////////////////////////////////////////////////////////////////////////////// // ОбменССайтом - формирование, отправка на сайт, чтение файлов xml формата CommerceML 2. // //////////////////////////////////////////////////////////////////////////////// // ╒══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╕ // ВНИМАНИЕ: изменения в пакете XDTO CML208 !!! // В типах объектов добавлен тип У1С_СсылкаНаТовар со свойство ИдТовара типа ИдентификаторГлобальныйТип (urn:1C.ru:commerceml_2) // В типах объектов в дереве добавлены свойства: // ПакетПредложений // У1С_НовоеПоступление типа У1С_СсылкаНаТовар (urn:1C.ru:commerceml_2) - добавлен // Предложения // Определение типа // Предложение // Определение типа // У1С_Сопутствующие типа У1С_СсылкаНаТовар (urn:1C.ru:commerceml_2) - добавлен // Товар // Картинка // Определение типа // Порядок - добавлен // Цена // У1С_СтараяЦенаЗаЕдиницу типа СуммаТип (urn:1C.ru:commerceml_2) - добавлен // ╘══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╛ #Область ПрограммныйИнтерфейс // Возвращает результат тестового подключения к сайту. // // Параметры: // НастройкиПодключения - структура - Адрес сайта, пользователь и пароль // ТекстСообщения - строка - текстовое сообщение об ошибках // Возвращаемое значение: // Успешно - булево - результат подключения к сайту. // Функция ВыполнитьТестовоеПодключениеКСайту(НастройкиПодключения, ТекстСообщения) Экспорт ПараметрыПодключения = Новый Структура("АдресСайта, Пароль, Пользователь"); ЗаполнитьЗначенияСвойств(ПараметрыПодключения, НастройкиПодключения); ТипСоединения = "catalog"; ОписаниеОшибки = ""; Если НЕ ПолучитьНастройкиПодключения(ПараметрыПодключения, ОписаниеОшибки) Тогда ТекстСообщения = НСтр("ru = 'Ошибка при получении параметров подключения к сайту.'") + Символы.ПС + ОписаниеОшибки; Возврат Ложь; КонецЕсли; Соединение = СоединениеССервером(ПараметрыПодключения, ОписаниеОшибки); Если Соединение = Неопределено Тогда ТекстСообщения = НСтр("ru = 'Ошибка при установке соединения с сайтом.'") + Символы.ПС + ОписаниеОшибки; Возврат Ложь; КонецЕсли; ОтветСервера = ""; Успешно = ВыполнитьАвторизациюДляСоединения(Соединение, ПараметрыПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения); Если Успешно Тогда ТекстСообщения = НСтр("ru = 'Соединение с сайтом успешно установлено.'"); Иначе ТекстСообщения = НСтр("ru = 'Не удалось установить соединение.'") + Символы.ПС + ОписаниеОшибки; КонецЕсли; Возврат Успешно; КонецФункции // Выполняет запуск обмена с сайтом. // // Параметры: // Параметры - Структура - настройки и данные для обмена. // РезультатОбмена - Структура - результат обмена товарами и заказами. // ТаблицаИнформации - ТаблицаЗначений - таблица, хранящая лог обмена. // Процедура ВыполнитьОбменССайтом(Параметры, РезультатОбмена, ТаблицаИнформации) Экспорт ПлатформаWindows = ПлатформаWindows(); Параметры.Вставить("ПлатформаWindows", ПлатформаWindows); КаталогВыгрузки = Параметры.КаталогВыгрузки; Если Параметры.ВыгружатьНаСайт Тогда КаталогВыгрузки = РаботаСФайламиБЭД.ВременныйКаталог(); Иначе ПоследнийСимвол = Прав(КаталогВыгрузки, 1); Если НЕ ПоследнийСимвол = "\" Тогда КаталогВыгрузки = КаталогВыгрузки + "\"; КонецЕсли; КонецЕсли; ПодкаталогБезопасностиКаталогаВыгрузки = "webdata"; КаталогНаДиске = КаталогВыгрузки + ПодкаталогБезопасностиКаталогаВыгрузки; КаталогНаДиске = ПодготовитьПутьДляПлатформы(ПлатформаWindows, КаталогНаДиске); РезультатОбмена.Вставить("ТоварыВыгружены", Ложь); РезультатОбмена.Вставить("ВыполненОбменЗаказами", Ложь); Параметры.Вставить("КаталогНаДиске", КаталогНаДиске); Каталог = Новый Файл(КаталогНаДиске); Если Не Каталог.Существует() Тогда Попытка СоздатьКаталог(КаталогНаДиске); Исключение СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыОбменаССайтом.Ошибка; СтрокаТаблицыИнформации.Описание = ОписаниеИсключительнойОшибки(); Возврат; КонецПопытки; КонецЕсли; ФайлЗагрузки = Параметры.ФайлЗагрузки; ФайлЗагрузки = ПодготовитьПутьДляПлатформы(ПлатформаWindows, ФайлЗагрузки); Параметры.Вставить("ФайлЗагрузки", ФайлЗагрузки); Параметры.Вставить("ПодкаталогФайлов", "import_files"); Параметры.Вставить("ДатаФормирования", ТекущаяДатаСеанса()); ПолучитьНастройкиПодключения(Параметры.НастройкиПодключения, ""); ДобавитьПараметрыПротоколаОбменаВСтруктуру(Параметры.НастройкиПодключения); СтруктураРезультата = Новый Структура; СтруктураРезультата.Вставить("ВыгруженоТоваров", 0); СтруктураРезультата.Вставить("ВыгруженоКартинок", 0); СтруктураРезультата.Вставить("ВыгруженоПредложений", 0); СтруктураРезультата.Вставить("Ошибка", Ложь); СтруктураРезультата.Вставить("ОписаниеОшибки", ""); Параметры.Вставить("СтруктураРезультата", СтруктураРезультата); Если Параметры.ОбменТоварами Тогда ТаблицаКаталогов = ПодготовитьТаблицуКаталогов(Параметры.УзелОбмена); Иначе ТаблицаКаталогов = Новый ТаблицаЗначений; КонецЕсли; ИндексФайлаОбмена = 0; ИндексФайлаОбменаСтрокой = "0"; Успешно = Истина; Для Каждого СтрокаТаблицы Из ТаблицаКаталогов Цикл Если ИндексФайлаОбмена > 0 Тогда ИндексФайлаОбменаСтрокой = Формат(ИндексФайлаОбмена, "ЧГ="); КонецЕсли; ИндексФайлаОбмена = ИндексФайлаОбмена + 1; Параметры.Вставить("ИндексФайлаОбмена", ИндексФайлаОбменаСтрокой); //+Филиппенко В.Б. Добавил структуру для контроля выгружаемых картинок ВыгруженныеКартинки = Новый ТаблицаЗначений; ВыгруженныеКартинки.Колонки.Добавить("УИД"); ВыгруженныеКартинки.Колонки.Добавить("ИмяФайла"); ВыгруженныеКартинки.Колонки.Добавить("ДатаИзменения"); ВыгруженныеКартинки.Колонки.Добавить("ПолноеИмяФайла"); ВыгруженныеКартинки.Колонки.Добавить("Удалить"); ВыгруженныеКартинки.Колонки.Добавить("Сортировка"); ВыгруженныеКартинки.Колонки.Добавить("ЭтоФайл"); ВыгруженныеКартинки.Колонки.Добавить("Выгружен"); Параметры.Вставить("ВыгруженныеКартинки", ВыгруженныеКартинки); //-Филиппенко В.Б. // Выгружаем каталог и пакет предложений. Если Параметры.ВыгружатьТовары И Параметры.ВыгружатьЦеныОстатки Тогда Успешно = ВыгрузитьКаталог(Параметры, СтрокаТаблицы, ТаблицаИнформации, Истина); Успешно = ВыгрузитьПакетПредложений(Параметры, СтрокаТаблицы, ТаблицаИнформации, Истина); // Выгружаем пакет предложений. ИначеЕсли Параметры.ВыгружатьТовары И Не Параметры.ВыгружатьЦеныОстатки Тогда Успешно = ВыгрузитьКаталог(Параметры, СтрокаТаблицы, ТаблицаИнформации); ИначеЕсли Параметры.ВыгружатьЦеныОстатки И Не Параметры.ВыгружатьТовары Тогда Успешно = ВыгрузитьПакетПредложений(Параметры, СтрокаТаблицы, ТаблицаИнформации); КонецЕсли; // Выгружаем обновление пакета предложений. Если Параметры.ВыгружатьОбновленияЦенИОстатков Тогда Успешно = ВыгрузитьОстаткиИЦены(Параметры, СтрокаТаблицы, ТаблицаИнформации); КонецЕсли; КонецЦикла; РезультатОбмена.ТоварыВыгружены = Успешно; ВыполненОбменЗаказами = ВыполнитьОбменЗаказами(Параметры, ТаблицаИнформации); РезультатОбмена.ВыполненОбменЗаказами = ВыполненОбменЗаказами; // Если выгружали напрямую на сайт, нужно удалить временный каталог. Если Параметры.ВыгружатьНаСайт Тогда Попытка УдалитьФайлы(КаталогВыгрузки); Исключение СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Перечисления.РезультатыОбменаССайтом.Ошибка; СтрокаТаблицыИнформации.Описание = ОписаниеИсключительнойОшибки(); Возврат; КонецПопытки; КонецЕсли; КонецПроцедуры #Область ДляВызоваИзДругихПодсистем // ЭлектронноеВзаимодействие // См. ЭлектронноеВзаимодействие.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт #Область Монопольно #Область Версия_1_3_6 #Область РегистрыСведений_СостоянияОбменовССайтом_ЗаполнитьСостоянияОбменовССайтами Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.3.6.34"; Обработчик.РежимВыполнения = "Монопольно"; Обработчик.Процедура = "РегистрыСведений.СостоянияОбменовССайтом.ЗаполнитьСостоянияОбменовССайтами"; Обработчик.ЧитаемыеОбъекты = ""; Обработчик.ИзменяемыеОбъекты = ""; Обработчик.Комментарий = НСтр("ru = ''"); #КонецОбласти #КонецОбласти #Область Версия_1_3_7 #Область ПланыОбмена_ОбменССайтом_ЗаполнитьРеквизитыНастройкиОбмена Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.3.7.5"; Обработчик.РежимВыполнения = "Монопольно"; Обработчик.Процедура = "ПланыОбмена.ОбменССайтом.ЗаполнитьРеквизитыНастройкиОбмена"; Обработчик.ЧитаемыеОбъекты = ""; Обработчик.ИзменяемыеОбъекты = ""; Обработчик.Комментарий = НСтр("ru = 'Обмен с сайтом: Заполнение настроек обмена с сайтом.'"); #КонецОбласти #Область ПланыОбмена_ОбменССайтом_ПеренестиПарольВБезопасноеХранилище Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.3.7.5"; Обработчик.РежимВыполнения = "Монопольно"; Обработчик.Процедура = "ПланыОбмена.ОбменССайтом.ПеренестиПарольВБезопасноеХранилище"; Обработчик.ЧитаемыеОбъекты = ""; Обработчик.ИзменяемыеОбъекты = ""; Обработчик.Комментарий = НСтр("ru = 'Обмен с сайтом: Перенос пароля в безопасное хранилище.'"); #КонецОбласти #КонецОбласти #КонецОбласти КонецПроцедуры // Конец ЭлектронноеВзаимодействие #КонецОбласти #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс Процедура ДобавитьПоляОтбораВСхему(ПоляОтбора, СхемаВыгрузкиДанных) Экспорт ВычисляемыеПоля = СхемаВыгрузкиДанных.ВычисляемыеПоля; Отбор = СхемаВыгрузкиДанных.НастройкиПоУмолчанию.Отбор.Элементы; Для Каждого ПоляНабора Из ПоляОтбора Цикл Для Каждого ДанныеПоля Из ПоляНабора.Значение Цикл Если Не ВычисляемыеПоля.Найти(ДанныеПоля.Наименование) = Неопределено Тогда Продолжить; КонецЕсли; НовоеПоле = ВычисляемыеПоля.Добавить(); НовоеПоле.Заголовок = ДанныеПоля.Синоним; НовоеПоле.ПутьКДанным = ДанныеПоля.Наименование; НовоеПоле.ТипЗначения = ДанныеПоля.ТипЗначения; Если ЗначениеЗаполнено(ДанныеПоля.Отбор) Тогда ЗаполнитьПараметрыРедактирования(НовоеПоле, ДанныеПоля.Отбор); КонецЕсли; Отбор = СхемаВыгрузкиДанных.НастройкиПоУмолчанию.Отбор.Элементы; НовоеПоле = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовоеПоле.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ДанныеПоля.Наименование); НовоеПоле.ИдентификаторПользовательскойНастройки = ДанныеПоля.Синоним; НовоеПоле.Использование = Ложь; КонецЦикла; КонецЦикла; КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции #Область ВыгрузкаНоменклатуры // Выгружает на сайт файлы каталога и пакета предложений. // // Параметры: // Параметры - Структура, все параметры обмена. // СтрокаТаблицыИнформации - Строка таблицы значений, в которую пишется лог обмена. // ТипСоединения - Строка или неопределено , "catalog" - для выгрузки товаров, "sale" - для обмена заказами. // Возвращаемое значение: // Успешно - Булево, признак успешной отправки данных на сайт. // Свидетельствует о том, что с сайта получен положительный сигнал о загрузке данных. Функция ВыгрузитьДанныеНаСайт(Параметры, СтрокаТаблицыИнформации, ТипСоединения = Неопределено) МассивПодкаталогов = Новый Массив; Если Параметры.ВыгружатьКартинки Тогда МассивПодкаталогов.Добавить(Параметры.ПодкаталогФайлов); КонецЕсли; ОписаниеОшибки = ""; Если ТипСоединения = Неопределено Тогда ТипСоединения = "catalog"; КонецЕсли; ОжидатьЗавершенияИмпортаФайловСервером = Не Параметры.ВыгружатьФайлыБезОжиданияПодтвержденияИмпортаСервером; Успешно = ВыгрузитьНаСайт(Параметры, МассивПодкаталогов, ОписаниеОшибки, ОжидатьЗавершенияИмпортаФайловСервером, ТипСоединения); Если Успешно Тогда СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ТекущаяДатаСеанса()+ " " + НСтр("ru = 'Данные успешно выгружены на сайт.'") + ?(ПустаяСтрока(ОписаниеОшибки), "", Символы.ПС + НСтр("ru = 'Дополнительная информация о выгрузке:'") + Символы.ПС + ОписаниеОшибки); Иначе СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ТекущаяДатаСеанса()+ " " + НСтр("ru = 'Выгрузка на сайт завершилась с ошибками.'") + Символы.ПС + ОписаниеОшибки; КонецЕсли; Попытка УдалитьФайлы(Параметры.КаталогНаДиске, "*.*"); Исключение СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось очистить каталог обмена:'") + " " + Параметры.КаталогНаДиске); КонецПопытки; Возврат Успешно; КонецФункции Функция ПакетCML() URIПространстваИмен = ПространствоИменСхемы(); Возврат ФабрикаXDTO.Пакеты.Получить(URIПространстваИмен); КонецФункции Функция ПространствоИменСхемы() Возврат "urn:1C.ru:commerceml_2"; КонецФункции Функция КоммерческаяИнформация(ДатаФормирования) ПакетCML = ПакетCML(); КоммерческаяИнформацияТип = ПакетCML.Получить("КоммерческаяИнформация"); КоммерческаяИнформацияXDTO = ФабрикаXDTO.Создать(КоммерческаяИнформацияТип); КоммерческаяИнформацияXDTO.ВерсияСхемы = ВерсияСхемы(); КоммерческаяИнформацияXDTO.ДатаФормирования = ДатаФормирования; Возврат КоммерческаяИнформацияXDTO; КонецФункции // Возвращает текущую версию формата обмена // Функция ВерсияСхемы() Возврат "2.07"; КонецФункции Процедура ЗарегистрироватьВыгружаемыеДанные(ТаблицаДанных, ИмяКолонки, УзелОбмена) КолонкаТаблицы = ТаблицаДанных.ВыгрузитьКолонку(ИмяКолонки); МассивУникальныхЗначений = Новый Массив; ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивУникальныхЗначений, КолонкаТаблицы, Истина); Для Каждого ЭлементМассива Из МассивУникальныхЗначений Цикл ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, ЭлементМассива); КонецЦикла; // Помечаем зарегистрированную в узле номенклатуру номером сообщения 0. ПланыОбмена.ВыбратьИзменения(УзелОбмена, 0, МассивУникальныхЗначений); КонецПроцедуры Функция ИмяФайлаПрайса(Параметры) ИндексПорции = Параметры.ИндексПорции; ИндексФайлаОбмена = Параметры.ИндексФайлаОбмена; ИмяФайлаПрайса = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\offers" + ИндексФайлаОбмена +"_" + ИндексПорции + ".xml"); Возврат ИмяФайлаПрайса; КонецФункции Процедура ЗаписатьДанныеВФайл(Параметры, КоммерческаяИнформацияXDTO, СтрокаТаблицыИнформации, ФайлЗаписан) СтруктураРезультата = Параметры.СтруктураРезультата; ИмяФайлаПрайса = ИмяФайлаПрайса(Параметры); ФайлЗаписан = Ложь; ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайлаПрайса, "UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); Попытка КоммерческаяИнформацияXDTO.Проверить(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КоммерческаяИнформацияXDTO, "КоммерческаяИнформация"); ЗаписьXML.Закрыть(); Исключение ОписаниеИсключительнойОшибки = ОписаниеИсключительнойОшибки( НСтр("ru = 'Не удалось записать XML-файл изменений предложений на диск:'") + " " + ИмяФайлаПрайса + Символы.ПС + ОписаниеОшибки()); ДобавитьОписаниеОшибки(СтруктураРезультата.ОписаниеОшибки, ОписаниеИсключительнойОшибки); СтруктураРезультата.ВыгруженоКартинок = 0; СтруктураРезультата.ВыгруженоТоваров = 0; ДобавитьОписаниеОшибки(СтрокаТаблицыИнформации.Описание, СтруктураРезультата.ОписаниеОшибки); ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Перечисления.РезультатыОбменаССайтом.Ошибка, "ru = 'Завершена выгрузка обновления пакета'"); Возврат; КонецПопытки; ФайлЗаписан = Истина; КонецПроцедуры Процедура СообщитьОбОшибке(Узел, ТекстОшибки) Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ТекстОшибки; Сообщение.УстановитьДанные(Узел); Сообщение.Сообщить(); КонецПроцедуры Функция ПодготовитьТаблицуКаталогов(УзелОбмена) ТаблицаКаталогов = УзелОбмена.СохраненнаяТаблицаКаталогов.Получить(); Для Каждого ДанныеКаталога Из ТаблицаКаталогов Цикл МассивУдалить = Новый Массив; Для Каждого Группа Из ДанныеКаталога.Группы Цикл Если НЕ ЗначениеЗаполнено(Группа.Значение) Тогда МассивУдалить.Добавить(Группа); КонецЕсли; КонецЦикла; Для Каждого УдалитьЭлемент Из МассивУдалить Цикл ДанныеКаталога.Группы.Удалить(УдалитьЭлемент); КонецЦикла; КонецЦикла; ТаблицаКаталогов.Колонки.Добавить("СтруктураРезультата"); Возврат ТаблицаКаталогов; КонецФункции Процедура ИзменитьОтборКомпоновщика(КомпоновщикНастроек, ПрикладныеПараметры, СписокГруппКаталога = Неопределено, МассивИзмененийНоменклатуры = Неопределено) Отбор = КомпоновщикНастроек.Настройки.Отбор; ОтборПоКаталогу = "ПрограммныйОтборПоКаталогу"; ОтборПоИзменениям = "ПрограммныйОтборПоИзменениям"; // Удаляем программные отборы, если они были установлены. МассивУдалить = Новый Массив; Для Каждого ЭлементОтбора Из Отбор.Элементы Цикл Если ЭлементОтбора.ИдентификаторПользовательскойНастройки = ОтборПоКаталогу ИЛИ ЭлементОтбора.ИдентификаторПользовательскойНастройки = ОтборПоИзменениям Тогда МассивУдалить.Добавить(ЭлементОтбора); КонецЕсли; КонецЦикла; Для Каждого УдалитьЭлемент Из МассивУдалить Цикл Отбор.Элементы.Удалить(УдалитьЭлемент); КонецЦикла; КлассифицироватьПоВиду = Неопределено; ПрикладныеПараметры.Свойство("КлассифицироватьПоВидамНоменклатуры", КлассифицироватьПоВиду); // Добавляем отбор по каталогу. Если СписокГруппКаталога <> Неопределено И СписокГруппКаталога.Количество() > 0 Тогда НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ИдентификаторПользовательскойНастройки = ОтборПоКаталогу; Если КлассифицироватьПоВиду = Истина Тогда НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НоменклатураВидНоменклатуры"); Иначе НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура"); КонецЕсли; НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии; НовыйЭлемент.ПравоеЗначение = СписокГруппКаталога; НовыйЭлемент.Использование = Истина; КонецЕсли; // Добавляем отбор по изменениям. Если МассивИзмененийНоменклатуры <> Неопределено Тогда СписокГруппОтбора = Новый СписокЗначений; СписокГруппОтбора.ЗагрузитьЗначения(МассивИзмененийНоменклатуры); НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ИдентификаторПользовательскойНастройки = ОтборПоИзменениям; НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура"); НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии; НовыйЭлемент.ПравоеЗначение = СписокГруппОтбора; НовыйЭлемент.Использование = Истина; КонецЕсли; КонецПроцедуры Функция ПолучитьКомпоновщикНастроекСхемыКомпоновки(СхемаКомпоновки, ХранилищеНастроекВыгрузки) КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки)); НастройкиКомпоновщикаИзНастройкиОбмена = ХранилищеНастроекВыгрузки.Получить(); Если ЗначениеЗаполнено(НастройкиКомпоновщикаИзНастройкиОбмена) Тогда КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновщикаИзНастройкиОбмена); КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность); Иначе КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию); КонецЕсли; Возврат КомпоновщикНастроек; КонецФункции Процедура ПолучитьДанныеОбновленияПакетаПредложений(ПрикладныеПараметры, КомпоновщикНастроек, ТаблицаОстаткиИЦены, ОписаниеОшибки) СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.АвтоЗаполнениеДоступныхПолей = Ложь; ТекстЗапроса = ""; ОбменССайтомПереопределяемый.ПолучитьТекстЗапросаОбновлениеПакетаПредложений(ТекстЗапроса); Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда ОписаниеОшибки = НСтр("ru = 'Не заполнен текст запроса для получения данных обновления ""Цен и остатков"".'"); Возврат; КонецЕсли; ПараметрыКомпоновки = СхемаКомпоновкиДанных.Параметры; ОбменССайтомПереопределяемый.УстановитьПараметрыЗапросаОбновлениеПакетаПредложений(ПрикладныеПараметры, ПараметрыКомпоновки); НаборДанных.Запрос = ТекстЗапроса; НаборДанных.Имя = "НаборДанных"; НаборДанных.ИсточникДанных = "ИсточникДанных"; Идентификатор = Новый УникальныйИдентификатор; АдресСхемыКомпоновкиДанных1 = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Идентификатор); ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных1); КомпоновщикНастроек1 = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек1.Инициализировать(ИсточникНастроек); Настройки = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки()); КомпоновщикНастроек1.ЗагрузитьНастройки(Настройки.Получить()); ОбменССайтомПереопределяемый.КомпоновщикНастроекСхемыФормированияДанныхПослеЗагрузкиНастроек(КомпоновщикНастроек1, "ОбновлениеПакетаПредложений"); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек1.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), Ложь); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(ТаблицаОстаткиИЦены); ПроцессорВывода.Вывести(ПроцессорКомпоновки); СоздатьНедостающиеКолонкиТаблицыДанных(КомпоновщикНастроек.Настройки, ТаблицаОстаткиИЦены); КонецПроцедуры Процедура ПолучитьДанныеДляВыгрузкиПакетаПредложений(ПрикладныеПараметры,Знач КомпоновщикНастроек, ТаблицаДанныеПакетаПредложений, ОписаниеОшибки, // ╒══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╕ // Потому что в прикладных не хватает параметров Параметры) // ╘══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╛ ТекстыЗапросов = Новый Структура("Цены, Остатки"); ОбменССайтомПереопределяемый.ПолучитьТекстыЗапросовПакетаПредложений(ТекстыЗапросов); ЕстьОшибка = Ложь; Для Каждого КлючЗначение Из ТекстыЗапросов Цикл Если Не ЗначениеЗаполнено(КлючЗначение.Значение) Тогда ОписаниеОшибки = ОписаниеОшибки + НСтр("ru = 'Не заполнен текст запроса для получения данных:'")+ КлючЗначение.Ключ + Символы.ПС; ЕстьОшибка = Истина; КонецЕсли; КонецЦикла; Если ЕстьОшибка Тогда Возврат; КонецЕсли; ПоляИсточниковДанных = Новый Структура; ЗаполнитьПоляИсточниковДанных(ПоляИсточниковДанных, Истина); ТаблицаЦены = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Цены, ПоляИсточниковДанных.Цены, ПрикладныеПараметры, "ПакетПредложений"); ТаблицаЦены.Индексы.Добавить("Номенклатура"); ТаблицаОстатки = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Остатки, ПоляИсточниковДанных.Остатки, ПрикладныеПараметры, "ПакетПредложений"); ТаблицаОстатки.Индексы.Добавить("Номенклатура"); // ╒══════════════ Ушаков С.И. 25 ноября 2017 г. ════════════════╕ // дополним первыми ценами: ЗапросСтарыхЦен = Новый Запрос( "ВЫБРАТЬ | МАКСИМУМ(ЕСТЬNULL(ЦеныНоменклатурыСрезПервых.Цена, 0)) КАК Цена, | ЦеныНоменклатурыСрезПервых.Номенклатура |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПервых( | , | ВидЦены В | (ВЫБРАТЬ | ВидыЦен.Ссылка | ИЗ | Справочник.ВидыЦен КАК ВидыЦен | ГДЕ | ВидыЦен.ИспользоватьПриПродаже) | И Номенклатура В (&Номенклатура) | И Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ЦеныНоменклатурыСрезПервых | |СГРУППИРОВАТЬ ПО | ЦеныНоменклатурыСрезПервых.Номенклатура"); // !+!+!+! Внимание! Считаем первой ценой цену, бывшую на момент последнего появления товара на остатках // то есть, если был товар, потом распродался, потом снова поступил, то вот дата этого последнего поступления // и есть дата "Первой (старой) цены" Но если на дату поступления цены ещё не назначено - берём первую цену ПОСЛЕ поступления. // ничего подобного. ЦеныДо учитывать не будем! Иначе может появиться "скидка" // вместо простого запроса используем хитрючий. ЗапросСтарыхЦен.Текст = // сначала отберём самые свежие выходы остатков в плюс "ВЫБРАТЬ | ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, | МАКСИМУМ(ТоварыНаСкладахОстаткиИОбороты.Период) КАК Период |ПОМЕСТИТЬ ДатыПоступлений |ИЗ | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Запись, , Номенклатура В (&Номенклатура)) КАК ТоварыНаСкладахОстаткиИОбороты |ГДЕ | ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток <= 0 | И ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток > 0 | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстаткиИОбороты.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// // потом отберём самые близкие к поступлениям даты назначения цен, раньшие их. |ВЫБРАТЬ | ДатыПоступлений.Номенклатура, | МАКСИМУМ(ЦеныНоменклатурыДо.Период) КАК Период |ПОМЕСТИТЬ ДатыЦенДо |ИЗ | ДатыПоступлений КАК ДатыПоступлений | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатурыДо | ПО ДатыПоступлений.Номенклатура = ЦеныНоменклатурыДо.Номенклатура // | И ДатыПоступлений.Период >= ЦеныНоменклатурыДо.Период // ВНИМАНИЕ!!! Так как цены назначаются временем 00:00 (почему-то), то считаем раньшими ценами только за предыдущие дни | И НачалоПериода(ДатыПоступлений.Период, день) > ЦеныНоменклатурыДо.Период | И (ЦеныНоменклатурыДо.ВидЦены В | (ВЫБРАТЬ | ВидыЦен.Ссылка | ИЗ | Справочник.ВидыЦен КАК ВидыЦен | ГДЕ | ВидыЦен.ИспользоватьПриПродаже)) | |СГРУППИРОВАТЬ ПО | ДатыПоступлений.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// // потом отберём самые близкие к поступлениям даты назначения цен, позжие их. |ВЫБРАТЬ | ДатыПоступлений.Номенклатура, | МИНИМУМ(ЦеныНоменклатурыПосле.Период) КАК Период |ПОМЕСТИТЬ ДатыЦенПосле |ИЗ | ДатыПоступлений КАК ДатыПоступлений | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатурыПосле | ПО ДатыПоступлений.Номенклатура = ЦеныНоменклатурыПосле.Номенклатура // | И ДатыПоступлений.Период <= ЦеныНоменклатурыПосле.Период // ВНИМАНИЕ!!! Так как цены назначаются временем 00:00 (почему-то), то считаем позжими ценами начиная с нуля этих суток | И НачалоПериода(ДатыПоступлений.Период, день) <= ЦеныНоменклатурыПосле.Период | И (ЦеныНоменклатурыПосле.ВидЦены В | (ВЫБРАТЬ | ВидыЦен.Ссылка | ИЗ | Справочник.ВидыЦен КАК ВидыЦен | ГДЕ | ВидыЦен.ИспользоватьПриПродаже)) | |СГРУППИРОВАТЬ ПО | ДатыПоступлений.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// // в конце концов отберём цены. На всякий случай, если цен будет несколько (разные характеристики, разные продажные виды цен) // свернём их и возьмём максимальную. |ВЫБРАТЬ | ДатыПоступлений.Номенклатура, | МАКСИМУМ(ЦеныНоменклатуры.Цена) КАК Цена |ИЗ | ДатыПоступлений КАК ДатыПоступлений //| ЛЕВОЕ СОЕДИНЕНИЕ ДатыЦенДо КАК ДатыЦенДо //| ПО ДатыПоступлений.Номенклатура = ДатыЦенДо.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ ДатыЦенПосле КАК ДатыЦенПосле | ПО ДатыПоступлений.Номенклатура = ДатыЦенПосле.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры | ПО ДатыПоступлений.Номенклатура = ЦеныНоменклатуры.Номенклатура // | И (ЕСТЬNULL(ДатыЦенДо.Период, ДатыЦенПосле.Период) = ЦеныНоменклатуры.Период) | И (ДатыЦенПосле.Период = ЦеныНоменклатуры.Период) | И (ЦеныНоменклатуры.ВидЦены В | (ВЫБРАТЬ | ВидыЦен.Ссылка | ИЗ | Справочник.ВидыЦен КАК ВидыЦен | ГДЕ | ВидыЦен.ИспользоватьПриПродаже)) | |СГРУППИРОВАТЬ ПО | ДатыПоступлений.Номенклатура"; // !+!+!+! ЗапросСтарыхЦен.УстановитьПараметр("Номенклатура", ТаблицаЦены.ВыгрузитьКолонку("Номенклатура")); ВыборкаЦенСтарых = ЗапросСтарыхЦен.Выполнить().Выбрать(); ТаблицаЦены.Колонки.Добавить("У1С_СтараяЦенаЗаЕдиницу", Новый ОписаниеТипов("Число")); ////// + capitan@mail.ru 2018-08-21 ////Для каждого стртзТаблицаЦены Из ТаблицаЦены Цикл //// мОстатки = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", стртзТаблицаЦены.Номенклатура)); //// Если мОстатки.Количество() = 0 ИЛИ мОстатки[0].ОстатокНаСкладе = 0 Тогда //// стртзТаблицаЦены.У1С_СтараяЦенаЗаЕдиницу = стртзТаблицаЦены.ЦенаЗаЕдиницу; //если не получится поставить 0 //// КонецЕсли; ////КонецЦикла; ////// - capitan@mail.ru 2018-08-21 Пока ВыборкаЦенСтарых.Следующий() Цикл СтрЦен = ТаблицаЦены.НайтиСтроки(Новый Структура("Номенклатура", ВыборкаЦенСтарых.Номенклатура)); Если СтрЦен.Количество()>0 Тогда мОстатки = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", ВыборкаЦенСтарых.Номенклатура)); ОстаткиНаСкладах = 0; Для Каждого Остаток из мОстатки Цикл ОстаткиНаСкладах = Остаток.ОстатокНаСкладе + ОстаткиНаСкладах; КонецЦикла; Если ОстаткиНаСкладах = 0 ИЛИ ПустаяСтрока(ВыборкаЦенСтарых.Номенклатура.Описание) ИЛИ ПустаяСтрока(ВыборкаЦенСтарых.Номенклатура.НаименованиеПолное) ИЛИ ПустаяСтрока(ВыборкаЦенСтарых.Номенклатура.Артикул) ИЛИ СтрЦен[0].ЦенаЗаЕдиницу <= 0 ИЛИ НЕ У1С_Доработки.УНоменклатурыЕстьКартинка(СтрЦен[0].Номенклатура) Тогда // если товар не отобразится в основном разделе сайта - не ставим акцию СтрЦен[0].У1С_СтараяЦенаЗаЕдиницу = СтрЦен[0].ЦенаЗаЕдиницу; Иначе СтрЦен[0].У1С_СтараяЦенаЗаЕдиницу = ВыборкаЦенСтарых.Цена КонецЕсли; КонецЕсли; КонецЦикла; // дополним таблицы агрегированными данными по товарам-наборам, чтобы на сайт выгружались остатки и цены по ним Запрос = Новый Запрос( "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВариантыКомплектацииНоменклатурыТовары.Ссылка.Владелец КАК Владелец, | ВариантыКомплектацииНоменклатурыТовары.Номенклатура КАК Номенклатура, | ВариантыКомплектацииНоменклатурыТовары.Количество КАК Количество, | ВариантыКомплектацииНоменклатурыТовары.Упаковка КАК Упаковка |ИЗ | Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ВариантыКомплектацииНоменклатурыТовары |ГДЕ | ВариантыКомплектацииНоменклатурыТовары.Ссылка.Владелец.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор) | И (ВариантыКомплектацииНоменклатурыТовары.Номенклатура В (&Номенклатура) | ИЛИ ВариантыКомплектацииНоменклатурыТовары.Ссылка.Владелец В (&Номенклатура)) |ИТОГИ ПО | Владелец"); МассивНом = Новый Массив; ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивНом, ТаблицаЦены.ВыгрузитьКолонку("Номенклатура"),Истина); ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивНом, ТаблицаОстатки.ВыгрузитьКолонку("Номенклатура"),Истина); Запрос.УстановитьПараметр("Номенклатура", МассивНом); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл ТекЦена = 0; ТекЦенаСтарая = 0; ТекОстаток = 999999999; // потом начинаем его ограничивать Выб = Выборка.Выбрать(); Пока Выб.Следующий() Цикл Стр = ТаблицаЦены.НайтиСтроки(Новый Структура("Номенклатура", Выб.Номенклатура)); Если Стр.Количество()=0 Тогда // надо заморочиться и искать цену.... // Отб = Новый Структура("Дата,Номенклатура,Характеристика,Упаковка,ВидЦены,Валюта", // ТекущаяДата(), Выб.Номенклатура, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), Выб.Упаковка, ТаблицаЦены[0].ТипЦены.ВидЦен, ТаблицаЦены[0].ТипЦены.Валюта); // ТекЦена = ТекЦена + ПродажиСервер.ПоылучитьЦенуПоОтбору(Отб) * Выб.Количество; ТекЦена = ТекЦена + У1С_Доработки.ЦенаНоменклатуры(Выб.Номенклатура) * Выб.Количество; ЗапросСтарыхЦен.УстановитьПараметр("Номенклатура", Выб.Номенклатура); ВыборкаЦенСтарых = ЗапросСтарыхЦен.Выполнить().Выбрать(); Если ВыборкаЦенСтарых.Следующий() Тогда попытка // ОТЛАДОЧНАЯ!!! ТекЦенаСтарая = ТекЦенаСтарая + ВыборкаЦенСтарых.Цена * Выб.Количество; исключение сообщить("Ошибка!!!!"+Выб.Номенклатура) конецпопытки КонецЕсли Иначе ТекЦена = ТекЦена + Стр[0].ЦенаЗаЕдиницу * Выб.Количество; ТекЦенаСтарая = ТекЦенаСтарая + Стр[0].У1С_СтараяЦенаЗаЕдиницу * Выб.Количество; КонецЕсли; Стр = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Выб.Номенклатура)); Если Стр.Количество()=0 Тогда // надо заморочиться и искать остаток.... ////ТЗОст = РегистрыНакопления.СвободныеОстатки.Остатки(ТекущаяДата(), Новый Структура("Номенклатура", Выб.Номенклатура), "Номенклатура", "ВНаличии"); ////Если ТЗОст.Количество()>0 Тогда //// Ост = ТЗОст[0].ВНаличии; ////Иначе //// Ост = 0; ////КонецЕсли; Ост = У1С_Доработки.ОстатокНоменклатуры(Выб.Номенклатура); ТекОстаток = Мин(ТекОстаток, Цел(Ост / Выб.Количество)); Иначе ОстаткиНаСкладах = 0; //+ Ковальский 2021-08-19 - не из того массива смотрит //Для Каждого Остаток из мОстатки Цикл Для Каждого Остаток из Стр Цикл //- Ковальский 2021-08-19 ОстаткиНаСкладах = Остаток.ОстатокНаСкладе + ОстаткиНаСкладах; КонецЦикла; ТекОстаток = Мин(ТекОстаток, Цел(ОстаткиНаСкладах / Выб.Количество)); КонецЕсли; КонецЦикла; Строки = ТаблицаЦены.НайтиСтроки(Новый Структура("Номенклатура", Выборка.Владелец)); Для каждого Стр Из Строки Цикл Стр.ЦенаЗаЕдиницу = ТекЦена; // ╒══════════════ Ушаков С.И. 18 августа 2018 г. ════════════════╕ Если ТекОстаток = 0 ИЛИ ПустаяСтрока(Стр.Номенклатура.Описание) ИЛИ ПустаяСтрока(Стр.Номенклатура.НаименованиеПолное) ИЛИ ПустаяСтрока(Стр.Номенклатура.Артикул) ИЛИ Стр.ЦенаЗаЕдиницу <= 0 ИЛИ НЕ У1С_Доработки.УНоменклатурыЕстьКартинка(Стр.Номенклатура) Тогда // если товар не отобразится в основном разделе сайта - не ставим акцию Стр.У1С_СтараяЦенаЗаЕдиницу = 0; // для распроданных снимаем признак акционности Иначе Стр.У1С_СтараяЦенаЗаЕдиницу = ТекЦенаСтарая; КонецЕсли; // ╘══════════════ Ушаков С.И. 18 августа 2018 г. ════════════════╛ КонецЦикла; Если Строки.Количество()=0 Тогда // тогда надо добавить... НовСтр = ТаблицаЦены.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр, ТаблицаЦены[0]); НовСтр.Номенклатура = Выборка.Владелец; НовСтр.НоменклатураАртикул = НовСтр.Номенклатура.Артикул; НовСтр.НоменклатураНаименование = НовСтр.Номенклатура.Наименование; НовСтр.НоменклатураПометкаУдаления = НовСтр.Номенклатура.ПометкаУдаления; НовСтр.ЦенаЗаЕдиницу = ТекЦена; КонецЕсли; Строки = ТаблицаОстатки.НайтиСтроки(Новый Структура("Номенклатура", Выборка.Владелец)); Для каждого Стр Из Строки Цикл Стр.ОстатокНаСкладе = ТекОстаток; КонецЦикла; Если Строки.Количество()=0 Тогда // тогда надо добавить... НовСтр = ТаблицаОстатки.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр, ТаблицаОстатки[0]); НовСтр.Номенклатура = Выборка.Владелец; НовСтр.ОстатокНаСкладе = ТекОстаток; КонецЕсли; КонецЦикла; // ╘══════════════ Ушаков С.И. 25 ноября 2017 г. ════════════════╛ // Полученные в результате выполнения СКД таблицы значений поместим в новую СКД, // чтобы можно было применить отбор по количеству на складе. СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных1"; ИсточникДанных.ТипИсточникаДанных = "Local"; ОбъектЦены = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); ОбъектЦены.Имя = "Цены"; ОбъектЦены.ИмяОбъекта = "Цены"; ОбъектЦены.ИсточникДанных = "ИсточникДанных1"; ОбъектОстатки = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); ОбъектОстатки.Имя = "Остатки"; ОбъектОстатки.ИмяОбъекта = "Остатки"; ОбъектОстатки.ИсточникДанных = "ИсточникДанных1"; ВнешниеНаборыДанных = Новый Структура; ВнешниеНаборыДанных.Вставить("Цены", ТаблицаЦены); ВнешниеНаборыДанных.Вставить("Остатки", ТаблицаОстатки); // Очищаем структуру полей и снова заполняем ее из макета, так как для данного запроса поля отбора нам не нужны // (более того, их может и не быть в списке полей таблиц данных - следовательно, обращаться к ним уже не можем). ПоляИсточниковДанных = Новый Структура; ЗаполнитьПоляИсточниковДанных(ПоляИсточниковДанных, Истина, Ложь); // Типизирование также придется повторить. ЗаполнитьТипыПолейНаборовДанных(ПоляИсточниковДанных.Цены, ТаблицаЦены); ЗаполнитьТипыПолейНаборовДанных(ПоляИсточниковДанных.Остатки, ТаблицаОстатки); // ╒══════════════ Ушаков С.И. 14 февраля 2018 г. ════════════════╕ СтрН = ПоляИсточниковДанных.Цены.Найти("ЦЕНАЗАЕДИНИЦУ", "ИмяПоля"); НовСтр = ПоляИсточниковДанных.Цены.Добавить(); НовСтр.ИмяПоля = ВРег("У1С_СтараяЦенаЗаЕдиницу"); НовСтр.ТипЗначенияПоля = СтрН.ТипЗначенияПоля; // ╘══════════════ Ушаков С.И. 14 февраля 2018 г. ════════════════╛ ЗаполнитьПоляСхемыКомпоновки(ПоляИсточниковДанных, СхемаКомпоновкиДанных); СвязиНаборов = СхемаКомпоновкиДанных.СвязиНаборовДанных; НоваяСвязь = СвязиНаборов.Добавить(); НоваяСвязь.НаборДанныхИсточник = "Цены"; НоваяСвязь.НаборДанныхПриемник = "Остатки"; НоваяСвязь.ВыражениеИсточник = "Номенклатура"; НоваяСвязь.ВыражениеПриемник = "Номенклатура"; НоваяСвязь = СвязиНаборов.Добавить(); НоваяСвязь.НаборДанныхИсточник = "Цены"; НоваяСвязь.НаборДанныхПриемник = "Остатки"; НоваяСвязь.ВыражениеИсточник = "Характеристика"; НоваяСвязь.ВыражениеПриемник = "Характеристика"; НоваяСвязь = СвязиНаборов.Добавить(); НоваяСвязь.НаборДанныхИсточник = "Цены"; НоваяСвязь.НаборДанныхПриемник = "Остатки"; НоваяСвязь.ВыражениеИсточник = "ЕдиницаИзмерения"; НоваяСвязь.ВыражениеПриемник = "ЕдиницаИзмерения"; Идентификатор = Новый УникальныйИдентификатор; АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Идентификатор); ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных); КомпоновщикНастроек1 = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек1.Инициализировать(ИсточникНастроек); Настройки = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки()); КомпоновщикНастроек1.ЗагрузитьНастройки(Настройки.Получить()); // ╒══════════════ Ушаков С.И. 14 февраля 2018 г. ════════════════╕ ЭлН = КомпоновщикНастроек1.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); // ЭлН.Заголовок = ЭлН.Использование = Истина; ЭлН.Поле = Новый ПолеКомпоновкиДанных("У1С_СтараяЦенаЗаЕдиницу"); // ╘══════════════ Ушаков С.И. 14 февраля 2018 г. ════════════════╛ ОбщийМассив = ПоляИсточниковДанных.Цены; ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ПоляИсточниковДанных.Остатки, ОбщийМассив); УдалитьПоляДругихНаборовДанных(ОбщийМассив, КомпоновщикНастроек1.Настройки); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек1.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,,); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ТаблицаДанныеПакетаПредложений = Новый ТаблицаЗначений; ПроцессорВывода.УстановитьОбъект(ТаблицаДанныеПакетаПредложений); ПроцессорВывода.Вывести(ПроцессорКомпоновки); ТаблицаДанныеПакетаПредложений.Индексы.Добавить("Номенклатура"); // ╒══════════════ Ушаков С.И. 16 января 2018 г. ════════════════╕ // ВНИМАНИЕ!!! ПРОВЕРКА КОРРЕКТНОСТИ НОМЕНКЛАТУРЫ!!! НеВыгружаемая = Новый Массив; Для каждого СтрНом Из ТаблицаДанныеПакетаПредложений Цикл // Если НЕ ЗначениеЗаполнено(СтрНом.Номенклатура.У1С_ДатаПоследнейВыгрузкиНаСайт) Тогда // проверяем только те, которые ни разу не выгружались на сайт Если ПустаяСтрока(СтрНом.Номенклатура.НаименованиеПолное) ИЛИ ПустаяСтрока(СтрНом.Номенклатура.Описание) // ИЛИ ПустаяСтрока(СтрНом.НоменклатураАртикул) // ИЛИ СтрНом.ОстатокНаСкладе <= 0 // ИЛИ СтрНом.ЦенаЗаЕдиницу <= 0 // при выгрузке предложений картинок в таблице нет // ИЛИ ТаблицаФайлы.НайтиСтроки(Новый Структура("Номенклатура", СтрНом.Номенклатура)) = 0 // поэтому проверяем отдельно ИЛИ НЕ У1С_Доработки.УНоменклатурыЕстьКартинка(СтрНом.Номенклатура) Тогда НеВыгружаемая.Добавить(СтрНом); КонецЕсли; // КонецЕсли; КонецЦикла; Для каждого СтрНом Из НеВыгружаемая Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, СтрНом.Номенклатура); ТаблицаДанныеПакетаПредложений.Удалить(СтрНом); КонецЦикла; // ╘══════════════ Ушаков С.И. 16 января 2018 г. ════════════════╛ КонецПроцедуры Процедура ЗаполнитьПоляСхемыКомпоновки(ПоляИсточниковДанных, СхемаКомпоновкиДанных) ПоляИсточникаЦены = СхемаКомпоновкиДанных.НаборыДанных.Цены.Поля; Для Каждого СтрокаПолеЦены Из ПоляИсточниковДанных.Цены Цикл Поле = ПоляИсточникаЦены.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ЗаполнитьПолеИсточника(Поле, СтрокаПолеЦены); КонецЦикла; ПоляИсточникаОстатки = СхемаКомпоновкиДанных.НаборыДанных.Остатки.Поля; Для Каждого СтрокаПолеОстатка Из ПоляИсточниковДанных.Остатки Цикл Поле = ПоляИсточникаОстатки.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ЗаполнитьПолеИсточника(Поле, СтрокаПолеОстатка); КонецЦикла; КонецПроцедуры Процедура ЗаполнитьПолеИсточника(ПолеПриемник, ДанныеПоляИсточник) ПолеПриемник.Поле = ДанныеПоляИсточник.ИмяПоля; ПолеПриемник.ПутьКДанным = ДанныеПоляИсточник.ИмяПоля; ПолеПриемник.Заголовок = ДанныеПоляИсточник.ИмяПоля; ПолеПриемник.ТипЗначения = ДанныеПоляИсточник.ТипЗначенияПоля; КонецПроцедуры Процедура ПолучитьДанныеДляВыгрузкиКаталога(ПрикладныеПараметры, Знач КомпоновщикНастроек, ТаблицыДляВыгрузкиКаталога, ОписаниеОшибки, // ╒══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╕ // Потому что в прикладных не хватает параметров Параметры) // ╘══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╛ ТекстыЗапросов = Новый Структура("Номенклатура, Свойства, Файлы"); ОбменССайтомПереопределяемый.ПолучитьТекстыЗапросовКаталог(ТекстыЗапросов); ЕстьОшибка = Ложь; Для Каждого КлючЗначение Из ТекстыЗапросов Цикл Если Не ЗначениеЗаполнено(КлючЗначение.Значение) Тогда ОписаниеОшибки = ОписаниеОшибки + НСтр("ru = 'Не заполнен текст запроса для получения данных'") +" "+ КлючЗначение.Ключ; ЕстьОшибка = Истина; КонецЕсли; КонецЦикла; Если ЕстьОшибка Тогда Возврат; КонецЕсли; ПоляИсточниковДанных = Новый Структура; ЗаполнитьПоляИсточниковДанных(ПоляИсточниковДанных); ТаблицаНоменклатуры = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Номенклатура, ПоляИсточниковДанных.Номенклатура, ПрикладныеПараметры, "Каталог"); ТаблицаНоменклатуры.Индексы.Добавить("Номенклатура"); ТаблицаХарактеристики = Неопределено; Если ТекстыЗапросов.Свойство("Характеристики") И ПрикладныеПараметры.ВыгружатьХарактеристикиВКаталогТоваров Тогда ТаблицаХарактеристики = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Характеристики, ПоляИсточниковДанных.Характеристики, ПрикладныеПараметры, "Каталог"); ТаблицаХарактеристики.Индексы.Добавить("Номенклатура"); КонецЕсли; ТаблицаФайлы = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Файлы, ПоляИсточниковДанных.Файлы, ПрикладныеПараметры, "Каталог"); //+Филиппенко В.Б. ТаблицаФайлы.Колонки.Добавить("ДатаИзмененияИзображения"); //-Филиппенко В.Б. ТаблицаФайлы.Индексы.Добавить("Номенклатура"); // ╒══════════════ Ушаков С.И. 28 ноября 2017 г. ════════════════╕ // расширим тип колонки. Чтобы можно было вместо справочника туда структуру подсунуть! или строку. ТаблицаФайлы.Колонки.НоменклатураФайлТом.Имя = "НоменклатураФайлТом_типовая"; ТаблицаФайлы.Колонки.НоменклатураФайл.Имя = "НоменклатураФайл_типовая"; ТаблицаФайлы.Колонки.Добавить("НоменклатураФайлТом"); // не указываем тип ТаблицаФайлы.Колонки.Добавить("НоменклатураФайл"); // не указываем тип //+Филиппенко В.Б. ТаблицаФайлы.Колонки.Добавить("ДанныеДляПоиска"); // не указываем тип //-Филиппенко В.Б. ТаблицаФайлы.Колонки.Добавить("НоменклатураФайл_УникальныйИдентификатор"); // не указываем тип МассивДляУдаленияСтрок = Новый Массив; Для каждого СтрФ Из ТаблицаФайлы Цикл СтрФ.НоменклатураФайлТом = СтрФ.НоменклатураФайлТом_типовая; СтрФ.НоменклатураФайл = СтрФ.НоменклатураФайл_типовая; СтрФ.НоменклатураФайл_УникальныйИдентификатор = СтрФ.НоменклатураФайл.УникальныйИдентификатор(); //+Филиппенко В.Б. Отбор только не выгруженных файлов СтрФ.ДанныеДляПоиска = "ИБ" + СтрФ.НоменклатураФайл.Наименование; УИД = СтрЗаменить(СтрФ.Номенклатура.УникальныйИдентификатор(), "-", ""); УИДКартинки = СтрЗаменить(СтрФ.НоменклатураФайл_УникальныйИдентификатор, "-", ""); ИмяФайла = УИД + "_" + УИДКартинки + "." + СтрФ.НоменклатураФайлРасширение; //ИмяФайла = УдалитьДополнительныеРасширенияФайла(ИмяФайла); ТЧСписокВыгруженныхФайлов = СтрФ.Номенклатура.СписокВыгруженныхФайлов.Выгрузить(); НайденнаяСтрока = ТчСписокВыгруженныхФайлов.Найти(ИмяФайла, "ИмяФайла"); Если Параметры.ВыгружатьИзмененияКартинок Тогда Если НайденнаяСтрока = Неопределено Тогда ВыгружатьФайл = Истина; ИначеЕсли НЕ НайденнаяСтрока.ДатаИзмененияФайла = СтрФ.НоменклатураФайл.ДатаМодификацииУниверсальная Тогда ВыгружатьФайл = Истина; Иначе ВыгружатьФайл = Ложь; КонецЕсли; Иначе ВыгружатьФайл = Истина; КонецЕсли; Если ВыгружатьФайл Тогда МассивДляУдаленияСтрок.Добавить(СтрФ); КонецЕсли; ДобавитьЗначениеВТЗВыгруженныхКартинок(УИД, Параметры.ВыгруженныеКартинки, НРег(Параметры.ПодкаталогФайлов + "/" + Лев(УИД, 2) + "/" + ИмяФайла), ИмяФайла, СтрФ.НоменклатураФайл.ДатаМодификацииУниверсальная,, "ИБ" + СтрФ.НоменклатураФайл.Наименование, ВыгружатьФайл, Истина); КонецЦикла; Для Каждого Файл ИЗ МассивДляУдаленияСтрок Цикл ТаблицаФайлы.Удалить(Файл); КонецЦикла; //-Филиппенко В.Б. Отбор только не выгруженных файлов // вот здесь добавим ещё и то, что в каталогах на диске лежит!!!! // а заодно проверим корректность к выгрузке и удалим лишнее НеВыгружаемая = Новый Массив; КолонкаНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("Номенклатура"); МассивНоменклатуры = Новый Массив; ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивНоменклатуры, КолонкаНоменклатуры,Истина); //ОбщегоНазначения.ЗаполнитьМассивУникальнымиЗначениями(МассивНоменклатуры, КолонкаНоменклатуры) Для каждого Номенклатура Из МассивНоменклатуры Цикл // СтрНом.Номенклатура.КаталогИзображений -- сканируем файлы и записываем в ТаблицаФайлы!!! // ПрикладныеПараметры.РазрешенныеТипыКартинок = "jpg,jpeg,png,bmp,tif,tiff,gif"; //+Филиппенко В.Б. Отбор только не выгруженных файлов Расширения = СтрЗаменить("gif,jpg,jpeg,tif,tiff,bmp,png", ",", Символы.ПС); УИД = СтрЗаменить(Номенклатура.УникальныйИдентификатор(),"-",""); //Если Параметры.ВыгружатьИзмененияКартинок Тогда ТЧСписокВыгруженныхФайлов = Номенклатура.СписокВыгруженныхФайлов.Выгрузить(); Для ц=1 По СтрЧислоСтрок(Расширения) Цикл МаскаФайла = "*."+СтрПолучитьСтроку(Расширения, ц); МассивФайлов = НайтиФайлы(Номенклатура.КаталогИзображений, МаскаФайла); Для Каждого ТекФайл Из МассивФайлов Цикл Если НЕ Найти(ТекФайл.Имя, " ") = 0 Тогда НовоеПолноеИмя = ТекФайл.Путь + СтрЗаменить(ТекФайл.Имя, " ","_"); ПереместитьФайл(ТекФайл.ПолноеИмя, НовоеПолноеИмя); ТекФайл = Новый Файл(НовоеПолноеИмя); КонецЕсли; ИмяФайла = НРег(СтрЗаменить(""+УИД + "_"+ТекФайл.Имя, "-","")); //ИмяФайла = УдалитьДополнительныеРасширенияФайла(ИмяФайла); НайденнаяСтрока = ТчСписокВыгруженныхФайлов.Найти(ИмяФайла, "ИмяФайла"); Если Параметры.ВыгружатьИзмененияКартинок Тогда ДатаИзмененияФайла = ПолучитьДатуИзмененияФайла(ТекФайл.ПолноеИмя); Если НайденнаяСтрока = Неопределено Тогда ВыгружатьФайл = Истина; ИначеЕсли НЕ НайденнаяСтрока.ДатаИзмененияФайла = ДатаИзмененияФайла Тогда ВыгружатьФайл = Истина; Иначе ВыгружатьФайл = Ложь; КонецЕсли; Иначе ВыгружатьФайл = Истина; КонецЕсли; Если ВыгружатьФайл Тогда НовСтр = ТаблицаФайлы.Добавить(); НовСтр.Номенклатура = Номенклатура; //НовСтр.НоменклатураФайлДанныеФайла = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ТекФайл.ПолноеИмя)); НовСтр.НоменклатураФайлРасширение = ?(Лев(ТекФайл.Расширение,1)=".", Сред(ТекФайл.Расширение,2), ТекФайл.Расширение); НовСтр.НоменклатураФайл = ТекФайл.ПолноеИмя; НовСтр.НоменклатураФайлТом = Новый Структура("ПолныйПутьWindows", ТекФайл.Путь); НовСтр.НоменклатураФайлПутьКФайлу = ТекФайл.Имя; // потому что путь выше указали НовСтр.НоменклатураФайлТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; НовСтр.НоменклатураФайл_УникальныйИдентификатор = ТекФайл.ИмяБезРасширения; НовСтр.ДатаИзмененияИзображения = ДатаИзмененияФайла; НовСтр.ДанныеДляПоиска = ИмяФайла; ДобавитьЗначениеВТЗВыгруженныхКартинок(УИД, Параметры.ВыгруженныеКартинки, НРег(Параметры.ПодкаталогФайлов + "/" + Лев(ИмяФайла, 2) + "/" + ИмяФайла), ИмяФайла, ДатаИзмененияФайла, ,ИмяФайла, Истина, Ложь); Если НЕ НайденнаяСтрока = Неопределено Тогда ТЧСписокВыгруженныхФайлов.Удалить(НайденнаяСтрока); КонецЕсли; Иначе ДобавитьЗначениеВТЗВыгруженныхКартинок(УИД, Параметры.ВыгруженныеКартинки, НРег(Параметры.ПодкаталогФайлов + "/" + Лев(ИмяФайла, 2) + "/" + ИмяФайла), ИмяФайла, ДатаИзмененияФайла, ,ИмяФайла); ТЧСписокВыгруженныхФайлов.Удалить(НайденнаяСтрока); КонецЕсли; КонецЦикла; КонецЦикла; Для Каждого УдаленныйФайл ИЗ ТЧСписокВыгруженныхФайлов Цикл ДобавитьЗначениеВТЗВыгруженныхКартинок(УИД, Параметры.ВыгруженныеКартинки, "", УдаленныйФайл.ИмяФайла, ТекущаяДата() ,Истина, УдаленныйФайл.НомерСтроки); КонецЦикла; //-Филиппенко В.Б. Отбор только не выгруженных файлов // ВНИМАНИЕ!!! ПРОВЕРКА КОРРЕКТНОСТИ НОМЕНКЛАТУРЫ!!! // Если НЕ ЗначениеЗаполнено(СтрНом.Номенклатура.У1С_ДатаПоследнейВыгрузкиНаСайт) Тогда // проверяем только те, которые ни разу не выгружались на сайт Если ПустаяСтрока(Номенклатура.Описание) ИЛИ ПустаяСтрока(Номенклатура.НаименованиеПолное) // ИЛИ ПустаяСтрока(СтрНом.НоменклатураАртикул) //+Филиппенко В.Б. Добавил проверку по удаленным из каталога файлам ИЛИ (ТаблицаФайлы.НайтиСтроки(Новый Структура("Номенклатура", Номенклатура)).Количество() = 0 И Параметры.ВыгруженныеКартинки.НайтиСтроки(Новый Структура ("УИД", УИД)).Количество() = 0) //-Филиппенко В.Б. Добавил проверку по удаленным из каталога файлам // при выгрузке каталога остаток и цена не вычисляются, всегда = 0 //ИЛИ СтрНом.ОстатокНаСкладе <= 0 //ИЛИ СтрНом.ЦенаЗаЕдиницу <= 0 // поэтому вычислим отдельно // ИЛИ У1С_Доработки.ОстатокНоменклатуры(СтрНом.Номенклатура) <= 0 // ИЛИ У1С_Доработки.ЦенаНоменклатуры(СтрНом.Номенклатура) <= 0 Тогда НайденныеСтроки = ТаблицаНоменклатуры.НайтиСтроки(Новый Структура("Номенклатура", Номенклатура)); Если НайденныеСтроки.Количество() > 0 Тогда Для Каждого СтрНом из НайденныеСтроки Цикл НеВыгружаемая.Добавить(СтрНом); КонецЦикла; КонецЕсли; Иначе // отладка!!!! а = 7; КонецЕсли; // КонецЕсли; КонецЦикла; // ╘══════════════ Ушаков С.И. 28 ноября 2017 г. ════════════════╛ ТаблицаСвойства = РезультатВыполненияСхемы(КомпоновщикНастроек, ТекстыЗапросов.Свойства, ПоляИсточниковДанных.Свойства, ПрикладныеПараметры, "Каталог"); ТаблицаСвойства.Индексы.Добавить("Номенклатура"); // ╒══════════════ Ушаков С.И. 16 января 2018 г. ════════════════╕ // и свойства тоже подчистим Для каждого СтрНом Из НеВыгружаемая Цикл КУд = ТаблицаСвойства.НайтиСтроки(Новый Структура("Номенклатура", СтрНом.Номенклатура)); Для каждого Стр Из КУд Цикл ТаблицаСвойства.Удалить(Стр); КонецЦикла; ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, СтрНом.Номенклатура); ТаблицаНоменклатуры.Удалить(СтрНом); // удаляем в конце, т.к. СтрНом после удаления умирает... КонецЦикла; // ╘══════════════ Ушаков С.И. 16 января 2018 г. ════════════════╛ Параметры.ВыгруженныеКартинки.Сортировать("Сортировка"); ТаблицыДляВыгрузкиКаталога = Новый Структура; ТаблицыДляВыгрузкиКаталога.Вставить("Номенклатура", ТаблицаНоменклатуры); ТаблицыДляВыгрузкиКаталога.Вставить("Характеристики", ТаблицаХарактеристики); ТаблицыДляВыгрузкиКаталога.Вставить("Файлы", ТаблицаФайлы); ТаблицыДляВыгрузкиКаталога.Вставить("Свойства", ТаблицаСвойства); КонецПроцедуры Функция РезультатВыполненияСхемы(Знач КомпоновщикНастроек, ТекстЗапроса, ПоляНабораДанных, ПрикладныеПараметры, ИмяМакета) СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; // Изменяем текст запроса чтобы получить таблицу, свернутую по номенклатуре. ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанныхЗапрос = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанныхЗапрос.АвтоЗаполнениеДоступныхПолей = Истина; НаборДанныхЗапрос.Запрос = ТекстЗапроса; НаборДанныхЗапрос.Имя = "НаборДанных"; НаборДанныхЗапрос.ИсточникДанных = "ИсточникДанных"; ПараметрыКомпоновки = СхемаКомпоновкиДанных.Параметры; Если ВРег(ИмяМакета) = ВРег("Каталог") Тогда ОбменССайтомПереопределяемый.УстановитьПараметрыЗапросаКаталог(ПрикладныеПараметры, ПараметрыКомпоновки); ИначеЕсли ВРег(ИмяМакета) = ВРег("ПакетПредложений") Тогда ОбменССайтомПереопределяемый.УстановитьПараметрыЗапросаПакетПредложений(ПрикладныеПараметры, ПараметрыКомпоновки); КонецЕсли; ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных); КомпоновщикНастроек1 = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек1.Инициализировать(ИсточникНастроек); Настройки = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки()); КомпоновщикНастроек1.ЗагрузитьНастройки(Настройки.Получить()); ОбменССайтомПереопределяемый.КомпоновщикНастроекСхемыФормированияДанныхПослеЗагрузкиНастроек(КомпоновщикНастроек1, ИмяМакета); УдалитьПоляДругихНаборовДанных(ПоляНабораДанных, КомпоновщикНастроек1.Настройки); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек1.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), Ложь); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ТаблицаРезультат = Новый ТаблицаЗначений; ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат); УстановитьПривилегированныйРежим(Истина); ПроцессорВывода.Вывести(ПроцессорКомпоновки); УстановитьПривилегированныйРежим(Ложь); СоздатьНедостающиеКолонкиТаблицыДанных(КомпоновщикНастроек.Настройки, ТаблицаРезультат); ЗаполнитьТипыПолейНаборовДанных(ПоляНабораДанных, ТаблицаРезультат); Возврат ТаблицаРезультат; КонецФункции Процедура ЗаполнитьТипыПолейНаборовДанных(Знач ПоляНабораДанных, Знач ТаблицаРезультат) Перем КолонкаТаблицы, СтрокаПоляНабораДанных; // Проставим типы в полях набора данных (их там нет, так как они берутся из нетипизированных макетов). Для Каждого СтрокаПоляНабораДанных Из ПоляНабораДанных Цикл Если Не ЗначениеЗаполнено(СтрокаПоляНабораДанных.ТипЗначенияПоля) Тогда КолонкаТаблицы = ТаблицаРезультат.Колонки.Найти(СтрокаПоляНабораДанных.ИмяПоля); Если КолонкаТаблицы <> Неопределено Тогда СтрокаПоляНабораДанных.ТипЗначенияПоля = КолонкаТаблицы.ТипЗначения КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьПоляИсточниковДанных(СтруктураСПолямиИсточниковДанных, ПакетПредложений = Ложь, ДобавитьПоляОтбор = Истина) ПоляОтбора = Новый Соответствие; Если ПакетПредложений Тогда СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиПакетПредложений"); ОбменССайтомПереопределяемый.ЗаполнитьПоляОтбораПакетаПредложений(ПоляОтбора); Иначе СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиКаталог"); ОбменССайтомПереопределяемый.ЗаполнитьПоляОтбораКаталога(ПоляОтбора); КонецЕсли; КоллекцияНаборовДанных = СхемаКомпоновки.НаборыДанных.НаборДанных1.Элементы; Для Каждого ЭлементДанных Из КоллекцияНаборовДанных Цикл ПоляНабора = ТаблицаПолейНабораДанных(); Для Каждого ПолеНабора Из ЭлементДанных.Поля Цикл НоваяСтрока = ПоляНабора.Добавить(); НоваяСтрока.ИмяПоля = ВРег(ПолеНабора.Поле); НоваяСтрока.ТипЗначенияПоля = ПолеНабора.ТипЗначения; КонецЦикла; Если ДобавитьПоляОтбор Тогда // Добавляем в поля набора Вычисляемые поля, что бы избежать их удаления из отбора. ИмяНабораДанных = ЭлементДанных.Имя; ВычисляемыеПоля = ПоляОтбора.Получить(ИмяНабораДанных); Если Не ВычисляемыеПоля = Неопределено Тогда Для Каждого ДанныеПоля Из ВычисляемыеПоля Цикл НоваяСтрока = ПоляНабора.Добавить(); НоваяСтрока.ИмяПоля = ВРег(ДанныеПоля.Наименование); НоваяСтрока.ТипЗначенияПоля = ДанныеПоля.ТипЗначения; КонецЦикла; КонецЕсли; КонецЕсли; СтруктураСПолямиИсточниковДанных.Вставить(ЭлементДанных.Имя, ПоляНабора); КонецЦикла; КонецПроцедуры Функция ТаблицаПолейНабораДанных() ТаблицаПолей = Новый ТаблицаЗначений; ТаблицаПолей.Колонки.Добавить("ИмяПоля"); ТаблицаПолей.Колонки.Добавить("ТипЗначенияПоля"); Возврат ТаблицаПолей; КонецФункции Функция МассивДопустимыхРасширенийИзображений() МассивДопустимыхРасширенийИзображений = Новый Массив; МассивДопустимыхРасширенийИзображений.Добавить("gif"); МассивДопустимыхРасширенийИзображений.Добавить("jpg"); МассивДопустимыхРасширенийИзображений.Добавить("JPG");// добавлено МассивДопустимыхРасширенийИзображений.Добавить("jpeg"); МассивДопустимыхРасширенийИзображений.Добавить("bmp"); МассивДопустимыхРасширенийИзображений.Добавить("png"); Возврат МассивДопустимыхРасширенийИзображений; КонецФункции Процедура УдалитьПоляДругихНаборовДанных(ПоляНабораДанных, КомпоновщикНастройки) ПоляКомпоновки = КомпоновщикНастройки.Выбор.Элементы; Счетчик = 0; Пока Счетчик < ПоляКомпоновки.Количество() Цикл ПолеКомпоновки = ПоляКомпоновки[Счетчик]; Если ПоляНабораДанных.Найти(ВРег(ПолеКомпоновки.Поле),"ИмяПоля") = Неопределено Тогда ПоляКомпоновки.Удалить(ПолеКомпоновки); Иначе Счетчик = Счетчик +1; КонецЕсли; КонецЦикла; // Поля отбора удаляются рекурсивно, так как в них могут быть группы. УдалитьПоляОтбораДругихНаборовДанныхРекурсивно(ПоляНабораДанных, КомпоновщикНастройки.Отбор.Элементы); КонецПроцедуры Процедура УдалитьПоляОтбораДругихНаборовДанныхРекурсивно(ПоляНабораДанных, ПоляОтбора) Счетчик = 0; Пока Счетчик < ПоляОтбора.Количество() Цикл ПолеОтбора = ПоляОтбора[Счетчик]; Если ТипЗнч(ПолеОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда УдалитьПоляОтбораДругихНаборовДанныхРекурсивно(ПоляНабораДанных, ПолеОтбора.Элементы); Счетчик = Счетчик + 1; Иначе ИмяОтбора = ПолеОтбора.ЛевоеЗначение; // Отбор может быть построен по реквизитам полей(например "Номенклатура"). // В таком случае отбор удалять не надо, если Родитель отбора входит в коллекцию выбранных полей набора данных. ПозицияТочки = Найти(ИмяОтбора, "."); Если ПозицияТочки > 0 Тогда ИмяИзмерения = Лев(ИмяОтбора, ПозицияТочки -1); Иначе ИмяИзмерения = ИмяОтбора; КонецЕсли; Если ПоляНабораДанных.Найти(ВРег(ИмяИзмерения),"ИмяПоля") = Неопределено Тогда ПоляОтбора.Удалить(ПолеОтбора); Иначе Счетчик = Счетчик +1; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьДанныеВладельцаКаталога(Параметры, ДанныеОрганизацииВладельцаКаталога) ИмяРеквизитаИНН = ОбщегоНазначенияБЭДПовтИсп.ИмяНаличиеОбъектаРеквизитаВПрикладномРешении("ИННОрганизации"); ИмяРеквизитаКПП = ОбщегоНазначенияБЭДПовтИсп.ИмяНаличиеОбъектаРеквизитаВПрикладномРешении("КППОрганизации"); ИмяРеквизитаНаименование = ОбщегоНазначенияБЭДПовтИсп.ИмяНаличиеОбъектаРеквизитаВПрикладномРешении("НаименованиеОрганизации"); ИмяРеквизитаПолноеНаименование = ОбщегоНазначенияБЭДПовтИсп.ИмяНаличиеОбъектаРеквизитаВПрикладномРешении("ПолноеНаименованиеОрганизации"); ИмяРеквизитаЮрФизЛицо = ОбщегоНазначенияБЭДПовтИсп.ИмяНаличиеОбъектаРеквизитаВПрикладномРешении("ЮридическоеФизическоеЛицо"); РеквизитыОрганизации = Новый Массив; РеквизитыОрганизации.Добавить(ИмяРеквизитаИНН); РеквизитыОрганизации.Добавить(ИмяРеквизитаКПП); РеквизитыОрганизации.Добавить(ИмяРеквизитаНаименование); РеквизитыОрганизации.Добавить(ИмяРеквизитаПолноеНаименование); РеквизитыОрганизации.Добавить(ИмяРеквизитаЮрФизЛицо); СтрокаРеквизитов = СтрСоединить(РеквизитыОрганизации, ", "); ПараметрыОрганизации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Параметры.ВладелецКаталога, СтрокаРеквизитов); ДанныеОрганизацииВладельцаКаталога = Новый Структура; ДанныеОрганизацииВладельцаКаталога.Вставить("Контрагент", Параметры.ВладелецКаталога); ДанныеОрганизацииВладельцаКаталога.Вставить("Наименование", ПараметрыОрганизации[ИмяРеквизитаНаименование]); ДанныеОрганизацииВладельцаКаталога.Вставить("НаименованиеПолное", ПараметрыОрганизации[ИмяРеквизитаПолноеНаименование]); ДанныеОрганизацииВладельцаКаталога.Вставить("ЮрФизЛицо", ПараметрыОрганизации[ИмяРеквизитаЮрФизЛицо]); ДанныеОрганизацииВладельцаКаталога.Вставить("ИНН", ПараметрыОрганизации[ИмяРеквизитаИНН]); ДанныеОрганизацииВладельцаКаталога.Вставить("КПП", ПараметрыОрганизации[ИмяРеквизитаКПП]); ДанныеОрганизацииВладельцаКаталога.Вставить("КодПоОКПО", ""); КонецПроцедуры Процедура ЗаполнитьКлассификатор(ДанныеДляВыгрузкиКаталога, Классификатор, ПрикладныеПараметры) Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; КлассифицироватьПоВидамНоменклатуры = Неопределено; Если ПрикладныеПараметры.Свойство("КлассифицироватьПоВидамНоменклатуры", КлассифицироватьПоВидамНоменклатуры) И КлассифицироватьПоВидамНоменклатуры = Истина Тогда Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВременнаяТаблицаНоменклатура.НоменклатураВидНоменклатуры КАК ВидНоменклатуры |ПОМЕСТИТЬ втКаталог |ИЗ | &ВременнаяТаблицаНоменклатура КАК ВременнаяТаблицаНоменклатура |ГДЕ | НЕ ВременнаяТаблицаНоменклатура.НоменклатураВидНоменклатуры = НЕОПРЕДЕЛЕНО | |ИНДЕКСИРОВАТЬ ПО | ВидНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | втКаталог.ВидНоменклатуры КАК Номенклатура |ИЗ | втКаталог КАК втКаталог |ИТОГИ ПО | Номенклатура ИЕРАРХИЯ"; //Доработка+ Запрос.УстановитьПараметр("ВременнаяТаблицаНоменклатура", ДанныеДляВыгрузкиКаталога); Результат = Запрос.Выполнить(); Классификатор = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); //Доработка- Иначе //Запрос.Текст = //"ВЫБРАТЬ РАЗЛИЧНЫЕ //| ВременнаяТаблицаНоменклатура.Номенклатура КАК Номенклатура //|ПОМЕСТИТЬ втКаталог //|ИЗ //| &ВременнаяТаблицаНоменклатура КАК ВременнаяТаблицаНоменклатура //| //|ИНДЕКСИРОВАТЬ ПО //| Номенклатура //|; //| //|//////////////////////////////////////////////////////////////////////////////// //|ВЫБРАТЬ //| втКаталог.Номенклатура КАК Номенклатура //|ИЗ //| втКаталог КАК втКаталог //|ИТОГИ ПО //| Номенклатура ТОЛЬКО ИЕРАРХИЯ"; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ //Доработка+ | ВременнаяТаблицаНоменклатура.НоменклатураРодитель КАК Подкатегория, | ВременнаяТаблицаНоменклатура.Номенклатура, | ВременнаяТаблицаНоменклатура.НоменклатураКатегория КАК Категория //Доработка- |ПОМЕСТИТЬ втКаталог |ИЗ | &ВременнаяТаблицаНоменклатура КАК ВременнаяТаблицаНоменклатура | //|ИНДЕКСИРОВАТЬ ПО //| Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ //Доработка+ | втКаталог.Подкатегория КАК Подкатегория, | втКаталог.Категория КАК Категория //Доработка- |ИЗ | втКаталог КАК втКаталог //Доработка+ | |СГРУППИРОВАТЬ ПО | втКаталог.Категория, | втКаталог.Подкатегория"; //Доработка- //Доработка+ Запрос.УстановитьПараметр("ВременнаяТаблицаНоменклатура", ДанныеДляВыгрузкиКаталога); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Классификатор = Новый ДеревоЗначений; Классификатор.Колонки.Добавить("Номенклатура"); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.Категория) Тогда Категория = Классификатор.Строки.Добавить(); Категория.Номенклатура = ВыборкаДетальныеЗаписи.Категория; Подкатегория = Категория.Строки.Добавить(); Подкатегория.Номенклатура = ВыборкаДетальныеЗаписи.Подкатегория; Иначе Категория = Классификатор.Строки.Добавить(); Категория.Номенклатура = ВыборкаДетальныеЗаписи.Подкатегория; КонецЕсли; КонецЦикла; //Доработка- КонецЕсли; КонецПроцедуры Процедура ЗаполнитьТаблицаОбновленияПакета(МассивНоменклатуры, ТаблицаИсточник, ТаблицаПриемник) Для Каждого ТекСтрока Из ТаблицаИсточник Цикл Если МассивНоменклатуры.Найти(ТекСтрока.Номенклатура) = Неопределено Тогда Продолжить; КонецЕсли; НоваяСтрока = ТаблицаПриемник.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока); КонецЦикла; ТаблицаЦены = ТаблицаПриемник.Скопировать(); ТаблицаЦены.Свернуть("Номенклатура, Характеристика, ЦенаЗаЕдиницу, ТипЦены, ТипЦеныВалютаКод, |ТипЦеныЕдиницаЦеныНаименованиеСокращенное, |ТипЦеныЕдиницаЦеныКоэффициент"); СтрокиСПустымиЦенами = Новый Массив; Для Каждого СтрокаЦен Из ТаблицаЦены Цикл Если Не (ЗначениеЗаполнено(СтрокаЦен.ТипЦены) И ЗначениеЗаполнено(СтрокаЦен.ТипЦеныВалютаКод) И ЗначениеЗаполнено(СтрокаЦен.ТипЦеныЕдиницаЦеныНаименованиеСокращенное) И ЗначениеЗаполнено(СтрокаЦен.ТипЦеныЕдиницаЦеныКоэффициент)) Тогда СтрокиСПустымиЦенами.Добавить(СтрокаЦен); КонецЕсли; КонецЦикла; Для Каждого СтрокаЦен Из СтрокиСПустымиЦенами Цикл ТаблицаЦены.Удалить(СтрокаЦен); КонецЦикла; ТаблицаОстатки = ТаблицаПриемник.Скопировать(); ТаблицаОстатки.Свернуть("Номенклатура, Характеристика, Склад, ОстатокНаСкладе"); ТаблицаПриемник.Свернуть("Номенклатура, Характеристика", "Цены, Остатки"); Для Каждого ТекСтрока Из ТаблицаПриемник Цикл Отбор = Новый Структура; Отбор.Вставить("Номенклатура", ТекСтрока.Номенклатура); Отбор.Вставить("Характеристика", ТекСтрока.Характеристика); Цены = ТаблицаЦены.Скопировать(Отбор,"ЦенаЗаЕдиницу, ТипЦены, ТипЦеныВалютаКод, |ТипЦеныЕдиницаЦеныНаименованиеСокращенное, |ТипЦеныЕдиницаЦеныКоэффициент"); ТекСтрока.Цены = Цены; Остатки = ТаблицаОстатки.Скопировать(Отбор, "Склад, ОстатокНаСкладе"); ТекСтрока.Остатки = Остатки; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьИзмененияПакета(СтрокаТаблицыКаталога, ТаблицаОбновленияПакета, КоммерческаяИнформацияXDTO) ПакетCML = ПакетCML(); ИзмененияПакетаПредложенийТип = ПакетCML.Получить("ИзмененияПакетаПредложений"); ИзмененияПакетаПредложенийXDTO = ФабрикаXDTO.Создать(ИзмененияПакетаПредложенийТип); ИзмененияПакетаПредложенийXDTO.Ид = СтрокаТаблицыКаталога.ИдентификаторКаталога+"#"; ИзмененияПакетаПредложенийXDTO.ИдКаталога = СтрокаТаблицыКаталога.ИдентификаторКаталога; ПредложенияТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ИзмененияПакетаПредложенийТип, "Предложения"); ПредложенияXDTO = ФабрикаXDTO.Создать(ПредложенияТип); ПредложениеТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПредложенияТип, "Предложение"); ЦенаТип = ПакетCML.Получить("Цена"); ОстаткиПоСкладамТип = ПакетCML.Получить("ОстаткиПоСкладам"); ЦеныТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПредложениеТип, "Цены"); Для Каждого ТекСтрока Из ТаблицаОбновленияПакета Цикл ПредложениеXDTO = ФабрикаXDTO.Создать(ПредложениеТип); ПредложениеXDTO.Ид = УникальныйИдентификаторОбъекта(ТекСтрока.Номенклатура); Если ЗначениеЗаполнено(ТекСтрока.Характеристика) Тогда ПредложениеXDTO.ИдХарактеристики = УникальныйИдентификаторОбъекта(ТекСтрока.Характеристика); КонецЕсли; ЦеныXDTO = ФабрикаXDTO.Создать(ЦеныТип); Для Каждого СтрокаТипЦены Из ТекСтрока.Цены Цикл ЦенаXDTO = ФабрикаXDTO.Создать(ЦенаТип); ЦенаXDTO.ИдТипаЦены = УникальныйИдентификаторОбъекта(СтрокаТипЦены.ТипЦены); ЦенаXDTO.ЦенаЗаЕдиницу = СтрокаТипЦены.ЦенаЗаЕдиницу; ЦенаXDTO.Коэффициент = СтрокаТипЦены.ТипЦеныЕдиницаЦеныКоэффициент; ЦенаXDTO.Валюта = СтрокаТипЦены.ТипЦеныВалютаКод; ЦенаXDTO.Единица = СтрокаТипЦены.ТипЦеныЕдиницаЦеныНаименованиеСокращенное; ЦеныXDTO.Цена.Добавить(ЦенаXDTO); КонецЦикла; Если ЦеныXDTO.Цена.Количество() > 0 Тогда ПредложениеXDTO.Цены = ЦеныXDTO; КонецЕсли; ОстатокВсего = 0; Для Каждого СтрокаОстаткиПоСкладам Из ТекСтрока.Остатки Цикл Если Не ЗначениеЗаполнено(СтрокаОстаткиПоСкладам.Склад) Тогда Продолжить; КонецЕсли; ОстаткиПоСкладамXDTO = ФабрикаXDTO.Создать(ОстаткиПоСкладамТип); ОстаткиПоСкладамXDTO.ИдСклада = УникальныйИдентификаторОбъекта(СтрокаОстаткиПоСкладам.Склад); ОстаткиПоСкладамXDTO.КоличествоНаСкладе = СтрокаОстаткиПоСкладам.ОстатокНаСкладе; ПредложениеXDTO.Склады.Добавить(ОстаткиПоСкладамXDTO); ОстатокВсего = ОстатокВсего + СтрокаОстаткиПоСкладам.ОстатокНаСкладе; КонецЦикла; ПредложениеXDTO.Количество = ОстатокВсего; ПредложенияXDTO.Предложение.Добавить(ПредложениеXDTO); КонецЦикла; ИзмененияПакетаПредложенийXDTO.Предложения = ПредложенияXDTO; КоммерческаяИнформацияXDTO.ИзмененияПакетаПредложений.Добавить(ИзмененияПакетаПредложенийXDTO); КонецПроцедуры Процедура ЗаполнитьТаблицуДляОтправкиДаннымиНоменклатуры(МассивНоменклатуры, СтруктураИсходныхТаблиц, ТаблицаПриемник) Для Каждого ТекСтрока Из СтруктураИсходныхТаблиц.Номенклатура Цикл Если МассивНоменклатуры.Найти(ТекСтрока.Номенклатура) = Неопределено Тогда Продолжить; КонецЕсли; Отбор = Новый Структура; Отбор.Вставить("Номенклатура", ТекСтрока.Номенклатура); Файлы = СтруктураИсходныхТаблиц.Файлы.Скопировать(Отбор); Свойства = СтруктураИсходныхТаблиц.Свойства.Скопировать(Отбор); Характеристики = Неопределено; Если Не СтруктураИсходныхТаблиц.Характеристики = Неопределено Тогда Характеристики = СтруктураИсходныхТаблиц.Характеристики.Скопировать(Отбор, "Характеристика, ХарактеристикаНаименование"); КонецЕсли; // Если таблицу характеристик не удалось заполнить, нужно все равно добавить в нее строку // для прохождения цикла заполнения строк основной таблицы. Если Не ЗначениеЗаполнено(Характеристики) Тогда Характеристики = Новый ТаблицаЗначений; Характеристики.Колонки.Добавить("Характеристика"); Характеристики.Колонки.Добавить("ХарактеристикаНаименование"); НоваяСтрока = Характеристики.Добавить(); КонецЕсли; Для Каждого СтрокаХарактеристики Из Характеристики Цикл НоваяСтрока = ТаблицаПриемник.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока); Если ЗначениеЗаполнено(СтрокаХарактеристики.Характеристика) Тогда ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаХарактеристики); КонецЕсли; НоваяСтрока.Файлы = Файлы; НоваяСтрока.Свойства = Свойства; КонецЦикла; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьТаблицуФормированияПакетаПредложений(МассивНоменклатуры, ТаблицаИсточник, ТаблицаПриемник) // ╒══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╕ ТаблицаПриемник.Колонки.Добавить("Сопутствующие"); // ╘══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╛ Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл Отбор = Новый Структура; Отбор.Вставить("Номенклатура", ЭлементМассива); ТаблицаТипыЦен = ТаблицаИсточник.Скопировать(Отбор); ТаблицаТипыЦен.Свернуть("ТипЦены, |ТипЦеныЦенаВключаетНДС, |ТипЦеныНаименование, |ТипЦеныВалютаКод, |ТипЦеныЕдиницаЦеныНаименованиеСокращенное, |ТипЦеныЕдиницаЦеныКоэффициент, |ЦенаЗаЕдиницу, // ╒══════════════ Ушаков С.И. 22 февраля 2018 г. ════════════════╕ |У1С_СтараяЦенаЗаЕдиницу, // ╘══════════════ Ушаков С.И. 22 февраля 2018 г. ════════════════╛ |ДатаУстановкиЦены, |Номенклатура, |Характеристика, ЕдиницаИзмерения"); УдалитьПустыеСтроки(ТаблицаТипыЦен, "ТипЦены"); ТаблицаОстаткиПоСкладам = ТаблицаИсточник.Скопировать(Отбор); ТаблицаОстаткиПоСкладам.Свернуть("Склад, СкладНаименование, ОстатокНаСкладе, |Номенклатура, Характеристика, ЕдиницаИзмерения"); УдалитьПустыеСтроки(ТаблицаОстаткиПоСкладам, "Склад"); ПромежуточнаяТаблицаНоменклатуры = ТаблицаИсточник.Скопировать(Отбор); ПромежуточнаяТаблицаНоменклатуры.Свернуть("Номенклатура, НоменклатураНаименование, |НоменклатураАртикул, |НоменклатураПометкаУдаления, |Характеристика, |ЕдиницаИзмерения, |ЕдиницаИзмеренияКод, |ЕдиницаИзмеренияНаименованиеПолное, |ЕдиницаИзмеренияМеждународноеСокращение, |ЕдиницаИзмеренияПересчетКоэф, |ЕдиницаИзмеренияПересчетЕдиница, |ЕдиницаИзмеренияПересчетЕдиница"); УдалитьПустыеСтроки(ПромежуточнаяТаблицаНоменклатуры, "НоменклатураНаименование"); Для Каждого ТекСтрока Из ПромежуточнаяТаблицаНоменклатуры Цикл НоваяСтрока = ТаблицаПриемник.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока); ОтборНоменклатураХарактеристика = Новый Структура; ОтборНоменклатураХарактеристика.Вставить("Номенклатура", ТекСтрока.Номенклатура); ОтборНоменклатураХарактеристика.Вставить("Характеристика", ТекСтрока.Характеристика); ОтборНоменклатураХарактеристика.Вставить("ЕдиницаИзмерения", ТекСтрока.ЕдиницаИзмерения); Остатки = ТаблицаОстаткиПоСкладам.Скопировать(ОтборНоменклатураХарактеристика); НоваяСтрока.ОстаткиПоСкладам = Остатки; //IT //НоваяСтрока.ОстатокНаСкладе = Остатки.Итог("ОстатокНаСкладе"); //IT ТаблицаЦен = ТаблицаТипыЦен.Скопировать(ОтборНоменклатураХарактеристика); НоваяСтрока.Цены = ТаблицаЦен; // ╒══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╕ Запрос = Новый Запрос( "ВЫБРАТЬ | НоменклатураПродаваемаяСовместно.НоменклатураСледствие КАК Товар |ИЗ | РегистрСведений.НоменклатураПродаваемаяСовместно КАК НоменклатураПродаваемаяСовместно |ГДЕ | НЕ НоменклатураПродаваемаяСовместно.У1С_НеВыгружатьНаСайт | И НоменклатураПродаваемаяСовместно.НоменклатураПредпосылка = &НоменклатураПредпосылка"); Запрос.УстановитьПараметр("НоменклатураПредпосылка", ТекСтрока.Номенклатура); ТаблицаСопутствующих = Запрос.Выполнить().Выгрузить(); НоваяСтрока.Сопутствующие = ТаблицаСопутствующих; // ╘══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╛ КонецЦикла; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьСвойстваНоменклатуры(Знач ТаблицаСвойстваНоменклатуры, СвойстваНоменклатуры) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВременнаяТаблицаНоменклатура.СвойствоНоменклатуры КАК Свойство, | ВременнаяТаблицаНоменклатура.ЗначениеСвойства КАК Значение |ПОМЕСТИТЬ втСвойства |ИЗ | &ВременнаяТаблицаНоменклатура КАК ВременнаяТаблицаНоменклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | втСвойства.Свойство КАК Свойство, | втСвойства.Значение КАК Значение, | втСвойства.Свойство.ТипЗначения КАК ТипЗначения |ИЗ | втСвойства КАК втСвойства |ИТОГИ ПО | Свойство"; Запрос.УстановитьПараметр("ВременнаяТаблицаНоменклатура", ТаблицаСвойстваНоменклатуры); Результат = Запрос.Выполнить(); СвойстваНоменклатуры = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); КонецПроцедуры Функция ВыгрузитьКаталог(Параметры, СтрокаТаблицыКаталога, ТаблицаИнформации, КаталогИПакетПредложений = Ложь) ИндексФайлаОбмена = Параметры.ИндексФайлаОбмена; ВыполнятьОбмен = Истина; ВыгруженоУспешно = Истина; ПерваяПорция = Истина; СтруктураРезультата = Параметры.СтруктураРезультата; ТолькоИзменения = Параметры.ВыгружатьИзменения; Если КаталогИПакетПредложений Тогда СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиКаталогПакетПредложений"); КомпоновщикНастроек = ПолучитьКомпоновщикНастроекСхемыКомпоновки(СхемаКомпоновки, СтрокаТаблицыКаталога.ХранилищеНастроекКаталогПакет); Иначе СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиКаталог"); КомпоновщикНастроек = ПолучитьКомпоновщикНастроекСхемыКомпоновки(СхемаКомпоновки, СтрокаТаблицыКаталога.ХранилищеНастроекКаталог); КонецЕсли; // Отборы. УстановитьОтборКомпоновщика(Параметры, СтрокаТаблицыКаталога, КомпоновщикНастроек); Если Параметры.ПрикладныеПараметры.ОграничитьКаталогДоступнымиПредложениями И КаталогИПакетПредложений Тогда // Получаем данные для формирования "Пакета предложений". ОписаниеОшибки = ""; ТаблицаДанныеПакетаПредложений = Новый ТаблицаЗначений; ПолучитьДанныеДляВыгрузкиПакетаПредложений(Параметры.ПрикладныеПараметры, КомпоновщикНастроек, ТаблицаДанныеПакетаПредложений, ОписаниеОшибки,Параметры); ДоступнаяНоменклатура = Новый Массив; Если ЗначениеЗаполнено(ТаблицаДанныеПакетаПредложений) Тогда ДоступнаяНоменклатура = ТаблицаДанныеПакетаПредложений.ВыгрузитьКолонку("Номенклатура"); КонецЕсли; Отбор = КомпоновщикНастроек.Настройки.Отбор; НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ИдентификаторПользовательскойНастройки = "тест"; НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура"); НовыйЭлемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; НовыйЭлемент.ПравоеЗначение = ДоступнаяНоменклатура; НовыйЭлемент.Использование = Истина; КонецЕсли; // Получаем данные для формирования "Каталога номенклатуры". ТаблицыДляВыгрузкиКаталога = Неопределено; ОписаниеОшибки = ""; // ╒══════════════ Ушаков С.И. 16 января 2018 г. ════════════════╕ // маразммм. Параметры.ПрикладныеПараметры.Вставить("РазрешенныеТипыКартинок", Параметры.РазрешенныеТипыКартинок); // ╘══════════════ Ушаков С.И. 16 января 2018 г. ════════════════╛ ПолучитьДанныеДляВыгрузкиКаталога(Параметры.ПрикладныеПараметры, КомпоновщикНастроек, ТаблицыДляВыгрузкиКаталога, ОписаниеОшибки,Параметры); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда ОбменССайтомСобытия.ЗаписатьОшибку(ОписаниеОшибки, Параметры.УзелОбмена); Возврат Ложь; КонецЕсли; Если ТаблицыДляВыгрузкиКаталога.Номенклатура.Количество() = 0 Тогда Возврат Истина; КонецЕсли; // Заполняем данные Владельца каталога. ДанныеОрганизацииВладельцаКаталога = Неопределено; ЗаполнитьДанныеВладельцаКаталога(Параметры, ДанныеОрганизацииВладельцаКаталога); // Формируем дерево значений, которое будет содержать классификатор каталога. Классификатор = Неопределено; ЗаполнитьКлассификатор(ТаблицыДляВыгрузкиКаталога.Номенклатура, Классификатор, Параметры.ПрикладныеПараметры); // Формируем Выборку свойств номенклатуры для заполнения Классификатора. СвойстваНоменклатуры = Неопределено; ЗаполнитьСвойстваНоменклатуры(ТаблицыДляВыгрузкиКаталога.Свойства, СвойстваНоменклатуры); // Сначала формируем и отправляем классификатор, // если сайт его успешно загрузит, // то будем порциями отправлять каталог. URIПространстваИмен = "urn:1C.ru:commerceml_2"; ПакетCML = ФабрикаXDTO.Пакеты.Получить(URIПространстваИмен); КоммерческаяИнформацияТип = ПакетCML.Получить("КоммерческаяИнформация"); КоммерческаяИнформацияXDTO = ФабрикаXDTO.Создать(КоммерческаяИнформацияТип); // Сначала отправляем каталог. КоммерческаяИнформацияXDTO.ВерсияСхемы = ВерсияСхемы(); КоммерческаяИнформацияXDTO.ДатаФормирования = Параметры.ДатаФормирования; КлассификаторТип = ПакетCML.Получить("Классификатор"); КлассификаторXDTO = ФабрикаXDTO.Создать(КлассификаторТип); КлассификаторXDTO.ИД = СтрокаТаблицыКаталога.ИдентификаторКаталога; КлассификаторXDTO.Наименование = ФорматНаименованияДляXDTO("Классификатор (" + СтрокаТаблицыКаталога.Каталог + ")"); Владелец = ПолучитьКонтрагентаXDTO(ДанныеОрганизацииВладельцаКаталога); Если Владелец = Неопределено Тогда ОписаниеИсключительнойОшибки = ОписаниеИсключительнойОшибки( НСтр("ru = 'Не удалось определить организацию владельца каталога'") + Символы.ПС + ОписаниеОшибки()); ДобавитьОписаниеОшибки(СтруктураРезультата.ОписаниеОшибки, ОписаниеИсключительнойОшибки); СтруктураРезультата.ВыгруженоКартинок = 0; СтруктураРезультата.ВыгруженоТоваров = 0; Возврат Ложь; КонецЕсли; КлассификаторXDTO.Владелец = Владелец; ДобавитьГруппыКлассификатораXDTO(КлассификаторXDTO, Классификатор.Строки, ПакетCML, Параметры.ПрикладныеПараметры); // Добавляем свойства номенклатуры. ДобавитьСвойстваНоменклатурыВКлассификаторXDTO(КлассификаторXDTO, ПакетCML, СвойстваНоменклатуры); КоммерческаяИнформацияXDTO.Классификатор = КлассификаторXDTO; ОписаниеОшибки = ""; // Регистрируем номенклатуру в узле. КолонкаНоменклатуры = ТаблицыДляВыгрузкиКаталога.Номенклатура.ВыгрузитьКолонку("Номенклатура"); МассивНоменклатуры = Новый Массив; ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивНоменклатуры, КолонкаНоменклатуры, Истина); Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; УдалитьРегистрациюГруппТоваров(Параметры); // Помечаем зарегистрированную в узле номенклатуру номером сообщения 0. ПланыОбмена.ВыбратьИзменения(Параметры.УзелОбмена, 0, МассивНоменклатуры); ИндексПорции = 0; НомерСообщения = 1; НомерСообщенияСтарый = Неопределено; КоличествоПовторов = 0; СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.ДействиеПриОбмене = Перечисления.ДействияПриОбменеССайтом.ВыгрузкаДанных; СтрокаТаблицыИнформации.Описание = Строка(ТекущаяДатаСеанса()) + " " + НСтр("ru = 'Запуск выгрузки товаров'"); ТаблицаДляФормированияКаталога = ТаблицыДляВыгрузкиКаталога.Номенклатура.СкопироватьКолонки(); ТаблицаДляФормированияКаталога.Колонки.Добавить("Файлы"); // в эту колонку поместим таблицу значений, содержащую файлы номенклатуры ТаблицаДляФормированияКаталога.Колонки.Добавить("Свойства"); // в эту колонку поместим таблицу значений, содержащую свойства номенклатуры ТаблицаДляФормированияКаталога.Колонки.Добавить("Характеристики"); // в эту колонку поместим таблицу значений, содержашую характеристики ТекстСообщения = "ru = 'Завершена выгрузка товаров'"; Пока ВыполнятьОбмен Цикл // Получаем порцию товаров. МассивНоменклатуры = НоменклатураУзла(Параметры.УзелОбмена, Параметры.РазмерПорции, 0); // Если в узле нет новых товаров, значит остались старые. Если МассивНоменклатуры.Количество() = 0 Тогда // ╒══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╕ // что за "старые" товары???? Из-за этого блока, наши отбракованные товары (без артикула, картинок...) попадают сюда // и повторно выгружаются. Прервать; // и всё тут. погядим что, как. // ╘══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╛ ТаблицаНоменклатуры = НоменклатураНомерСообщенияУзла(Параметры.УзелОбмена, Параметры.РазмерПорции); Если ТаблицаНоменклатуры.Количество() = 0 Тогда Прервать; КонецЕсли; Если НомерСообщенияСтарый = ТаблицаНоменклатуры[0].НомерСообщения Тогда КоличествоПовторов = КоличествоПовторов + 1; КонецЕсли; // Если количество повторов больше заданного // прерываем обмен. Если КоличествоПовторов >= Параметры.КоличествоПовторов Тогда ВыполнятьОбмен = Ложь; Если Параметры.КоличествоПовторов > 0 Тогда ВыгруженоУспешно = Ложь; КонецЕсли; Прервать; КонецЕсли; МассивНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("Номенклатура"); НомерСообщенияСтарый = ТаблицаНоменклатуры[0].НомерСообщения; КонецЕсли; // Получаем данные номенклатуры для получения файла. ТаблицаДляФормированияКаталога.Очистить(); // Т.к. данные в основной таблице хранятся в развернутом виде // (количество строк будет равно количеству прикрепленных файлов, например) // необходимо свернуть их по номенклатуре, характеристике , единице измерения. ЗаполнитьТаблицуДляОтправкиДаннымиНоменклатуры(МассивНоменклатуры, ТаблицыДляВыгрузкиКаталога, ТаблицаДляФормированияКаталога); Если ТаблицаДляФормированияКаталога.Количество() = 0 Тогда Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; Продолжить; КонецЕсли; // Формируем файл с каталогом для отправки на сайт. КаталогТип = ПакетCML.Получить("Каталог"); КаталогXDTO = ФабрикаXDTO.Создать(КаталогТип); КаталогXDTO.СодержитТолькоИзменения = Параметры.ВыгружатьИзменения Или (НомерСообщения > 1); КаталогXDTO.Ид = СтрокаТаблицыКаталога.ИдентификаторКаталога; КаталогXDTO.ИдКлассификатора = СтрокаТаблицыКаталога.ИдентификаторКаталога; КаталогXDTO.Наименование = ФорматНаименованияДляXDTO(СтрокаТаблицыКаталога.Каталог); КаталогXDTO.Владелец = ПолучитьКонтрагентаXDTO(ДанныеОрганизацииВладельцаКаталога); // Добавляем в каталог информацию о товарах. ДобавитьНоменклатуруВКаталогXDTO(КаталогXDTO, ПакетCML, Параметры, ТаблицаДляФормированияКаталога); КаталогXDTO.Проверить(); Если НомерСообщения > 1 Тогда КоммерческаяИнформацияТип = ПакетCML.Получить("КоммерческаяИнформация"); КоммерческаяИнформацияXDTO = ФабрикаXDTO.Создать(КоммерческаяИнформацияТип); КонецЕсли; КоммерческаяИнформацияXDTO.Каталог = КаталогXDTO; КоммерческаяИнформацияXDTO.ВерсияСхемы = ВерсияСхемы(); КоммерческаяИнформацияXDTO.ДатаФормирования = Параметры.ДатаФормирования; КоммерческаяИнформацияXDTO.Классификатор = КлассификаторXDTO; // IT ИндексПорции = ИндексПорции + 1; ИмяФайлаКаталога = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\import" + ИндексФайлаОбмена +"_" + ИндексПорции + ".xml"); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайлаКаталога, "UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); Попытка КоммерческаяИнформацияXDTO.Проверить(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КоммерческаяИнформацияXDTO, "КоммерческаяИнформация"); ЗаписьXML.Закрыть(); Исключение ОписаниеИсключительнойОшибки = ОписаниеИсключительнойОшибки( НСтр("ru = 'Не удалось записать XML-файл классификатора товаров на диск:'") + " " + ИмяФайлаКаталога + Символы.ПС + ОписаниеОшибки()); ДобавитьОписаниеОшибки(СтруктураРезультата.ОписаниеОшибки, ОписаниеИсключительнойОшибки); ДобавитьОписаниеОшибки(СтрокаТаблицыИнформации.Описание, СтруктураРезультата.ОписаниеОшибки); ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Перечисления.РезультатыОбменаССайтом.Ошибка, ТекстСообщения); СтруктураРезультата.ВыгруженоКартинок = 0; СтруктураРезультата.ВыгруженоТоваров = 0; Возврат Ложь; КонецПопытки; // Отправляем файл на сайт. Если Параметры.ВыгружатьНаСайт Тогда ВыгруженоУспешно = ВыгрузитьДанныеНаСайт(Параметры, СтрокаТаблицыИнформации); Иначе ВыгруженоУспешно = Истина; КонецЕсли; // Если файл на сайт был загружен, удаляем регистрацию. Если ВыгруженоУспешно Тогда Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; Иначе // Если не был отправлен первый файл, который содержит классификатор // то не будем продолжать обмен, т.к. данные на сайт не загрузятся. Если НомерСообщения = 1 Тогда ВыполнятьОбмен = Ложь; Прервать; КонецЕсли; // Если мы имеем дело с данными, которые уже отправлялись на сайт, но не отправились // то не будем у них изменять номер сообщения. Если Не НомерСообщенияСтарый = Неопределено Тогда Продолжить; КонецЕсли; // Если товары не были отправлены на сайт, то зарегистрируем их в узле // и пометим номером сообщения отличным от нуля. Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; ПланыОбмена.ВыбратьИзменения(Параметры.УзелОбмена, НомерСообщения, МассивНоменклатуры); КонецЕсли; НомерСообщения = НомерСообщения + 1; КонецЦикла; Если ВыгруженоУспешно Тогда Результат = Перечисления.РезультатыОбменаССайтом.Выполнено; Иначе Результат = Перечисления.РезультатыОбменаССайтом.Ошибка; КонецЕсли; ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Результат, ТекстСообщения); Возврат ВыгруженоУспешно; КонецФункции Функция ВыгрузитьОстаткиИЦены(Параметры, СтрокаТаблицыКаталога, ТаблицаИнформации) ИндексФайлаОбмена = Параметры.ИндексФайлаОбмена; СтруктураРезультата = Параметры.СтруктураРезультата; ТолькоИзменения = Параметры.ВыгружатьИзменения; СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиОбновлениеПакетаПредложений"); КомпоновщикНастроек = ПолучитьКомпоновщикНастроекСхемыКомпоновки(СхемаКомпоновки, СтрокаТаблицыКаталога.ХранилищеНастроекИзмененияПакета); УстановитьОтборКомпоновщика(Параметры, СтрокаТаблицыКаталога, КомпоновщикНастроек); ТаблицаОстаткиИЦены = Новый ТаблицаЗначений; ОписаниеОшибки = ""; ПолучитьДанныеОбновленияПакетаПредложений(Параметры.ПрикладныеПараметры, КомпоновщикНастроек, ТаблицаОстаткиИЦены, ОписаниеОшибки); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда ОбменССайтомСобытия.ЗаписатьОшибку(ОписаниеОшибки, Параметры.УзелОбмена); Возврат Ложь; КонецЕсли; ЗарегистрироватьВыгружаемыеДанные(ТаблицаОстаткиИЦены, "Номенклатура", Параметры.УзелОбмена); ИндексПорции = 0; НомерСообщения = 1; НомерСообщенияСтарый = Неопределено; КоличествоПовторов = 0; СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.ДействиеПриОбмене = Перечисления.ДействияПриОбменеССайтом.ВыгрузкаДанных; СтрокаТаблицыИнформации.Описание = Строка(ТекущаяДатаСеанса()) + " " + НСтр("ru = 'Запуск выгрузки обновление пакета'"); ТекстСообщения = "ru = 'Завершена выгрузка обновления пакета'"; ВыполнятьОбмен = Истина; Пока ВыполнятьОбмен Цикл // Получаем порцию товаров. МассивНоменклатуры = НоменклатураУзла(Параметры.УзелОбмена, Параметры.РазмерПорции, 0); // Если в узле нет новых товаров, значит остались старые. Если МассивНоменклатуры.Количество() = 0 Тогда ТаблицаНоменклатуры = НоменклатураНомерСообщенияУзла(Параметры.УзелОбмена, Параметры.РазмерПорции); Если ТаблицаНоменклатуры.Количество() = 0 Тогда Прервать; КонецЕсли; Если НомерСообщенияСтарый = ТаблицаНоменклатуры[0].НомерСообщения Тогда КоличествоПовторов = КоличествоПовторов + 1; КонецЕсли; // Если количество повторов больше заданного // прерываем обмен. Если КоличествоПовторов >= Параметры.КоличествоПовторов Тогда ВыполнятьОбмен = Ложь; Прервать; КонецЕсли; МассивНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("Номенклатура"); НомерСообщенияСтарый = ТаблицаНоменклатуры[0].НомерСообщения; КонецЕсли; ТаблицаОбновленияПакета = ТаблицаОстаткиИЦены.СкопироватьКолонки(); ТаблицаОбновленияПакета.Колонки.Добавить("Цены"); ТаблицаОбновленияПакета.Колонки.Добавить("Остатки"); // Из общей таблицы товаров получаем данные по товарам в порции // и сгруппируем ее по ценам и остаткам по складам. ЗаполнитьТаблицаОбновленияПакета(МассивНоменклатуры, ТаблицаОстаткиИЦены, ТаблицаОбновленияПакета); Если ТаблицаОбновленияПакета.Количество() = 0 Тогда Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; Продолжить; КонецЕсли; КоммерческаяИнформацияXDTO = КоммерческаяИнформация(Параметры.ДатаФормирования); ЗаполнитьИзмененияПакета(СтрокаТаблицыКаталога, ТаблицаОбновленияПакета, КоммерческаяИнформацияXDTO); // Записываем сформированный XDTO в каталог на диске. Параметры.Вставить("ИндексПорции",НомерСообщения); ЗаписатьДанныеВФайл(Параметры, КоммерческаяИнформацияXDTO, СтрокаТаблицыИнформации, ВыполнятьОбмен); Если Не ВыполнятьОбмен Тогда Продолжить; КонецЕсли; // Отправляем файл на сайт. Если Параметры.ВыгружатьНаСайт Тогда УдалитьРегистрацию = ВыгрузитьДанныеНаСайт(Параметры, СтрокаТаблицыИнформации); Иначе УдалитьРегистрацию = Истина; КонецЕсли; // Если файл на сайт был загружен, удаляем регистрацию. Если УдалитьРегистрацию Тогда Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; Иначе // Если имеем дело с данными, которые уже отправлялись на сайт, но не отправились // то не будем у них изменять номер сообщения. Если Не НомерСообщенияСтарый = Неопределено Тогда Продолжить; КонецЕсли; // Если товары не были отправлены на сайт, то зарегистрируем их в узле // и пометим номером сообщения отличным от нуля. Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; ПланыОбмена.ВыбратьИзменения(Параметры.УзелОбмена, НомерСообщения, МассивНоменклатуры); КонецЕсли; НомерСообщения = НомерСообщения + 1; КонецЦикла; Если ВыполнятьОбмен Тогда Результат = Перечисления.РезультатыОбменаССайтом.Выполнено; Иначе Результат = Перечисления.РезультатыОбменаССайтом.Ошибка; КонецЕсли; ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Результат, ТекстСообщения); Возврат ВыполнятьОбмен; КонецФункции Процедура УстановитьОтборКомпоновщика(Параметры, СтрокаТаблицыКаталога, КомпоновщикНастроек) Если Параметры.ВыгружатьИзменения Тогда ИзменитьОтборКомпоновщика(КомпоновщикНастроек, Параметры.ПрикладныеПараметры, СтрокаТаблицыКаталога.Группы, Параметры.СтруктураИзменений.Товары); Иначе ИзменитьОтборКомпоновщика(КомпоновщикНастроек, Параметры.ПрикладныеПараметры, СтрокаТаблицыКаталога.Группы); КонецЕсли; КонецПроцедуры Функция НоменклатураУзла(Узел, КоличествоЭлементов, НомерСообщения = Неопределено) ИмяСправочникаНоменклатура = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("Номенклатура"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ " + ?(КоличествоЭлементов = 0,"", "Первые "+ Формат(КоличествоЭлементов, "ЧГ=")) + " | Т.Ссылка КАК Номенклатура |ИЗ | Справочник."+ИмяСправочникаНоменклатура+".Изменения КАК Т |ГДЕ | Т.Узел = &Узел | И Выбор Когда &НомерСообщения = &Неопределено Тогда Истина | Иначе Т.НомерСообщения = &НомерСообщения | Конец"; Запрос.УстановитьПараметр("Узел", Узел); Запрос.УстановитьПараметр("Неопределено", Неопределено); Запрос.УстановитьПараметр("НомерСообщения", НомерСообщения); Результат = Запрос.Выполнить(); Возврат Результат.Выгрузить().ВыгрузитьКолонку("Номенклатура"); КонецФункции Функция НоменклатураНомерСообщенияУзла(УзелОбмена, КоличествоЭлементов) ИмяСправочникаНоменклатура = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("Номенклатура"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ " + ?(КоличествоЭлементов = 0,"", "Первые " + Формат(КоличествоЭлементов, "ЧГ="))+ " | Т.Ссылка КАК Номенклатура, | Т.НомерСообщения КАК НомерСообщения |ИЗ | Справочник."+ИмяСправочникаНоменклатура+".Изменения КАК Т |ГДЕ | Т.Узел = &Узел |УПОРЯДОЧИТЬ ПО | НомерСообщения"; Запрос.УстановитьПараметр("Узел", УзелОбмена); Результат = Запрос.Выполнить(); Возврат Результат.Выгрузить(); КонецФункции Функция ЗаказНомерСообщенияУзла(УзелОбмена, КоличествоЭлементов) ИмяДокументаЗаказы = ОбменССайтомПовтИсп.ИмяПрикладногоДокумента("ЗаказПокупателя"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ " + ?(КоличествоЭлементов = 0, "", "Первые " + Формат(КоличествоЭлементов, "ЧГ=")) + " | Т.Ссылка КАК Заказ, | Т.НомерСообщения КАК НомерСообщения |ИЗ | Документ."+ИмяДокументаЗаказы+".Изменения КАК Т |ГДЕ | Т.Узел = &Узел |УПОРЯДОЧИТЬ ПО | НомерСообщения"; Запрос.УстановитьПараметр("Узел", УзелОбмена); Результат = Запрос.Выполнить(); Возврат Результат.Выгрузить(); КонецФункции Функция ЗаказыУзла(Узел, КоличествоЭлементов, НомерСообщения = Неопределено) ИмяДокументаЗаказы = ОбменССайтомПовтИсп.ИмяПрикладногоДокумента("ЗаказПокупателя"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ " + ?(КоличествоЭлементов = 0, "", "Первые " + Формат(КоличествоЭлементов, "ЧГ=")) + " | Т.Ссылка КАК Заказ |ИЗ | Документ."+ИмяДокументаЗаказы+".Изменения КАК Т |ГДЕ | Т.Узел = &Узел | И Выбор Когда &НомерСообщения = &Неопределено Тогда Истина | Иначе Т.НомерСообщения = &НомерСообщения | Конец"; Запрос.УстановитьПараметр("Узел", Узел); Запрос.УстановитьПараметр("Неопределено", Неопределено); Запрос.УстановитьПараметр("НомерСообщения", НомерСообщения); Результат = Запрос.Выполнить(); Возврат Результат.Выгрузить().ВыгрузитьКолонку("Заказ"); КонецФункции Процедура ПолучитьДанныеВидыЦенПакетаПредложений(ДанныеПакетаПредложений, ТаблицаВидыЦен) ТаблицаВидыЦен = ДанныеПакетаПредложений.Скопировать(,"ТипЦены, |ТипЦеныНаименование, |ТипЦеныВалютаКод, |ТипЦеныЦенаВключаетНДС"); ТаблицаВидыЦен.Свернуть("ТипЦены, |ТипЦеныНаименование, |ТипЦеныВалютаКод, |ТипЦеныЦенаВключаетНДС"); УдалитьПустыеСтроки(ТаблицаВидыЦен, "ТипЦены"); КонецПроцедуры Процедура УдалитьПустыеСтроки(ТаблицаИсточник, ИмяКолонки) Счетчик = 0; Пока Счетчик < ТаблицаИсточник.Количество() Цикл СтрокаТаблицы = ТаблицаИсточник[Счетчик]; Если Не ЗначениеЗаполнено(СтрокаТаблицы[ИмяКолонки]) Тогда ТаблицаИсточник.Удалить(Счетчик); Иначе Счетчик = Счетчик + 1; КонецЕсли; КонецЦикла; КонецПроцедуры // Получаем таблицу, которая содержит информацию о складах, на которых есть остатки // и о точках самовывоза, указанных на форме. Процедура ПолучитьДанныеСкладыПакетаПредложений(ДанныеПакетаПредложений, Параметры, СкладыПакетаПредложений) СписокТочекСамовывоза = Параметры.ПрикладныеПараметры.СписокТочекСамовывоза; СписокСкладов = ДанныеПакетаПредложений.ВыгрузитьКолонку("Склад"); СкладыПакетаПредложений = Новый ТаблицаЗначений(); СкладыПакетаПредложений.Колонки.Добавить("Склад"); СкладыПакетаПредложений.Колонки.Добавить("СкладНаименование"); СкладыПакетаПредложений.Колонки.Добавить("СкладАдрес"); СкладыПакетаПредложений.Колонки.Добавить("СкладКонтактнаяИнформация"); СкладАдрес = Новый Структура("ПочтовыйИндекс, Страна, Регион, Район, |НаселенныйПункт, Город,Улица, Дом, Корпус, Квартира"); СкладКонтактнаяИнформация = Новый Структура("ТелефонРабочий, Почта, КоординатыНаКарте, Прочее"); ОбменССайтомПереопределяемый.ЗаполнитьИнформациюОСкладахИТочкахСамовывоза(СписокТочекСамовывоза, СписокСкладов, СкладыПакетаПредложений, СкладАдрес, СкладКонтактнаяИнформация); УдалитьПустыеСтроки(СкладыПакетаПредложений, "Склад"); КонецПроцедуры Функция ВыгрузитьПакетПредложений(Параметры, СтрокаТаблицыКаталога, ТаблицаИнформации, КаталогИПакетПредложений = Ложь) Если КаталогИПакетПредложений Тогда СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиКаталогПакетПредложений"); КомпоновщикНастроек = ПолучитьКомпоновщикНастроекСхемыКомпоновки(СхемаКомпоновки, СтрокаТаблицыКаталога.ХранилищеНастроекКаталогПакет); Иначе СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиПакетПредложений"); КомпоновщикНастроек = ПолучитьКомпоновщикНастроекСхемыКомпоновки(СхемаКомпоновки, СтрокаТаблицыКаталога.ХранилищеНастроекПакетПредложений); КонецЕсли; // Отборы. УстановитьОтборКомпоновщика(Параметры, СтрокаТаблицыКаталога, КомпоновщикНастроек); // Получаем данные для формирования "Пакета предложений". ОписаниеОшибки = ""; ТаблицаДанныеПакетаПредложений = Новый ТаблицаЗначений; ПолучитьДанныеДляВыгрузкиПакетаПредложений(Параметры.ПрикладныеПараметры, КомпоновщикНастроек, ТаблицаДанныеПакетаПредложений, ОписаниеОшибки,Параметры); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда ОбменССайтомСобытия.ЗаписатьОшибку(ОписаниеОшибки, Параметры.УзелОбмена); Возврат Ложь; КонецЕсли; Если ТаблицаДанныеПакетаПредложений.Количество() = 0 Тогда Возврат Истина; КонецЕсли; ДанныеОрганизацииВладельцаКаталога = Неопределено; ЗаполнитьДанныеВладельцаКаталога(Параметры, ДанныеОрганизацииВладельцаКаталога); // Из таблицы с данными пакета предложений. ВидыЦенПакетаПредложений = Неопределено; ПолучитьДанныеВидыЦенПакетаПредложений(ТаблицаДанныеПакетаПредложений, ВидыЦенПакетаПредложений); СкладыПакетаПредложений = Неопределено; ПолучитьДанныеСкладыПакетаПредложений(ТаблицаДанныеПакетаПредложений, Параметры, СкладыПакетаПредложений); КолонкаНоменклатуры = ТаблицаДанныеПакетаПредложений.ВыгрузитьКолонку("Номенклатура"); МассивНоменклатуры = Новый Массив; ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивНоменклатуры, КолонкаНоменклатуры, Истина); // Регистрируем номенклатуру в узле. Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; // Помечаем зарегистрированную в узле номенклатуру номером сообщения 0. ПланыОбмена.ВыбратьИзменения(Параметры.УзелОбмена, 0, МассивНоменклатуры); ИндексФайлаОбмена = Параметры.ИндексФайлаОбмена; СтруктураРезультата = Параметры.СтруктураРезультата; СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); СтрокаТаблицыИнформации.ДействиеПриОбмене = Перечисления.ДействияПриОбменеССайтом.ВыгрузкаДанных; СтрокаТаблицыИнформации.Описание = Строка(ТекущаяДатаСеанса()) + " " + НСтр("ru = 'Запуск выгрузки пакета предложений'"); ТекстСообщения = "ru = 'Завершена выгрузка пакета предложений'"; ИндексПорции = 0; НомерСообщения = 1; НомерСообщенияСтарый = Неопределено; КоличествоПовторов = 0; КоммерческаяИнформацияXDTO = КоммерческаяИнформация(Параметры.ДатаФормирования); ПерваяИтерация = Истина; ВыполнятьОбмен = Истина; ВыгруженоУспешно = Истина; Пока ВыполнятьОбмен Цикл // Получаем порцию товаров. МассивНоменклатуры = НоменклатураУзла(Параметры.УзелОбмена, Параметры.РазмерПорции, 0); // Если в узле нет новых товаров, проверим старые. Если МассивНоменклатуры.Количество() = 0 Тогда // ╒══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╕ // что за "старые" товары???? Из-за этого блока, наши отбракованные товары (без артикула, картинок...) попадают сюда // и повторно выгружаются. Хуже того, ниже по тексту они помечаюися как выгруженные - реквизитом У1С_ДатаПоследнейВыгрузкиНаСайт Прервать; // и всё тут. погядим что, как. // ╘══════════════ Ушаков С.И. 20 января 2018 г. ════════════════╛ ТаблицаНоменклатуры = НоменклатураНомерСообщенияУзла(Параметры.УзелОбмена, Параметры.РазмерПорции); Если ТаблицаНоменклатуры.Количество() = 0 Тогда Прервать; КонецЕсли; Если НомерСообщенияСтарый = ТаблицаНоменклатуры[0].НомерСообщения Тогда КоличествоПовторов = КоличествоПовторов + 1; КонецЕсли; // Если количество повторов больше заданного // прерываем обмен. Если КоличествоПовторов >= Параметры.КоличествоПовторов Тогда ВыполнятьОбмен = Ложь; Если Параметры.КоличествоПовторов > 0 Тогда ВыгруженоУспешно = Ложь КонецЕсли; Прервать; КонецЕсли; МассивНоменклатуры = ТаблицаНоменклатуры.ВыгрузитьКолонку("Номенклатура"); НомерСообщенияСтарый = ТаблицаНоменклатуры[0].НомерСообщения; КонецЕсли; ТаблицаДляФормированияПакетаПредложений = ТаблицаДанныеПакетаПредложений.СкопироватьКолонки(); ТаблицаДляФормированияПакетаПредложений.Колонки.Добавить("Цены"); // в эту колонку поместим таблицу значений, содержащую цены номенклатуры ТаблицаДляФормированияПакетаПредложений.Колонки.Добавить("ОстаткиПоСкладам"); // в эту колонку поместим таблицу значений, содержащую остатки по складам // Получаем порцию данных из общей таблицы. // Т.к. данные в основной таблице хранятся в развернутом виде (количество строк будет равно количеству типов цен и/ или складов, например,) // необходимо свернуть их по номенклатуре, характеристике , единице измерения. ЗаполнитьТаблицуФормированияПакетаПредложений(МассивНоменклатуры, ТаблицаДанныеПакетаПредложений, ТаблицаДляФормированияПакетаПредложений); Если ТаблицаДляФормированияПакетаПредложений.Количество() = 0 Тогда Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; Продолжить; КонецЕсли; ПакетCML = ПакетCML(); ПакетПредложенийXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("ПакетПредложений")); ПакетПредложенийXDTO.Владелец = ПолучитьКонтрагентаXDTO(ДанныеОрганизацииВладельцаКаталога); Если ПерваяИтерация Тогда КлассификаторТип = ПакетCML.Получить("Классификатор"); КлассификаторXDTO = ФабрикаXDTO.Создать(КлассификаторТип); КлассификаторXDTO.ИД = СтрокаТаблицыКаталога.ИдентификаторКаталога; КлассификаторXDTO.Наименование = ФорматНаименованияДляXDTO("Классификатор (" + СтрокаТаблицыКаталога.Каталог + ")"); КлассификаторXDTO.Владелец = ПолучитьКонтрагентаXDTO(ДанныеОрганизацииВладельцаКаталога);; ЗаполнитьСвойстваПредложений(КлассификаторXDTO, ТаблицаДляФормированияПакетаПредложений); КоммерческаяИнформацияXDTO.Классификатор = КлассификаторXDTO; КлассификаторXDTO.Проверить(); ПерваяИтерация = Ложь; КонецЕсли; ДобавитьВидыЦенВПакетПредложенийXDTO(ВидыЦенПакетаПредложений, ПакетПредложенийXDTO, Параметры); ДобавитьСкладыВПакетПредложений(СкладыПакетаПредложений, ПакетПредложенийXDTO, Параметры); // ╒══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╕ У1С_ДобавитьНовыеПоступленияВПакетПредложенийXDTO(МассивНоменклатуры, ПакетПредложенийXDTO, Параметры); // ╘══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╛ ПакетПредложенийXDTO.СодержитТолькоИзменения = Параметры.ВыгружатьИзменения Или (НомерСообщения > 1); ПакетПредложенийXDTO.Ид = СтрокаТаблицыКаталога.ИдентификаторКаталога + "#"; Шаблон = НСтр("ru = 'Пакет предложений ( %1 )'"); ИмяПакета = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, СтрокаТаблицыКаталога.Каталог); ПакетПредложенийXDTO.Наименование = ИмяПакета; ПакетПредложенийXDTO.ИдКаталога = СтрокаТаблицыКаталога.ИдентификаторКаталога; ПакетПредложенийXDTO.ИдКлассификатора = СтрокаТаблицыКаталога.ИдентификаторКаталога; ДобавитьПредложенияВПакетПредложенийXDTO(ПакетПредложенийXDTO, ТаблицаДляФормированияПакетаПредложений, Параметры); КоммерческаяИнформацияXDTO.ПакетПредложений = ПакетПредложенийXDTO; ИндексПорции = ИндексПорции + 1; ИмяФайлаПрайса = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\offers" + ИндексФайлаОбмена +"_" + ИндексПорции + ".xml"); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайлаПрайса, "UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); Попытка КоммерческаяИнформацияXDTO.Проверить(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КоммерческаяИнформацияXDTO, "КоммерческаяИнформация"); ЗаписьXML.Закрыть(); Исключение ОписаниеИсключительнойОшибки = ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать XML-файл пакета предложений на диск:'") + " " + ИмяФайлаПрайса + Символы.ПС + ОписаниеОшибки()); ДобавитьОписаниеОшибки(СтруктураРезультата.ОписаниеОшибки, ОписаниеИсключительнойОшибки); СтруктураРезультата.ВыгруженоПредложений = 0; ТекстСообщенияОбОшибке = НСтр("ru = 'Ошибка записи пакета предложений на диск.'") + Символы.ПС + НСтр("ru = 'Подробности см. в Журнале регистрации.'"); СообщитьОбОшибке(Параметры.УзелОбмена, ТекстСообщенияОбОшибке); ДобавитьОписаниеОшибки(СтруктураРезультата.ОписаниеОшибки, ОписаниеИсключительнойОшибки); ДобавитьОписаниеОшибки(СтрокаТаблицыИнформации.Описание, СтруктураРезультата.ОписаниеОшибки); ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Перечисления.РезультатыОбменаССайтом.Ошибка, ТекстСообщения); Возврат Ложь; КонецПопытки; // Отправляем файл на сайт. Если Параметры.ВыгружатьНаСайт Тогда ВыгруженоУспешно = ВыгрузитьДанныеНаСайт(Параметры, СтрокаТаблицыИнформации); Иначе ВыгруженоУспешно = Истина; КонецЕсли; // Если файл на сайт был загружен, удаляем регистрацию. Если ВыгруженоУспешно Тогда МассивУзловТовары = ОбменССайтомПовтИсп.МассивУзловДляРегистрации(Истина); Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл // ╒══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╕ // запомним дату обмена с сайтом Если Параметры.ВыгружатьНаСайт Тогда НомОбъ = ЭлементМассива.ПолучитьОбъект(); //+Филиппенко В.Б. Добавил сохранение выгруженных файлов картинок УИД = СтрЗаменить(ЭлементМассива.УникальныйИдентификатор(),"-",""); АдресаСохраненныхКартинок = Параметры.ВыгруженныеКартинки.НайтиСтроки(Новый Структура("УИД", УИД)); Если АдресаСохраненныхКартинок.Количество() > 0 Тогда НомОбъ.СписокВыгруженныхФайлов.Очистить(); Для Каждого АдресСохраненнойКартинки из АдресаСохраненныхКартинок Цикл Если НЕ АдресСохраненнойКартинки.Удалить И АдресСохраненнойКартинки.Выгружен Тогда НСтр = НомОбъ.СписокВыгруженныхФайлов.Добавить(); НСтр.ИмяФайла = АдресСохраненнойКартинки.ИмяФайла; НСтр.ДатаИзмененияФайла = АдресСохраненнойКартинки.ДатаИзменения; КонецЕсли; КонецЦикла; КонецЕсли; //-Филиппенко В.Б. Добавил сохранение выгруженных файлов картинок Если НЕ ПустаяСтрока(ЭлементМассива.Описание) И НЕ ПустаяСтрока(ЭлементМассива.НаименованиеПолное) И НЕ ПустаяСтрока(ЭлементМассива.Артикул) // ИЛИ ЭлементМассива.ОстатокНаСкладе <= 0 // ИЛИ ЭлементМассива.ЦенаЗаЕдиницу <= 0 // при выгрузке каталога остаток и цена не вычисляются, всегда = 0 // поэтому вычислим отдельно И У1С_Доработки.ОстатокНоменклатуры(ЭлементМассива) > 0 И У1С_Доработки.ЦенаНоменклатуры(ЭлементМассива) > 0 // при выгрузке предложений картинок в таблице нет // ИЛИ ТаблицаФайлы.НайтиСтроки(Новый Структура("Номенклатура", СтрНом.Номенклатура)) = 0 // поэтому проверяем отдельно И У1С_Доработки.УНоменклатурыЕстьКартинка(ЭлементМассива) Тогда НомОбъ.У1С_ДатаПоследнейВыгрузкиНаСайт = ТекущаяДата(); // обновляем только для корректных товаров КонецЕсли; НомОбъ.ОбменДанными.Загрузка = Истина; // отключение проверок НомОбъ.Записать(); КонецЕсли; // ╘══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╛ Для каждого Узел Из МассивУзловТовары Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Узел, ЭлементМассива); КонецЦикла; КонецЦикла; Иначе // Если мы имеем дело с данными, которые уже отправлялись на сайт, но не отправились // то не будем у них изменять номер сообщения . Если Не НомерСообщенияСтарый = Неопределено Тогда Продолжить; КонецЕсли; // Если товары не были отправлены на сайт, то зарегистрируем их в узле // и пометим номером сообщения отличным от нуля. Для Каждого ЭлементМассива Из МассивНоменклатуры Цикл ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; ПланыОбмена.ВыбратьИзменения(Параметры.УзелОбмена, НомерСообщения, МассивНоменклатуры); КонецЕсли; НомерСообщения = НомерСообщения + 1; КонецЦикла; Если ВыгруженоУспешно Тогда Результат = Перечисления.РезультатыОбменаССайтом.Выполнено; Иначе Результат = Перечисления.РезультатыОбменаССайтом.Ошибка; КонецЕсли; ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Результат, ТекстСообщения); Возврат ВыгруженоУспешно; КонецФункции Процедура ЗаполнитьСвойстваПредложений(КлассификаторXDTO, ТаблицаДляФормированияПакетаПредложений) СвойстваПредложений = Новый Массив; Характеристики = ТаблицаДляФормированияПакетаПредложений.ВыгрузитьКолонку("Характеристика"); ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СвойстваПредложений, Характеристики, Истина); СвойстваИЗначения = Новый Соответствие; Для Каждого Характеристика Из СвойстваПредложений Цикл Если Не ЗначениеЗаполнено(Характеристика) Тогда Продолжить; КонецЕсли; Для Каждого СвойстваХарактеристик Из Характеристика.ДополнительныеРеквизиты Цикл Значения = СвойстваИЗначения.Получить(СвойстваХарактеристик.Свойство); Если Значения = Неопределено Тогда Значения = Новый Массив; Значения.Добавить(СвойстваХарактеристик.Значение); СвойстваИЗначения.Вставить(СвойстваХарактеристик.Свойство, Значения); Иначе Если Значения.Найти(СвойстваХарактеристик.Значение) = Неопределено Тогда Значения.Добавить(СвойстваХарактеристик.Значение); КонецЕсли; КонецЕсли; КонецЦикла; КонецЦикла; ПакетCML = ПакетCML(); ТипСвойство = ПакетCML.Получить("Свойство"); СвойстваТип = КлассификаторXDTO.Свойства().Получить("Свойства").Тип; СвойстваXDTO = ФабрикаXDTO.Создать(СвойстваТип); Для Каждого КлючИЗначение Из СвойстваИЗначения Цикл Свойство = КлючИЗначение.Ключ; СвойствоXDTO = ФабрикаXDTO.Создать(ТипСвойство); СвойствоXDTO.ДляПредложений = Истина; СвойствоXDTO.ИД = Строка(Свойство.УникальныйИдентификатор()); Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Заголовок",Свойство.Метаданные()) Тогда СвойствоXDTO.Наименование = ФорматНаименованияДляXDTO(Свойство.Заголовок); Иначе СвойствоXDTO.Наименование = ФорматНаименованияДляXDTO(Свойство); КонецЕсли; ЗначенияСвойства = КлючИЗначение.Значение; Типы = КлючИЗначение.Ключ.ТипЗначения.Типы(); ТипXML = "Строка"; Если Типы.Количество() <> 1 Тогда СвойствоXDTO.ТипЗначений = ТипXML; Иначе Тип = Типы[0]; Если Тип = Тип("Число") Тогда ТипXML = "Число"; ИначеЕсли Тип = Тип("Дата") Тогда ТипXML = "Время"; ИначеЕсли ТипЗначенияСправочник(Тип) Тогда ТипXML = "Справочник"; КонецЕсли; СвойствоXDTO.ТипЗначений = ТипXML; Если ТипXML = "Справочник" Тогда ВариантыЗначенийСвойстваТип = ТипСвойство.Свойства.Получить("ВариантыЗначений").Тип; СправочникТип = ВариантыЗначенийСвойстваТип.Свойства.Получить("Справочник").Тип; ВариантыЗначенийXDTO = ФабрикаXDTO.Создать(ВариантыЗначенийСвойстваТип); Для Каждого ВариантЗначения Из ЗначенияСвойства Цикл Значение = Лев(ВариантЗначения, 1000); Если ПустаяСтрока(Значение) Тогда Продолжить; КонецЕсли; СправочникXDTO = ФабрикаXDTO.Создать(СправочникТип); СправочникXDTO.ИдЗначения = Строка(ВариантЗначения.УникальныйИдентификатор()); СправочникXDTO.Значение = Значение; ВариантыЗначенийXDTO.Справочник.Добавить(СправочникXDTO); КонецЦикла; СвойствоXDTO.ВариантыЗначений = ВариантыЗначенийXDTO; КонецЕсли; КонецЕсли; СвойстваXDTO.Свойство.Добавить(СвойствоXDTO); КонецЦикла; Если СвойстваXDTO.Свойство.Количество() > 0 Тогда КлассификаторXDTO.Свойства = СвойстваXDTO; КонецЕсли; КонецПроцедуры // Добавляет в классификатор номенклатуры дерево родителей номенклатуры // Параметры: // КлассификаторXDTO - XDTO объект, в который добавляется дерево. // ДеревоГрупп - дерево значений -дерево групп номенклатуры. // ПакетCML - XDTO объект, содержащий описание элемента "Группы". // Процедура ДобавитьГруппыКлассификатораXDTO(КлассификаторXDTO, ДеревоГрупп, ПакетCML, ПрикладныеПараметры) ГруппыКлассификатораТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("Классификатор"), "Группы"); ГруппыКлассификатораXDTO = ФабрикаXDTO.Создать(ГруппыКлассификатораТип); ЗаполнитьГруппыКлассификатораXDTO(ГруппыКлассификатораXDTO, ДеревоГрупп, ПакетCML, ПрикладныеПараметры); Если ГруппыКлассификатораXDTO.Группа.Количество() > 0 Тогда КлассификаторXDTO.Группы = ГруппыКлассификатораXDTO; КонецЕсли; КонецПроцедуры Процедура ЗаполнитьГруппыКлассификатораXDTO(ГруппыКлассификатораXDTO, ДеревоГрупп, ПакетCML, ПрикладныеПараметры, ТекущийРодитель = Неопределено) Для Каждого СтрокаДерева Из ДеревоГрупп Цикл КлассифицироватьПоВидамНоменклатуры = Неопределено; ПрикладныеПараметры.Свойство("КлассифицироватьПоВидамНоменклатуры", КлассифицироватьПоВидамНоменклатуры); Если КлассифицироватьПоВидамНоменклатуры = Неопределено Или КлассифицироватьПоВидамНоменклатуры = Ложь Тогда Если Не ЗначениеЗаполнено(СтрокаДерева.Номенклатура) Тогда Продолжить; КонецЕсли; Если НЕ СтрокаДерева.Номенклатура.ЭтоГруппа Тогда Продолжить; КонецЕсли; КонецЕсли; Если СтрокаДерева.Номенклатура = ТекущийРодитель Тогда Продолжить; КонецЕсли; ГруппаXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("Группа")); ИдГруппы = УникальныйИдентификаторОбъекта(СтрокаДерева.Номенклатура); ИмяГруппы = СтрокаДерева.Номенклатура.Наименование; ГруппаXDTO.Ид = ИдГруппы; ГруппаXDTO.Наименование = ФорматНаименованияДляXDTO(ИмяГруппы); ГруппыXDTO = ГруппыНоменклатурыXDTO(СтрокаДерева.Строки, ПакетCML, СтрокаДерева.Номенклатура, КлассифицироватьПоВидамНоменклатуры); Если ГруппыXDTO.Группа.Количество() > 0 Тогда ГруппаXDTO.Группы = ГруппыXDTO; КонецЕсли; ГруппыКлассификатораXDTO.Группа.Добавить(ГруппаXDTO); КонецЦикла; КонецПроцедуры // Рекурсивно формирует Объект XDTO, содержащий иерархию групп номенклатуры. // // Параметры: // ДеревоГрупп - Дерево значений // СписокГрупп - список значений, группы выгружаемого каталога // ТекущийРодитель - СправочникСсылка.Номенклатура. // // Возвращаемое значение: // ОбъектXDTO - объект, содержащий иерархию групп. // Функция ГруппыНоменклатурыXDTO(ДеревоГрупп, ПакетCML, ТекущийРодитель = Неопределено, КлассифицироватьПоВидамНоменклатуры = Неопределено) ГруппыТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("Группа"), "Группы"); ГруппыXDTO = ФабрикаXDTO.Создать(ГруппыТип); Для Каждого СтрокаДерева Из ДеревоГрупп Цикл Если КлассифицироватьПоВидамНоменклатуры = Неопределено Или КлассифицироватьПоВидамНоменклатуры = Ложь Тогда Если НЕ СтрокаДерева.Номенклатура.ЭтоГруппа И НЕ ТипЗнч(СтрокаДерева.Номенклатура) = Тип("СправочникСсылка.ПодкатегорииТоваров") Тогда//IT Продолжить; КонецЕсли; КонецЕсли; Если СтрокаДерева.Номенклатура = ТекущийРодитель Тогда Продолжить; КонецЕсли; ГруппаXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("Группа")); ИдГруппы = УникальныйИдентификаторОбъекта(СтрокаДерева.Номенклатура); ИмяГруппы = СтрокаДерева.Номенклатура.Наименование; ГруппаXDTO.Ид = ИдГруппы; ГруппаXDTO.Наименование = ФорматНаименованияДляXDTO(ИмяГруппы); Если СтрокаДерева.Строки.Количество() > 0 Тогда ГруппыОбъектXDTO = ГруппыНоменклатурыXDTO(СтрокаДерева.Строки, ПакетCML, СтрокаДерева.Номенклатура, КлассифицироватьПоВидамНоменклатуры); Если ГруппыОбъектXDTO.Группа.Количество() > 0 Тогда ГруппаXDTO.Группы = ГруппыОбъектXDTO; КонецЕсли; КонецЕсли; ГруппыXDTO.Группа.Добавить(ГруппаXDTO); КонецЦикла; Возврат ГруппыXDTO; КонецФункции // Добавляет свойства Номенклатуры в список свойств объекта XDTO типа Классификатор. // // Параметры // КлассификаторXDTO - объект XDTO типа Классификатор // ПакетCML - пакет XDTO // ВыборкаСвойствНоменклатуры - выборка, содержащая свойства Номенклатуры. // Процедура ДобавитьСвойстваНоменклатурыВКлассификаторXDTO(КлассификаторXDTO, ПакетCML, ВыборкаСвойствНоменклатуры) Если ВыборкаСвойствНоменклатуры.Количество() = 0 Тогда Возврат; КонецЕсли; СвойстваТип = КлассификаторXDTO.Свойства().Получить("Свойства").Тип; СвойстваXDTO = ФабрикаXDTO.Создать(СвойстваТип); Пока ВыборкаСвойствНоменклатуры.Следующий() Цикл Если Не ЗначениеЗаполнено(ВыборкаСвойствНоменклатуры.ТипЗначения) Тогда Продолжить; КонецЕсли; ТипСвойство = ПакетCML.Получить("Свойство"); СвойствоXDTO = ФабрикаXDTO.Создать(ТипСвойство); СвойствоXDTO.ИД = Строка(ВыборкаСвойствНоменклатуры.Свойство.УникальныйИдентификатор()); Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Заголовок",ВыборкаСвойствНоменклатуры.Свойство.Метаданные()) Тогда СвойствоXDTO.Наименование = ФорматНаименованияДляXDTO(ВыборкаСвойствНоменклатуры.Свойство.Заголовок); Иначе СвойствоXDTO.Наименование = ФорматНаименованияДляXDTO(ВыборкаСвойствНоменклатуры.Свойство); КонецЕсли; Типы = ВыборкаСвойствНоменклатуры.ТипЗначения.Типы(); ТипXML = "Строка"; Если Типы.Количество() <> 1 Тогда // По стандарту CML можно выгрузить только один тип значений. // Выгружаем тип "Строка", как универсальный тип. СвойствоXDTO.ТипЗначений = ТипXML; Иначе Тип = Типы[0]; Если Тип = Тип("Число") Тогда ТипXML = "Число"; ИначеЕсли Тип = Тип("Дата") Тогда ТипXML = "Время"; ИначеЕсли ТипЗначенияСправочник(Тип) Тогда ТипXML = "Справочник"; КонецЕсли; СвойствоXDTO.ТипЗначений = ТипXML; Если ТипXML = "Справочник" Тогда ВариантыЗначенийСвойстваТип = ТипСвойство.Свойства.Получить("ВариантыЗначений").Тип; СправочникТип = ВариантыЗначенийСвойстваТип.Свойства.Получить("Справочник").Тип; ВариантыЗначенийXDTO = ФабрикаXDTO.Создать(ВариантыЗначенийСвойстваТип); ВариантыЗначений = ВариантыЗначенийСвойстваПоТипу(ВыборкаСвойствНоменклатуры, Тип); Для Каждого ВариантЗначения Из ВариантыЗначений Цикл Значение = Лев(ВариантЗначения, 1000); Если ПустаяСтрока(Значение) Тогда Продолжить; КонецЕсли; СправочникXDTO = ФабрикаXDTO.Создать(СправочникТип); СправочникXDTO.ИдЗначения = Строка(ВариантЗначения.УникальныйИдентификатор()); СправочникXDTO.Значение = Значение; ВариантыЗначенийXDTO.Справочник.Добавить(СправочникXDTO); КонецЦикла; СвойствоXDTO.ВариантыЗначений = ВариантыЗначенийXDTO; КонецЕсли; КонецЕсли; СвойстваXDTO.Свойство.Добавить(СвойствоXDTO); КонецЦикла; Если СвойстваXDTO.Свойство.Количество() > 0 Тогда КлассификаторXDTO.Свойства = СвойстваXDTO; КонецЕсли; КонецПроцедуры // Заполняет список товаров объекта XDTO типа Каталог // // Параметры // КаталогXDTO - объект XDTO типа Каталог // ПакетCML - пакет XDTO // Параметры - структура, содержащая параметры обмена. // Процедура ДобавитьНоменклатуруВКаталогXDTO(КаталогXDTO, ПакетCML, Параметры, ТаблицаНоменклатуры) Экспорт ТоварыТип = КаталогXDTO.Свойства().Получить("Товары").Тип; ТоварыXDTO = ФабрикаXDTO.Создать(ТоварыТип); //Доработка+ ТаблицаЦикла = ТаблицаНоменклатуры.Скопировать(); ТаблицаЦикла.Колонки.Удалить("НоменклатураРодитель"); КолонкиТЧ = ""; Для Каждого Колонка ИЗ ТаблицаЦикла.Колонки Цикл КолонкиТЧ = "" + КолонкиТЧ + Колонка.Имя + ", "; КонецЦикла; КолонкиТЧ = Лев(КолонкиТЧ, СтрДлина(КолонкиТЧ) - 2); ТаблицаЦикла.Свернуть(КолонкиТЧ); Для Каждого ТекСтрока Из ТаблицаЦикла Цикл СтрокиТоваров = ТаблицаНоменклатуры.НайтиСтроки(Новый Структура("Номенклатура", ТекСтрока.Номенклатура)); МассивПодкатегорий = Новый Массив; Для Каждого Строка из СтрокиТоваров Цикл МассивПодкатегорий.Добавить(Строка.НоменклатураРодитель); КонецЦикла; ДобавитьНоменклатуруXDTO(ТоварыXDTO, ПакетCML, ТекСтрока, Параметры, МассивПодкатегорий); //Доработка- КонецЦикла; Если ТоварыXDTO.Товар.Количество() > 0 Тогда КаталогXDTO.Товары = ТоварыXDTO; КонецЕсли; КонецПроцедуры // Создает объект XDTO БазоваяЕдиница и заполняет данными // Функция БазоваяЕдиницаXDTO(ТоварXDTO, ДанныеЕдиницы) ПакетCML = ПакетCML(); СвойствоБазоваяЕдиница = ПакетCML.Получить("Товар").Свойства.Получить("БазоваяЕдиница"); ТипБазоваяЕдиница = СвойствоБазоваяЕдиница.Тип; БазоваяЕдиницаXDTO = ФабрикаXDTO.Создать(ТипБазоваяЕдиница); Если СтрДлина(ДанныеЕдиницы.ЕдиницаИзмеренияКод) >= 3 Тогда БазоваяЕдиницаXDTO.Код = ДанныеЕдиницы.ЕдиницаИзмеренияКод; КонецЕсли; Если НЕ ПустаяСтрока(ДанныеЕдиницы.ЕдиницаИзмеренияНаименованиеПолное) Тогда БазоваяЕдиницаXDTO.НаименованиеПолное = ДанныеЕдиницы.ЕдиницаИзмеренияНаименованиеПолное; Иначе Если ТипЗнч(ДанныеЕдиницы) = Тип("Структура") Тогда Если Не ПустаяСтрока(ДанныеЕдиницы.ЕдиницаИзмеренияНаименование) Тогда БазоваяЕдиницаXDTO.НаименованиеПолное = ДанныеЕдиницы.ЕдиницаИзмеренияНаименование; КонецЕсли; ИначеЕсли ТипЗнч(ДанныеЕдиницы) = Тип("СтрокаТаблицыЗначений") Тогда Если Не ПустаяСтрока(ДанныеЕдиницы.ЕдиницаИзмерения.Наименование) Тогда БазоваяЕдиницаXDTO.НаименованиеПолное = ДанныеЕдиницы.ЕдиницаИзмерения.Наименование; КонецЕсли; КонецЕсли; КонецЕсли; Если НЕ ПустаяСтрока(ДанныеЕдиницы.ЕдиницаИзмеренияМеждународноеСокращение) Тогда БазоваяЕдиницаXDTO.МеждународноеСокращение = ДанныеЕдиницы.ЕдиницаИзмеренияМеждународноеСокращение; КонецЕсли; Если ЗначениеЗаполнено(ДанныеЕдиницы.ЕдиницаИзмеренияПересчетЕдиница) Тогда Если СтрДлина(ДанныеЕдиницы.ЕдиницаИзмеренияПересчетЕдиница) >= 3 Тогда ТипПересчет = ТипБазоваяЕдиница.Свойства.Получить("Пересчет").Тип; ПересчетXDTO = ФабрикаXDTO.Создать(ТипПересчет); ПересчетXDTO.Коэффициент = ДанныеЕдиницы.ЕдиницаИзмеренияПересчетКоэф; ПересчетXDTO.Единица = Лев(ДанныеЕдиницы.ЕдиницаИзмеренияПересчетЕдиница, 3); БазоваяЕдиницаXDTO.Пересчет.Добавить(ПересчетXDTO); КонецЕсли; КонецЕсли; Возврат БазоваяЕдиницаXDTO; КонецФункции // Добавляет объект XDTO типа Товар в список товаров объекта XDTO типа Каталог // // Параметры // ТоварыXDTO - объект XDTO типа Товары // ПакетCML - пакет XDTO // ДополнительныеДанные - структура, содержащая информацию по изображениям номенклатуры и значения свойств // Параметры - структура, содержащая параметры обмена. // Процедура ДобавитьНоменклатуруXDTO(ТоварыXDTO, ПакетCML, ДанныеНоменклатуры, Параметры, МассивПодкатегорий ) СтруктураРезультата = Параметры.СтруктураРезультата; ТоварТип = ПакетCML.Получить("Товар"); ТоварXDTO = ФабрикаXDTO.Создать(ТоварТип); Если ДанныеНоменклатуры.НоменклатураПометкаУдаления Тогда ТоварXDTO.Статус = "Удален"; КонецЕсли; Ид = УникальныйИдентификаторОбъекта(ДанныеНоменклатуры.Номенклатура, ДанныеНоменклатуры.Характеристика); ТоварXDTO.Ид = Ид; Штрихкод = ПолучитьШтрихкодДляXDTO(ДанныеНоменклатуры.НоменклатураШтрихКод); Если ЗначениеЗаполнено(Штрихкод) Тогда ТоварXDTO.Штрихкод = ШтрихКод; КонецЕсли; ТоварXDTO.Артикул = ДанныеНоменклатуры.НоменклатураАртикул; Наименование = ДанныеНоменклатуры.НоменклатураНаименование; Если ЗначениеЗаполнено(ДанныеНоменклатуры.Характеристика) Тогда Наименование = Наименование + " (" + ДанныеНоменклатуры.Характеристика + ")"; КонецЕсли; ТоварXDTO.Наименование = ФорматНаименованияДляXDTO(Наименование); ТоварXDTO.БазоваяЕдиница = БазоваяЕдиницаXDTO(ТоварXDTO, ДанныеНоменклатуры); //Доработка+ ИдГруппы = ""; //Если ЗначениеЗаполнено(ДанныеНоменклатуры.НоменклатураРодитель) Тогда Если МассивПодкатегорий.Количество() > 0 Тогда ГруппыТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "Группы"); ГруппыXDTO = ФабрикаXDTO.Создать(ГруппыТип); Для каждого Подкатегория Из МассивПодкатегорий Цикл //ИдГруппы = УникальныйИдентификаторОбъекта(ДанныеНоменклатуры.НоменклатураРодитель); ИдГруппы = УникальныйИдентификаторОбъекта(Подкатегория); Если НЕ ПустаяСтрока(ИдГруппы) Тогда ГруппыXDTO.Ид.Добавить(ИдГруппы); КонецЕсли; КонецЦикла; //Доработка- ТоварXDTO.Группы = ГруппыXDTO; КонецЕсли; // Производитель Если ЗначениеЗаполнено(ДанныеНоменклатуры.НоменклатураПроизводитель) Тогда Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ДанныеНоменклатуры.НоменклатураПроизводитель) Тогда ИДИзготовитель = УникальныйИдентификаторОбъекта(ДанныеНоменклатуры.НоменклатураПроизводитель) Иначе ИДИзготовитель = Строка(Новый УникальныйИдентификатор); КонецЕсли; ИзготовительТип = ПакетCML.Получить("Контрагент"); ИзготовительXDTO = ФабрикаXDTO.Создать(ИзготовительТип); ИзготовительXDTO.Ид = ИДИзготовитель; ИзготовительXDTO.Наименование = Строка(ДанныеНоменклатуры.НоменклатураПроизводитель); ТоварXDTO.Изготовитель = ИзготовительXDTO; КонецЕсли; // Ставка НДС Если ЗначениеЗаполнено(ДанныеНоменклатуры.НоменклатураСтавкаНДСЗначение) Тогда СтавкиНалоговТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "СтавкиНалогов"); СтавкаНалогаТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(СтавкиНалоговТип, "СтавкаНалога"); СтавкаНалога = ФабрикаXDTO.Создать(СтавкаНалогаТип); СтавкаНалога.Наименование = НСтр("ru = 'НДС'"); СтавкаНалога.Ставка = СтрЗаменить(Строка(ДанныеНоменклатуры.НоменклатураСтавкаНДСЗначение), "%",""); СтавкиНалогов = ФабрикаXDTO.Создать(СтавкиНалоговТип); СтавкиНалогов.СтавкаНалога.Добавить(СтавкаНалога); ТоварXDTO.СтавкиНалогов = СтавкиНалогов; КонецЕсли; ЗаполнитьХарактеристикиСтрокиТоваров(ТоварXDTO, ДанныеНоменклатуры); ТоварXDTO.Описание = ДанныеНоменклатуры.НоменклатураОписание; ОписанияФайлов = Новый Соответствие; ДобавитьАдресаИзображенийНоменклатурыXDTO(ТоварXDTO, ДанныеНоменклатуры, ОписанияФайлов, Параметры); ДобавитьЗначенияСвойствНоменклатурыXDTO(ТоварXDTO, ДанныеНоменклатуры.Свойства); ЗначенияРеквизитовТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "ЗначенияРеквизитов"); ЗначенияРеквизитовXDTO = ФабрикаXDTO.Создать(ЗначенияРеквизитовТип); Для Каждого ОписаниеФайла Из ОписанияФайлов Цикл Файл = ОписаниеФайла.Ключ; Описание = ОписаниеФайла.Значение; ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ОписаниеФайла", Файл + "#" + Описание); КонецЦикла; Если ЗначениеЗаполнено(ДанныеНоменклатуры.НоменклатураФайлОписанияHTML) Тогда ОписаниеВФорматеHTML = ТекстHTMLИзФайла(ДанныеНоменклатуры.НоменклатураФайлОписанияHTML); Если НЕ ПустаяСтрока(ОписаниеВФорматеHTML) Тогда Если СтрДлина(ОписаниеВФорматеHTML) <= 1000 Тогда ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ОписаниеВФорматеHTML", ОписаниеВФорматеHTML); КонецЕсли; КонецЕсли; КонецЕсли; ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Код", ДанныеНоменклатуры.НоменклатураКод); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ВидНоменклатуры", ДанныеНоменклатуры.НоменклатураВидНоменклатуры); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ТипНоменклатуры", ДанныеНоменклатуры.НоменклатураТипНоменклатуры); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru ='Полное наименование'"), ДанныеНоменклатуры.НоменклатураНаименованиеПолное); // ╒══════════════ Ушаков С.И. 26 января 2018 г. ════════════════╕ Если ДанныеНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда Запрос = Новый Запрос( "ВЫБРАТЬ | ВариантыКомплектацииНоменклатурыТовары.Номенклатура КАК Номенклатура, | ВариантыКомплектацииНоменклатурыТовары.Количество КАК Количество, | ВариантыКомплектацииНоменклатурыТовары.Номенклатура.ВесЧислитель КАК Вес |ИЗ | Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК ВариантыКомплектацииНоменклатурыТовары |ГДЕ | ВариантыКомплектацииНоменклатурыТовары.Ссылка.Владелец = &Владелец"); Запрос.УстановитьПараметр("Владелец", ДанныеНоменклатуры.Номенклатура); ВыбНабор = Запрос.Выполнить().Выбрать(); лВес = 0; Пока ВыбНабор.Следующий() Цикл Если ВыбНабор.Вес = 0 Тогда лВес = 0; // не указан вес комплектующей - косяк. Прервать; Иначе лВес = лВес + ВыбНабор.Вес * ВыбНабор.Количество; КонецЕсли; КонецЦикла; Иначе лВес = ДанныеНоменклатуры.Номенклатура.ВесЧислитель; КонецЕсли; ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Вес", лВес); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "СостояниеТовара", ДанныеНоменклатуры.Номенклатура.СостояниеТовара); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ОписаниеСостояния", ДанныеНоменклатуры.Номенклатура.ОписаниеСостоянияТовара); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ГодВыпуска", ДанныеНоменклатуры.Номенклатура.ГодВыпуска); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "AvitoID", ДанныеНоменклатуры.Номенклатура.AvitoID); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Код", ДанныеНоменклатуры.Номенклатура.Код); // ╘══════════════ Ушаков С.И. 26 января 2018 г. ════════════════╛ //+ Ковальский 2021-08-03 ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Длина", ДанныеНоменклатуры.НоменклатураДлина); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Ширина", ДанныеНоменклатуры.НоменклатураШирина); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Высота", ДанныеНоменклатуры.НоменклатураВысота); //- Ковальский 2021-08-03 ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Рабочее наименование", ДанныеНоменклатуры.НоменклатураНаименование); ТоварXDTO.ЗначенияРеквизитов = ЗначенияРеквизитовXDTO; ТоварыXDTO.Товар.Добавить(ТоварXDTO); СтруктураРезультата.ВыгруженоТоваров = СтруктураРезультата.ВыгруженоТоваров + 1; КонецПроцедуры // Добавляет пути к файлам изображений номенклатуры в объект XDTO типа Товар. // // Параметры // ТоварXDTO - объект XDTO типа Товар // ТаблицаФайлов - таблица значений, содержащая пути к файлам // Параметры - структура, содержащая параметры обмена // ОписанияФайлов - соответствие, ключом которого является пути к файлу, а значением описание файла. // Процедура ДобавитьАдресаИзображенийНоменклатурыXDTO(ТоварXDTO, ДанныеНоменклатуры, ОписанияФайлов, Параметры) Если НЕ Параметры.ВыгружатьКартинки Тогда Возврат; КонецЕсли; СтруктураРезультата = Параметры.СтруктураРезультата; // Основное изображение выгружаем первым. ТаблицаФайлов = ДанныеНоменклатуры.Файлы; ТаблицаФайлов = ДанныеНоменклатуры.Файлы; ТаблицаФайлов.Колонки.Добавить("Сортировка"); ОсновноеИзображение = ДанныеНоменклатуры.НоменклатураОсновноеИзображение; ТаблицаФайлов.ЗаполнитьЗначения(1, "Сортировка"); // ╒══════════════ Ушаков С.И. 30 января 2018 г. ════════════════╕ // сделаем сортировку по имени файлов ТаблицаФайлов.Сортировать("НоменклатураФайл_УникальныйИдентификатор"); // при хранении в КаталогеИзображений, здесь просто имя файла без расширения Для ц = 0 по ТаблицаФайлов.Количество()-1 Цикл ТаблицаФайлов[ц].Сортировка = ц+1; // да хоть +1000 КонецЦикла; // ╘══════════════ Ушаков С.И. 30 января 2018 г. ════════════════╛ Если ЗначениеЗаполнено(ОсновноеИзображение) Тогда Найдено = ТаблицаФайлов.Найти(ОсновноеИзображение, "НоменклатураФайл"); Если НЕ Найдено = Неопределено Тогда ИндексОсновногоИзображения = ТаблицаФайлов.Индекс(Найдено); Если ИндексОсновногоИзображения > 0 Тогда Найдено.Сортировка = 0; ТаблицаФайлов.Сортировать("Сортировка"); КонецЕсли; КонецЕсли; КонецЕсли; //+Филиппенко В.Б. добавляю адреса уже выгруженных картинок и пустые адреса для удаления картинок (удаленных из каталога) УИД = СтрЗаменить(ДанныеНоменклатуры.Номенклатура.УникальныйИдентификатор(), "-", ""); АдресаСохраненныхКартинок = Параметры.ВыгруженныеКартинки.НайтиСтроки(Новый Структура("УИД", УИД)); КоличествоУдаленныхИзображений = 0; Для каждого АдресСохраненнойКартинки из АдресаСохраненныхКартинок Цикл Если АдресСохраненнойКартинки.ЭтоФайл Тогда Файлы = ТаблицаФайлов.НайтиСтроки(Новый Структура("ДанныеДляПоиска", АдресСохраненнойКартинки.Сортировка)); Для Каждого ТекФайл Из Файлы Цикл ОписаниеОшибки = ""; АдресФайла = ПутьКФайлу(ТекФайл, ДанныеНоменклатуры, Параметры, ОписаниеОшибки); Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда СтруктураРезультата.ОписаниеОшибки = СтруктураРезультата.ОписаниеОшибки + Символы.ПС + ТекущаяДатаСеанса() + ": " + ОписаниеОшибки; Иначе Если ЗначениеЗаполнено(АдресФайла) Тогда СтруктураРезультата.ВыгруженоКартинок = СтруктураРезультата.ВыгруженоКартинок + 1; ТоварXDTO.Картинка.Добавить(АдресФайла); Описание = ТекФайл.НоменклатураФайлОписание; Если НЕ ПустаяСтрока(Описание) Тогда ОписанияФайлов.Вставить(АдресФайла, Описание); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; ИначеЕсли АдресСохраненнойКартинки.Удалить Тогда КоличествоУдаленныхИзображений = КоличествоУдаленныхИзображений + 1; Иначе ТоварXDTO.Картинка.Добавить(АдресСохраненнойКартинки.ПолноеИмяФайла); КонецЕсли; КонецЦикла; Если КоличествоУдаленныхИзображений > 0 Тогда Для К=1 по КоличествоУдаленныхИзображений Цикл ТоварXDTO.Картинка.Добавить(""); КонецЦикла; КонецЕсли; //-Филиппенко В.Б. КонецПроцедуры // Записывает файл с изображением номенклатуры на диск и возвращает путь к файлу. // // Параметры // ДанныеФайла - структура, содержащая информацию по изображению. // Параметры - структура, содержащая данные по обмену. // ОписаниеОшибки - строка для записи информации об ошибках. // // Возвращаемое значение // Строка, содержащая путь к файлу. // Функция ПутьКФайлу(ДанныеФайла, ДанныеНоменклатуры, Параметры, ОписаниеОшибки) АдресФайла = ""; РасширениеФайла = НРег(ДанныеФайла.НоменклатураФайлРасширение); Если НЕ Параметры.ВыгружатьКартинки Тогда Возврат АдресФайла; КонецЕсли; Если Не ЗначениеЗаполнено(ДанныеФайла.НоменклатураФайл) Тогда Возврат АдресФайла; КонецЕсли; ФайлВХранилище = ДанныеФайла.НоменклатураФайлТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; Если ФайлВХранилище Тогда Если Не ЗначениеЗаполнено(ДанныеФайла.НоменклатураФайлДанныеФайла) Тогда ДвоичныеДанныеФайла = Неопределено; Иначе ДвоичныеДанныеФайла = ДанныеФайла.НоменклатураФайлДанныеФайла.Получить(); КонецЕсли; Если ДвоичныеДанныеФайла = Неопределено Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось получить данные файла %1 номенклатуры %2'"), ДанныеФайла.НоменклатураФайл, ДанныеНоменклатуры.Номенклатура); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); Возврат АдресФайла; КонецЕсли; Иначе ПутьДляПлатформы = ПутьТомаДляПлатформы(Параметры.ПлатформаWindows, ДанныеФайла.НоменклатураФайлТом); ПутьДляПлатформы = ПутьДляПлатформы+ "\" + ДанныеФайла.НоменклатураФайлПутьКФайлу; ИмяФайла = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, ПутьДляПлатформы); Попытка ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла); Исключение ТекстОшибки = ОписаниеИсключительнойОшибки(НСтр("ru = 'Выгрузка файла номенклатуры:'") + " " + ДанныеНоменклатуры.Номенклатура); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); Возврат АдресФайла; КонецПопытки; КонецЕсли; ИмяПоНоменклатуре = СтрЗаменить(ДанныеНоменклатуры.Номенклатура.УникальныйИдентификатор(), "-", ""); // ╒══════════════ Ушаков С.И. 28 января 2018 г. ════════════════╕ // здесь мы подставляем файл не из тома и не из БД, а просто из папки на диске. // поэтому подменим имя. // ИмяПоХранилищу = СтрЗаменить(ДанныеФайла.НоменклатураФайл.УникальныйИдентификатор(), "-", ""); ИмяПоХранилищу = СтрЗаменить(ДанныеФайла.НоменклатураФайл_УникальныйИдентификатор, "-", ""); // ╘══════════════ Ушаков С.И. 28 января 2018 г. ════════════════╛ ПодкаталогФайлов = Параметры.ПодкаталогФайлов; ИмяФайла = Нрег(ИмяПоНоменклатуре + "_" + ИмяПоХранилищу + "." + НРег(РасширениеФайла)); //Доработка КаталогПоИмени = Лев(ИмяПоНоменклатуре, 2); КаталогФайла = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, Параметры.КаталогНаДиске + "\" + ПодкаталогФайлов + "\" + КаталогПоИмени); Попытка СоздатьКаталог(КаталогФайла); Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось создать каталог %1. Номенклатура: %2'"), КаталогФайла, ДанныеНоменклатуры.Номенклатура.Номенклатура); ОписаниеИсключительнойОшибки = ОписаниеИсключительнойОшибки(ТекстОшибки); ДобавитьОписаниеОшибки(ОписаниеОшибки,ОписаниеИсключительнойОшибки); Возврат АдресФайла; КонецПопытки; ПолноеИмяФайла = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, КаталогФайла + "\" + ИмяФайла); Попытка ДвоичныеДанныеФайла.Записать(ПолноеИмяФайла); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось записать файл %1 на диск. Номенклатура: %2'"), ПолноеИмяФайла, // ╒══════════════ Ушаков С.И. 5 марта 2018 г. ════════════════╕ // Что за косячище! Нет такого параметра же! Исправим: // Параметры.ВыборкаНоменклатуры.Номенклатура)) ДанныеНоменклатуры.Номенклатура)) // ╘══════════════ Ушаков С.И. 5 марта 2018 г. ════════════════╛ ); Возврат АдресФайла; КонецПопытки; АдресФайла = ПодкаталогФайлов + "/" + КаталогПоИмени + "/" + ИмяФайла; Возврат АдресФайла; КонецФункции // Добавляет значения свойств номенклатуры в список значений свойств объекта XDTO типа Товар. // // Параметры // ТоварXDTO - объект XDTO типа Товар // ТаблицаСвойств - таблица значений, содержащая значения свойств номенклатуры // Параметры - структура, содержащая параметры обмена // ПакетCML - пакет XDTO. // Процедура ДобавитьЗначенияСвойствНоменклатурыXDTO(ТоварXDTO, ТаблицаСвойств) ЗначенияСвойствТип = ТоварXDTO.Свойства().Получить("ЗначенияСвойств").Тип; ЗначенияСвойствXDTO = ФабрикаXDTO.Создать(ЗначенияСвойствТип); ПакетCML = ПакетCML(); Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойств Цикл Если Не ЗначениеЗаполнено(СтрокаТаблицыСвойств.СвойствоНоменклатуры) Тогда Продолжить; КонецЕсли; ЗначенияСвойстваXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("ЗначенияСвойства")); ЗначенияСвойстваXDTO.Ид = УникальныйИдентификаторОбъекта(СтрокаТаблицыСвойств.СвойствоНоменклатуры); Если НЕ ЗначениеЗаполнено(СтрокаТаблицыСвойств.ЗначениеСвойства) Тогда // Если значение свойства не заполнено, выгружаем пустую строку. ЗначениеСвойства = ""; Иначе ТипЗначенияСвойства = ТипЗнч(СтрокаТаблицыСвойств.ЗначениеСвойства); Если ТипЗначенияСвойства = Тип("Дата") Тогда ЗначениеСвойства = ФорматДатыДляXDTO(СтрокаТаблицыСвойств.ЗначениеСвойства); ИначеЕсли ТипЗначенияСправочник(ТипЗначенияСвойства) Тогда ЗначениеСвойства = УникальныйИдентификаторОбъекта(СтрокаТаблицыСвойств.ЗначениеСвойства); Иначе ЗначениеСвойства = Строка(СтрокаТаблицыСвойств.ЗначениеСвойства); КонецЕсли; КонецЕсли; ЗначенияСвойстваXDTO.Значение.Добавить(ЗначениеСвойства); ЗначенияСвойствXDTO.ЗначенияСвойства.Добавить(ЗначенияСвойстваXDTO); КонецЦикла; Если ЗначенияСвойствXDTO.ЗначенияСвойства.Количество() > 0 Тогда ТоварXDTO.ЗначенияСвойств = ЗначенияСвойствXDTO; КонецЕсли; КонецПроцедуры Процедура ДобавитьСкладыВПакетПредложений(ТаблицаСкладов, ПакетПредложенийXDTO, Параметры) Если ТаблицаСкладов = Неопределено Тогда Возврат; КонецЕсли; ПакетCML = ПакетCML(); СкладыТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("ПакетПредложений"), "Склады"); СкладыXDTO = ФабрикаXDTO.Создать(СкладыТип); Для Каждого ТекСтрока Из ТаблицаСкладов Цикл СкладТип = ПакетCML.Получить("Склад"); СкладXDTO = ФабрикаXDTO.Создать(СкладТип); СкладXDTO.Ид = УникальныйИдентификаторОбъекта(ТекСтрока.Склад); СкладXDTO.Наименование = ТекСтрока.СкладНаименование; Адрес = АдресСклада(ТекСтрока.СкладАдрес); Если Адрес.АдресноеПоле.Количество() > 0 Тогда СкладXDTO.Адрес = Адрес; КонецЕсли; Контакты = КонтактнаяИнформацияСклада(ТекСтрока.СкладКонтактнаяИнформация); Если Контакты.Контакт.Количество() > 0 Тогда СкладXDTO.Контакты = Контакты; КонецЕсли; СкладыXDTO.Склад.Добавить(СкладXDTO); КонецЦикла; Если СкладыXDTO.Склад.Количество() > 0 Тогда ПакетПредложенийXDTO.Склады = СкладыXDTO; КонецЕсли; КонецПроцедуры Функция АдресСклада(СтруктураАдресСклада) ПакетCML = ПакетCML(); АдресСклада = ФабрикаXDTO.Создать(ПакетCML.Получить("Адрес")); Представление = ""; Для Каждого КлючЗначение Из СтруктураАдресСклада Цикл Если Не ЗначениеЗаполнено(КлючЗначение.Значение) Тогда Продолжить; КонецЕсли; ДобавитьАдресноеПоле(КлючЗначение, АдресСклада.АдресноеПоле); Представление = Представление +КлючЗначение.Значение +" ,"; КонецЦикла; АдресСклада.Представление = Представление; Возврат АдресСклада; КонецФункции Процедура ДобавитьАдресноеПоле(КлючЗначение, АдресныеПоля) ПакетCML = ПакетCML(); АдресноеПолеТип =ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("Адрес"), "АдресноеПоле"); АдресноеПоле = ФабрикаXDTO.Создать(АдресноеПолеТип); Если ВРег(КлючЗначение.Ключ) = ВРег("ПочтовыйИндекс") Тогда АдресноеПоле.Тип = НСтр("ru = 'Почтовый индекс'"); ИначеЕсли ВРег(КлючЗначение.Ключ) = ВРег("НаселенныйПункт") Тогда АдресноеПоле.Тип = НСтр("ru = 'Населенный пункт'"); Иначе АдресноеПоле.Тип = КлючЗначение.Ключ; КонецЕсли; АдресноеПоле.Значение = КлючЗначение.Значение; АдресныеПоля.Добавить(АдресноеПоле); КонецПроцедуры Функция КонтактнаяИнформацияСклада(СтруктураКИСклада) ПакетCML = ПакетCML(); КонтактнаяИнформация = ФабрикаXDTO.Создать(ПакетCML.Получить("КонтактнаяИнформация")); КонтактТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("КонтактнаяИнформация"), "Контакт"); Для Каждого КлючЗначение Из СтруктураКИСклада Цикл Если Не ЗначениеЗаполнено(КлючЗначение.Значение) Тогда Продолжить; КонецЕсли; Контакт = ФабрикаXDTO.Создать(КонтактТип); ЗаполнитьКонтакт(КлючЗначение, Контакт); КонтактнаяИнформация.Контакт.Добавить(Контакт); КонецЦикла; Возврат КонтактнаяИнформация; КонецФункции Процедура ЗаполнитьКонтакт(КлючЗначение, Контакт) Если ВРег(КлючЗначение.Ключ) = ВРег("ТелефонРабочий") Тогда Контакт.Тип = НСтр("ru = 'Телефон рабочий'"); ИначеЕсли ВРег(КлючЗначение.Ключ) = ВРег("КоординатыНаКарте") Тогда Контакт.Тип = НСтр("ru = 'Координаты на карте'"); Иначе Контакт.Тип = КлючЗначение.Ключ; КонецЕсли; Контакт.Значение = КлючЗначение.Значение; КонецПроцедуры // Добавляет виды цен в объект XDTO типа ПакетПредложений. // // Параметры // ПакетПредложенийXDTO - объект XDTO типа ПакетПредложений // ПакетCML - пакет XDTO // Параметры - структура, содержащая параметры обмена. Процедура ДобавитьВидыЦенВПакетПредложенийXDTO(ВидыЦенПакетаПредложений, ПакетПредложенийXDTO, Параметры) Если ВидыЦенПакетаПредложений.Количество() = 0 Тогда Возврат; КонецЕсли; ПакетCML = ПакетCML(); ТипыЦенТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("ПакетПредложений"), "ТипыЦен"); ТипыЦенXDTO = ФабрикаXDTO.Создать(ТипыЦенТип); Для Каждого ТекСтрока Из ВидыЦенПакетаПредложений Цикл ТипТипЦены = ПакетCML.Получить("ТипЦены"); ТипЦеныXDTO = ФабрикаXDTO.Создать(ТипТипЦены); ИдТипаЦены = УникальныйИдентификаторОбъекта(ТекСтрока.ТипЦены); ТипЦеныXDTO.Ид = ИдТипаЦены; ТипЦеныXDTO.Наименование = ФорматНаименованияДляXDTO(ТекСтрока.ТипЦеныНаименование); ТипЦеныXDTO.Валюта = ФорматНаименованияВалютыДляXDTO(ТекСтрока.ТипЦеныВалютаКод); НалогXDTO = ФабрикаXDTO.Создать(ТипТипЦены.Свойства.Получить("Налог").Тип); НалогXDTO.Наименование = Параметры.НаименованиеНалога; НалогXDTO.УчтеноВСумме = ТекСтрока.ТипЦеныЦенаВключаетНДС; НалогXDTO.Акциз = Ложь; ТипЦеныXDTO.Налог.Добавить(НалогXDTO); ТипыЦенXDTO.ТипЦены.Добавить(ТипЦеныXDTO); КонецЦикла; ПакетПредложенийXDTO.ТипыЦен = ТипыЦенXDTO; КонецПроцедуры // ╘══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╛ // Добавляет предложения в объект XDTO типа ПакетПредложений. // // Параметры // ПакетПредложенийXDTO - объект XDTO типа ПакетПредложений // ПакетCML - пакет XDTO // Параметры - структура, содержащая параметры обмена. // Процедура ДобавитьПредложенияВПакетПредложенийXDTO(ПакетПредложенийXDTO, ТаблицаДанныеПакетаПредложений, Параметры) СтруктураРезультата = Параметры.СтруктураРезультата; ПакетCML = ПакетCML(); ПредложенияТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("ПакетПредложений"), "Предложения"); ПредложенияXDTO = ФабрикаXDTO.Создать(ПредложенияТип); ПредложениеТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПредложенияТип,"Предложение"); ТекНоменклатура = Неопределено; ТекХарактеристика = Неопределено; ПредложениеXDTO = Неопределено; ЦеныXDTO = Неопределено; Для Каждого ТекСтрока Из ТаблицаДанныеПакетаПредложений Цикл ПредложениеXDTO = ФабрикаXDTO.Создать(ПредложениеТип); ЦеныТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПредложениеТип, "Цены"); ЦеныXDTO = ФабрикаXDTO.Создать(ЦеныТип); ДобавитьРеквизитыТовараДляПредложенияXDTO(ПредложениеXDTO, ТекСтрока, Параметры); ЗаполнитьЦеныXDTO(ЦеныXDTO, ТекСтрока.Цены); Если ЦеныXDTO.Цена.Количество() > 0 Тогда ПредложениеXDTO.Цены = ЦеныXDTO; КонецЕсли; ЗаполнитьОстаткиПоСкладам(ПредложениеXDTO, ТекСтрока.ОстаткиПоСкладам); ПредложенияXDTO.Предложение.Добавить(ПредложениеXDTO); // ╒══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╕ У1С_ЗаполнитьСопутствующие(ПредложениеXDTO, ТекСтрока.Сопутствующие); // ╘══════════════ Ушаков С.И. 29 ноября 2017 г. ════════════════╛ СтруктураРезультата.ВыгруженоПредложений = СтруктураРезультата.ВыгруженоПредложений + 1; КонецЦикла; ПакетПредложенийXDTO.Предложения = ПредложенияXDTO; КонецПроцедуры Процедура ЗаполнитьОстаткиПоСкладам(ПредложениеXDTO, ТаблицаОстатков) ПакетCML = ПакетCML(); КоличествоВсего = 0; Для Каждого ТекСтрока Из ТаблицаОстатков Цикл Если Не ЗначениеЗаполнено(ТекСтрока.Склад) Тогда Продолжить; КонецЕсли; ОстатокXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("ОстаткиПоСкладам")); ОстатокXDTO.ИдСклада = УникальныйИдентификаторОбъекта(ТекСтрока.Склад); ОстатокXDTO.КоличествоНаСкладе = ТекСтрока.ОстатокНаСкладе; ПредложениеXDTO.Склад.Добавить(ОстатокXDTO); КоличествоВсего = КоличествоВсего + ТекСтрока.ОстатокНаСкладе; КонецЦикла; ПредложениеXDTO.Количество = КоличествоВсего; КонецПроцедуры Процедура ЗаполнитьЦеныXDTO(ЦеныXDTO, ТаблицаЦен) ПакетCML = ПакетCML(); Для Каждого ТекСтрока Из ТаблицаЦен Цикл Если Не ЗначениеЗаполнено(ТекСтрока.ТипЦены) Тогда Продолжить; КонецЕсли; ЦенаXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("Цена")); ИдТипаЦены = УникальныйИдентификаторОбъекта(ТекСтрока.ТипЦены); Единица = ТекСтрока.ТипЦеныЕдиницаЦеныНаименованиеСокращенное; ПредставлениеЦены = НСтр("ru ='"+ " " + СокрЛП(ТекСтрока.ЦенаЗаЕдиницу) + " " + СокрЛП(ТекСтрока.ТипЦеныВалютаКод) + " "+"за"+" " + СокрЛП(Единица)+ "'"); ЦенаXDTO.Представление = ПредставлениеЦены; ЦенаXDTO.ИдТипаЦены = ИдТипаЦены; ЦенаXDTO.ЦенаЗаЕдиницу = ТекСтрока.ЦенаЗаЕдиницу; ЦенаXDTO.Валюта = ФорматНаименованияВалютыДляXDTO(ТекСтрока.ТипЦеныВалютаКод); Если ЗначениеЗаполнено(Единица) Тогда Если СтрДлина(Единица) = 3 Тогда ЦенаXDTO.Единица = Единица; КонецЕсли; КонецЕсли; ЦенаXDTO.Коэффициент = ТекСтрока.ТипЦеныЕдиницаЦеныКоэффициент; // ╒══════════════ Ушаков С.И. 13 февраля 2018 г. ════════════════╕ // Добавляем значение цены для типа акции. Если ТаблицаЦен.Колонки.Найти("У1С_СтараяЦенаЗаЕдиницу")<>Неопределено И ЗначениеЗаполнено(ТекСтрока.У1С_СтараяЦенаЗаЕдиницу) И (ТекСтрока.У1С_СтараяЦенаЗаЕдиницу - ТекСтрока.ЦенаЗаЕдиницу >100) Тогда ЦенаXDTO.У1С_СтараяЦенаЗаЕдиницу = ТекСтрока.У1С_СтараяЦенаЗаЕдиницу; Если ЗначениеЗаполнено(ТекСтрока.ДатаУстановкиЦены) Тогда ЦенаXDTO.ДатаУстановкиЦены = ФорматДатыДляXDTO(ТекСтрока.ДатаУстановкиЦены); КонецЕсли; КонецЕсли; // ╘══════════════ Ушаков С.И. 13 февраля 2018 г. ════════════════╛ ЦеныXDTO.Цена.Добавить(ЦенаXDTO); КонецЦикла; КонецПроцедуры // Заполняет реквизиты товара для объекта XDTO типа Предложение. // // Параметры // ПредложениеXDTO - объект XDTO типа Предложение // ПакетCML - пакет XDTO // Характеристика - характеристика номенклатуры // Параметры - параметры обмена. // Процедура ДобавитьРеквизитыТовараДляПредложенияXDTO(ПредложениеXDTO, СтрокаПредложения, Параметры) ПредложениеXDTO.Ид = УникальныйИдентификаторОбъекта(СтрокаПредложения.Номенклатура, СтрокаПредложения.Характеристика); Наименование = СтрокаПредложения.НоменклатураНаименование; Если ЗначениеЗаполнено(СтрокаПредложения.Характеристика) Тогда Наименование = Наименование + " (" + СтрокаПредложения.Характеристика + ")"; КонецЕсли; ПредложениеXDTO.Наименование = ФорматНаименованияДляXDTO(Наименование); ПредложениеXDTO.БазоваяЕдиница = БазоваяЕдиницаXDTO(ПредложениеXDTO, СтрокаПредложения); ПредложениеXDTO.Артикул = СтрокаПредложения.НоменклатураАртикул; ЗаполнитьХарактеристикиСтрокиТоваров(ПредложениеXDTO, СтрокаПредложения); ЗаполнитьСвойстваПредложения(ПредложениеXDTO, СтрокаПредложения); СтатусУдаления = Неопределено; Если СтрокаПредложения.НоменклатураПометкаУдаления = Истина Тогда СтатусУдаления = "Удален"; КонецЕсли; Если ЗначениеЗаполнено(СтатусУдаления) Тогда ПредложениеXDTO.Статус = СтатусУдаления; КонецЕсли; КонецПроцедуры Процедура ЗаполнитьСвойстваПредложения(ПредложениеXDTO, СтрокаПредложения); Характеристика = СтрокаПредложения.Характеристика; Если Не ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Характеристика)) Тогда Возврат; КонецЕсли; Если Характеристика.Метаданные().ТабличныеЧасти.Найти("ДополнительныеРеквизиты") = Неопределено Тогда Возврат; КонецЕсли; ЗначенияСвойствТип = ПредложениеXDTO.Свойства().Получить("ЗначенияСвойств").Тип; ЗначенияСвойствXDTO = ФабрикаXDTO.Создать(ЗначенияСвойствТип); ПакетCML = ПакетCML(); Для Каждого ТекСтрока Из Характеристика.ДополнительныеРеквизиты Цикл Если Не ЗначениеЗаполнено(ТекСтрока.Значение) Тогда Продолжить; КонецЕсли; ЗначениеСвойстваXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("ЗначенияСвойства")); ЗначениеСвойстваXDTO.Ид = УникальныйИдентификаторОбъекта(ТекСтрока.Свойство); Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Заголовок",ТекСтрока.Свойство.Метаданные()) Тогда Наименование = ФорматНаименованияДляXDTO(ТекСтрока.Свойство.Заголовок); Иначе Наименование = ФорматНаименованияДляXDTO(ТекСтрока.Свойство); КонецЕсли; ЗначениеСвойстваXDTO.Наименование = Наименование; Если ТекСтрока.Свойство.ТипЗначения.Типы().Количество() > 1 Тогда ЗначениеСвойстваXDTO.Значение.Добавить(Строка(ТекСтрока.Значение)); Иначе Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ТекСтрока.Значение) Тогда ЗначениеСвойстваXDTO.Значение.Добавить(УникальныйИдентификаторОбъекта(ТекСтрока.Значение)); Иначе ЗначениеСвойстваXDTO.Значение.Добавить(ТекСтрока.Значение); КонецЕсли; КонецЕсли; ЗначенияСвойствXDTO.ЗначенияСвойства.Добавить(ЗначениеСвойстваXDTO); КонецЦикла; Если ЗначенияСвойствXDTO.ЗначенияСвойства.Количество() > 0 Тогда ПредложениеXDTO.ЗначенияСвойств = ЗначенияСвойствXDTO; КонецЕсли; КонецПроцедуры Процедура ЗаполнитьХарактеристикиСтрокиТоваров(СтрокаТовараXDTO, СтрокаТовара) Характеристика = СтрокаТовара.Характеристика; Если Не ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Характеристика)) Тогда Возврат; КонецЕсли; Если Характеристика.Метаданные().ТабличныеЧасти.Найти("ДополнительныеРеквизиты") = Неопределено Тогда Возврат; КонецЕсли; ХарактеристикиТовараТип = СтрокаТовараXDTO.Свойства().Получить("ХарактеристикиТовара").Тип; ХарактеристикиТовараXDTO = ФабрикаXDTO.Создать(ХарактеристикиТовараТип); ПакетCML = ПакетCML(); Для Каждого ТекСтрока Из Характеристика.ДополнительныеРеквизиты Цикл Если Не ЗначениеЗаполнено(ТекСтрока.Значение) Тогда Продолжить; КонецЕсли; ХарактеристикаТовараТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ХарактеристикиТовараТип, "ХарактеристикаТовара"); ХарактеристикаТовараXDTO = ФабрикаXDTO.Создать(ХарактеристикаТовараТип); ХарактеристикаТовараXDTO.Ид = УникальныйИдентификаторОбъекта(ТекСтрока.Свойство); Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Заголовок",ТекСтрока.Свойство.Метаданные()) Тогда Наименование = ФорматНаименованияДляXDTO(ТекСтрока.Свойство.Заголовок); Иначе Наименование = ФорматНаименованияДляXDTO(ТекСтрока.Свойство); КонецЕсли; ХарактеристикаТовараXDTO.Наименование = Наименование; ХарактеристикаТовараXDTO.Значение = Строка(ТекСтрока.Значение); ХарактеристикиТовараXDTO.ХарактеристикаТовара.Добавить(ХарактеристикаТовараXDTO); КонецЦикла; Если ХарактеристикиТовараXDTO.ХарактеристикаТовара.Количество() > 0 Тогда СтрокаТовараXDTO.ХарактеристикиТовара = ХарактеристикиТовараXDTO; КонецЕсли; КонецПроцедуры Процедура УдалитьРегистрациюГруппТоваров(Знач Параметры) ИмяСправочникаТовары = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("Номенклатура"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НоменклатураИзменения.Ссылка |ИЗ | Справочник." + ИмяСправочникаТовары + ".Изменения КАК НоменклатураИзменения |ГДЕ | НоменклатураИзменения.Узел = &Узел | И НоменклатураИзменения.Ссылка.ЭтоГруппа"; Запрос.УстановитьПараметр("Узел", Параметры.УзелОбмена); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, Выборка.Ссылка); КонецЦикла; КонецПроцедуры // ╒══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╕ Процедура У1С_ДобавитьНовыеПоступленияВПакетПредложенийXDTO(МассивНоменклатуры, ПакетПредложенийXDTO, Параметры) Если МассивНоменклатуры.Количество() = 0 Тогда Возврат; КонецЕсли; ПакетCML = ПакетCML(); У1С_ТоварТип = ПакетCML.Получить("У1С_СсылкаНаТовар"); // //Для Каждого Номенклатура Из МассивНоменклатуры Цикл // // Если ((ТекущаяДата()-Номенклатура.У1С_ДатаПоследнейВыгрузкиНаСайт) / 60 / 60 / 24) > 7 Тогда // // теперь проверим мегасложное условие. // // итак. 1. Если с прошлого обмена ЭТИМ товаром прошло более 7 дней // // 2. И за этот срок товар уходил в 0 или в минус // // 3. И сегодня остаток > 0 // Запрос = Новый Запрос; // //Запрос.Текст = // // "ВЫБРАТЬ // // | ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток, // // | ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток, // // | ТоварыНаСкладахОстаткиИОбороты.Период КАК Период // // |ИЗ // // | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачПериода, &КонПериода, Регистратор, ДвиженияИГраницыПериода, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстаткиИОбороты // // | // // |УПОРЯДОЧИТЬ ПО // // | Период УБЫВ"; // Запрос.Текст = // "ВЫБРАТЬ // | СвободныеОстаткиОстаткиИОбороты.ВНаличииНачальныйОстаток - СвободныеОстаткиОстаткиИОбороты.ВРезервеСоСкладаНачальныйОстаток КАК ВНаличииНачальныйОстаток, // | СвободныеОстаткиОстаткиИОбороты.ВНаличииКонечныйОстаток - СвободныеОстаткиОстаткиИОбороты.ВРезервеСоСкладаКонечныйОстаток КАК ВНаличииКонечныйОстаток, // | СвободныеОстаткиОстаткиИОбороты.Период КАК Период, // | СвободныеОстаткиОстаткиИОбороты.Номенклатура КАК Номенклатура // |ИЗ // | РегистрНакопления.СвободныеОстатки.ОстаткиИОбороты(&НачПериода, &КонПериода, Регистратор, ДвиженияИГраницыПериода, Номенклатура В (&Номенклатура)) КАК СвободныеОстаткиОстаткиИОбороты // | // |УПОРЯДОЧИТЬ ПО // | Период УБЫВ // |ИТОГИ // | МИНИМУМ(ВНаличииКонечныйОстаток) // |ПО // | Номенклатура"; // Запрос.УстановитьПараметр("НачПериода", Номенклатура.У1С_ДатаПоследнейВыгрузкиНаСайт); // Запрос.УстановитьПараметр("КонПериода", ТекущаяДата()); // Если Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда // // здесь добавляем составляющие // МассНом = У1С_Доработки.ПолучитьТЗСоставляющих(Номенклатура).ВыгрузитьКолонку("Номенклатура"); // Иначе // МассНом = Новый Массив; // МассНом.Добавить(Номенклатура); // КонецЕсли; // Запрос.УстановитьПараметр("Номенклатура", МассНом); // Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // ПризнакНовой = Ложь; // Для каждого Выборка Из Дерево.Строки Цикл // цикл по комплектующим. Если это не набор, то будет одна итерация // Ост = Выборка.Строки; // Если Ост.Количество()=0 ИЛИ Ост[0].ВНаличииКонечныйОстаток<=0 Тогда // ПризнакНовой = Ложь; // позиция нулевая, значит не помещаем в новые, пошли дальше // Прервать // КонецЕсли; // // //// Если Ост.Найти(0, "ВНаличииНачальныйОстаток") <> Неопределено ИЛИ ЗначениеЗаполнено(Номенклатура.У1С_ДатаПоследнейВыгрузкиНаСайт) Тогда // остаток уходил в 0 за период! Или товар совсем новый // Ост.Сортировать("ВНаличииНачальныйОстаток"); // Если (Ост[0].ВНаличииНачальныйОстаток <= 0 ИЛИ ЗначениеЗаполнено(Номенклатура.У1С_ДатаПоследнейВыгрузкиНаСайт)) И ЗначениеЗаполнено(Номенклатура.Артикул) Тогда // остаток уходил в 0 за период! Или товар совсем новый // // это новое предложение // ПризнакНовой = Истина; // КонецЕсли; // КонецЦикла; // // Если ПризнакНовой Тогда // У1С_НовоеПоступлениеXDTO = ФабрикаXDTO.Создать(У1С_ТоварТип); // У1С_НовоеПоступлениеXDTO.ИдТовара = УникальныйИдентификаторОбъекта(Номенклатура); // ПакетПредложенийXDTO.У1С_НовоеПоступление.Добавить(У1С_НовоеПоступлениеXDTO); // КонецЕсли; // КонецЕсли; //КонецЦикла; КонецПроцедуры Процедура У1С_ЗаполнитьСопутствующие(ПредложениеXDTO, ТаблицаСопутствующих) ПакетCML = ПакетCML(); Для Каждого ТекСтрока Из ТаблицаСопутствующих Цикл Если Не ЗначениеЗаполнено(ТекСтрока.Товар) Тогда Продолжить; КонецЕсли; СопутствующиеXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("У1С_СсылкаНаТовар")); СопутствующиеXDTO.ИдТовара = УникальныйИдентификаторОбъекта(ТекСтрока.Товар); ПредложениеXDTO.У1С_Сопутствующие.Добавить(СопутствующиеXDTO); КонецЦикла; КонецПроцедуры #КонецОбласти #Область ОбменЗаказами Процедура ДобавитьОтборПоЗаказам(КомпоновщикНастроек, МассивОграничения, ВидСравнения) Отбор = КомпоновщикНастроек.Настройки.Отбор; НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Заказ"); НовыйЭлемент.ВидСравнения = ВидСравнения; СписокЗначенийОграничения = Новый СписокЗначений; СписокЗначенийОграничения.ЗагрузитьЗначения(МассивОграничения); НовыйЭлемент.ПравоеЗначение = СписокЗначенийОграничения; НовыйЭлемент.Использование = Истина; КонецПроцедуры Процедура ПолучитьДанныеДляВыгрузкиЗаказов(ПараметрыОбмена, ТаблицаЗаказов, ОписаниеОшибки) СхемаКомпоновки = ПланыОбмена.ОбменССайтом.ПолучитьМакет("СхемаВыгрузкиЗаказов"); КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки)); КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию); Заказы = ПараметрыОбмена.СтруктураИзменений.Заказы; // На сайт выгружать будем только измененные заказы. ДобавитьОтборПоЗаказам(КомпоновщикНастроек, Заказы, ВидСравненияКомпоновкиДанных.ВСписке); СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.АвтоЗаполнениеДоступныхПолей = Ложь; ТекстЗапроса = ""; ОбменССайтомПереопределяемый.ПолучитьТекстЗапросаЗаказы(ТекстЗапроса); Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда ОписаниеОшибки = НСтр("ru = 'Не заполнен текст запроса для получения данных выгрузки ""Заказы покупателя"".'"); Возврат; КонецЕсли; НаборДанных.Запрос = ТекстЗапроса; НаборДанных.Имя = "НаборДанных"; НаборДанных.ИсточникДанных = "ИсточникДанных"; // Заполняем параметры "НомерЗаказаНаСайте", и "ДатаЗаказаНаСайте". ПараметрыКомпоновки = СхемаКомпоновкиДанных.Параметры; ОбменССайтомПереопределяемый.УстановитьПараметрыТекстаЗапросаЗаказы(ПараметрыОбмена.ПрикладныеПараметры, ПараметрыКомпоновки); ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), Ложь); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(ТаблицаЗаказов); ПроцессорВывода.Вывести(ПроцессорКомпоновки); СоздатьНедостающиеКолонкиТаблицыДанных(КомпоновщикНастроек.Настройки, ТаблицаЗаказов); КонецПроцедуры // Запускает процесс обмена заказами. // // Параметры: // Параметры - Структура, основные параметры. // ТаблицаИнформации - Таблица значений, таблица информации о состоянии обмена. // // Возвращаемое значение // Булево - Истина, если успех. // Функция ВыполнитьОбменЗаказами(Параметры, ТаблицаИнформации) Если Не Параметры.ОбменЗаказами Тогда Возврат Истина; КонецЕсли; УспешноЗагружено = Ложь; УспешноВыгружено = Ложь; СтруктураСтатистики = Новый Структура; СтруктураСтатистики.Вставить("ОбработаноНаЗагрузке", 0); СтруктураСтатистики.Вставить("Загружено" , Новый Массив); СтруктураСтатистики.Вставить("Пропущено" , Новый Массив); СтруктураСтатистики.Вставить("Обновлено" , Новый Массив); СтруктураСтатистики.Вставить("Создано" , Новый Массив); СтруктураСтатистики.Вставить("Выгружено" , Новый Массив); Параметры.Вставить("СтруктураСтатистики", СтруктураСтатистики); ОписаниеОшибки = ""; ДатаНачала = ТекущаяДатаСеанса(); Если Параметры.ВыгружатьНаСайт Тогда ЗаказыССайта = Новый Массив; Параметры.Вставить("ЗаказыССайта",ЗаказыССайта); УспешноЗагружено = ЗагрузитьЗаказыССайта(Параметры, ОписаниеОшибки); ОбменССайтомСобытия.ЗаписатьИнформациюПоЗаказамВТаблицуИнформации(ТаблицаИнформации, Параметры, ДатаНачала, Истина, УспешноЗагружено, СтруктураСтатистики, ОписаниеОшибки); Иначе УспешноЗагружено = ЗагрузитьЗаказыИзФайла(Параметры, ОписаниеОшибки); ОбменССайтомСобытия.ЗаписатьИнформациюПоЗаказамВТаблицуИнформации(ТаблицаИнформации, Параметры, ДатаНачала, Истина, УспешноЗагружено, СтруктураСтатистики, ОписаниеОшибки); КонецЕсли; УспешноВыгружено = Истина; ВыгрузитьЗаказы(Параметры, ТаблицаИнформации, УспешноВыгружено); Успешно = УспешноЗагружено И УспешноВыгружено; Возврат Успешно; КонецФункции Процедура ВыгрузитьЗаказы(Параметры, ТаблицаИнформации, УспешноВыгружено) ТаблицаЗаказов = Новый ТаблицаЗначений; ОписаниеОшибки = ""; ПолучитьДанныеДляВыгрузкиЗаказов(Параметры, ТаблицаЗаказов, ОписаниеОшибки); Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда ОбменССайтомСобытия.ЗаписатьОшибку(ОписаниеОшибки, Параметры.УзелОбмена); УспешноВыгружено = Ложь; Возврат; КонецЕсли; Если ТаблицаЗаказов.Количество() = 0 Тогда Возврат ; КонецЕсли; ЗарегистрироватьВыгружаемыеДанные(ТаблицаЗаказов, "Заказ", Параметры.УзелОбмена); СтруктураСтатистики = Параметры.СтруктураСтатистики; УИД = Строка(Новый УникальныйИдентификатор); ОписаниеОшибки = ""; ИндексПорции = 0; НомерСообщения = 1; НомерСообщенияСтарый = Неопределено; КоличествоПовторов = 0; ВыполнятьОбмен = Истина; Пока ВыполнятьОбмен Цикл МассивЗаказов = ЗаказыУзла(Параметры.УзелОбмена, Параметры.РазмерПорции, 0); // Если в узле нет новых товаров, то м.б. остались старые. Если МассивЗаказов.Количество() = 0 Тогда ЗаказыСНомерами = ЗаказНомерСообщенияУзла(Параметры.УзелОбмена, Параметры.РазмерПорции); Если ЗаказыСНомерами .Количество() = 0 Тогда Прервать; КонецЕсли; Если НомерСообщенияСтарый = ЗаказыСНомерами [0].НомерСообщения Тогда КоличествоПовторов = КоличествоПовторов + 1; КонецЕсли; // Если количество повторов больше заданного // прерываем обмен. Если КоличествоПовторов >= Параметры.КоличествоПовторов Тогда ВыполнятьОбмен = Ложь; Прервать; КонецЕсли; МассивЗаказов = ЗаказыСНомерами .ВыгрузитьКолонку("Заказ"); НомерСообщенияСтарый = ЗаказыСНомерами[0].НомерСообщения; КонецЕсли; ТаблицаДанныеЗаказов = ТаблицаЗаказов.СкопироватьКолонки(); ТаблицаДанныеЗаказов.Колонки.Добавить("Товары"); // Из общей таблицы товаров получаем данные по товарам в порции // и сгруппируем их по ценам и остаткам и по складам. ЗаполнитьТаблицуДанныеЗаказов(МассивЗаказов, ТаблицаЗаказов, ТаблицаДанныеЗаказов); КоммерческаяИнформация = Неопределено; СформироватьЗаказыXDTO(Параметры, ТаблицаДанныеЗаказов, КоммерческаяИнформация); ИмяФайлаОбмена = "orders-" + УИД+ "_"+ НомерСообщения + ".xml"; ИмяФайлаОбмена = Параметры.КаталогНаДиске + "\" + ИмяФайлаОбмена; ПолноеИмяФайлаОбмена = ПодготовитьПутьДляПлатформы(Параметры.ПлатформаWindows, ИмяФайлаОбмена); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ИмяФайлаОбмена, "UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); Попытка КоммерческаяИнформация.Проверить(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КоммерческаяИнформация, "КоммерческаяИнформация"); ЗаписьXML.Закрыть(); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать XML-файл на диск:'") + " " + ПолноеИмяФайлаОбмена + Символы.ПС + ОписаниеОшибки())); СтруктураСтатистики.Выгружено.Очистить(); УспешноВыгружено = Ложь; Возврат ; КонецПопытки; // Отправляем файл на сайт. Если Параметры.ВыгружатьНаСайт Тогда СтрокаТаблицыИнформации = ТаблицаИнформации.Добавить(); УдалитьРегистрацию = ВыгрузитьДанныеНаСайт(Параметры, СтрокаТаблицыИнформации, "sale"); Иначе УдалитьРегистрацию = Истина; КонецЕсли; // Если файл на сайт был загружен, удаляем регистрацию. Если УдалитьРегистрацию Тогда Для Каждого ЭлементМассива Из МассивЗаказов Цикл ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; Иначе // Если имеем дело с данными, которые уже отправлялись на сайт, но не отправились, // то не будем у них изменять номер сообщения. Если Не НомерСообщенияСтарый = Неопределено Тогда Продолжить; КонецЕсли; // Если товары не были отправлены на сайт, то зарегистрируем их в узле // и пометим номером сообщения отличным от нуля. Для Каждого ЭлементМассива Из МассивЗаказов Цикл ПланыОбмена.ЗарегистрироватьИзменения(Параметры.УзелОбмена, ЭлементМассива); КонецЦикла; ПланыОбмена.ВыбратьИзменения(Параметры.УзелОбмена, НомерСообщения, МассивЗаказов); КонецЕсли; НомерСообщения = НомерСообщения + 1; КонецЦикла; КонецПроцедуры // Загружает заказы с сайта. // // Параметры: // Параметры - Структура, основные параметры // СтруктураСтатистики - Структура // ОписаниеОшибки - Строка // // Возвращаемое значение // Булево - Истина, если успех. // Функция ЗагрузитьЗаказыССайта(Параметры, ОписаниеОшибки) ОтветСервера = ""; Соединение = Неопределено; ТипСоединения = "sale"; АдресДляРаботы = Параметры.НастройкиПодключения.АдресСкрипта + "?type=" + ТипСоединения; ОписаниеОшибки = ""; Если НЕ ВыполнитьАвторизациюДляСоединения(Соединение, Параметры.НастройкиПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Загрузка заказов не выполнена.'")); Возврат Ложь; КонецЕсли; КукиИмя = СтрПолучитьСтроку(ОтветСервера, 2); КукиЗначение = СтрПолучитьСтроку(ОтветСервера, 3); ЗаголовкиЗапросов = Новый Соответствие; ЗаголовкиЗапросов.Вставить("Cookie", КукиИмя + "=" + КукиЗначение); ОписаниеОшибки = ""; ПараметрыЗапроса = АдресДляРаботы + Параметры.НастройкиПодключения.ПараметрЗапросаHTTP_ПолучитьДанные; Если Параметры.ИспользоватьИдентификаторСессии Тогда ПараметрыЗапроса = ПараметрыЗапроса + "&sessid=" + Параметры.НастройкиПодключения.ИдентификаторСессии; КонецЕсли; ОтветСервера = ПолучитьДанныеССервера( Соединение, ОписаниеОшибки, ПараметрыЗапроса, ЗаголовкиЗапросов); Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Загрузка заказов не выполнена.'")); Возврат Ложь; КонецЕсли; СтрокаXML = ""; Если Лев(ОтветСервера, 2) = "PK" Тогда СтрокаXML = РаспаковатьZIPАрхив(ОтветСервера, ОписаниеОшибки); Иначе Если Лев(ОтветСервера, 5) = ".<ХозОперация> документа XML (%1)'"), ДокументXDTO.ХозОперация); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); Возврат Ложь; КонецЕсли; Если НЕ СвойствоXDTOЗаполнено(ДокументXDTO.Валюта) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка в значении узла <Документ>.<Валюта> документа XML (%1)'"), ДокументXDTO.Валюта); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); Возврат Ложь; КонецЕсли; // Получаем свойства заказа. СвойстваЗаказа = Новый Соответствие; Если ОбъектXDTOСодержитСвойство(ДокументXDTO, "ЗначенияРеквизитов") И ДокументXDTO.ЗначенияРеквизитов <> Неопределено И ОбъектXDTOСодержитСвойство(ДокументXDTO.ЗначенияРеквизитов, "ЗначениеРеквизита") Тогда МассивЗначенийРеквизитовXDTO = КоллекцияОбъектовXDTO(ДокументXDTO.ЗначенияРеквизитов.ЗначениеРеквизита); Для каждого ЗначениеРеквизитаXDTO Из МассивЗначенийРеквизитовXDTO Цикл Реквизит = ЗначениеРеквизитаXDTO.Наименование; Значение = ЗначениеРеквизитаXDTO.Значение; Если ТипЗнч(Значение) = Тип("Строка") Тогда ЗначениеРеквизита = Значение; ИначеЕсли ТипЗнч(Значение) = Тип("СписокXDTO") И Значение.Количество() > 0 Тогда ЗначениеРеквизита = Значение[0]; КонецЕсли; СвойстваЗаказа.Вставить(Реквизит, ЗначениеРеквизита); КонецЦикла; КонецЕсли; СтруктураСтатистики.ОбработаноНаЗагрузке = СтруктураСтатистики.ОбработаноНаЗагрузке + 1; ЭтоНовыйДокумент = Ложь; ЕстьСсылкиНаДокументыОплатыОтгрузки = Ложь; ЗаказЗакрытОтменен = Ложь; СпособОплаты = Справочники.БанковскиеСчетаОрганизаций.НайтиПоРеквизиту("НаименованиеСпособаОплатыДляСайта", ДокументXDTO.Оплата.Способ); //Доработка // Поиск должен осуществляться по номеру и дате НайденнаяСтрока = РанееЗагруженныеЗаказы.Найти(ДокументXDTO.Номер, "НомерЗаказаНаСайте"); Если НайденнаяСтрока <> Неопределено Тогда ЗаказЗакрытОтменен = НайденнаяСтрока.НеОбновлятьЗаказ; // Если ЗаказЗакрытОтменен Тогда СтруктураСтатистики.Пропущено.Добавить(НайденнаяСтрока.ЗаказПокупателя); ТекстОшибки = Строка(НайденнаяСтрока.ЗаказПокупателя) + " " + НСтр("ru = 'пропущен по причине:'") + Символы.ПС + НСтр("ru = 'Статус заказа - ""Закрыт"".'"); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); Продолжить; КонецЕсли; //ХЗ зачем это, но проверю ДокументОбъект = НайденнаяСтрока.ЗаказПокупателя.ПолучитьОбъект(); Иначе ДокументОбъект = Неопределено; ОбменССайтомПереопределяемый.СоздатьНовыйДокументЗаказ(ДокументОбъект); ЭтоНовыйДокумент = Истина; КонецЕсли; Если ДокументОбъект = Неопределено Тогда Возврат Ложь; КонецЕсли; Если ЗаказЗакрытОтменен Тогда // Если у заказа есть ссылки на документы оплаты или отгрузки - обновляем только свойства. СтруктураСтатистики.Пропущено.Добавить(ДокументОбъект.Ссылка); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 пропущен, т.к. существуют документы, введенные на основании заказа.'"), ДокументОбъект.Ссылка); ДобавитьОписаниеОшибки(ОписаниеОшибки, Сообщение); ОбновленыСвойстваЗаказа = Истина; // //ОбменССайтомПереопределяемый.ОбновитьСоздатьДополнительныеСведенияЗаказа(ОбновленыСвойстваЗаказа, // Параметры.ПрикладныеПараметры, // ДокументОбъект.Ссылка, // СвойстваЗаказа, ОписаниеОшибки); //Доработка+ Успех = ОбменССайтомПереопределяемый.ОбновитьСоздатьДополнительныеСведенияЗаказа(Параметры.ПрикладныеПараметры, ОбновленыСвойстваЗаказа, ДокументОбъект.Ссылка, СвойстваЗаказа, ОписаниеОшибки, СпособОплаты); Если Не Успех Тогда Возврат Ложь; КонецЕсли; //Доработка- Если ОбновленыСвойстваЗаказа Тогда Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Свойства заказа %1 обновлены.'"), ДокументОбъект.Ссылка); ДобавитьОписаниеОшибки(ОписаниеОшибки, Сообщение); КонецЕсли; Иначе Успешно = Ложь; СтруктураРеквизитыЗаказа = Неопределено; ИнициализироватьСтруктуруРеквизитов(СтруктураРеквизитыЗаказа); ИзвлечьСвойстваЗаказаИзДанныхДокументаXDTO(СтруктураРеквизитыЗаказа, ДокументXDTO, СвойстваЗаказа, Параметры, ОписаниеОшибки); // заполняем документ заказ ОбменССайтомПереопределяемый.ЗаполнитьЗаказ(ДокументОбъект, СтруктураРеквизитыЗаказа, СвойстваЗаказа, Параметры.ПрикладныеПараметры, ОписаниеОшибки, Успешно); Если НЕ Успешно Тогда Возврат Ложь; КонецЕсли; Если Не ЗначениеЗаполнено(ДокументОбъект.Номер) Тогда ДокументОбъект.УстановитьНовыйНомер(); КонецЕсли; //+ Сиротин Н.А. 19.05.19 ДокументОбъект.ДополнительныеСвойства.Вставить("ОбменССайтом", Истина); //- Сиротин Н.А, 19.05.19 ЗаписатьДокумент(ДокументОбъект); ОбменССайтомПереопределяемый.ПослеЗаписиЗаказа(ДокументОбъект.Ссылка, Параметры.ПрикладныеПараметры, СвойстваЗаказа); Если ЭтоНовыйДокумент Тогда СтруктураСтатистики.Создано.Добавить(ДокументОбъект.Ссылка); Иначе СтруктураСтатистики.Обновлено.Добавить(ДокументОбъект.Ссылка); КонецЕсли; ОбновленыСвойстваЗаказа = Истина; //ОбменССайтомПереопределяемый.ОбновитьСоздатьДополнительныеСведенияЗаказа(ОбновленыСвойстваЗаказа, // Параметры.ПрикладныеПараметры, // ДокументОбъект.Ссылка, // СвойстваЗаказа, ОписаниеОшибки); //Доработка+ Успех = ОбменССайтомПереопределяемый.ОбновитьСоздатьДополнительныеСведенияЗаказа(Параметры.ПрикладныеПараметры, ОбновленыСвойстваЗаказа, ДокументОбъект.Ссылка, СвойстваЗаказа, ОписаниеОшибки, СпособОплаты); Если Не Успех Тогда Возврат Ложь; КонецЕсли; //Доработка- //TSSS24 Если ОбновленыСвойстваЗаказа Тогда Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Свойства заказа %1 обновлены.'"), ДокументОбъект.Ссылка); ДобавитьОписаниеОшибки(ОписаниеОшибки, Сообщение); КонецЕсли; СтруктураСтатистики.Загружено.Добавить(ДокументОбъект.Ссылка); НоваяСтрока = ТаблицаЗаказов.Добавить(); НоваяСтрока.Заказ = ДокументОбъект.Ссылка; НоваяСтрока.НомерЗаказа = СтруктураРеквизитыЗаказа.Номер; НоваяСтрока.ДатаЗаказа = СтруктураРеквизитыЗаказа.Дата; ЗаказОтмененССайта = СвойстваЗаказа.Получить("Отменен"); Если ВРег(ЗаказОтмененССайта) = ВРег("true") Тогда МассивОтмененныхЗаказов.Добавить(ДокументОбъект.Ссылка); КонецЕсли; КонецЕсли; Параметры.СвойстваЗаказов.Вставить(ДокументОбъект.Ссылка, СвойстваЗаказа); КонецЦикла; ОбменССайтомПереопределяемый.ЗаписатьДатуНомерЗаказовССайта(ТаблицаЗаказов, Параметры.ПрикладныеПараметры); ОтменитьЗаказыОтмененныеНаСайте(МассивОтмененныхЗаказов, Параметры.ПрикладныеПараметры); Возврат Истина; КонецФункции Процедура ИзвлечьСвойстваЗаказаИзДанныхДокументаXDTO(СтруктураРеквизитыЗаказа, ДокументXDTO, СвойстваЗаказа, Параметры, ОписаниеОшибки) ВремяСтрока = ""; Если ОбъектXDTOСодержитСвойство(ДокументXDTO, "Время") Тогда ВремяСтрока = ДокументXDTO.Время; КонецЕсли; СтруктураРеквизитыЗаказа.Ид = СокрЛП(ДокументXDTO.Ид); СтруктураРеквизитыЗаказа.Дата = ДатаВремяИзСтроки(ДокументXDTO.Дата, ВремяСтрока); СтруктураРеквизитыЗаказа.ДатаОтгрузки = ДатаОтгрузкиИзСвойствЗаказа(СвойстваЗаказа); СтруктураРеквизитыЗаказа.Номер = СокрЛП(ДокументXDTO.Номер); СтруктураРеквизитыЗаказа.ВалютаДокументаКод = ДокументXDTO.Валюта; Контрагент = Неопределено; ДанныеКонтрагента = Новый Структура; ЗаполнитьДанныеКонтрагента(ДанныеКонтрагента, ДокументXDTO); СтруктураРеквизитыЗаказа.Вставить("Контрагент", Неопределено); // Добавим адрес доставки непосредственно в структуру реквизитов заказа. СтрокаАдреса = ДанныеКонтрагента.ИнформацияПоКонтрагенту.Найти("Фактический адрес", "Вид"); ФактическийАдрес = ?(СтрокаАдреса <> Неопределено, СтрокаАдреса.Представление, ""); СтруктураРеквизитыЗаказа.Вставить("АдресДоставки", ФактическийАдрес); ОбменССайтомПереопределяемый.ИдентифицироватьКонтрагента(СтруктураРеквизитыЗаказа, ДанныеКонтрагента, Параметры.ПрикладныеПараметры, ОписаниеОшибки); Если СтруктураРеквизитыЗаказа.Контрагент = Неопределено Тогда Успешно = Ложь; КонецЕсли; Если НЕ ИдентифицироватьНоменклатуру(СтруктураРеквизитыЗаказа, ДокументXDTO, Параметры, ОписаниеОшибки) Тогда Успешно = Ложь; КонецЕсли; Склад = Неопределено; Если НЕ ДокументXDTO.Свойства().Получить("Склады") = Неопределено Тогда ДанныеСклада = Новый Структура; ИзвлечьРеквизитыСклада(ДокументXDTO.Склады.Склад, ДанныеСклада); ИдентифицироватьСклад(ДанныеСклада, Склад, ОписаниеОшибки); КонецЕсли; СтруктураРеквизитыЗаказа.ТочкаСамовывоза = Склад; Если ОбъектXDTOСодержитСвойство(ДокументXDTO, "Комментарий") И ТипЗнч(ДокументXDTO.Комментарий) = Тип("Строка") Тогда СтруктураРеквизитыЗаказа.Комментарий = ДокументXDTO.Комментарий; КонецЕсли; // ╒══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╕ // извлечём данные по доставке ДоставкаXDTO = ДокументXDTO.ПолучитьXDTO("Доставка"); Если ДоставкаXDTO<>Неопределено Тогда Попытка СтруктураРеквизитыЗаказа.СпособДоставки = Перечисления.СпособыДоставки[ДоставкаXDTO.Способ]; Исключение СтруктураРеквизитыЗаказа.СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчика; КонецПопытки; СтруктураРеквизитыЗаказа.ЗонаДоставки = Справочники.ЗоныДоставки.НайтиПоНаименованию(ДоставкаXDTO.Зона); СтруктураРеквизитыЗаказа.АдресДоставки = ДоставкаXDTO.Адрес; //+ Сиротин 19.05.2019 - добавим перевозчика Если СтруктураРеквизитыЗаказа.Свойство("Перевозчик") Тогда Если СтруктураРеквизитыЗаказа.СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчика ИЛИ СтруктураРеквизитыЗаказа.СпособДоставки = Перечисления.СпособыДоставки.СиламиПеревозчикаПоАдресу Тогда СтруктураРеквизитыЗаказа.Перевозчик = Справочники.Партнеры.НайтиПоКоду("00-00016083");//shipter - агрегатор КонецЕсли; КонецЕсли; Если ЗначениеЗаполнено(СтруктураРеквизитыЗаказа.Перевозчик) Тогда Если ТипЗнч(СтруктураРеквизитыЗаказа.Перевозчик) <> Тип("СправочникСсылка.Партнеры") Тогда ОбменССайтомПереопределяемый.ИдентифицироватьПеревозчика(СтруктураРеквизитыЗаказа, ОписаниеОшибки); КонецЕсли; КонецЕсли; //- Сиротин 19.05.2018 КонецЕсли; // ╘══════════════ Ушаков С.И. 13 января 2018 г. ════════════════╛ Успешно = Истина; КонецПроцедуры Процедура ЗаполнитьДанныеКонтрагента(ДанныеКонтрагента, ДокументXDTO) Если ТипЗнч(ДокументXDTO.Контрагенты.Контрагент) = Тип("ОбъектXDTO") Тогда КонтрагентXDTO = ДокументXDTO.Контрагенты.Контрагент; Иначе КонтрагентXDTO = ДокументXDTO.Контрагенты.Контрагент[0]; КонецЕсли; ЮрЛицо = ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ОфициальноеНаименование"); ОфициальноеНаименование = ""; Если ЮрЛицо Тогда ОфициальноеНаименование = КонтрагентXDTO.ОфициальноеНаименование; КонецЕсли; ДанныеКонтрагента.Вставить("ЮрЛицо", ЮрЛицо); ДанныеКонтрагента.Вставить("ОфициальноеНаименование", ОфициальноеНаименование); ПолноеНаименование = ""; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ПолноеНаименование") Тогда Если Не ТипЗнч(КонтрагентXDTO.ПолноеНаименование) = Тип("ОбъектXDTO") Тогда ПолноеНаименование = КонтрагентXDTO.ПолноеНаименование; КонецЕсли; КонецЕсли; ДанныеКонтрагента.Вставить("ПолноеНаименование",ПолноеНаименование); Наименование = ""; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Наименование") Тогда Если Не ТипЗнч(КонтрагентXDTO.Наименование) = Тип("ОбъектXDTO") Тогда Наименование = КонтрагентXDTO.Наименование; КонецЕсли; КонецЕсли; ДанныеКонтрагента.Вставить("Наименование", Наименование); ФИО = ПолучитьИзОбъектаXDTOСтрокуСФИО(КонтрагентXDTO); ДанныеКонтрагента.Вставить("ФИО", ФИО); ОКПО = ""; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ОКПО") Тогда ОКПО = КонтрагентXDTO.ОКПО; КонецЕсли; ДанныеКонтрагента.Вставить("ОКПО", ОКПО); ИНН = ""; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ИНН") Тогда ИНН = КонтрагентXDTO.ИНН; КонецЕсли; ДанныеКонтрагента.Вставить("ИНН", ИНН); КПП = ""; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "КПП") Тогда КПП = КонтрагентXDTO.КПП; КонецЕсли; ДанныеКонтрагента.Вставить("КПП", КПП); // Банковские счета. Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "РасчетныеСчета") И КонтрагентXDTO.РасчетныеСчета <> Неопределено И ОбъектXDTOСодержитСвойство(КонтрагентXDTO.РасчетныеСчета, "РасчетныйСчет") Тогда РасчетныеСчетаXDTO = КонтрагентXDTO.РасчетныеСчета.РасчетныйСчет; МассивРасчетныхСчетовXDTO = КоллекцияОбъектовXDTO(РасчетныеСчетаXDTO); РасчетныеСчета = Новый Массив; Для каждого РасчетныйСчетXDTO Из МассивРасчетныхСчетовXDTO Цикл РасчетныйСчет = Новый Структура; НомерСчета = СтрЗаменить(РасчетныйСчетXDTO.НомерСчета, " ", ""); РасчетныйСчет.Вставить("НомерСчета", НомерСчета); БанкXDTO = РасчетныйСчетXDTO.Банк; ДанныеБанкаXDTO = ПолучитьДанныеБанкаXDTO(БанкXDTO); РасчетныйСчет.Вставить("ДанныеБанка", ДанныеБанкаXDTO); Комментарий = ""; Если ОбъектXDTOСодержитСвойство(РасчетныйСчетXDTO, "Комментарий") И СвойствоXDTOЗаполнено(РасчетныйСчетXDTO.Комментарий) Тогда Комментарий = РасчетныйСчетXDTO.Комментарий; КонецЕсли; РасчетныйСчет.Вставить("Комментарий", Комментарий); РасчетныеСчета.Добавить(РасчетныйСчет); КонецЦикла; ДанныеКонтрагента.Вставить("РасчетныеСчета", РасчетныеСчета); КонецЕсли; ИнформацияПоКонтрагенту = Новый ТаблицаЗначений; ИнформацияПоКонтрагенту.Колонки.Добавить("Вид"); ИнформацияПоКонтрагенту.Колонки.Добавить("Представление"); ЗаполнитьДанныеКонтрагентаЗаказа(КонтрагентXDTO, ИнформацияПоКонтрагенту); ДанныеКонтрагента.Вставить("ИнформацияПоКонтрагенту",ИнформацияПоКонтрагенту); КонецПроцедуры Процедура ИзвлечьРеквизитыСклада(СкладXDTO, ДанныеСклада) ДанныеСклада.Вставить("Ид", СкладXDTO.Ид); АдресСклада = Новый Структура; АдресСклада.Вставить("ТипАдреса", СкладXDTO.Адрес.АдресноеПоле.Тип); АдресСклада.Вставить("ЗначениеАдреса", СкладXDTO.Адрес.АдресноеПоле.Значение); ДанныеСклада.Вставить("Адрес", АдресСклада); КонтактыСклада = Новый Структура("ТипКонтакта,ЗначениеКонтакта"); Если Не ТипЗнч(СкладXDTO.Контакты.Контакт.Значение) = Тип("ОбъектXDTO") Тогда КонтактыСклада.ТипКонтакта = СкладXDTO.Контакты.Контакт.Тип; КонтактыСклада.ЗначениеКонтакта = СкладXDTO.Контакты.Контакт.Значение; КонецЕсли; ДанныеСклада.Вставить("Контакты", КонтактыСклада); ДанныеСклада.Вставить("Наименование", СкладXDTO.Наименование); КонецПроцедуры // ДанныеСклада - структура // Поля: // Ид - Строка, идентификатор склада. // Адрес - Структура с полями "ТипАдреса" и "ЗначениеАдреса". // Контакты - Структура с полями "ТипКонтакта" и "ЗначениеКонтакта". // Наименование - Строка - наименование склада. // Процедура ИдентифицироватьСклад(ДанныеСклада, Склад, ОписаниеОшибки) // Если в параметрах склада Если Не ЗначениеЗаполнено(ДанныеСклада.Ид) И Не ЗначениеЗаполнено(ДанныеСклада.Наименование) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Не заполнены поля поиска точки самовывоза: ""Ид"" и ""Наименование""'")); Возврат; КонецЕсли; ИмяСправочникаСклады = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("ТочкиСамовывоза"); Попытка Склад = Справочники[ИмяСправочникаСклады].ПолучитьСсылку(Новый УникальныйИдентификатор(ДанныеСклада.Ид)); Если Не Склад = Справочники[ИмяСправочникаСклады].ПустаяСсылка() И Склад.ПолучитьОбъект() <> Неопределено Тогда Возврат; КонецЕсли; Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Точка самовывоза не найдена по уникальному идентификатору:'")+ " " + ДанныеСклада.Ид); КонецПопытки; Попытка Склад = Справочники[ИмяСправочникаСклады].НайтиПоНаименованию(ДанныеСклада.Наименование); Если Не Склад = Справочники[ИмяСправочникаСклады].ПустаяСсылка() И Склад.ПолучитьОбъект() <> Неопределено Тогда Возврат; КонецЕсли; Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Точка самовывоза не найдена по наименованию:'")+ " " + ДанныеСклада.Наименование); КонецПопытки; ОбменССайтомПереопределяемый.СоздатьТочкуСамовывоза(ДанныеСклада, Склад); КонецПроцедуры Процедура ЗаписатьДокумент(ДокументОбъект) Если НЕ ЗначениеЗаполнено(ДокументОбъект.Номер) Тогда ДокументОбъект.УстановитьНовыйНомер(); КонецЕсли; Если ДокументОбъект.Проведен Тогда ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Иначе ДокументОбъект.ОбменДанными.Загрузка = Истина; ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); КонецЕсли; КонецПроцедуры Функция ДатаОтгрузкиИзСвойствЗаказа(СвойстваЗаказа) ДатаОтгрузки = Дата(1,1,1); ДатаОтгрузкиСтрока = СвойстваЗаказа.Получить("Дата отгрузки"); Если ДатаОтгрузкиСтрока <> Неопределено И ЗначениеЗаполнено(ДатаОтгрузкиСтрока) Тогда ДатаСтрока = Лев(ДатаОтгрузкиСтрока, 10); ВремяСтрока = Сред(ДатаОтгрузкиСтрока, 12); ДатаОтгрузки = ДатаВремяИзСтроки(ДатаСтрока, ВремяСтрока); КонецЕсли; Возврат ДатаОтгрузки; КонецФункции // Добавляет и заполняет строку табличной части "ИнформацияПоКонтрагенту" заказа покупателя. // // Параметры // Вид - Строка, вид информации // Представление - строка, информация о контрагенте // ИнформацияПоКонтрагенту - ТабличнаяЧасть документ ЗаказПокупателю. // Процедура ДобавитьСтрокуИнформацииПоКонтрагенту(Вид, Представление, ИнформацияПоКонтрагенту) //+ Ковальский 2021-01-06 - если Представление - ОбъектXDTO, скорее всего на сайте не заполнено. //Во избежании ошибок пропускаем такие данные Если ТипЗнч(Представление) = Тип("ОбъектXDTO") Тогда Возврат; КонецЕсли; //- Ковальский 2021-01-06 Если ЗначениеЗаполнено(Представление) Тогда НоваяСтрока = ИнформацияПоКонтрагенту.Добавить(); НоваяСтрока.Вид = Вид; НоваяСтрока.Представление = Представление; КонецЕсли; КонецПроцедуры Функция УточненноеПредставлениеАдреса(АдресXDTO) Если ОбъектXDTOСодержитСвойство(АдресXDTO, "АдресноеПоле") И ТипЗнч(АдресXDTO.АдресноеПоле) = Тип("СписокXDTO") Тогда ПочтовыйИндекс = ""; Страна = ""; Регион = ""; Район = ""; НаселенныйПункт = ""; Город = ""; Улица = ""; Дом = ""; Корпус = ""; Квартира = ""; АдресноеПоле = АдресXDTO.АдресноеПоле; Для Каждого ТипАдреса Из АдресноеПоле Цикл Если НРег(ТипАдреса.Тип) = НРег("Почтовый индекс") Тогда ПочтовыйИндекс = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Страна") Тогда Страна = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Регион") Тогда Регион = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Район") Тогда Район = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Населенный пункт") Тогда НаселенныйПункт = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Город") Тогда Город = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Улица") Тогда Улица = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Дом") Тогда Дом = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Корпус") Тогда Корпус = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; Если НРег(ТипАдреса.Тип) = НРег("Квартира") Тогда Квартира = ЗначениеПростогоТипаИзXDTO(ТипАдреса.Значение); КонецЕсли; КонецЦикла; ПредставлениеАдреса = ?(ЗначениеЗаполнено(ПочтовыйИндекс), ПочтовыйИндекс+","+ " ","") + ?(ЗначениеЗаполнено(Страна), Страна + "," + " ","") + ?(ЗначениеЗаполнено(Регион), Регион + "," + " ","") + ?(ЗначениеЗаполнено(Район), Район + "," + " ","") + ?(ЗначениеЗаполнено(НаселенныйПункт), НаселенныйПункт + "," + " ","") + ?(ЗначениеЗаполнено(Город), Город + " " + НСтр("ru = 'г'") + ","+ " ","") + ?(ЗначениеЗаполнено(Улица), Улица + " " + НСтр("ru = 'ул'") + "," + " ","") + ?(ЗначениеЗаполнено(Дом),НСтр("ru = 'дом №'") + " " + Дом + "," + " ","") + ?(ЗначениеЗаполнено(Корпус), Корпус + "," + " ","") + ?(ЗначениеЗаполнено(Квартира),НСтр("ru = 'квартира'") + " " + Квартира + " ",""); Иначе ПредставлениеАдреса = СокрЛП(АдресXDTO.Представление); КонецЕсли; Возврат ПредставлениеАдреса; КонецФункции // Заполняет табличную часть "ИнформацияПоКонтрагенту" заказа покупателя. // Процедура ЗаполнитьДанныеКонтрагентаЗаказа(КонтрагентXDTO, ИнформацияПоКонтрагенту) ЭтоЮрЛицо = Ложь; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Наименование") И СвойствоXDTOЗаполнено(КонтрагентXDTO.Наименование) Тогда ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='Наименование'"), КонтрагентXDTO.Наименование, ИнформацияПоКонтрагенту); КонецЕсли; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ПолноеНаименование") И СвойствоXDTOЗаполнено(КонтрагентXDTO.ПолноеНаименование) Тогда ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='Полное наименование'"), КонтрагентXDTO.ПолноеНаименование, ИнформацияПоКонтрагенту); ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='Юр./Физ. лицо'"), НСтр("ru = 'Физ. лицо'"), ИнформацияПоКонтрагенту); ИначеЕсли ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ОфициальноеНаименование") И СвойствоXDTOЗаполнено(КонтрагентXDTO.ОфициальноеНаименование) Тогда ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='Полное наименование'"), КонтрагентXDTO.ОфициальноеНаименование, ИнформацияПоКонтрагенту); ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru = 'Юр./Физ. лицо'"), НСтр("ru = 'Юр. лицо'"), ИнформацияПоКонтрагенту); ЭтоЮрЛицо = Истина; КонецЕсли; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ИНН") Тогда ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='ИНН'"), КонтрагентXDTO.ИНН, ИнформацияПоКонтрагенту); КонецЕсли; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "КПП") Тогда ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='КПП'"), КонтрагентXDTO.КПП, ИнформацияПоКонтрагенту); КонецЕсли; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ОКПО") И СвойствоXDTOЗаполнено(КонтрагентXDTO.ОКПО) Тогда ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru ='ОКПО'"), КонтрагентXDTO.ОКПО, ИнформацияПоКонтрагенту); КонецЕсли; // Контактная информация. Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Адрес") И ОбъектXDTOСодержитСвойство(КонтрагентXDTO.Адрес, "Представление") И СвойствоXDTOЗаполнено(КонтрагентXDTO.Адрес.Представление) Тогда ФактическийАдресПредставление = УточненноеПредставлениеАдреса(КонтрагентXDTO.Адрес); ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru = 'Фактический адрес'"), ФактическийАдресПредставление, ИнформацияПоКонтрагенту); КонецЕсли; Если ЭтоЮрЛицо И ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "ЮридическийАдрес") И ОбъектXDTOСодержитСвойство(КонтрагентXDTO.ЮридическийАдрес, "Представление") И СвойствоXDTOЗаполнено(КонтрагентXDTO.ЮридическийАдрес.Представление) Тогда ЮридическийАдресПредставление = УточненноеПредставлениеАдреса(КонтрагентXDTO.ЮридическийАдрес); ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru = 'Юридический адрес'"), ЮридическийАдресПредставление, ИнформацияПоКонтрагенту); ИначеЕсли НЕ ЭтоЮрЛицо И ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "АдресРегистрации") И ОбъектXDTOСодержитСвойство(КонтрагентXDTO.АдресРегистрации, "Представление") И СвойствоXDTOЗаполнено(КонтрагентXDTO.АдресРегистрации.Представление) Тогда // физ. лицо содержит адрес регистрации АдресРегистрацииПредставление = УточненноеПредставлениеАдреса(КонтрагентXDTO.АдресРегистрации); ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru = 'Юридический адрес'"), АдресРегистрацииПредставление, ИнформацияПоКонтрагенту); КонецЕсли; //Контакты. Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Контакты") И ОбъектXDTOСодержитСвойство(КонтрагентXDTO.Контакты, "Контакт") Тогда КонтактыXDTO = КонтрагентXDTO.Контакты.Контакт; МассивКонтактовXDTO = КоллекцияОбъектовXDTO(КонтактыXDTO); Для каждого КонтактXDTO Из МассивКонтактовXDTO Цикл ТипКИXDTO = СтрЗаменить(КонтактXDTO.Тип, " ", ""); ДобавитьСтрокуИнформацииПоКонтрагенту(ТипКИXDTO, КонтактXDTO.Значение, ИнформацияПоКонтрагенту); КонецЦикла; КонецЕсли; // Контактные лица. Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Представители") И ОбъектXDTOСодержитСвойство(КонтрагентXDTO.Представители, "Представитель") Тогда ПредставителиXDTO = КонтрагентXDTO.Представители.Представитель; МассивПредставителейXDTO = КоллекцияОбъектовXDTO(ПредставителиXDTO); Если МассивПредставителейXDTO.Количество() > 0 Тогда КонтактныеЛица = ""; Для каждого ПредставительXDTO Из МассивПредставителейXDTO Цикл НаименованиеКЛ = ""; Если ОбъектXDTOСодержитСвойство(ПредставительXDTO, "Контрагент") И ОбъектXDTOСодержитСвойство(ПредставительXDTO.Контрагент, "Наименование") Тогда НаименованиеКЛ = ПредставительXDTO.Контрагент.Наименование; КонецЕсли; Если НЕ ПустаяСтрока(НаименованиеКЛ) Тогда КонтактныеЛица = КонтактныеЛица + НаименованиеКЛ + ";"; КонецЕсли; КонецЦикла; КонтактныеЛица = Сред(КонтактныеЛица,1,СтрДлина(КонтактныеЛица)-1); ДобавитьСтрокуИнформацииПоКонтрагенту(НСтр("ru = 'Контактные лица'"), КонтактныеЛица, ИнформацияПоКонтрагенту); КонецЕсли; КонецЕсли; КонецПроцедуры // Выполняет поиск номенклатуры и заполнение табличной части Запасы заказа покупателя. // Не найденные элементы номенклатуры создаются. // // Параметры // ДокументОбъект - ДокументОбъект.ЗаказПокупателя - заказ, для которого идентифицируется номенклатура. // ДокументXDTO - ОбъектXDTO - источник информации для заполнения данных заказа покупателя. // Параметры - Структура - параметры обмена. // ОписаниеОшибки - Строка - информация по ошибкам. // // Возвращаемое значение: // Булево - Истина, если не возникло ошибок. // Функция ИдентифицироватьНоменклатуру(РеквизитыЗаказа, ДокументXDTO, Параметры, ОписаниеОшибки) Успешно = Истина; Запасы = ИнициализироватьТаблицуЗапасов(); РеквизитыЗаказа.Товары = Запасы; Если НЕ ОбъектXDTOСодержитСвойство(ДокументXDTO, "Товары") ИЛИ ДокументXDTO.Товары = Неопределено ИЛИ НЕ ОбъектXDTOСодержитСвойство(ДокументXDTO.Товары, "Товар") Тогда Возврат Успешно ; КонецЕсли; СтавкаНДСПоУмолчанию = Неопределено; Если ОбъектXDTOСодержитСвойство(ДокументXDTO, "Налоги") И ДокументXDTO.Налоги <> Неопределено И ОбъектXDTOСодержитСвойство(ДокументXDTO.Налоги, "Налог") Тогда НалогиXDTO = ДокументXDTO.Налоги.Налог; МассивНалоговXDTO = КоллекцияОбъектовXDTO(НалогиXDTO); Для каждого НалогXDTO Из МассивНалоговXDTO Цикл Если ОбъектXDTOСодержитСвойство(НалогXDTO, "Наименование") И НРег(НалогXDTO.Наименование) = "ндс" Тогда Если ОбъектXDTOСодержитСвойство(НалогXDTO, "Ставка") Тогда СтавкаНДСПоУмолчанию = ОбменССайтомПовтИсп.ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(НалогXDTO.Ставка); КонецЕсли; Если ОбъектXDTOСодержитСвойство(НалогXDTO, "УчтеноВСумме") Тогда РеквизитыЗаказа.СуммаВключаетНДС = НалогXDTO.УчтеноВСумме = Истина ИЛИ НРег(НалогXDTO.УчтеноВСумме) = "true"; КонецЕсли; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; ТоварыXDTO = ДокументXDTO.Товары.Товар; МассивТоваровXDTO = КоллекцияОбъектовXDTO(ТоварыXDTO); Для каждого ТоварXDTO Из МассивТоваровXDTO Цикл ТипНоменклатурыXDTO = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "ЗначенияРеквизитов") И ТоварXDTO.ЗначенияРеквизитов <> Неопределено И ОбъектXDTOСодержитСвойство(ТоварXDTO.ЗначенияРеквизитов, "ЗначениеРеквизита") Тогда ЗначенияРеквизитовXDTO = ТоварXDTO.ЗначенияРеквизитов.ЗначениеРеквизита; МассивЗначенийРеквизитовXDTO = КоллекцияОбъектовXDTO(ЗначенияРеквизитовXDTO); Для каждого ЗначениеРеквизитаXDTO Из МассивЗначенийРеквизитовXDTO Цикл Если ЗначениеРеквизитаXDTO.Наименование = "ТипНоменклатуры" И ТипЗнч(ЗначениеРеквизитаXDTO.Значение) = Тип("Строка") Тогда ТипНоменклатурыXDTO = ЗначениеРеквизитаXDTO.Значение; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; СтавкаНДСНоменклатуры = Неопределено; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "СтавкиНалогов") И ТоварXDTO.СтавкиНалогов <> Неопределено И ОбъектXDTOСодержитСвойство(ТоварXDTO.СтавкиНалогов, "СтавкаНалога") Тогда СтавкиНалогов = ТоварXDTO.СтавкиНалогов.СтавкаНалога; МассивСтавокXDTO = КоллекцияОбъектовXDTO(СтавкиНалогов); Для каждого СтавкаНалога Из МассивСтавокXDTO Цикл Если НРег(СтавкаНалога.Наименование) = "ндс" Тогда ЗначениеСтавкиНДС = ОбменССайтомПовтИсп.ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(СтавкаНалога.Ставка); Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Единица") Тогда КодУпаковки = ТоварXDTO.Единица; Упаковка = Неопределено; ОбменССайтомПереопределяемый.НайтиСоздатьУпаковку(КодУпаковки, Упаковка); КонецЕсли; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Коэффициент") Тогда КоэффициентУпаковки = ТоварXDTO.Коэффициент; КонецЕсли; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Налоги") И ТоварXDTO.Налоги <> Неопределено И ОбъектXDTOСодержитСвойство(ТоварXDTO.Налоги, "Налог") Тогда НалогиXDTO = ТоварXDTO.Налоги.Налог; МассивНалоговXDTO = КоллекцияОбъектовXDTO(НалогиXDTO); Для каждого НалогXDTO Из МассивНалоговXDTO Цикл Если ОбъектXDTOСодержитСвойство(НалогXDTO, "Наименование") И НРег(НалогXDTO.Наименование) = "ндс" Тогда Если ОбъектXDTOСодержитСвойство(НалогXDTO, "Ставка") Тогда ЗначениеСтавкиНДС = ОбменССайтомПовтИсп.ПолучитьПоЗначениюДляВыгрузкиСтавкуНДС(НалогXDTO.Ставка); Прервать; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; СтавкаНДСНоменклатуры = ?(ЗначениеЗаполнено(ЗначениеСтавкиНДС), ЗначениеСтавкиНДС, СтавкаНДСПоУмолчанию); Если СтавкаНДСНоменклатуры = Неопределено Тогда СтавкаНДСНоменклатуры = НСтр("ru = 'Без НДС'"); ЗначениеСтавки = 0; Иначе ЗначениеСтавки = Число(СтавкаНДСНоменклатуры); КонецЕсли; ЭтоУслуга = НРег(ТипНоменклатурыXDTO) = НРег("Услуга"); Номенклатура = ПолучитьНоменклатуру(ТоварXDTO, ЭтоУслуга, Параметры, СтавкаНДСНоменклатуры, ОписаниеОшибки); Если НЕ ЗначениеЗаполнено(Номенклатура) Тогда Продолжить; КонецЕсли; ХарактеристикаНоменклатуры = НайтиСоздатьХарактеристикуНоменклатуры( ТоварXDTO, ЭтоУслуга, Номенклатура, Параметры, ОписаниеОшибки); Если НЕ ОбъектXDTOСодержитСвойство(ТоварXDTO, "Количество") Тогда Продолжить; КонецЕсли; Количество = ЧислоИзСтроки(ТоварXDTO.Количество); Если Количество = 0 Тогда Продолжить; КонецЕсли; Резерв = 0; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Резерв") Тогда Резерв = ЧислоИзСтроки(ТоварXDTO.Резерв); Если Резерв > Количество Тогда Резерв = Количество; КонецЕсли; КонецЕсли; ЦенаЗаЕдиницу = 0; Сумма = 0; СуммаСкидок = 0; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "ЦенаЗаЕдиницу") Тогда ЦенаЗаЕдиницу = ЧислоИзСтроки(ТоварXDTO.ЦенаЗаЕдиницу); КонецЕсли; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Сумма") Тогда Сумма = ЧислоИзСтроки(ТоварXDTO.Сумма); КонецЕсли; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Скидки") И ТоварXDTO.Скидки <> Неопределено И ОбъектXDTOСодержитСвойство(ТоварXDTO.Скидки, "Скидка") Тогда МассивСкидокXDTO = КоллекцияОбъектовXDTO(ТоварXDTO.Скидки.Скидка); Для каждого СкидкаXDTO Из МассивСкидокXDTO Цикл Если НЕ ОбъектXDTOСодержитСвойство(СкидкаXDTO, "УчтеноВСумме") ИЛИ НРег(СкидкаXDTO.УчтеноВСумме = "true") Тогда Продолжить; КонецЕсли; СуммаСкидки = ЧислоИзСтроки(СкидкаXDTO.Сумма); СуммаСкидок = СуммаСкидок + СуммаСкидки; КонецЦикла; КонецЕсли; // Добавляем новую строку в табличную часть "Запасы". // ╒══════════════ Ушаков С.И. 30 января 2018 г. ════════════════╕ // сделаем здесь хитрый финт. ЕСли у нас набор - разобъём его // хотя есть хитрая функция: ПодобранныеТовары = НаборыВызовСервера.Комплектующие(ПараметрыКомплектующих, ДополнительныеПараметры); // она СЛИШКОМ хитра. Сделаем попроще. КоличествоНаборов = Количество; ТЗКомпл = У1С_Доработки.ПолучитьТЗСоставляющих(Номенклатура); Для каждого СтрТЗ Из ТЗКомпл Цикл Номенклатура = СтрТЗ.Номенклатура; Количество = СтрТЗ.Количество * КоличествоНаборов; // Упаковка = Номенклатура.ЕдиницаИзмерения; // КоэффициентУпаковки = 1; // тупо, зато просто Сумма = У1С_Доработки.ЦенаНоменклатуры(Номенклатура) * Количество; ЦенаЗаЕдиницу = Сумма / Количество; // ╘══════════════ Ушаков С.И. 30 января 2018 г. ════════════════╛ НоваяСтрока = Запасы.Добавить(); НоваяСтрока.ТипНоменклатурыЗапас = НЕ ЭтоУслуга; НоваяСтрока.Номенклатура = Номенклатура; Если ЗначениеЗаполнено(Упаковка) Тогда НоваяСтрока.ЕдиницаИзмерения = Упаковка; КонецЕсли; Если ЗначениеЗаполнено(КоэффициентУпаковки) Тогда НоваяСтрока.Коэффициент = КоэффициентУпаковки КонецЕсли; НоваяСтрока.Характеристика = ХарактеристикаНоменклатуры; НоваяСтрока.Количество = Количество; НоваяСтрока.Резерв = Резерв; НоваяСтрока.СтавкаНДС = СтавкаНДСНоменклатуры; НоваяСтрока.ЗначениеСтавкиНДС = ЗначениеСтавки; НоваяСтрока.Сумма = ?(СуммаСкидок > 0, Сумма - СуммаСкидок, Сумма); НоваяСтрока.Цена = ?(ЦенаЗаЕдиницу > 0, ЦенаЗаЕдиницу, НоваяСтрока.Сумма / НоваяСтрока.Количество); // ╒══════════════ Ушаков С.И. 30 января 2018 г. ════════════════╕ КонецЦикла; // ╘══════════════ Ушаков С.И. 30 января 2018 г. ════════════════╛ КонецЦикла; ЗаполнитьЕдиницыИзмеренияТоваров(Запасы, ОписаниеОшибки); // Скидка на документ распределяется на строки табличной части пропорционально сумме. Если ОбъектXDTOСодержитСвойство(ДокументXDTO, "Скидки") И ДокументXDTO.Скидки <> Неопределено И ОбъектXDTOСодержитСвойство(ДокументXDTO.Скидки, "Скидка") Тогда МассивСкидокXDTO = КоллекцияОбъектовXDTO(ДокументXDTO.Скидки.Скидка); Для каждого СкидкаXDTO Из МассивСкидокXDTO Цикл Если ОбъектXDTOСодержитСвойство(СкидкаXDTO, "Сумма") Тогда Если ОбъектXDTOСодержитСвойство(СкидкаXDTO, "Наименование") И ОбъектXDTOСодержитСвойство(СкидкаXDTO, "Процент") Тогда ПроцентЧисло = ЧислоИзСтроки(СкидкаXDTO.Процент); Если ПроцентЧисло <> 0 Тогда РеквизитыЗаказа.НаименованиеСкидки = СкидкаXDTO.Наименование; РеквизитыЗаказа.ПроцентСкидки = СкидкаXDTO.Процент; КонецЕсли; КонецЕсли; Если ОбъектXDTOСодержитСвойство(СкидкаXDTO, "УчтеноВСумме") И НЕ НРег(СкидкаXDTO.УчтеноВСумме) = "true" Тогда СуммаСкидки = ЧислоИзСтроки(СкидкаXDTO.Сумма); Если СуммаСкидки <> 0 Тогда РеквизитыЗаказа.СуммаСкидки = СуммаСкидки; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Успешно; КонецФункции // Таблица, в которой хранятся данные, загружаемые в табличную часть Заказа покупателя. // Функция ИнициализироватьТаблицуЗапасов() ТаблицаЗапасы = Новый ТаблицаЗначений; ТаблицаЗапасы.Колонки.Добавить("ТипНоменклатурыЗапас"); ТаблицаЗапасы.Колонки.Добавить("Номенклатура"); ТаблицаЗапасы.Колонки.Добавить("ЕдиницаИзмерения"); ТаблицаЗапасы.Колонки.Добавить("Коэффициент"); ТаблицаЗапасы.Колонки.Добавить("Характеристика"); ТаблицаЗапасы.Колонки.Добавить("Резерв"); ТаблицаЗапасы.Колонки.Добавить("Количество"); ТаблицаЗапасы.Колонки.Добавить("СтавкаНДС"); ТаблицаЗапасы.Колонки.Добавить("ЗначениеСтавкиНДС"); ТаблицаЗапасы.Колонки.Добавить("Сумма"); ТаблицаЗапасы.Колонки.Добавить("СуммаНДС"); ТаблицаЗапасы.Колонки.Добавить("Цена"); ТаблицаЗапасы.Колонки.Добавить("Всего"); Возврат ТаблицаЗапасы; КонецФункции Функция НайтиСоздатьХарактеристикуНоменклатуры(ТоварXDTO, ЭтоУслуга, Номенклатура, Параметры, ОписаниеОшибки) ИмяПрикладногоСправочника = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("ХарактеристикиНоменклатуры"); Если ИмяПрикладногоСправочника = Неопределено Тогда Возврат Неопределено; КонецЕсли; ХарактеристикаНоменклатуры = Справочники[ИмяПрикладногоСправочника].ПустаяСсылка(); Если ЭтоУслуга ИЛИ Не Параметры.ИспользоватьХарактеристики Тогда Возврат ХарактеристикаНоменклатуры; КонецЕсли; ХарактеристикаТовараXDTO = Неопределено; ИдХарактеристики = ""; НаименованиеХарактеристики = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Ид") И СвойствоXDTOЗаполнено(ТоварXDTO.Ид) Тогда ИдХарактеристики = ИдХарактеристики(ТоварXDTO.Ид); КонецЕсли; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Наименование") И СвойствоXDTOЗаполнено(ТоварXDTO.Наименование) Тогда НаименованиеХарактеристики = НаименованиеХарактеристики(ТоварXDTO.Наименование); КонецЕсли; Попытка Если Не ПустаяСтрока(ИдХарактеристики) Тогда СправочникМенеджер = Справочники[ИмяПрикладногоСправочника]; ХарактеристикаНоменклатуры = СправочникМенеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдХарактеристики)); Если Не ХарактеристикаНоменклатуры = СправочникМенеджер.ПустаяСсылка() И ХарактеристикаНоменклатуры.ПолучитьОбъект() <> Неопределено Тогда Возврат ХарактеристикаНоменклатуры; Иначе Дополнение = НСтр("ru = 'Характеристика номенклатуры не найдена по уникальному идентификатору: %1'"); Дополнение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Дополнение, ИдХарактеристики); ДобавитьОписаниеОшибки(ОписаниеОшибки, Дополнение); КонецЕсли; КонецЕсли; Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось выполнить поиск характеристики номенклатуры по уникальному идентификатору:'") + " "+ ИдХарактеристики)); КонецПопытки; Если СвойствоXDTOЗаполнено(НаименованиеХарактеристики) Тогда ХарактеристикаНоменклатуры = СправочникМенеджер.НайтиПоНаименованию(НаименованиеХарактеристики, Истина,, Номенклатура); Иначе Возврат ХарактеристикаНоменклатуры; КонецЕсли; Если ЗначениеЗаполнено(ХарактеристикаНоменклатуры) Тогда Возврат ХарактеристикаНоменклатуры; КонецЕсли; ХарактеристикаНоменклатуры = СправочникМенеджер.СоздатьЭлемент(); ХарактеристикаНоменклатуры.Владелец = Номенклатура; ХарактеристикаНоменклатуры.Наименование = НаименованиеХарактеристики; ХарактеристикаНоменклатуры.Записать(); Если Параметры.ОбменТоварами И Параметры.ВыгружатьТолькоИзменения Тогда ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, ХарактеристикаНоменклатуры.Ссылка); КонецЕсли; Возврат ХарактеристикаНоменклатуры.Ссылка; КонецФункции Функция ПолучитьНоменклатуру(ТоварXDTO, ЭтоУслуга,Параметры, СтавкаНДС, ОписаниеОшибки) ДанныеНоменклатуры = Новый Структура; ИД = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Ид") Тогда Ид = ТоварXDTO.Ид; КонецЕсли; ДанныеНоменклатуры.Вставить("Ид",Ид); АртикулНоменклатуры = ""; НаименованиеНоменклатуры = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Артикул") И СвойствоXDTOЗаполнено(ТоварXDTO.Артикул) Тогда АртикулНоменклатуры = ТоварXDTO.Артикул; КонецЕсли; ДанныеНоменклатуры.Вставить("АртикулНоменклатуры",АртикулНоменклатуры); НаименованиеНоменклатуры = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "Наименование") И СвойствоXDTOЗаполнено(ТоварXDTO.Наименование) Тогда Наименование = НаименованиеНоменклатуры(ТоварXDTO.Наименование); КонецЕсли; ДанныеНоменклатуры.Вставить("НаименованиеНоменклатуры", Наименование); // ╒══════════════ Ушаков С.И. 24 ноября 2017 г. ════════════════╕ //ЕдиницаИзмерения = БазоваяЕдиницаИзмеренияИзТоварXDTO(ТоварXDTO); //ДанныеНоменклатуры.Вставить("ЕдиницаИзмерения", ЕдиницаИзмерения); УникальныйИдентификаторКорректен = Истина; Если НЕ ОбменССайтамиУТ.УспешноНайденТоварПоСсылке(, ДанныеНоменклатуры, , УникальныйИдентификаторКорректен) Тогда ЕдиницаИзмерения = БазоваяЕдиницаИзмеренияИзТоварXDTO(ТоварXDTO); ДанныеНоменклатуры.Вставить("ЕдиницаИзмерения", ЕдиницаИзмерения); КонецЕсли; // ╘══════════════ Ушаков С.И. 24 ноября 2017 г. ════════════════╛ ДанныеНоменклатуры.Вставить("ЭтоУслуга", ЭтоУслуга); ДанныеНоменклатуры.Вставить("СтавкаНДС", СтавкаНДС); Номенклатура = Неопределено; ОбменССайтомПереопределяемый.НайтиСоздатьНоменклатуру(Номенклатура, ДанныеНоменклатуры, Параметры.ПрикладныеПараметры, ОписаниеОшибки); Если Номенклатура = Неопределено Тогда Возврат Неопределено; КонецЕсли; ПланыОбмена.УдалитьРегистрациюИзменений(Параметры.УзелОбмена, Номенклатура); Возврат Номенклатура; КонецФункции Функция БазоваяЕдиницаИзмеренияИзТоварXDTO(ТоварXDTO) ЕдиницаПоКлассификатору = Новый Структура; // ╒══════════════ Ушаков С.И. 21 ноября 2017 г. ════════════════╕ Если НЕ ОбъектXDTOСодержитСвойство(ТоварXDTO, "БазоваяЕдиница") Тогда ЕдиницаПоКлассификатору.Вставить("КодБазовойЕдиницы", "796"); Возврат ЕдиницаПоКлассификатору; КонецЕсли; // ╘══════════════ Ушаков С.И. 21 ноября 2017 г. ════════════════╛ КодБазовойЕдиницы = ""; НаименованиеБазовойЕдиницы = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO, "БазоваяЕдиница") Тогда Если ОбъектXDTOСодержитСвойство(ТоварXDTO.БазоваяЕдиница, "Код") Тогда КодБазовойЕдиницы = ТоварXDTO.БазоваяЕдиница.Код; КонецЕсли; НаименованиеБазовойЕдиницы = ""; Если ОбъектXDTOСодержитСвойство(ТоварXDTO.БазоваяЕдиница, "НаименованиеПолное") И СвойствоXDTOЗаполнено(ТоварXDTO.БазоваяЕдиница.НаименованиеПолное) Тогда НаименованиеБазовойЕдиницы = ТоварXDTO.БазоваяЕдиница.НаименованиеПолное; КонецЕсли; КонецЕсли; ЕдиницаПоКлассификатору.Вставить("КодБазовойЕдиницы", КодБазовойЕдиницы); ЕдиницаПоКлассификатору.Вставить("НаименованиеБазовойЕдиницы", НаименованиеБазовойЕдиницы); Возврат ЕдиницаПоКлассификатору; КонецФункции Процедура ЗаполнитьТаблицуДанныеЗаказов(МассивЗаказов, ТаблицаИсточник, ТаблицаПриемник) Для Каждого ТекСтрока Из ТаблицаИсточник Цикл Если МассивЗаказов.Найти(ТекСтрока.Заказ) = Неопределено Тогда Продолжить; КонецЕсли; НоваяСтрока = ТаблицаПриемник.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока); КонецЦикла; ТаблицаТовары = ТаблицаПриемник.Скопировать(,"Заказ, ТоварыНоменклатура, |ТоварыНоменклатураАртикул, |ТоварыНоменклатураТипНоменклатуры, |ТоварыЕдиницаИзмерения, |ТоварыЕдиницаИзмеренияКод, |ТоварыЕдиницаИзмеренияМеждународноеСокращение, |ТоварыЕдиницаИзмеренияНаименование, |ТоварыЕдиницаИзмеренияНаименованиеПолное, |ТоварыЕдиницаИзмеренияПересчетКоэффициент, |ТоварыЕдиницаИзмеренияПересчетЕдиницаКод, |ТоварыКоличество, |ТоварыПроцентСкидки, |ТоварыСуммаСкидки, |ТоварыСтавкаНДС, |ТоварыСумма, |ТоварыСуммаНДС, |ТоварыХарактеристика, |ТоварыЦена"); ТаблицаПриемник.Свернуть("Заказ, ЗаказВалютаКод, ЗаказДата, ЗаказДатаНаСайте, |ЗаказДатаОплаты, |ЗаказДатаОтгрузки, |ЗаказЗакрыт, |ЗаказКОплатеОстаток, |ЗаказКОтгрузкеОстаток, |ЗаказКомментарий, |ЗаказНалогообложениеНДС, |ЗаказСуммаВключаетНДС, |ЗаказКурс, |ЗаказНомер, |ЗаказНомерНаСайте, |ЗаказНомерОтгрузки, |ЗаказНомерОплаты, |ЗаказПометкаУдаления, |ЗаказПроведен, |ЗаказСостояниеЗаказа, |ЗаказСтатусЗаказа, |ЗаказСуммаДокумента, |Контрагент, |КонтрагентИНН, |КонтрагентКПП, |КонтрагентКодПоОКПО, |КонтрагентНаименование, |КонтрагентНаименованиеПолное, |КонтрагентЮрФизЛицо, //Доработка+ |ЗаказТрекНомер, |ЗаказВебСтраницаПеревозчика","Товары"); //Доработка- Для Каждого ТекСтрока Из ТаблицаПриемник Цикл Отбор = Новый Структура; Отбор.Вставить("Заказ", ТекСтрока.Заказ); Товары = ТаблицаТовары.Скопировать(Отбор,"ТоварыНоменклатура, |ТоварыНоменклатураАртикул, |ТоварыНоменклатураТипНоменклатуры, |ТоварыЕдиницаИзмерения, |ТоварыЕдиницаИзмеренияКод, |ТоварыЕдиницаИзмеренияМеждународноеСокращение, |ТоварыЕдиницаИзмеренияНаименование, |ТоварыЕдиницаИзмеренияНаименованиеПолное, |ТоварыЕдиницаИзмеренияПересчетКоэффициент, |ТоварыЕдиницаИзмеренияПересчетЕдиницаКод, |ТоварыКоличество, |ТоварыПроцентСкидки, |ТоварыСуммаСкидки, |ТоварыСтавкаНДС, |ТоварыСумма, |ТоварыСуммаНДС, |ТоварыХарактеристика, |ТоварыЦена"); ТекСтрока.Товары = Товары; КонецЦикла; КонецПроцедуры Процедура СформироватьЗаказыXDTO(Параметры, ТаблицаДанныеЗаказов, КоммерческаяИнформацияXDTO) СтруктураСтатистики = Параметры.СтруктураСтатистики; КоммерческаяИнформацияXDTO = КоммерческаяИнформация(Параметры.ДатаФормирования); ПакетCML = ПакетCML(); Для Каждого ТекСтрока Из ТаблицаДанныеЗаказов Цикл // Если заказ есть в списке загруженных, то его не будем выгружать // Если Не СтруктураСтатистики.Загружено.Найти(ТекСтрока.Заказ) = Неопределено Тогда Продолжить; КонецЕсли; Если НЕ ЗначениеЗаполнено(ТекСтрока.ЗаказНомерНаСайте) ИЛИ НЕ ЗначениеЗаполнено(ТекСтрока.ЗаказДатаНаСайте) Тогда Продолжить; КонецЕсли; СтруктураСтатистики.Выгружено.Добавить(ТекСтрока.Заказ); ДокументТип = ПакетCML.Получить("Документ"); ДокументXDTO = ФабрикаXDTO.Создать(ДокументТип); ДокументXDTO.Ид = УникальныйИдентификаторОбъекта(ТекСтрока.Заказ); ДокументXDTO.Номер = ТекСтрока.ЗаказНомерНаСайте; ДокументXDTO.Дата = ТекСтрока.ЗаказДатаНаСайте; ДокументXDTO.ХозОперация = НСтр("ru ='Заказ товара'"); ДокументXDTO.Роль = НСтр("ru ='Продавец'"); ДокументXDTO.Валюта = ФорматНаименованияВалютыДляXDTO(ТекСтрока.ЗаказВалютаКод); ДокументXDTO.Курс = ТекСтрока.ЗаказКурс; ДокументXDTO.Сумма = ТекСтрока.ЗаказСуммаДокумента; ДокументXDTO.Время = ТекСтрока.ЗаказДатаНаСайте; Если ЗначениеЗаполнено(ТекСтрока.ЗаказДатаОплаты) Тогда ДокументXDTO.СрокПлатежа = ТекСтрока.ЗаказДатаОплаты; КонецЕсли; Комментарий = Лев(ТекСтрока.ЗаказКомментарий, 3000); Если НЕ ПустаяСтрока(Комментарий) Тогда ДокументXDTO.Комментарий = Комментарий; КонецЕсли; КонтрагентыXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(ДокументТип, "Контрагенты")); РеквизитыКонтрагента = ДанныеКонтрагента(ТекСтрока); КонтрагентXDTO = ПолучитьКонтрагентаXDTO(РеквизитыКонтрагента); КонтрагентыXDTO.Контрагент.Добавить(КонтрагентXDTO); ДокументXDTO.Контрагенты = КонтрагентыXDTO; ДеревоСвойствХарактеристик = Неопределено; ДобавитьТоварыЗаказаXDTO(ДокументXDTO, ТекСтрока, ДеревоСвойствХарактеристик, Параметры); ДобавитьЗначенияРеквизитовЗаказаXDTO(ДокументXDTO, ПакетCML, ТекСтрока, Параметры); КоммерческаяИнформацияXDTO.Документ.Добавить(ДокументXDTO); КонецЦикла; КонецПроцедуры Функция ДанныеКонтрагента(ТекСтрока) ДанныеКонтрагента = Новый Структура; ДанныеКонтрагента.Вставить("Контрагент", ТекСтрока.Контрагент); ДанныеКонтрагента.Вставить("Наименование", ТекСтрока.КонтрагентНаименование); ДанныеКонтрагента.Вставить("НаименованиеПолное",ТекСтрока.КонтрагентНаименованиеПолное); ДанныеКонтрагента.Вставить("ЮрФизЛицо", ТекСтрока.КонтрагентЮрФизЛицо); ДанныеКонтрагента.Вставить("ИНН", ТекСтрока.КонтрагентИНН); ДанныеКонтрагента.Вставить("КПП", ТекСтрока.КонтрагентКПП); ДанныеКонтрагента.Вставить("КодПоОКПО", ТекСтрока.КонтрагентКодПоОКПО); ДанныеКонтрагента.Вставить("КонтактнаяИнформация", ""); Возврат ДанныеКонтрагента; КонецФункции // Заполняет списки XDTO Товары и Налоги объекта XDTO типа Документ. // // Параметры // ДокументXDTO - объект XDTO типа Документ // ПакетCML - пакет XDTO, содержащий типы CML // ВыборкаДокументов - выборка, содержащая данные по заказам покупателей // ДеревоСвойствХарактеристик - дерево значений, содержащее свойства характеристик. // Параметры - структура, содержащая параметры обмена. // Процедура ДобавитьТоварыЗаказаXDTO(ДокументXDTO, ТекСтрока, ДеревоСвойствХарактеристик, Параметры) ТаблицаТоваров = ТекСтрока.Товары; Если ТаблицаТоваров.Количество() = 0 Тогда Возврат; КонецЕсли; ПакетCML = ПакетCML(); ТоварыТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ДокументXDTO.Тип(), "Товары"); ТоварТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварыТип, "Товар"); НалогиВДокументеXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(ДокументXDTO.Тип(), "Налоги")); ТоварыXDTO = ФабрикаXDTO.Создать(ТоварыТип); СчитатьНДС = Истина; ОбменССайтомПереопределяемый.ОпределитьНеобходимостьНДСВЗаказе(СчитатьНДС, ТекСтрока.ЗаказНалогообложениеНДС); СуммаНДС = 0; Для Каждого СтрокаТаблицыТоваров Из ТаблицаТоваров Цикл ТоварXDTO = ФабрикаXDTO.Создать(ТоварТип); Характеристика = Неопределено; Если Параметры.ИспользоватьХарактеристики Тогда Характеристика = СтрокаТаблицыТоваров.ТоварыХарактеристика; КонецЕсли; ИдТовара = УникальныйИдентификаторОбъекта(СтрокаТаблицыТоваров.ТоварыНоменклатура, Характеристика); ТоварXDTO.Ид = ИдТовара; ТоварXDTO.Артикул = СтрокаТаблицыТоваров.ТоварыНоменклатураАртикул; ТоварXDTO.Наименование = ФорматНаименованияДляXDTO(СтрокаТаблицыТоваров.ТоварыНоменклатура); РеквизитыЕдиницыИзмерения = ДанныеЕдиницыИзмерения(СтрокаТаблицыТоваров); ТоварXDTO.БазоваяЕдиница = БазоваяЕдиницаXDTO(ТоварXDTO, РеквизитыЕдиницыИзмерения); ТоварXDTO.ЦенаЗаЕдиницу = СтрокаТаблицыТоваров.ТоварыЦена; ТоварXDTO.Количество = СтрокаТаблицыТоваров.ТоварыКоличество; ТоварXDTO.Сумма = СтрокаТаблицыТоваров.ТоварыСумма; Если ЗначениеЗаполнено(СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияПересчетЕдиницаКод) Тогда ТоварXDTO.Единица = Лев(Строка(СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияПересчетЕдиницаКод),3); КонецЕсли; Если ЗначениеЗаполнено(СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияПересчетКоэффициент) Тогда ТоварXDTO.Коэффициент = СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияПересчетКоэффициент; КонецЕсли; ДобавитьТипНоменклатурыВЗначенияРеквизитов(ТоварXDTO, СтрокаТаблицыТоваров.ТоварыНоменклатураТипНоменклатуры); Если СтрокаТаблицыТоваров.ТоварыСуммаНДС > 0 Тогда НалогТовараXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("Налог")); СтавкиНалоговXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "СтавкиНалогов")); ТипНалогиТовара = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "Налоги"); НалогиТовараXDTO = ФабрикаXDTO.Создать(ТипНалогиТовара); ТипНалогТовара = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТипНалогиТовара, "Налог"); НалогТовараXDTO = ФабрикаXDTO.Создать(ТипНалогТовара); НалогТовараXDTO.Наименование = Параметры.НаименованиеНалога; НалогТовараXDTO.УчтеноВСумме = ТекСтрока.ЗаказСуммаВключаетНДС; НалогТовараXDTO.Сумма = СтрокаТаблицыТоваров.ТоварыСуммаНДС; ЗначениеСтавкиНДС = 0; ОбменССайтомПереопределяемый.ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(СтрокаТаблицыТоваров.ТоварыСтавкаНДС, ЗначениеСтавкиНДС); НалогТовараXDTO.Ставка = ЗначениеСтавкиНДС; НалогиТовараXDTO.Налог.Добавить(НалогТовараXDTO); ТоварXDTO.Налоги = НалогиТовараXDTO; Если СчитатьНДС Тогда СуммаНДС = СуммаНДС + СтрокаТаблицыТоваров.ТоварыСуммаНДС; КонецЕсли; КонецЕсли; ПроцентСкидки = СтрокаТаблицыТоваров.ТоварыПроцентСкидки; Если ПроцентСкидки <> 0 Тогда СуммаСкидки = СтрокаТаблицыТоваров.ТоварыСуммаСкидки; СкидкиТовараXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "Скидки")); СкидкаТовараXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(СкидкиТовараXDTO.Тип(), "Скидка")); СкидкаТовараXDTO.Наименование = Строка(ПроцентСкидки); СкидкаТовараXDTO.Процент = ПроцентСкидки; СкидкаТовараXDTO.Сумма = СуммаСкидки; СкидкаТовараXDTO.УчтеноВСумме = "true"; СкидкиТовараXDTO.Скидка.Добавить(СкидкаТовараXDTO); ТоварXDTO.Скидки = СкидкиТовараXDTO; КонецЕсли; Если ЗначениеЗаполнено(СтрокаТаблицыТоваров.ТоварыСтавкаНДС) Тогда СтавкиНалоговXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТоварТип, "СтавкиНалогов")); СтавкаНалогаXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(СтавкиНалоговXDTO.Тип(), "СтавкаНалога")); СтавкаНалогаXDTO.Наименование = Параметры.НаименованиеНалога; ЗначениеСтавки = 0; ОбменССайтомПереопределяемый.ПолучитьПоСтавкеНДСЗначениеДляВыгрузки(СтрокаТаблицыТоваров.ТоварыСтавкаНДС, ЗначениеСтавки); СтавкаНалогаXDTO.Ставка = ЗначениеСтавки; СтавкиНалоговXDTO.СтавкаНалога.Добавить(СтавкаНалогаXDTO); ТоварXDTO.СтавкиНалогов = СтавкиНалоговXDTO; КонецЕсли; ТоварыXDTO.Товар.Добавить(ТоварXDTO); КонецЦикла; ТипДокумента = ПакетCML.Получить("Документ"); ТипНалогиДокумента = ТипДокумента.Свойства.Получить("Налоги").Тип; ТипНалогДокумента = ТипНалогиДокумента.Свойства.Получить("Налог").Тип; НалогДокументаXDTO = ФабрикаXDTO.Создать(ТипНалогДокумента); НалогДокументаXDTO.Наименование = Параметры.НаименованиеНалога; НалогДокументаXDTO.УчтеноВСумме = ТекСтрока.ЗаказСуммаВключаетНДС; НалогДокументаXDTO.Сумма = СуммаНДС; НалогиВДокументеXDTO.Налог.Добавить(НалогДокументаXDTO); ДокументXDTO.Налоги = НалогиВДокументеXDTO; ДокументXDTO.Товары = ТоварыXDTO; КонецПроцедуры // Заполняет значения дополнительных реквизитов для объекта XDTO типа Документ. // // Параметры // ДокументXDTO - объект XDTO типа Документ // ПакетCML - пакет XDTO, содержащий типы CML // ДанныеДокумента - выборка, содержащая данные заказа покупателя // Параметры - структура, содержащая параметры обмена. // Процедура ДобавитьЗначенияРеквизитовЗаказаXDTO(ДокументXDTO, ПакетCML, ДанныеДокумента, Параметры) ЗначенияРеквизитовXDTO = ФабрикаXDTO.Создать(ДокументXDTO.Свойства().Получить("ЗначенияРеквизитов").Тип); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru = 'Номер по 1С'"), ДанныеДокумента.ЗаказНомер); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru = 'Дата по 1С'"), ФорматДатыДляXDTO(ДанныеДокумента.ЗаказДата, Истина, Истина)); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "ПометкаУдаления", ДанныеДокумента.ЗаказПометкаУдаления); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Проведен", ДанныеДокумента.ЗаказПроведен); ЗаказОплачен = Ложь; ОбменССайтомПереопределяемый.ОпределитьСтатусОплатыЗаказа(ЗаказОплачен, ДанныеДокумента.ЗаказСтатусЗаказа, ДанныеДокумента.ЗаказКОплатеОстаток); Если ДанныеДокумента.ЗаказПроведен И ЗаказОплачен Тогда ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru = 'Номер оплаты по 1С'"), ДанныеДокумента.ЗаказНомерОплаты); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru = 'Дата оплаты по 1С'"), ФорматДатыДляXDTO(ДанныеДокумента.ЗаказДатаОплаты, Истина, Истина)); КонецЕсли; ЗаказОтгружен = Ложь; ОбменССайтомПереопределяемый.ОпределитьСтатусОтгрузкиЗаказа(ЗаказОтгружен, ДанныеДокумента.ЗаказСтатусЗаказа, ДанныеДокумента.ЗаказКОтгрузкеОстаток); Если ДанныеДокумента.ЗаказПроведен И ЗаказОтгружен Тогда ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru = 'Номер отгрузки по 1С'"), ДанныеДокумента.ЗаказНомерОтгрузки); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, НСтр("ru = 'Дата отгрузки по 1С'"), ФорматДатыДляXDTO(ДанныеДокумента.ЗаказДатаОтгрузки, Истина, Истина)); КонецЕсли; ЗаказВРаботе = Ложь; ОбменССайтомПереопределяемый.ОпределитьСтатусСостоянияЗаказаЗаказВРаботе(ЗаказВРаботе, ДанныеДокумента.ЗаказСостояниеЗаказа); Если ДанныеДокумента.ЗаказЗакрыт И ЗаказВРаботе Тогда ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Отменен", "true"); КонецЕсли; //+Филиппенко В.Б 20200109 ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "Трек номер", ДанныеДокумента.ЗаказТрекНомер); ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, "СсылкаТК", ДанныеДокумента.ЗаказВебСтраницаПеревозчика); //-Филиппенко В.Б. 20200109 ДокументXDTO.ЗначенияРеквизитов = ЗначенияРеквизитовXDTO; КонецПроцедуры #КонецОбласти Процедура ОтменитьЗаказыОтмененныеНаСайте(МассивОтмененныхЗаказов, ПрикладныеПараметры) Если МассивОтмененныхЗаказов.Количество() = 0 Тогда Возврат; КонецЕсли; Для Каждого ДокументСсылка Из МассивОтмененныхЗаказов Цикл ОбменССайтомПереопределяемый.ОтменитьЗаказ(ПрикладныеПараметры, ДокументСсылка); КонецЦикла; КонецПроцедуры Процедура ДобавитьТипНоменклатурыВЗначенияРеквизитов(ТоварXDTO, ТипНоменклатуры) ЗначениеРеквизитов = ТоварXDTO.Свойства().Получить("ЗначенияРеквизитов").Тип; ЗначениеРеквизитовXDTO = ФабрикаXDTO.Создать(ЗначениеРеквизитов); ПакетCML = ПакетCML(); ЗначениеРеквизитаXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("ЗначениеРеквизита")); ЗначениеРеквизитаXDTO.Наименование = "ТипНоменклатуры"; ЗначениеСвойства = ТипНоменклатуры; ЗначениеРеквизитаXDTO.Значение.Добавить(ЗначениеСвойства); ЗначениеРеквизитовXDTO.ЗначениеРеквизита.Добавить(ЗначениеРеквизитаXDTO); ТоварXDTO.ЗначенияРеквизитов = ЗначениеРеквизитовXDTO; КонецПроцедуры Процедура ЗаполнитьЕдиницыИзмеренияТоваров(ТоварыЗаказа, ОписаниеОшибки) ИмяСправочникаНоменклатура = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("Номенклатура"); Если Не ЗначениеЗаполнено(ИмяСправочникаНоменклатура) Тогда Возврат; КонецЕсли; МетаданныеСправочника = Метаданные.Справочники[ИмяСправочникаНоменклатура]; Если МетаданныеСправочника.Реквизиты.Найти("ЕдиницаИзмерения") = Неопределено Тогда ШаблонСообщения = НСтр("ru = 'В справочнике %1 не найден реквизит %2'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ИмяСправочникаНоменклатура, "ЕдиницаИзмерения"); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстСообщения); Возврат; КонецЕсли; МассивНоменклатуры = ТоварыЗаказа.ВыгрузитьКолонку("Номенклатура"); ЕдиницыНоменклатуры = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивНоменклатуры, "ЕдиницаИзмерения"); Для Каждого ТекСтрока Из ТоварыЗаказа Цикл Если Не ЗначениеЗаполнено(ТекСтрока.ЕдиницаИзмерения) Тогда Единица = ЕдиницыНоменклатуры.Получить(ТекСтрока.Номенклатура); ТекСтрока.ЕдиницаИзмерения = Единица; ТекСтрока.Коэффициент = 1; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьПараметрыРедактирования(НовоеПоле, Отбор) ПараметрВыбора = НовоеПоле.ПараметрыРедактирования.Элементы.Найти("ПараметрыВыбора"); Для Каждого СтруктураОтбора Из Отбор Цикл НовыйОтбор =ПараметрВыбора.Значение.Добавить(); НовыйОтбор.Имя = "Отбор."+ СтруктураОтбора.ИмяПоля; НовыйОтбор.Значение = СтруктураОтбора.ЗначениеОтбора; КонецЦикла; ПараметрВыбора.Использование = Истина; КонецПроцедуры // В связи с тем, что некоторые данные могут быть завязаны на функциональную опцию, // например, Использование характеристик, Дополнительных свойств и Томов хранения файлов // то при отключенной ф.о. в таблице пропадает часть колонок (построитель их не выведет) // для того, чтобы в дальнейшем избежать ошибки, связанной с обращением к несуществующей колонке // дополним полученную таблицу значений колонками которые могли исчезнуть. // Для этого переберем поля компоновщика настроек и убедимся (или создадим) что все колонки существуют. // Тип создаваемой колонки будет браться из построителя, его необходимо задать при встраивании. // Процедура СоздатьНедостающиеКолонкиТаблицыДанных(НастройкиКомпоновщика, ТаблицаДанных) ВыбранныеПоля = НастройкиКомпоновщика.ДоступныеПоляВыбора.Элементы; Для Каждого ПолеКомпоновщика Из ВыбранныеПоля Цикл ИмяКолонки = Строка(ПолеКомпоновщика.Поле); // Если существует такая колонка, то проверяем следующее поле Если Не ТаблицаДанных.Колонки.Найти(ИмяКолонки) = Неопределено Тогда Продолжить; КонецЕсли; // Если колонки нет, то будет ее создавать Если ИмяКолонки = "НоменклатураКатегория" Тогда КС = Новый КвалификаторыСтроки (20); ТипЗначенияПоля = Тип("СправочникСсылка.Номенклатура"); // Попытка в логику МассивТипов = Новый Массив; МассивТипов.Добавить(ТипЗначенияПоля); ТипЗначенияПоля = Новый ОписаниеТипов(МассивТипов,,КС); Иначе ТипЗначенияПоля = ПолеКомпоновщика.ТипЗначения; КонецЕсли; ТаблицаДанных.Колонки.Добавить(ИмяКолонки, ТипЗначенияПоля); КонецЦикла; КонецПроцедуры Функция ДанныеЕдиницыИзмерения(СтрокаТаблицыТоваров) ДанныеЕдиницы = Новый Структура; ДанныеЕдиницы.Вставить("ЕдиницаИзмеренияКод", СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияКод); ДанныеЕдиницы.Вставить("ЕдиницаИзмеренияНаименованиеПолное", СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияНаименованиеПолное); ДанныеЕдиницы.Вставить("ЕдиницаИзмеренияНаименование", СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияНаименование); ДанныеЕдиницы.Вставить("ЕдиницаИзмеренияМеждународноеСокращение", СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияМеждународноеСокращение); ДанныеЕдиницы.Вставить("ЕдиницаИзмеренияПересчетКоэф", СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияПересчетКоэффициент); ДанныеЕдиницы.Вставить("ЕдиницаИзмеренияПересчетЕдиница", СтрокаТаблицыТоваров.ТоварыЕдиницаИзмеренияПересчетЕдиницаКод); Возврат ДанныеЕдиницы; КонецФункции Функция УникальныйИдентификаторОбъекта(Объект, Характеристика = Неопределено) Ид = Строка(Объект.УникальныйИдентификатор()); Если ЗначениеЗаполнено(Характеристика) Тогда ИдХарактеристики = Строка(Характеристика.УникальныйИдентификатор()); Ид = Ид + "#" + ИдХарактеристики; КонецЕсли; Возврат Ид; КонецФункции // Формирует объект ИнтернетПрокси по настройкам прокси. // // Параметры: // Прокси - Соответствие - // ключи: // НеИспользоватьПроксиДляЛокальныхАдресов - строка - // Сервер - адрес прокси-сервера // Порт - порт прокси-сервера // Пользователь - имя пользователя для авторизации на прокси-сервере // Пароль - пароль пользователя // Протокол - строка - протокол для которого устанавливаются параметры прокси сервера. // Например: "http", "https", "ftp". // Функция НастройкиПрокси(Настройки, Протокол) Прокси = Новый ИнтернетПрокси; Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Настройки["НеИспользоватьПроксиДляЛокальныхАдресов"]; Прокси.Установить(Протокол, Настройки["Сервер"], Настройки["Порт"], Настройки["Пользователь"], Настройки["Пароль"]); Возврат Прокси; КонецФункции // Формирует структуру параметров подключения к сайту по настройке обмена // с учетом параметров прокси. // // Параметры: // УзелОбмена - ПланОбменаСсылка.ОбменУправлениеНебольшойФирмойСайт // НастройкиПодключения - Структура настроек подключения к сайту // ОписаниеОшибки - Строка // // Возвращаемое значение: // Булево - Истина, если успех. // Функция ПолучитьНастройкиПодключения(НастройкиПодключения, ОписаниеОшибки) Если НЕ РазобратьАдресСайта( НастройкиПодключения, ОписаниеОшибки) Тогда Возврат Ложь; КонецЕсли; НастройкаПроксиСервера = Новый Соответствие; ОбменССайтомПереопределяемый.ПолучитьНастройкиПроксиСервера(НастройкаПроксиСервера); Если НастройкаПроксиСервера <> Неопределено И НастройкаПроксиСервера["ИспользоватьПрокси"] = Ложь Тогда НастройкаПроксиСервера = Неопределено; КонецЕсли; Протокол = ?(НастройкиПодключения.ЗащищенноеСоединение, "https", "http"); Прокси = ?(НастройкаПроксиСервера = Неопределено, Неопределено, НастройкиПрокси(НастройкаПроксиСервера, Протокол)); НастройкиПодключения.Вставить("Прокси", Прокси); Возврат Истина; КонецФункции Функция СоединениеССервером(ПараметрыПодключения, ОписаниеОшибки) ЗащищенноеСоединение = Неопределено; Если ПараметрыПодключения.ЗащищенноеСоединение Тогда ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(); КонецЕсли; Соединение = Новый HTTPСоединение( ПараметрыПодключения.Сервер, ПараметрыПодключения.Порт, ПараметрыПодключения.Пользователь, ПараметрыПодключения.Пароль, ПараметрыПодключения.Прокси, 180, ЗащищенноеСоединение); Возврат Соединение; КонецФункции Функция ВыполнитьАвторизациюДляСоединения(Соединение, ПараметрыПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения = "catalog") Соединение = СоединениеССервером(ПараметрыПодключения, ОписаниеОшибки); Если Соединение = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Авторизация не выполнена.'")); Возврат Ложь; КонецЕсли; ОписаниеОшибки = ""; ОтветСервера = ПолучитьДанныеССервера( Соединение, ОписаниеОшибки, ПараметрыПодключения.АдресСкрипта + "?type=" + ТипСоединения + "&mode=checkauth"); Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Авторизация не выполнена.'")); Возврат Ложь; КонецЕсли; Если СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 1))) <> "success" Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Авторизация не выполнена.'") + Символы.ПС + НСтр("ru = 'Не удалось установить соединение с сервером. Проверьте имя пользователя и пароль.'")); Возврат Ложь; КонецЕсли; ПараметрыПодключения.Вставить("ИдентификаторСессии", СтрЗаменить(СтрПолучитьСтроку(ОтветСервера, 4), "sessid=", "")); Возврат Истина; КонецФункции // Выгружает файлы на сайт. // // Параметры: // Параметры - Структура, основные параметры // МассивПодкаталогов - Массив // ОписаниеОшибки - Строка // ОжидатьЗавершенияИмпортаФайловСервером - булево // ТипСоединения - Строка // // Возвращаемое значение: // Булево - Истина, если успех. // Функция ВыгрузитьНаСайт(Параметры, МассивПодкаталогов, ОписаниеОшибки, ОжидатьЗавершенияИмпортаФайловСервером, ТипСоединения) ОтветСервера = ""; Соединение = Неопределено; НастройкиПодключения = Параметры.НастройкиПодключения; АдресДляРаботы = НастройкиПодключения.АдресСкрипта + "?type=" + ТипСоединения; Успешно = ВыполнитьАвторизациюДляСоединения(Соединение, НастройкиПодключения, ОтветСервера, ОписаниеОшибки, ТипСоединения); Если НЕ Успешно Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'")); Возврат Ложь; КонецЕсли; КукиИмя = СтрПолучитьСтроку(ОтветСервера, 2); КукиЗначение = СтрПолучитьСтроку(ОтветСервера, 3); ЗаголовкиЗапросов = Новый Соответствие; ЗаголовкиЗапросов.Вставить("Cookie", КукиИмя + "=" + КукиЗначение); ПараметрыЗапроса = АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_Инициализация; Если Параметры.ИспользоватьИдентификаторСессии Тогда ПараметрыЗапроса = ПараметрыЗапроса + "&sessid=" + НастройкиПодключения.ИдентификаторСессии; КонецЕсли; ОтветСервера = ПолучитьДанныеССервера( Соединение, ОписаниеОшибки, ПараметрыЗапроса, ЗаголовкиЗапросов); Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Выгрузка на сайт не выполнена.'")); Возврат Ложь; КонецЕсли; //*********************************************** Сообщить("Подключение: "+ОтветСервера); //*********************************************** ZIPФайлыРазрешены = Ложь; ОграничениеРазмераФрагментаФайлаОбмена = 0; Если СтрЧислоСтрок(ОтветСервера) <> 2 Тогда ТекстОшибки = НСтр("ru = 'Выгрузка на сайт не выполнена.'") + Символы.ПС + НСтр("ru = 'Не удалось прочитать ответ сервера. Параметры обмена не получены.'"); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); Возврат Ложь; КонецЕсли; ZIPФайлыРазрешены = СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 1))) = НастройкиПодключения.ОтветСервера_ZIPРазрешен; Попытка ОграничениеРазмераФрагментаФайлаОбмена = Число(СтрЗаменить(СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 2))), НастройкиПодключения.ОтветСервера_ОграничениеРазмераФрагментаФайлаОбмена, "")); Исключение ОписаниеИсключительнойОшибки = ОписаниеИсключительнойОшибки( НСтр("ru = 'Ошибка получения параметров обмена (ограничение размера файла).'")); ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки); ОграничениеРазмераФрагментаФайлаОбмена = -1; КонецПопытки; //Доработка+ Если Параметры.ОбменЗаказами Тогда МассивИсходныхXMLФайлов = НайтиФайлы(Параметры.КаталогНаДиске, "orders*.xml"); СписокФайловДляОтправки = ФайлыДляОтправки(Параметры.КаталогНаДиске, МассивПодкаталогов, "orders*.xml"); Иначе МассивИсходныхXMLФайлов = НайтиФайлы(Параметры.КаталогНаДиске, "*.xml"); СписокФайловДляОтправки = ФайлыДляОтправки(Параметры.КаталогНаДиске, МассивПодкаталогов); КонецЕсли; //Доработка- Если ZIPФайлыРазрешены Тогда СписокФайловДляОтправки = ПодготовитьZIPАрхивы(Параметры.КаталогНаДиске, ОписаниеОшибки); Если СписокФайловДляОтправки.Количество() = 0 Тогда Возврат Ложь; КонецЕсли; КонецЕсли; Если ОграничениеРазмераФрагментаФайлаОбмена > 0 Тогда СписокФайловДляОтправки = РазделитьФайлыНаФрагменты(СписокФайловДляОтправки, ОграничениеРазмераФрагментаФайлаОбмена); КонецЕсли; ВсегоФайлов = СписокФайловДляОтправки.Количество(); Для Каждого ТекФайл Из СписокФайловДляОтправки Цикл ПараметрыЗапроса = АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_ПередачаФайла + ТекФайл.Представление; Если Параметры.ИспользоватьИдентификаторСессии Тогда ПараметрыЗапроса = ПараметрыЗапроса + "&sessid=" + НастройкиПодключения.ИдентификаторСессии; КонецЕсли; ОтветСервера = ОтправитьФайлНаСервер(ТекФайл.Значение, Соединение, ОписаниеОшибки, ПараметрыЗапроса, ЗаголовкиЗапросов); Если ZIPФайлыРазрешены Тогда Попытка УдалитьФайлы(ТекФайл.Значение); Исключение ШаблонСообщения = НСтр("ru = 'Ошибка удаления файла %1'"); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ТекФайл.Значение); ЗаписьЖурналаРегистрации(ТекстОшибки,УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; Если ОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Не удалось получить ответ сервера. Файл не отправлен.'") + " (" + ТекФайл.Значение + ")."); Возврат Ложь; КонецЕсли; //*********************************************** Сообщить("Файл: "+ОтветСервера); //*********************************************** СостояниеОбмена = СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера,1))); Если СостояниеОбмена = НастройкиПодключения.ОтветСервера_АварийноеЗавершениеТекущейОперации Тогда ОписаниеИсключительнойОшибки = НСтр("ru = 'Произошла ошибка на стороне сервера. Файл не отправлен.'") + " (" + ТекФайл.Значение + ")." + Символы.ПС + НСтр("ru = 'Ответ сервера:'") + Символы.ПС + ОтветСервера; ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки); Возврат Ложь; ИначеЕсли СостояниеОбмена = НастройкиПодключения.ОтветСервера_УспешноеЗавершениеТекущейОперации Тогда //+Филиппенко В.Б. Если Найти(ТекФайл.Представление, ".xml") = 0 Тогда Попытка Параметры.ВыгруженныеКартинки.Найти(НРег(ТекФайл.Представление), "ПолноеИмяФайла").Выгружен = Истина; Исключение КонецПопытки; КонецЕсли; //-Филиппенко В.Б. Если СтрЧислоСтрок(ОтветСервера) > 1 Тогда ОписаниеИсключительнойОшибки = НСтр("ru = 'Получен расширенный статус успешного завершения сеанса.'") + Символы.ПС + НСтр("ru = 'Ответ сервера:'") + Символы.ПС + ОтветСервера; ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки); КонецЕсли; Иначе ОписаниеИсключительнойОшибки = НСтр("ru = 'Произошла ошибка на стороне сервера. Не получен статус завершения операции. Файл не отправлен.'") + " (" + ТекФайл.Значение + ")." + Символы.ПС + НСтр("ru = 'Ответ сервера:'") + Символы.ПС + ОтветСервера; ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки); Возврат Ложь; КонецЕсли; КонецЦикла; ИмпортУспешноЗавершен = Ложь; Если ОжидатьЗавершенияИмпортаФайловСервером Тогда Для Каждого ТекФайл Из МассивИсходныхXMLФайлов Цикл ИмпортПродолжается = Истина; ТекущееСостояние = ""; Пока ИмпортПродолжается Цикл ИмпортПродолжается = Ложь; ОписаниеОшибки = ""; ПараметрыЗапроса = АдресДляРаботы + НастройкиПодключения.ПараметрЗапросаHTTP_ИмпортФайлаСервером + ТекФайл.Имя; Если Параметры.ИспользоватьИдентификаторСессии Тогда ПараметрыЗапроса = ПараметрыЗапроса + "&sessid=" + НастройкиПодключения.ИдентификаторСессии; КонецЕсли; ОтветСервера = ПолучитьДанныеССервера( Соединение, ОписаниеОшибки, ПараметрыЗапроса, ЗаголовкиЗапросов); Если ОтветСервера = Неопределено Тогда Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Не удалось получить текущее состояние процесса обмена. Данные обмена отправлены, но не загружены.'")); ИначеЕсли СтрЧислоСтрок(ОтветСервера) = 0 Тогда Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Не удалось прочитать данные о текущем состоянии процесса обмена. Данные обмена отправлены, но не загружены.'")); Иначе //*********************************************** Сообщить("Подключение: "+ОтветСервера); //*********************************************** СостояниеОбмена = СокрЛП(НРег(СтрПолучитьСтроку(ОтветСервера, 1))); Если СостояниеОбмена = НастройкиПодключения.ОтветСервера_АварийноеЗавершениеТекущейОперации Тогда Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Произошла ошибка на стороне сервера.'") + Символы.ПС + НСтр("ru = 'Ответ сервера'") + ": " + Символы.ПС + ОтветСервера); ИначеЕсли СостояниеОбмена = НастройкиПодключения.ОтветСервера_УспешноеЗавершениеТекущейОперации Тогда ИмпортУспешноЗавершен = Истина; ИначеЕсли СостояниеОбмена = НастройкиПодключения.ОтветСервера_ВыполнениеТекущейОперации Тогда ИмпортПродолжается = Истина; Иначе Успешно = Ложь; ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекФайл.Имя + ": " + НСтр("ru = 'Произошла ошибка на стороне сервера. Получен неизвестный статус импорта.'") + Символы.ПС + НСтр("ru = 'Ответ сервера'") + ": " + Символы.ПС + ОтветСервера); КонецЕсли; КонецЕсли; КонецЦикла; Если НЕ ИмпортУспешноЗавершен Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Успешно; КонецФункции // Отправляет файл на сервер по http. // // Параметры: // ПолноеИмяФайла - строка // Соединение - HTTPСоединение // ПараметрыЗапроса - строка // Заголовки - строка // ОписаниеОшибки - строка // // Возвращаемое значение: // Строка - Ответ сервера. // Функция ОтправитьФайлНаСервер(ПолноеИмяФайла, Соединение, ОписаниеОшибки, ПараметрыЗапроса="", Заголовки = Неопределено) ОтветСервера = Неопределено; HTTPОтветСервера = Неопределено; Если Заголовки = Неопределено Тогда Заголовки = Новый Соответствие; КонецЕсли; HTTPЗапрос = Новый HTTPЗапрос(СокрЛП(ПараметрыЗапроса), Заголовки); HTTPЗапрос.УстановитьИмяФайлаТела(ПолноеИмяФайла); Попытка HTTPОтветСервера = Соединение.ОтправитьДляОбработки(HTTPЗапрос); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки()); КонецПопытки; Если HTTPОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Ответ сервера не получен'"))); Возврат Неопределено; ИначеЕсли HTTPОтветСервера.КодСостояния <> 200 Тогда ТекстОшибки = СтрШаблон(НСтр("ru = 'Отправка файла на сервер: ответ сервера = %1'"), HTTPОтветСервера.КодСостояния); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); КонецЕсли; ТекстОтвета = HTTPОтветСервера.ПолучитьТелоКакСтроку(); Если Не ЗначениеЗаполнено(ТекстОтвета) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Отправка файла на сервер: Получен пустой ответ сервера.'")); Иначе ОтветСервера = ТекстОтвета; КонецЕсли; Возврат ОтветСервера; КонецФункции Функция РазделитьФайлыНаФрагменты(СписокФайлов, ОграничениеРазмераФрагмента) НовыйСписокФайлов = Новый СписокЗначений; Для Каждого ТекФайл Из СписокФайлов Цикл ФайлНаДиске = Новый Файл(ТекФайл.Значение); Если ФайлНаДиске.Размер() > ОграничениеРазмераФрагмента Тогда МассивФрагментов = РазделитьФайл(ФайлНаДиске.ПолноеИмя, ОграничениеРазмераФрагмента); Для Каждого НовыйФайл Из МассивФрагментов Цикл НовыйСписокФайлов.Добавить(НовыйФайл, ТекФайл.Представление); КонецЦикла; УдалитьФайлы(ФайлНаДиске.ПолноеИмя); Иначе НовыйСписокФайлов.Добавить(ТекФайл.Значение, ТекФайл.Представление); КонецЕсли; КонецЦикла; Возврат НовыйСписокФайлов; КонецФункции Функция ПодготовитьZIPАрхивы(КаталогНаДиске, ОписаниеОшибки) ПолноеИмяФайлаАрхива = ПолучитьИмяВременногоФайла("zip"); ЗаписьАрхива = Новый ЗаписьZipФайла(ПолноеИмяФайлаАрхива); НовыйСписокФайлов = Новый СписокЗначений; ЗаписьАрхива.Добавить(КаталогНаДиске + "\*.*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); Попытка ЗаписьАрхива.Записать(); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать zip-архив на диск.'"))); Возврат НовыйСписокФайлов; КонецПопытки; ФайлАрхива = Новый Файл(ПолноеИмяФайлаАрхива); НовыйСписокФайлов.Добавить(ПолноеИмяФайлаАрхива, ФайлАрхива.Имя); Возврат НовыйСписокФайлов; КонецФункции Функция ФайлыДляОтправки(КаталогНаДиске, МассивПодкаталогов, Маска = "*.*") СписокФайлов = Новый СписокЗначений; //Маска = "*.*"; //Доработка ВсеФайлыДляВыгрузки = НайтиФайлы(КаталогНаДиске, Маска); Если МассивПодкаталогов <> Неопределено Тогда Для Каждого Подкаталог Из МассивПодкаталогов Цикл ФайлыВПодкаталоге = НайтиФайлы(КаталогНаДиске + ПолучитьРазделительПути() + Подкаталог, Маска, Истина); Для Каждого ТекФайл Из ФайлыВПодкаталоге Цикл Если Не ТекФайл.ЭтоКаталог() Тогда ВсеФайлыДляВыгрузки.Добавить(ТекФайл); КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; Для Каждого ТекФайл Из ВсеФайлыДляВыгрузки Цикл Если НЕ ТекФайл.ЭтоКаталог() Тогда ПолноеИмяФайлаДляСервера = ПодготовитьИмяФайлаДляСервера(КаталогНаДиске, ТекФайл); //Доработка+ Если Маска = "*.*" И НЕ Найти(ТекФайл.ПолноеИмя, "orders") > 0 Тогда СписокФайлов.Добавить(ТекФайл.ПолноеИмя, ПолноеИмяФайлаДляСервера); ИначеЕсли НЕ Маска = "*.*" Тогда СписокФайлов.Добавить(ТекФайл.ПолноеИмя, ПолноеИмяФайлаДляСервера); КонецЕсли; //Доработка- КонецЕсли; КонецЦикла; Возврат СписокФайлов; КонецФункции Функция ПодготовитьИмяФайлаДляСервера(КаталогНаДиске, ФайлОбъект) ПолноеИмяФайлаДляСервера = ""; Если Найти(ФайлОбъект.Имя, ".xml") > 0 Тогда ПолноеИмяФайлаДляСервера = ФайлОбъект.Имя; Иначе // Для картинки оставляем 2 папки и разворачиваем слэши. ПолноеИмяФайлаДляСервера = ФайлОбъект.ПолноеИмя; ПутьДляУдаления = КаталогНаДиске + ПолучитьРазделительПути(); ПолноеИмяФайлаДляСервера = СтрЗаменить(ПолноеИмяФайлаДляСервера, ПутьДляУдаления, ""); ПолноеИмяФайлаДляСервера = СтрЗаменить(ПолноеИмяФайлаДляСервера, "\", "/"); КонецЕсли; //ПолноеИмяФайлаДляСервера = УдалитьДополнительныеРасширенияФайла(ПолноеИмяФайлаДляСервера); //Доработка (воможно, нет) //ПолноеИмяФайлаДляСервера = УдалитьДополнительныеРасширенияФайла(КаталогНаДиске, ПолноеИмяФайлаДляСервера); Возврат ПолноеИмяФайлаДляСервера; КонецФункции Функция УдалитьДополнительныеРасширенияФайла(КаталогНаДиске, ИсходноеИмяФайла) ПозицияТочки = Найти(ИсходноеИмяФайла, "."); ИмяФайла = Лев(ИсходноеИмяФайла, ПозицияТочки - 1); ПраваяЧастьИсходногоИмени = Прав(ИсходноеИмяФайла, СтрДлина(ИсходноеИмяФайла) - ПозицияТочки); ПозицияТочки = Найти(ПраваяЧастьИсходногоИмени, "."); Расширение = ПраваяЧастьИсходногоИмени; Если ПозицияТочки > 0 Тогда Расширение = Лев(ПраваяЧастьИсходногоИмени, ПозицияТочки - 1); КонецЕсли; Возврат ИмяФайла + "." + Расширение; КонецФункции Функция ПолучитьДанныеССервера(Соединение, ОписаниеОшибки, ПараметрыЗапроса = "", Знач Заголовки = Неопределено) HTTPОтветСервера = Неопределено; ОтветСервера = Неопределено; Если Заголовки = Неопределено Тогда Заголовки = Новый Соответствие; КонецЕсли; HTTPЗапрос = Новый HTTPЗапрос(СокрЛП(ПараметрыЗапроса), Заголовки); Попытка HTTPОтветСервера = Соединение.Получить(HTTPЗапрос); Исключение ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось получить данные с сервера. |Проверьте правильность адреса сервера, порт, имя пользователя и пароль,'") + Символы.ПС + ПодробноеПредставлениеОшибки + Символы.ПС + НСтр("ru = 'а также настройки подключения к Интернет.'"))); Возврат Неопределено; КонецПопытки; Если HTTPОтветСервера = Неопределено Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Ответ сервера не получен'"))); Возврат Неопределено; ИначеЕсли HTTPОтветСервера.КодСостояния <> 200 Тогда ТекстОшибки = СтрШаблон(НСтр("ru = 'Получение данных с сервера: ответ сервера = %1'"), HTTPОтветСервера.КодСостояния); ДобавитьОписаниеОшибки(ОписаниеОшибки, ТекстОшибки); КонецЕсли; ТекстОтвета = HTTPОтветСервера.ПолучитьТелоКакСтроку(); Если Не ЗначениеЗаполнено(ТекстОтвета) Тогда ДобавитьОписаниеОшибки(ОписаниеОшибки, НСтр("ru = 'Получение данных с сервера: Получен пустой ответ сервера.'")); Иначе ОтветСервера = ТекстОтвета; КонецЕсли; Возврат ОтветСервера; КонецФункции // В зависимости от типа платформы меняет слеши в пути к файлу // Функция ПодготовитьПутьДляПлатформы(ПлатформаWindows, Путь) Экспорт Если ПлатформаWindows Тогда ЧтоМенять = "/"; НаЧтоМенять = "\"; Иначе ЧтоМенять = "\"; НаЧтоМенять = "/"; КонецЕсли; Путь = СтрЗаменить(Путь, ЧтоМенять, НаЧтоМенять); Возврат Путь; КонецФункции // Возвращает тип операционной системы компьютера // Функция ПлатформаWindows() Экспорт СистемнаяИнформация = Новый СистемнаяИнформация; ПлатформаWindows = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64; Возврат ПлатформаWindows; КонецФункции Процедура ДобавитьЗначениеРеквизитаXDTO(ЗначенияРеквизитовXDTO, ПакетCML, Наименование, Значение) Если НЕ ЗначениеЗаполнено(Наименование) ИЛИ НЕ ЗначениеЗаполнено(Значение) Тогда Возврат; КонецЕсли; ЗначениеРеквизитаXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("ЗначениеРеквизита")); ЗначениеРеквизитаXDTO.Наименование = Наименование; ЗначениеРеквизитаXDTO.Значение.Добавить(СтрокаЗаписиДляXML(Значение)); ЗначенияРеквизитовXDTO.ЗначениеРеквизита.Добавить(ЗначениеРеквизитаXDTO); КонецПроцедуры // Получает тип свойства от типа объекта XDTO. // // Параметры: // ТипОбъектаXDTO - тип объекта XDTO, от которого требуется получить тип свойства. // ИмяСвойства - имя свойства, тип которого нужно получить. // // Возвращаемое значение: // ТипОбъектаXDTO. // Функция ПолучитьТипСвойстваОтТипаОбъектаXDTO(ТипОбъектаXDTO, ИмяСвойства) ТипСвойства = ТипОбъектаXDTO.Свойства.Получить(ИмяСвойства).Тип; Возврат ТипСвойства; КонецФункции // Формирует XDTO объект типа Контрагент и заполняет его данными. // Параметры: // ДанныеКонтрагента - выборка результата запроса реквизитами контрагента. // ПакетCML - пакет, который содержит описание типа контрагента. // Возвращаемое значение // КонтрагентXDTO - ОбъектXDTO - данные контрагента. // Функция ПолучитьКонтрагентаXDTO(ДанныеКонтрагента) ПакетCML = ПакетCML(); Если ДанныеКонтрагента = Неопределено Тогда Возврат Неопределено; КонецЕсли; НазваниеСправочникаОрганизации = ОбменССайтомПовтИсп.ИмяПрикладногоСправочника("Организации"); Если Не ЗначениеЗаполнено(НазваниеСправочникаОрганизации) Тогда НазваниеСправочникаОрганизации = "Организации"; КонецЕсли; ЭтоОрганизация = ТипЗнч(ДанныеКонтрагента.Контрагент) = Тип("СправочникСсылка."+НазваниеСправочникаОрганизации); Если ЭтоОрганизация Тогда КонтрагентXDTO = ФабрикаXDTO.Создать(ПакетCML.Получить("Контрагент")); Иначе КонтрагентыТип = ПолучитьТипСвойстваОтТипаОбъектаXDTO(ПакетCML.Получить("Документ"), "Контрагенты"); КонтрагентXDTO = ФабрикаXDTO.Создать(ПолучитьТипСвойстваОтТипаОбъектаXDTO(КонтрагентыТип, "Контрагент")); КонецЕсли; Если ЗначениеЗаполнено(ДанныеКонтрагента.Контрагент) Тогда КонтрагентXDTO.ИД = УникальныйИдентификаторОбъекта(ДанныеКонтрагента.Контрагент); КонецЕсли; КонтрагентXDTO.Наименование = ДанныеКонтрагента.Наименование; ЭтоЮрЛицо = Ложь; ОбменССайтомПереопределяемый.ОпределитьЭтоЮрЛицо(ДанныеКонтрагента.ЮрФизЛицо, ЭтоЮрЛицо); Если ЭтоЮрЛицо Тогда Если НЕ ПустаяСтрока(ДанныеКонтрагента.НаименованиеПолное) Тогда КонтрагентXDTO.ОфициальноеНаименование = ДанныеКонтрагента.НаименованиеПолное; КонецЕсли; Иначе Если НЕ ПустаяСтрока(ДанныеКонтрагента.НаименованиеПолное) Тогда КонтрагентXDTO.ПолноеНаименование = ДанныеКонтрагента.НаименованиеПолное; КонецЕсли; КонецЕсли; ИНН = ПолучитьИННДляXDTO(ДанныеКонтрагента.ИНН, ЭтоЮрЛицо); Если НЕ ПустаяСтрока(ИНН) Тогда КонтрагентXDTO.ИНН = ИНН; КонецЕсли; КПП = ПолучитьКППДляXDTO(ДанныеКонтрагента.КПП); Если НЕ ПустаяСтрока(КПП) Тогда КонтрагентXDTO.КПП = КПП; КонецЕсли; Если ЭтоЮрЛицо Тогда КонтрагентXDTO.ОКПО = ДанныеКонтрагента.КодПоОКПО; КонецЕсли; Если НЕ ЭтоОрганизация Тогда КонтрагентXDTO.Роль = "Покупатель"; КонецЕсли; КонтрагентXDTO.Проверить(); Возврат КонтрагентXDTO; КонецФункции Функция ПолучитьИННДляXDTO(ИНН, ЭтоЮрЛицо) Если ЭтоЮрЛицо Тогда ЗначениеИНН = ?(СтрДлина(ИНН) = 10, ИНН, ""); Иначе ЗначениеИНН = ?(СтрДлина(ИНН) = 12, ИНН, ""); КонецЕсли; Возврат ЗначениеИНН; КонецФункции Функция ПолучитьКППДляXDTO(КПП) ЗначениеКПП = ?(СтрДлина(КПП) = 9, КПП, ""); Возврат ЗначениеКПП; КонецФункции // Проверяет штрихкод на соответствие формату CML205. // Если штрихкод не соответствует формату, возвращает пустую строку. // Функция ПолучитьШтрихкодДляXDTO(Штрихкод) Если СтрДлина(Штрихкод) < 8 ИЛИ СтрДлина(Штрихкод) > 14 Тогда Возврат ""; КонецЕсли; Возврат Штрихкод; КонецФункции Функция ТипЗначенияСправочник(Тип) Возврат Справочники.ТипВсеСсылки().СодержитТип(Тип); КонецФункции Функция ФорматНаименованияДляXDTO(Наименование) Возврат Лев(Наименование, 250); КонецФункции Функция ФорматДатыДляXDTO(ЗначениеДата, ВернутьДату = Истина, ВернутьВремя = Ложь) ФорматДаты = "ДФ=yyyy-MM-dd; ДЛФ=D"; ФорматВремени = "ДЛФ=T"; РазделительДатаВремя = "T"; ДатаСтрока = Формат(ЗначениеДата, ФорматДаты); ВремяСтрока = Формат(ЗначениеДата, ФорматВремени); Результат = ""; Если ВернутьДату И ВернутьВремя Тогда Результат = ДатаСтрока + РазделительДатаВремя + ВремяСтрока; ИначеЕсли ВернутьДату И (НЕ ВернутьВремя) Тогда Результат = ДатаСтрока; ИначеЕсли (НЕ ВернутьДату) И ВернутьВремя Тогда Результат = ВремяСтрока; КонецЕсли; Возврат Результат; КонецФункции // Возвращает значение валюты для выгрузки в XML. // // Параметры: // Валюта - СправочникСсылка.Валюты. // // Возвращаемое значение: // Строка. // Функция ФорматНаименованияВалютыДляXDTO(НаименованиеВалюты) Возврат Лев(НаименованиеВалюты, 3);; КонецФункции Функция РаспаковатьZIPАрхив(СтрокаZIP, ОписаниеОшибки) СтрокаСодержимого = ""; ИмяФайла = ПолучитьИмяВременногоФайла("zip"); ИмяКаталога = РаботаСФайламиБЭД.ВременныйКаталог(); СтрокаВФайл = Новый ТекстовыйДокумент; СтрокаВФайл.УстановитьТекст(СтрокаZIP); Попытка СтрокаВФайл.Записать(ИмяФайла); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось записать архив с заказами:'") + " " + ИмяФайла)); Возврат ""; КонецПопытки; Попытка ЧтениеZIP = Новый ЧтениеZIPФайла(ИмяФайла); ЧтениеZIP.ИзвлечьВсе(ИмяКаталога); ЧтениеZIP.Закрыть(); РаспакованныеФайлы = НайтиФайлы(ИмяКаталога, "*.xml"); Если РаспакованныеФайлы.Количество() = 1 Тогда СтрокаИзФайла = Новый ТекстовыйДокумент; СтрокаИзФайла.Прочитать(РаспакованныеФайлы[0].ПолноеИмя); СтрокаСодержимого = СтрокаИзФайла.ПолучитьТекст(); КонецЕсли; УдалитьФайлы(ИмяФайла); УдалитьФайлы(ИмяКаталога); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось распаковать архив с заказами:'") + " " + ИмяФайла)); Возврат ""; КонецПопытки; Возврат СтрокаСодержимого; КонецФункции // Возвращает структуру, содержащую данные банка, полученные из объекта XDTO типа Банк. // Функция ПолучитьДанныеБанкаXDTO(БанкXDTO) ДанныеБанка = Новый Структура; Наименование = ""; Если ОбъектXDTOСодержитСвойство(БанкXDTO, "Наименование") И СвойствоXDTOЗаполнено(БанкXDTO.Наименование) Тогда Наименование = БанкXDTO.Наименование; КонецЕсли; БИК = ""; Если ОбъектXDTOСодержитСвойство(БанкXDTO, "БИК") И СвойствоXDTOЗаполнено(БанкXDTO.БИК) Тогда БИК = СтрЗаменить(БанкXDTO.БИК, " ", ""); КонецЕсли; SWIFT = ""; Если ОбъектXDTOСодержитСвойство(БанкXDTO, "SWIFT") И СвойствоXDTOЗаполнено(БанкXDTO.SWIFT) Тогда SWIFT = СтрЗаменить(БанкXDTO.SWIFT, " ", ""); КонецЕсли; КоррСчет = ""; Если ОбъектXDTOСодержитСвойство(БанкXDTO, "СчетКорреспондентский") И СвойствоXDTOЗаполнено(БанкXDTO.СчетКорреспондентский) Тогда КоррСчет = СтрЗаменить(БанкXDTO.СчетКорреспондентский, " ", ""); КонецЕсли; Адрес = ""; Если ОбъектXDTOСодержитСвойство(БанкXDTO, "Адрес") И СвойствоXDTOЗаполнено(БанкXDTO.Адрес.Представление) Тогда Адрес = СокрЛП(БанкXDTO.Адрес.Представление); КонецЕсли; Город = ""; Если ОбъектXDTOСодержитСвойство(БанкXDTO, "Адрес") Тогда Город = ПолучитьГородБанкаИзАдресаXDTO(БанкXDTO.Адрес); КонецЕсли; ДанныеБанка.Вставить("Наименование", Наименование); ДанныеБанка.Вставить("БИК", БИК); ДанныеБанка.Вставить("SWIFT", SWIFT); ДанныеБанка.Вставить("КоррСчет", КоррСчет); ДанныеБанка.Вставить("Адрес", Адрес); ДанныеБанка.Вставить("Город", Город); Возврат ДанныеБанка; КонецФункции Функция ОбъектXDTOСодержитСвойство(ОбъектXDTO, Свойство) ЕстьСвойство = Ложь; Если Не ТипЗнч(ОбъектXDTO) = Тип("ОбъектXDTO") Тогда Возврат ЕстьСвойство; КонецЕсли; ЕстьСвойство = ОбъектXDTO.Свойства().Получить(Свойство) <> Неопределено И ОбъектXDTO[Свойство] <> Неопределено; Возврат ЕстьСвойство; КонецФункции Функция СвойствоXDTOЗаполнено(СвойствоXDTO) СвойствоЗаполнено = Истина; Если ТипЗнч(СвойствоXDTO) = Тип("ОбъектXDTO") ИЛИ ТипЗнч(СвойствоXDTO) = Тип("СписокXDTO") ИЛИ НЕ ЗначениеЗаполнено(СвойствоXDTO) Тогда СвойствоЗаполнено = Ложь; КонецЕсли; Возврат СвойствоЗаполнено; КонецФункции Функция ЗначениеПростогоТипаИзXDTO(ЗначениеXDTO, ЗначениеПоУмолчанию = "") Результат = ЗначениеПоУмолчанию; Если ТипЗнч(ЗначениеXDTO) <> Тип("ОбъектXDTO") Тогда Результат = ЗначениеXDTO; КонецЕсли; Возврат Результат; КонецФункции Функция ПолучитьГородБанкаИзАдресаXDTO(АдресXDTO) Город = ""; Если ОбъектXDTOСодержитСвойство(АдресXDTO, "АдресноеПоле") И ТипЗнч(АдресXDTO.АдресноеПоле) = Тип("СписокXDTO") Тогда Для каждого ОбъектXDTO Из АдресXDTO.АдресноеПоле Цикл Если ОбъектXDTO.Тип = "Город" Тогда Город = ОбъектXDTO.Значение; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Город; КонецФункции Функция ПолучитьИзОбъектаXDTOСтрокуСФИО(КонтрагентXDTO) ТекущаяСтрока = ""; Фамилия = ""; Имя = ""; Отчество = ""; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Фамилия") И СвойствоXDTOЗаполнено(КонтрагентXDTO.Фамилия) Тогда ТекущаяСтрока = КонтрагентXDTO.Фамилия; КонецЕсли; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Имя") И СвойствоXDTOЗаполнено(КонтрагентXDTO.Имя) Тогда ТекущаяСтрока = СокрЛП(ТекущаяСтрока + " " + КонтрагентXDTO.Имя); КонецЕсли; Если ОбъектXDTOСодержитСвойство(КонтрагентXDTO, "Отчество") И СвойствоXDTOЗаполнено(КонтрагентXDTO.Отчество) Тогда ТекущаяСтрока = СокрЛП(ТекущаяСтрока + " " + КонтрагентXDTO.Отчество); КонецЕсли; Возврат ТекущаяСтрока; КонецФункции // Возвращает массив, содержащий объекты XDTO // или объект XDTO, если тип переданного параметра "ОбъектXDTO". // // Параметры // СписокXDTO - СписокXDTO, ОбъектXDTO - список XDTO, объекты которого нужно получить. // // Возвращаемое значение // Массив - массив свойств объекта XDTO. // Функция КоллекцияОбъектовXDTO(СписокXDTO) МассивОбъектовXDTO = Новый Массив; Если ТипЗнч(СписокXDTO) = Тип("СписокXDTO") Тогда Для каждого ОбъектXDTO Из СписокXDTO Цикл МассивОбъектовXDTO.Добавить(ОбъектXDTO); КонецЦикла; Иначе МассивОбъектовXDTO.Добавить(СписокXDTO); КонецЕсли; Возврат МассивОбъектовXDTO; КонецФункции Функция ЧислоИзСтроки(ЗначениеСтрока) ОписаниеТипа = Новый ОписаниеТипов("Число"); ЗначениеЧисло = ОписаниеТипа.ПривестиЗначение(ЗначениеСтрока); Возврат ЗначениеЧисло; КонецФункции Функция НаименованиеНоменклатуры(Знач Наименование) ПозицияРазделителя = Найти(Наименование, "#"); Если ПозицияРазделителя > 0 Тогда НаименованиеНоменклатуры = Лев(Наименование, ПозицияРазделителя - 1); Иначе НаименованиеНоменклатуры = Наименование; КонецЕсли; Возврат НаименованиеНоменклатуры; КонецФункции Функция ИдХарактеристики(Знач Ид) ПозицияРазделителя = Найти(Ид, "#"); Если ПозицияРазделителя > 0 Тогда ИдХарактеристики = Сред(Ид, ПозицияРазделителя + 1); Иначе ИдХарактеристики = ""; КонецЕсли; Возврат ИдХарактеристики; КонецФункции Функция НаименованиеХарактеристики(Знач Наименование) ПозицияРазделителя = Найти(Наименование, "#"); Если ПозицияРазделителя > 0 Тогда НаименованиеХарактеристики = Сред(Наименование, ПозицияРазделителя + 1); Иначе НаименованиеХарактеристики = ""; КонецЕсли; Возврат НаименованиеХарактеристики; КонецФункции Функция ДатаВремяИзСтроки(ДатаСтрока, ВремяСтрока = "") ДатаВремя = Дата(1,1,1); Попытка Если ТипЗнч(ДатаСтрока) = Тип("Дата") И ТипЗнч(ВремяСтрока) = Тип("Дата") Тогда ДатаВремя = Дата(Формат(ДатаСтрока, "ДЛФ=D") + " " + Формат(ВремяСтрока, "ДЛФ=T")); КонецЕсли; Если ДатаВремя = Дата(1,1,1) Тогда Если ЗначениеЗаполнено(ВремяСтрока) Тогда Время = СтрЗаменить(ВремяСтрока, ":", ""); ДатаВремя = Дата(СтрЗаменить(ДатаСтрока, "-", "") + Время); Иначе ДатаВремя = Дата(СтрЗаменить(ДатаСтрока, "-", "") + "000000"); КонецЕсли; КонецЕсли; Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка преобразования даты'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Возврат ДатаВремя; КонецФункции Процедура ДобавитьПараметрыПротоколаОбменаВСтруктуру(СтруктураПараметров) СтруктураПараметров.Вставить("ПараметрЗапроса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"); КонецПроцедуры // Возвращает путь к файлу в зависимости от типа платформы // Функция ПутьТомаДляПлатформы(ПлатформаWindows, Том) Если ПлатформаWindows Тогда Возврат Том.ПолныйПутьWindows; Иначе Возврат Том.ПолныйПутьLinux; КонецЕсли; КонецФункции Функция ВариантыЗначенийСвойстваПоТипу(Выборка, Тип) ВариантыЗначений = Новый Массив; ВыборкаЗначений = Выборка.Выбрать(); Пока ВыборкаЗначений.Следующий() Цикл Если ТипЗнч(ВыборкаЗначений.Значение) = Тип Тогда ВариантыЗначений.Добавить(ВыборкаЗначений.Значение); КонецЕсли; КонецЦикла; Возврат ВариантыЗначений; КонецФункции Функция СтрокаЗаписиДляXML(Значение) СтрокаЗаписи = Строка(Значение); Если ТипЗнч(Значение) = Тип("Число") Тогда СтрокаЗаписи = СтрЗаменить(СтрокаЗаписи, Символы.НПП, ""); СтрокаЗаписи = СтрЗаменить(СтрокаЗаписи, ",", "."); ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда Если Значение Тогда СтрокаЗаписи = "true"; Иначе СтрокаЗаписи = "false"; КонецЕсли; КонецЕсли; Возврат СтрокаЗаписи; КонецФункции // Формирует расширенное описание ошибки. // // Параметры: // ТекстНачалаСообщения - Строка // ТекстОкончанияСообщения - Строка // // Возвращаемое значение: // Строка - Сформированное описание ошибки. // Функция ОписаниеИсключительнойОшибки(ТекстНачалаСообщения = "", ТекстОкончанияСообщения = "") Экспорт ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстСообщения = НСтр("ru = 'Произошла ошибка:'") + " " + ТекстНачалаСообщения + ?(ПустаяСтрока(ТекстОкончанияСообщения), "", Символы.ПС + ТекстОкончанияСообщения) + ?(ПустаяСтрока(ПодробноеПредставлениеОшибки), "", Символы.ПС + ПодробноеПредставлениеОшибки); Возврат ТекстСообщения; КонецФункции // Формирует структуру параметров подключения к сайту по URL. // // Параметры: // АдресСайта - Строка, URL // НастройкиПодключения - Структура настроек подключения к сайту // ОписаниеОшибки - Строка // // Возвращаемое значение: // Булево - Истина, если успех. // Функция РазобратьАдресСайта(НастройкиПодключения, ОписаниеОшибки) АдресСайта = СокрЛП(НастройкиПодключения.АдресСайта); Сервер = ""; Порт = 0; АдресСкрипта = ""; ЗащищенноеСоединение = Ложь; Если НЕ ПустаяСтрока(АдресСайта) Тогда АдресСайта = СтрЗаменить(АдресСайта, "\", "/"); АдресСайта = СтрЗаменить(АдресСайта, " ", ""); Если НРег(Лев(АдресСайта, 7)) = "http://" Тогда АдресСайта = Сред(АдресСайта, 8); ИначеЕсли НРег(Лев(АдресСайта, 8)) = "https://" Тогда АдресСайта = Сред(АдресСайта, 9); ЗащищенноеСоединение = Истина; КонецЕсли; ПозицияСлэша = Найти(АдресСайта, "/"); Если ПозицияСлэша > 0 Тогда Сервер = Лев(АдресСайта, ПозицияСлэша - 1); АдресСкрипта = Прав(АдресСайта, СтрДлина(АдресСайта) - ПозицияСлэша); Иначе Сервер = АдресСайта; АдресСкрипта = ""; КонецЕсли; ПозицияДвоеточия = Найти(Сервер, ":"); ПортСтрока = "0"; Если ПозицияДвоеточия > 0 Тогда СерверСПортом = Сервер; Сервер = Лев(СерверСПортом, ПозицияДвоеточия - 1); ПортСтрока = Прав(СерверСПортом, СтрДлина(СерверСПортом) - ПозицияДвоеточия); КонецЕсли; Попытка Порт = Число(ПортСтрока); Исключение ДобавитьОписаниеОшибки(ОписаниеОшибки, ОписаниеИсключительнойОшибки(НСтр("ru = 'Не удалось получить номер порта:'") + " " + ПортСтрока + Символы.ПС + НСтр("ru = 'Проверьте правильность ввода адреса сайта.'"))); Возврат Ложь; КонецПопытки; Если Порт = 0 Тогда Порт = ?(ЗащищенноеСоединение, 443, 80); КонецЕсли; КонецЕсли; Если АдресСкрипта = "" Тогда АдресСкрипта = "bitrix/admin/1c_exchange.php"; КонецЕсли; НастройкиПодключения.Вставить("Сервер", Сервер); НастройкиПодключения.Вставить("Порт", Порт); НастройкиПодключения.Вставить("АдресСкрипта", АдресСкрипта); НастройкиПодключения.Вставить("ЗащищенноеСоединение", ЗащищенноеСоединение); Возврат Истина; КонецФункции // К существующему описанию добавляет текст // Процедура ДобавитьОписаниеОшибки(Описание, Дополнение) Экспорт Если ПустаяСтрока(Описание) Тогда Описание = Дополнение; Иначе Описание = Описание + Символы.ПС + Дополнение; КонецЕсли; КонецПроцедуры Процедура ЗафиксироватьЗавершениеВыгрузкиНоменклатуры(СтрокаТаблицыИнформации, Результат, ТекстЗавершения) ДатаОкончания = ТекущаяДатаСеанса(); СтрокаТаблицыИнформации.Описание = СтрокаТаблицыИнформации.Описание + Символы.ПС + ДатаОкончания + " " + НСтр(ТекстЗавершения); СтрокаТаблицыИнформации.РезультатВыполненияОбмена = Результат; СтрокаТаблицыИнформации.ДатаОкончания = ДатаОкончания; КонецПроцедуры Функция ТекстHTMLИзФайла(ФайлОписанияHTML) СтруктураДанныхФайла = РаботаСФайлами.ДанныеФайла(ФайлОписанияHTML); ДвоичныеДанныеСсылкаВХ = СтруктураДанныхФайла.СсылкаНаДвоичныеДанныеФайла; Если ДвоичныеДанныеСсылкаВХ = НеОпределено Тогда Возврат ""; КонецЕсли; ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ДвоичныеДанныеСсылкаВХ); ИмяВремФайла = ПолучитьИмяВременногоФайла(); ТекстФайла = Новый ТекстовыйДокумент; ДвоичныеДанныеФайла.Записать(ИмяВремФайла); ТекстФайла.Прочитать(ИмяВремФайла); ТекстHTML = ТекстФайла.ПолучитьТекст(); УдалитьФайлы(ИмяВремФайла); Возврат ТекстHTML; КонецФункции //+Филиппенко В.Б. Заполнение структуры значений сохраненных картинок в разрезе номенклатуры Процедура ДобавитьЗначениеВТЗВыгруженныхКартинок (УИД, ТЗ, ПолноеИмяФайла, ИмяФайла, ДатаИзменения, Удалить = Ложь, Сортировка, ЭтоФайл = Ложь, Выгружен = Истина) НоваяСтрока = ТЗ.Добавить(); НоваяСтрока.УИД = УИД; НоваяСтрока.ПолноеИмяФайла = ПолноеИмяФайла; НоваяСтрока.ИмяФайла = ИмяФайла; НоваяСтрока.Удалить = Удалить; НоваяСтрока.ДатаИзменения = ДатаИзменения; НоваяСтрока.Сортировка = Сортировка; НоваяСтрока.ЭтоФайл = ЭтоФайл; НоваяСтрока.Выгружен = Выгружен; КонецПроцедуры Функция ПолучитьДатуИзмененияФайла (ПутьКФайлу) FSO = Новый COMОбъект("Scripting.FileSystemObject"); File = FSO.GetFile(ПутьКФайлу); Возврат File.DateLastModified; КонецФункции //-Филиппенко В.Б. #КонецОбласти