From d7ce0715b3e3d05db84fb720875ad32ff898b2c7 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Wed, 23 Oct 2024 14:07:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=B8=D0=B7=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #76, #100, #126 --- .../Ext/Form.xml" | 2 + .../Ext/Module.bsl" | 248 ++----- .../Ext/Module.bsl" | 41 +- ...0\265\321\200\320\262\320\265\321\200.xml" | 23 + .../Ext/Module.bsl" | 640 ++++++++++++++++++ .../Ext/Module.bsl" | 48 +- .../Ext/Module.bsl" | 156 ++++- .../Ext/Module.bsl" | 2 +- .../Ext/Module.bsl" | 18 + .../Ext/Module.bsl" | 8 + src/cf/Configuration.xml | 9 +- ...0\274\320\265\320\275\321\202\320\260.xml" | 1 + 12 files changed, 924 insertions(+), 272 deletions(-) create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" index c5f00b6e..24910326 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" @@ -304,6 +304,7 @@ Группа данные сообщения исходящего + Usual None false @@ -367,6 +368,7 @@ Группа данные сообщения исходящего + Usual None false diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl" index 5bbaa7f6..ebe42a6f 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl" @@ -27,225 +27,30 @@ // Параметры: // АдресВХранилище - Строка - Адрес файла во временном хранилище // Расширение - Строка - Расширение файла (xls, xlsx) -// Параметры - Структура - Параметры загрузки +// Параметры - Структура - структура параметров загрузки Excel-файла +// см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент.ИнициализироватьСтруктуруПередачиПараметровНаСервер // Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, Параметры) Экспорт - Макет = Параметры.Макет; - АдресПомещения = Параметры.АдресПомещения; - НазваниеЛиста = Параметры.НазваниеЛиста; - НомерСтроки = Параметры.НомерПервойСтроки; + ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище); - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); - ДвоичныеДанные.Записать(ИмяВременногоФайла); + ПараметрыЧтения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла(); + ПараметрыЧтения.НазваниеЛиста = Параметры.НазваниеЛиста; + ПараметрыЧтения.НомерСтроки = Параметры.НомерПервойСтроки; + ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию; - ТабДок = Новый ТабличныйДокумент; - ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); + ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер + .КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений( + АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения); - Попытка - УдалитьФайлы(ИмяВременногоФайла); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка файла через табличный документ.Удаление временного файла'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); - - ПервыйЛист = ТабДок.Области[0].Имя; - Для Каждого ЛистДок Из ТабДок.Области Цикл - Если ЛистДок.Верх = 1 Тогда - ПервыйЛист = ЛистДок.Имя; - КонецЕсли; - КонецЦикла; - - ТабДок = ТабДок.ПолучитьОбласть(?(Лист = Неопределено, ПервыйЛист, СтрЗаменить(НазваниеЛиста, " ", "_"))); - - Если Не НомерСтроки = 1 Тогда - ТабДок.УдалитьОбласть(ТабДок.Область("R1:R" + Строка(НомерСтроки - 1)), ТипСмещенияТабличногоДокумента.ПоВертикали); - КонецЕсли; - - ТабДок.ВставитьОбласть(ТабДок.Область("R1"), - ТабДок.Область("R1"), - ТипСмещенияТабличногоДокумента.ПоГоризонтали); - - Табдок.Область("R1").Очистить(Истина, Истина, Истина); - - Счетчик = 0; - Для Каждого Колонка Из Макет Цикл - Счетчик = Счетчик + 1; - Если Не ЗначениеЗаполнено(Колонка.Значение) Тогда - Продолжить; - КонецЕсли; - ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст = Колонка.Ключ; - КонецЦикла; - - ПЗ = Новый ПостроительЗапроса; - ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область()); - ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.Добавлять; - ПЗ.ЗаполнитьНастройки(); - ПЗ.Выполнить(); - ТЗ = ПЗ.Результат.Выгрузить(); - - ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число")); - - КоллекцияОтборов = Новый ТаблицаЗначений; - КоллекцияОтборов.Колонки.Добавить("ТипДанных"); - КоллекцияОтборов.Колонки.Добавить("НомерСтрокиДочерней"); - КоллекцияОтборов.Колонки.Добавить("МассивДанных"); - КоллекцияОтборов.Колонки.Добавить("НазваниеКолонки"); - - Н = ТЗ.Количество() - 1; - - Пока НЕ Н < 0 Цикл - - Счетчик = 0; - ТЗ[Н].ПорядковыйНомер = Н; - - Для каждого Колонка Из ТЗ.Колонки Цикл - Если Не ЗначениеЗаполнено(ТЗ[Н][Колонка.Имя]) Тогда - Счетчик = Счетчик + 1; - КонецЕсли; - КонецЦикла; - - Если Счетчик = ТЗ.Колонки.Количество() Тогда - ТЗ.Удалить(Н); - КонецЕсли; - - Н = Н - 1; - - КонецЦикла; - - ВставкаВТ = ""; - ВставкаБазовые = ""; - ВставкаСсылочные = ""; - ВставкаИсточники = ""; - ХранилищеИсточников = Новый Соответствие; - МассивИменСсылочных = Новый Массив; - СоответствиеПеречислений = Новый Соответствие; - - Для Каждого Колонка Из Макет Цикл - - Если Не ЗначениеЗаполнено(Колонка.Значение) Тогда - Продолжить; - КонецЕсли; - - ВставкаВТ = ВставкаВТ + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС; - - Если СтрНайти(Колонка.Значение, "Ссылка") <> 0 И СтрНайти(Колонка.Значение, "Перечисление") = 0 Тогда - - ТЗ.Колонки.Добавить(Колонка.Ключ + "КодЧислом", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15))); - ВставкаВТ = ВставкаВТ + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом КАК " + Колонка.Ключ + "КодЧислом," + Символы.ПС; - МассивИменСсылочных.Добавить(Колонка.Ключ); - - РазбивкаТипа = СтрРазделить(СтрЗаменить(Колонка.Значение, "Ссылка", ""), ".", Ложь); - - ВхождениеИсточника = ХранилищеИсточников.Получить(РазбивкаТипа[1]); - ХранилищеИсточников.Вставить(РазбивкаТипа[1], ?(ВхождениеИсточника = Неопределено, 1, ВхождениеИсточника + 1)); - Итерация = ?(ХранилищеИсточников.Получить(РазбивкаТипа[1]) = 0, "", Строка(ХранилищеИсточников.Получить(РазбивкаТипа[1]))); - - Если РазбивкаТипа[0] = "Документ" Тогда - РеквизитСравнения = "Номер"; - Иначе - РеквизитСравнения = "Наименование"; - КонецЕсли; - - ВставкаСсылочные = ВставкаСсылочные + РазбивкаТипа[1] + Итерация + ".Ссылка КАК " + Колонка.Ключ + "," + Символы.ПС; - - Если Не СтрНайти(ВставкаИсточники, " " + РазбивкаТипа[1] + " ") > 0 Тогда - ВставкаИсточники = ВставкаИсточники + " - | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(Колонка.Значение, "Ссылка", "") + " КАК " + РазбивкаТипа[1] + Итерация + " - | ПО " + "ВходнаяТаблица." + Колонка.Ключ + " <> """" И " + "ВходнаяТаблица." + Колонка.Ключ + " <> 0" + " - | И (ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + РеквизитСравнения + Символы.ПС; - - Если СтрНайти(РазбивкаТипа[1], "Номенклатура") > 0 Тогда - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Артикул" + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; - ИначеЕсли СтрНайти(Колонка.Значение, "Справочник") > 0 - И Не СтрНайти(Колонка.Значение, "Организации") > 0 Тогда - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; - КонецЕсли; - - ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "Служебный," + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + ")"; - КонецЕсли; - - ИначеЕсли СтрНайти(Колонка.Значение, "Перечисление") <> 0 Тогда - КолонкаПеречисления = ТЗ.Колонки.Добавить(Колонка.Ключ + "НеОбрабатывать", Новый ОписаниеТипов(Колонка.Значение)); - СоответствиеПеречислений.Вставить(Колонка.Ключ, Колонка.Значение); - ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + Колонка.Ключ + " КАК", "." + КолонкаПеречисления.Имя + " КАК"); - ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС; - ИначеЕсли Не СтрНайти(Колонка.Ключ, "НеОбрабатывать") > 0 Тогда - ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС; - КонецЕсли; - - КонецЦикла; - - ВставкаВТ = ВставкаВТ + "ВходнаяТаблица.ПорядковыйНомер Как ПорядковыйНомер"; - ВставкаБазовые = Лев(ВставкаБазовые, СтрДлина(ВставкаБазовые) - 2); - ОТЧ = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15)); - - Для Каждого СтрокаТаблицы Из ТЗ Цикл - - Для Каждого ИмяМассива Из МассивИменСсылочных Цикл - СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОТЧ.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]); - КонецЦикла; - - Для Каждого Колонка Из СоответствиеПеречислений Цикл - - Для Каждого ТекЭлемент Из Метаданные.Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")].ЗначенияПеречисления Цикл - Если нРег(ТекЭлемент.Синоним) = нРег(СтрокаТаблицы[Колонка.Ключ]) Тогда - СтрокаТаблицы[Колонка.Ключ + "НеОбрабатывать"] = Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")][ТекЭлемент.Имя]; - Прервать; - КонецЕсли; - КонецЦикла; - - КонецЦикла; - - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | #ВставкаВТ - |ПОМЕСТИТЬ ВходнаяТаблица - |ИЗ - | &ВходнаяТаблица КАК ВходнаяТаблица - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | #ВставкаСсылочные - | #ВставкаБазовые - |ИЗ - | ВходнаяТаблица КАК ВходнаяТаблица - | #ВставкаИсточники - | - |УПОРЯДОЧИТЬ ПО - | ВходнаяТаблица.ПорядковыйНомер"; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники); - - Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ); - РезультатЗапроса = Запрос.Выполнить(); - - ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресПомещения); + ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения); КонецПроцедуры // Функция - Поместить заглушку // // Параметры: -// Макет - Структура - Список колонок загружаемого файла +// Макет - Строка - Адрес временного хранилища, где находится таблица значений со списком колонок загружаемого файла // // Возвращаемое значение: // - Строка - Адрес файла во временном хранилище @@ -254,8 +59,10 @@ Заглушка = Новый ТаблицаЗначений; - Для Каждого Колонка Из Макет Цикл - Заглушка.Колонки.Добавить(Колонка.Ключ, Новый ОписаниеТипов(Колонка.Значение)); + МакетТаблица = ПолучитьИзВременногоХранилища(Макет); + + Для Каждого КолонкаТаблицы Из МакетТаблица Цикл + Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения)); КонецЦикла; ИД = ПоместитьВоВременноеХранилище(Заглушка, Новый УникальныйИдентификатор); @@ -264,4 +71,25 @@ КонецФункции -#КонецОбласти \ No newline at end of file +// Инициализирует таблицу со свойствами колонок загружаемого файла +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица готовая для заполнения данных колонок +// +Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт + + СвойстваКолонок = Новый ТаблицаЗначений; + ДлинаСтроки = 150; + СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3)); + + Возврат СвойстваКолонок; + +КонецФункции + +#КонецОбласти // ПрограммныйИнтерфейс \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" index 673326d9..be82bba0 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" @@ -22,21 +22,30 @@ #Область ПрограммныйИнтерфейс -// Функция - Загрузить из XLS +// Загружает файл XLS, парсит его и помещает результат в таблицу значений, которая передается во временное хранилище // // Параметры: -// СоответствиеКолонок - Структура - Описание колонок загружаемого файла -// НазваниеЛиста - Строка - Имя загружаемого листа (по-умолчанию не заполнено) -// НомерПервойСтроки - Число - Номер строки с которой начинается загрузка данных (по-умолчанию 1) +// АдресСоответствияКолонок - Строка - описание колонок загружаемого файла в таблице значений, +// помещенное во временное хранилище на Сервере. +// см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ИнициализироватьТаблицуСоСвойствамиКолонок +// НазваниеЛиста - Строка - Имя загружаемого листа (по-умолчанию не заполнено) +// НомерПервойСтроки - Число - Номер строки с которой начинается загрузка данных (по-умолчанию 1) +// СопоставлениеПоНаименованию - Булево - если Истина, то колонки макета сопоставляются с табличным документом по +// наименованию; если Ложь, то сопоставляются в последовательности колонок макета, а наименования игнорируются. // // Возвращаемое значение: // - Строка - Адрес файла во временном хранилище // -Асинх Функция ЗагрузитьИзXLS(СоответствиеКолонок, НазваниеЛиста = "", НомерПервойСтроки = 1) Экспорт +Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок, НазваниеЛиста = "", НомерПервойСтроки = 1, СопоставлениеПоНаименованию = Ложь) Экспорт - АдресПомещения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(СоответствиеКолонок); + АдресПомещения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(АдресСоответствияКолонок); - Параметры = Новый Структура("Макет, АдресПомещения, НазваниеЛиста, НомерПервойСтроки", СоответствиеКолонок, АдресПомещения, НазваниеЛиста, НомерПервойСтроки); + Параметры = ИнициализироватьСтруктуруПередачиПараметровНаСервер(); + Параметры.АдресМакета = АдресСоответствияКолонок; + Параметры.АдресПомещения = АдресПомещения; + Параметры.НазваниеЛиста = НазваниеЛиста; + Параметры.НомерПервойСтроки = НомерПервойСтроки; + Параметры.ПоНаименованию = СопоставлениеПоНаименованию; ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов; ПараметрыДиалога.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; @@ -47,7 +56,8 @@ ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх( , , , ПараметрыДиалога); Если ТипЗнч(ОписаниеФайла) = Тип("ОписаниеПомещенногоФайла") И Не ОписаниеФайла.ПомещениеФайлаОтменено Тогда - пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ФормированиеТаблицы(ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение, Параметры); + пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ФормированиеТаблицы( + ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение, Параметры); Иначе пбп_ОбщегоНазначенияСлужебныйКлиент.СообщитьПользователю(НСтр("ru = 'Помещение файла отменено'")); АдресПомещения = Неопределено; @@ -57,4 +67,17 @@ КонецФункции -#КонецОбласти \ No newline at end of file +#КонецОбласти // ПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + +Функция ИнициализироватьСтруктуруПередачиПараметровНаСервер() + + СтруктураПараметров = Новый Структура( + "АдресМакета, АдресПомещения, НазваниеЛиста, НомерПервойСтроки, ПоНаименованию"); + + Возврат СтруктураПараметров; + +КонецФункции + +#КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200.xml" new file mode 100644 index 00000000..0ea21113 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер + + + ru + Загрузка файла через табличный документ сервер + + + + false + false + true + true + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" new file mode 100644 index 00000000..6341bec0 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\244\320\260\320\271\320\273\320\260\320\247\320\265\321\200\320\265\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\321\213\320\271\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" @@ -0,0 +1,640 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +#Область ПрограммныйИнтерфейс + +// Получить параметры чтения файла +// - НазваниеЛиста - Строка - наименование листа, с которого необходимо выполнить загрузку данных +// - НомерСтроки - Число - номер первой строки листа, с которой начинается парсинг данных +// - СопоставлениеПоНаименованию - Булево - если Истина, то колонки макета сопоставляются с табличным документом по +// наименованию; если Ложь, то сопоставляются в последовательности колонок макета, а наименования игнорируются. +// - КонвертироватьДаты - Булево - конвертировать значения с типом дата из строки в дату +// +// Возвращаемое значение: +// Структура - параметры чтения +// +Функция ПолучитьПараметрыЧтенияФайла() Экспорт + + ПараметрыЧтения = Новый Структура; + ПараметрыЧтения.Вставить("НазваниеЛиста", ""); + ПараметрыЧтения.Вставить("НомерСтроки", 0); + ПараметрыЧтения.Вставить("СопоставлениеПоНаименованию", Ложь); + ПараметрыЧтения.Вставить("КонвертироватьДаты", Истина); + + Возврат ПараметрыЧтения; + +КонецФункции + +// Конвертирует данные табличного документа в таблицу значений по переданному макету +// +// Параметры: +// АдресВХранилище - Строка - Адрес файла во временном хранилище +// Расширение - Строка - Расширение файла (xls, xlsx) +// Макет - ТаблицаЗначений - в таблице указано имя колонок, их тип и поле поиска ссылочного типа +// ПараметрыЧтения - Структура - см. ПолучитьПараметрыЧтенияФайла +// +Функция КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений( + АдресВХранилище, Расширение, Макет, ПараметрыЧтения) Экспорт + + НазваниеЛиста = ПараметрыЧтения.НазваниеЛиста; + НомерСтроки = ПараметрыЧтения.НомерСтроки; + СопоставлениеПоНаименованию = ПараметрыЧтения.СопоставлениеПоНаименованию; + КонвертироватьДаты = ПараметрыЧтения.КонвертироватьДаты; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище); + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); + ДвоичныеДанные.Записать(ИмяВременногоФайла); + + ТабДок = Новый ТабличныйДокумент; + ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); + + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + ТекстОшибки = НСтр("ru = 'Загрузка файла через табличный документ.Удаление временного файла'"); + ЗаписьЖурналаРегистрации(ТекстОшибки, + УровеньЖурналаРегистрации.Ошибка, , , + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); + + ПервыйЛист = ТабДок.Области[0].Имя; + Для Каждого ЛистДок Из ТабДок.Области Цикл + Если ЛистДок.Верх = 1 Тогда + ПервыйЛист = ЛистДок.Имя; + КонецЕсли; + КонецЦикла; + + ТабДок = ТабДок.ПолучитьОбласть(?(Лист = Неопределено, ПервыйЛист, СтрЗаменить(НазваниеЛиста, " ", "_"))); + ТЗ = ПолучитьПромежуточнуюТаблицуЗначенийИзТабличногоДокумента(ТабДок, НомерСтроки, Макет, СопоставлениеПоНаименованию); + + КоллекцияОтборов = Новый ТаблицаЗначений; + КоллекцияОтборов.Колонки.Добавить("ТипДанных"); + КоллекцияОтборов.Колонки.Добавить("НомерСтрокиДочерней"); + КоллекцияОтборов.Колонки.Добавить("МассивДанных"); + КоллекцияОтборов.Колонки.Добавить("НазваниеКолонки"); + + Н = ТЗ.Количество() - 1; + + Пока Не Н < 0 Цикл + + Счетчик = 0; + ТЗ[Н].ПорядковыйНомер = Н; + + Для Каждого Колонка Из ТЗ.Колонки Цикл + Если Не ЗначениеЗаполнено(ТЗ[Н][Колонка.Имя]) Тогда + Счетчик = Счетчик + 1; + КонецЕсли; + КонецЦикла; + + Если Счетчик = ТЗ.Колонки.Количество() Тогда + ТЗ.Удалить(Н); + КонецЕсли; + + Н = Н - 1; + + КонецЦикла; + + ВставкаВТ = ""; + ВставкаБазовые = ""; + ВставкаСсылочные = ""; + ВставкаИсточники = ""; + ХранилищеИсточников = Новый Соответствие; + МассивИменСсылочных = Новый Массив; + СтруктураИменКолонокДат = Новый Структура; + СоответствиеПеречислений = Новый Соответствие; + + ОписаниеТипаЧисло15 = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15)); + ШаблонИмяКолонки = "ВходнаяТаблица.%1 КАК %1," + Символы.ПС; + СтрокаНеОбрабатывать = "НеОбрабатывать"; + + Для Каждого СтрокаТаблицы Из Макет Цикл + + Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЗначения) Тогда + Продолжить; + КонецЕсли; + + ВставкаВТ = ВставкаВТ + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); + + Если СтрНайти(СтрокаТаблицы.ТипЗначения, "Ссылка") <> 0 + И СтрНайти(СтрокаТаблицы.ТипЗначения, "Перечисление") = 0 Тогда + + ТЗ.Колонки.Добавить(СтрокаТаблицы.ИмяКолонки + "КодЧислом", ОписаниеТипаЧисло15); + ВставкаВТ = ВставкаВТ + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки + "КодЧислом"); + МассивИменСсылочных.Добавить(СтрокаТаблицы.ИмяКолонки); + + РазбивкаТипа = СтрРазделить(СтрЗаменить(СтрокаТаблицы.ТипЗначения, "Ссылка", ""), ".", Ложь); + ТипОбъекта = РазбивкаТипа[0]; + ИмяОбъекта = РазбивкаТипа[1]; + + ВхождениеИсточника = ХранилищеИсточников.Получить(ИмяОбъекта); + ХранилищеИсточников.Вставить(ИмяОбъекта, ?(ВхождениеИсточника = Неопределено, 1, ВхождениеИсточника + 1)); + Итерация = ?(ХранилищеИсточников.Получить(ИмяОбъекта) = 0, "", Строка(ХранилищеИсточников.Получить(ИмяОбъекта))); + + // В макете могут быть заявлены поля, для которых не назначили полей поиска + ЕстьПоляПоиска = ЗначениеЗаполнено(СтрокаТаблицы.ПолеПоиска1) + Или ЗначениеЗаполнено(СтрокаТаблицы.ПолеПоиска2) + Или ЗначениеЗаполнено(СтрокаТаблицы.ПолеПоиска3); + Если ЕстьПоляПоиска Тогда + ВставкаСсылочные = ВставкаСсылочные + ИмяОбъекта + Итерация + + ".Ссылка КАК " + СтрокаТаблицы.ИмяКолонки + "," + Символы.ПС; + Иначе + ВставкаСсылочные = ВставкаСсылочные + "НЕОПРЕДЕЛЕНО КАК " + + СтрокаТаблицы.ИмяКолонки + "," + Символы.ПС; + КонецЕсли; + + ОператорСравнения = ?(ПустаяСтрока(СтрокаТаблицы.ОператорСравнения), + "ИЛИ", СтрокаТаблицы.ОператорСравнения); + + Если Не СтрНайти(ВставкаИсточники, " " + ИмяОбъекта + " ") > 0 И ЕстьПоляПоиска Тогда + ВставкаУсловияСоединения = ""; + Для Инкремент = 1 По 3 Цикл + РеквизитСравнения = СтрокаТаблицы["ПолеПоиска" + Инкремент]; + Если ПустаяСтрока(РеквизитСравнения) Тогда + Продолжить; + КонецЕсли; + + // Возможно использование оператора И для сопоставления, но при его использовании + // имена полей поиска должны равняться именам колонок обрабатываемой таблицы. Например: + // Если в свойствах макета у колонки заполнен тип ДокументСсылка., ПолеПоиска1 = "Номер", + // а ПолеПоиска2 = "Дата" И ОператорСравнения = "И", тогда таблица построителя должна иметь + // колонки "Номер", где лежит номер документа и "Дата", где лежит дата документа. + Если ОператорСравнения = "ИЛИ" Тогда + ИмяКолонкиСравнения = СтрокаТаблицы.ИмяКолонки; + Иначе + ИмяКолонкиСравнения = РеквизитСравнения; + КонецЕсли; + + ВставкаУсловияСоединения = ВставкаУсловияСоединения + + ?(ПустаяСтрока(ВставкаУсловияСоединения), "", Символы.ПС + " + | " + ОператорСравнения + " ") + "ВходнаяТаблица." + ИмяКолонкиСравнения + + " = " + ИмяОбъекта + Итерация + "." + РеквизитСравнения; + КонецЦикла; + + Если Не ПустаяСтрока(ВставкаУсловияСоединения) Тогда + ВставкаИсточники = ВставкаИсточники + " + | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(СтрокаТаблицы.ТипЗначения, "Ссылка", "") + " КАК " + ИмяОбъекта + Итерация + " + | ПО ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + " <> """" И " + "ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + " <> 0 + | И (" + ВставкаУсловияСоединения + ")"; + КонецЕсли; + + ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + + " КАК " + СтрокаТаблицы.ИмяКолонки + "Служебный," + Символы.ПС; + КонецЕсли; + + ИначеЕсли СтрНайти(СтрокаТаблицы.ТипЗначения, "Перечисление") <> 0 Тогда + КолонкаПеречисления = ТЗ.Колонки.Добавить(СтрокаТаблицы.ИмяКолонки + СтрокаНеОбрабатывать, + Новый ОписаниеТипов(СтрокаТаблицы.ТипЗначения)); + СоответствиеПеречислений.Вставить(СтрокаТаблицы.ИмяКолонки, СтрокаТаблицы.ТипЗначения); + ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + СтрокаТаблицы.ИмяКолонки + " КАК", "." + КолонкаПеречисления.Имя + " КАК"); + ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); + ИначеЕсли Не СтрНайти(СтрокаТаблицы.ИмяКолонки, СтрокаНеОбрабатывать) > 0 Тогда + ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); + Если СтрНайти(СтрокаТаблицы.ТипЗначения, "Дата") <> 0 + И ТЗ.Колонки.Найти(СтрокаТаблицы.ИмяКолонки + "Строкой") <> Неопределено Тогда + СтруктураИменКолонокДат.Вставить(СтрокаТаблицы.ИмяКолонки, ""); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + ВставкаВТ = ВставкаВТ + "ВходнаяТаблица.ПорядковыйНомер Как ПорядковыйНомер"; + ВставкаБазовые = Лев(ВставкаБазовые, СтрДлина(ВставкаБазовые) - 2); + + Если ТЗ.Количество() Тогда + ПрисвоитьНомераФорматовКолонокДат(ТЗ, СтруктураИменКолонокДат); + КонецЕсли; + + Для Каждого СтрокаТаблицы Из ТЗ Цикл + + Для Каждого ИмяМассива Из МассивИменСсылочных Цикл + СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОписаниеТипаЧисло15.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]); + КонецЦикла; + + Для Каждого Колонка Из СоответствиеПеречислений Цикл + ИмяПеречисления = СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", ""); + + Для Каждого ТекЭлемент Из Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления Цикл + Если НРег(ТекЭлемент.Синоним) = НРег(СтрокаТаблицы[Колонка.Ключ]) Тогда + СтрокаТаблицы[Колонка.Ключ + СтрокаНеОбрабатывать] = Перечисления[ИмяПеречисления][ТекЭлемент.Имя]; + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + Для Каждого КлючИЗначение Из СтруктураИменКолонокДат Цикл + СтрокаТаблицы[КлючИЗначение.Ключ] = ПреобразоватьДатуИзСтрокиПоФормату( + СтрокаТаблицы[КлючИЗначение.Ключ + "Строкой"], КлючИЗначение.Значение); + КонецЦикла; + + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | #ВставкаВТ + |ПОМЕСТИТЬ ВходнаяТаблица + |ИЗ + | &ВходнаяТаблица КАК ВходнаяТаблица + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | #ВставкаСсылочные + | #ВставкаБазовые + |ИЗ + | ВходнаяТаблица КАК ВходнаяТаблица + | #ВставкаИсточники + | + |УПОРЯДОЧИТЬ ПО + | ВходнаяТаблица.ПорядковыйНомер"; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники); + + Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ); + РезультатЗапроса = Запрос.Выполнить(); + + ВыгрузкаРезультатаЗапроса = РезультатЗапроса.Выгрузить(); + + Возврат ВыгрузкаРезультатаЗапроса; + +КонецФункции + +// Возвращает таблицу значений без null в ячейках +// +// Параметры: +// ТаблицаЗначений - ТаблицаЗначений - таблица, в которой необходимо подменить значения +// фИзменилиТаблицу - Булево - флаг, оповещающий о том, что в таблице были выполнены замены +// +Процедура ТаблицаЗначенийБезNull(ТаблицаЗначений, фИзменилиТаблицу = Ложь) Экспорт + + фИзменилиТаблицу = Ложь; + + чКрайний = ТаблицаЗначений.Колонки.Количество() - 1; + Для чИндекс = 0 По чКрайний Цикл + + ТипКолонки = ТаблицаЗначений.Колонки[чИндекс].ТипЗначения; + + Если ТипКолонки.СодержитТип(Тип("Null")) Тогда + + ИмяКолонки = ТаблицаЗначений.Колонки[чИндекс].Имя; + ЗагКолонки = ТаблицаЗначений.Колонки[чИндекс].Заголовок; + ШирКолонки = ТаблицаЗначений.Колонки[чИндекс].Ширина; + ЗнчКолонки = ТаблицаЗначений.ВыгрузитьКолонку(чИндекс); + ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL" + ,ТипКолонки.КвалификаторыЧисла + ,ТипКолонки.КвалификаторыСтроки + ,ТипКолонки.КвалификаторыДаты + ,ТипКолонки.КвалификаторыДвоичныхДанных + ); + + ТаблицаЗначений.Колонки.Удалить(чИндекс); + ТаблицаЗначений.Колонки.Вставить(чИндекс, ИмяКолонки, ТипКолонки, ЗагКолонки, ШирКолонки); + ТаблицаЗначений.ЗагрузитьКолонку(ЗнчКолонки, чИндекс); + + фИзменилиТаблицу = Истина; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти // ПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьПромежуточнуюТаблицуЗначенийИзТабличногоДокумента(ТабДок, НомерСтроки, Макет, СопоставлениеПоНаименованию) + + Если Не НомерСтроки = 1 Тогда + ТабДок.УдалитьОбласть(ТабДок.Область("R1:R" + Строка(НомерСтроки - 1)), ТипСмещенияТабличногоДокумента.ПоВертикали); + КонецЕсли; + + Если Не СопоставлениеПоНаименованию Тогда + ПреобразоватьТабличныйДокументПоследовательнымСопоставлением(ТабДок, Макет); + Иначе + ПреобразоватьТабличныйДокументСопоставлениемПоНаименованиюКолонок(ТабДок, Макет); + КонецЕсли; + + ПЗ = Новый ПостроительЗапроса; + ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область()); + ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.Добавлять; + ПЗ.ЗаполнитьНастройки(); + ПЗ.Выполнить(); + ТЗ = ПЗ.Результат.Выгрузить(); + + Если СопоставлениеПоНаименованию Тогда + // Дополняем колонками из макета, если в ТД они отсутствовали + Для Каждого СтрокаМакета Из Макет Цикл + Если ТЗ.Колонки.Найти(СтрокаМакета.ИмяКолонки) = Неопределено Тогда + ТЗ.Колонки.Добавить(СтрокаМакета.ИмяКолонки, Новый ОписаниеТипов(СтрокаМакета.ТипЗначения)); + Иначе + // Для колонок с типом Дата необходимо преобразование + Если СтрокаМакета.ТипЗначения = "Дата" Тогда + ТЗ.Колонки[СтрокаМакета.ИмяКолонки].Имя = ТЗ.Колонки[СтрокаМакета.ИмяКолонки].Имя + "Строкой"; + ТЗ.Колонки.Добавить(СтрокаМакета.ИмяКолонки, Новый ОписаниеТипов("Дата")); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // Удаляем пустые строки, которые остались от объединения строк + ИмяКолонки1 = ТЗ.Колонки[0].Имя; + ИмяКолонки2 = ТЗ.Колонки[1].Имя; + ИмяКолонки3 = ТЗ.Колонки[2].Имя; + КоличествоСтрок = ТЗ.Количество() - 1; + Пока КоличествоСтрок >= 0 Цикл + СтрокаТаблицы = ТЗ[КоличествоСтрок]; + Если ПустаяСтрока(СтрокаТаблицы[ИмяКолонки1]) + И ПустаяСтрока(СтрокаТаблицы[ИмяКолонки2]) + И ПустаяСтрока(СтрокаТаблицы[ИмяКолонки3]) Тогда + ТЗ.Удалить(СтрокаТаблицы); + КонецЕсли; + + КоличествоСтрок = КоличествоСтрок - 1; + КонецЦикла; + + ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число")); + + Возврат ТЗ; + +КонецФункции + +Процедура ПреобразоватьТабличныйДокументПоследовательнымСопоставлением(ТабДок, Макет) + + ТабДок.ВставитьОбласть(ТабДок.Область("R1"), + ТабДок.Область("R1"), + ТипСмещенияТабличногоДокумента.ПоГоризонтали); + + Табдок.Область("R1").Очистить(Истина, Истина, Истина); + + Счетчик = 0; + Для Каждого СтрокаТаблицы Из Макет Цикл + Счетчик = Счетчик + 1; + Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЗначения) Тогда + Продолжить; + КонецЕсли; + ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст = СтрокаТаблицы.ИмяКолонки; + КонецЦикла; + +КонецПроцедуры + +Процедура ПреобразоватьТабличныйДокументСопоставлениемПоНаименованиюКолонок(ТабДок, Макет) + + Счетчик = 1; + КолонкиКУдалению = Новый Массив; + ТекстШапки = СокрЛП(ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст); + Пока Не ПустаяСтрока(ТекстШапки) Цикл + ИмяКолонки = ""; + // Сверяем наименование колонки ТД и наименование из макета + Для Каждого СтрокаТаблицы Из Макет Цикл + Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЗначения) Тогда + Продолжить; + КонецЕсли; + Если (ЗначениеЗаполнено(СтрокаТаблицы.ИмяВТабДоке) + И ТекстШапки = СтрокаТаблицы.ИмяВТабДоке) + Или (Не ЗначениеЗаполнено(СтрокаТаблицы.ИмяВТабДоке) + И ТекстШапки = СтрокаТаблицы.ИмяКолонки) Тогда + ИмяКолонки = СтрокаТаблицы.ИмяКолонки; + Прервать; + КонецЕсли; + КонецЦикла; + + // Подменяем имя для работы с построителем; если колонки нет, то готовим ее к удалению + Если Не ПустаяСтрока(ИмяКолонки) Тогда + ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст = ИмяКолонки; + Иначе + КолонкиКУдалению.Добавить(Счетчик); + КонецЕсли; + + Счетчик = Счетчик + 1; + ТекстШапки = СокрЛП(ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст); + КонецЦикла; + + // Удаляем ненужные колонки + КоличествоКолонокКУдалению = КолонкиКУдалению.Количество() - 1; + Пока КоличествоКолонокКУдалению >= 0 Цикл + НомерКолонки = КолонкиКУдалению[КоличествоКолонокКУдалению]; + ТабДок.УдалитьОбласть(ТабДок.Область("C" + Строка(НомерКолонки)), ТипСмещенияТабличногоДокумента.ПоГоризонтали); + + КоличествоКолонокКУдалению = КоличествоКолонокКУдалению - 1; + КонецЦикла; + +КонецПроцедуры + +Процедура ПрисвоитьНомераФорматовКолонокДат(ТЗ, СтруктураИменКолонокДат) + + Если Не ТЗ.Количество() Тогда + Возврат; + КонецЕсли; + + ПерваяСтрокаТаблицы = ТЗ[0]; + + Для Каждого КлючИЗначение Из СтруктураИменКолонокДат Цикл + ЗначениеКолонки = ПерваяСтрокаТаблицы[КлючИЗначение.Ключ + "Строкой"]; + Если ПустаяСтрока(ЗначениеКолонки) Тогда + Продолжить; + КонецЕсли; + + СтруктураИменКолонокДат.Вставить(КлючИЗначение.Ключ, ПолучитьНомерФорматаДатыИзСтроки(ЗначениеКолонки)); + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьНомерФорматаДатыИзСтроки(ЗначениеКолонки) + + ЕстьВремя = СтрНайти(ЗначениеКолонки, ":") > 0; + ЭтоУниверсальноеВремя = Ложь; + + Если ЕстьВремя Тогда + МассивРазделителей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ЗначениеКолонки, ":", Истина, Истина); + Если СтрНайти(МассивРазделителей[1], "AM") > 0 + Или СтрНайти(МассивРазделителей[1], "PM") > 0 Тогда + РазрядВремени = "2"; + Иначе + РазрядВремени = "1"; + КонецЕсли; + + МассивРазделителейДатаВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + МассивРазделителей[0], " ", Истина, Истина); + Если МассивРазделителейДатаВремя.Количество() = 2 Тогда + ТолькоДата = МассивРазделителейДатаВремя[0]; + ИначеЕсли МассивРазделителейДатаВремя.Количество() = 0 Тогда + МассивРазделителейДатаВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + МассивРазделителей[0], "T", Истина, Истина); + Если МассивРазделителейДатаВремя.Количество() = 2 Тогда + ТолькоДата = МассивРазделителейДатаВремя[0]; + ЭтоУниверсальноеВремя = Истина; + КонецЕсли; + Иначе + ТолькоДата = ПолучитьТолькоДатуЕслиРазделительПробел(МассивРазделителейДатаВремя); + КонецЕсли; + Иначе + ТолькоДата = ЗначениеКолонки; + РазрядВремени = "0"; + КонецЕсли; + + Если Не ЭтоУниверсальноеВремя Тогда + Если СтрНайти(ТолькоДата, ".") > 0 Тогда + РазрядРазделителя = "1"; + РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, "."); + ИначеЕсли СтрНайти(ТолькоДата, "/") > 0 Тогда + РазрядРазделителя = "2"; + РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, "/"); + ИначеЕсли СтрНайти(ТолькоДата, "-") > 0 Тогда + РазрядРазделителя = "3"; + РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, "-"); + Иначе + РазрядРазделителя = "4"; + РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, " "); + КонецЕсли; + Иначе + РазрядРазделителя = "0"; + РазрядФормата = "0"; + РазрядВремени = "0"; + КонецЕсли; + + Возврат РазрядРазделителя + "_" + РазрядФормата + "_" + РазрядВремени; + +КонецФункции + +Функция ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, Разделитель) + + МассивРазделителей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ЗначениеКолонки, Разделитель, Истина, Истина); + СокрМесяц = ТРег(Лев(МассивРазделителей[1], 3)); + Если Число(МассивРазделителей[0]) > 31 Тогда // тут год + РазрядФормата = "1"; + ИначеЕсли пбп_ОбщегоНазначенияКлиентСервер.ПолучитьНомерМесяцаПоСтроковомуПредставлению(СокрМесяц) = 0 Тогда + РазрядФормата = "2"; + Иначе + РазрядФормата = "3"; + КонецЕсли; + + Возврат РазрядФормата; + +КонецФункции + +Функция ПолучитьТолькоДатуЕслиРазделительПробел(МассивРазделителейДатаВремя) + + КоличествоРазделителей = МассивРазделителейДатаВремя.Количество() - 2; // В последнем часы + Для Разделитель = 0 По КоличествоРазделителей Цикл + ТолькоДата = ТолькоДата + ?(ПустаяСтрока(ТолькоДата), "", " ") + МассивРазделителейДатаВремя[Разделитель]; + КонецЦикла; + + Возврат ТолькоДата; + +КонецФункции + +Функция ПреобразоватьДатуИзСтрокиПоФормату(ВхЗначение, НомерФормата) + + ПреобразованнаяДата = Неопределено; + Если НомерФормата = "000" Тогда + ПреобразованнаяДата = XMLЗначение(Тип("Дата"), ВхЗначение); + Иначе + РазрядыФормата = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(НомерФормата, "_"); + + СтрокаВремя = ""; + Если РазрядыФормата[2] = "0" Тогда + СтрокаВремя = "00:00:00"; + ТолькоДата = ВхЗначение; + Иначе + МассивРазделителей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ВхЗначение, ":", Истина, Истина); + + МассивРазделителейДатаВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + МассивРазделителей[0], " ", Истина, Истина); + Если РазрядыФормата[0] = "4" Тогда + ТолькоДата = ПолучитьТолькоДатуЕслиРазделительПробел(МассивРазделителейДатаВремя); + Иначе + ТолькоДата = МассивРазделителейДатаВремя[0]; + КонецЕсли; + + Если РазрядыФормата[1] = "1" Тогда + Часы = МассивРазделителейДатаВремя[МассивРазделителейДатаВремя.Количество() - 1]; + МинутыСекунды = МассивРазделителей[1]; + Иначе + ЧасыБезСдвигаЧисло = Число(МассивРазделителейДатаВремя[МассивРазделителейДатаВремя.Количество() - 1]); + Если Прав(МинутыСекунды, 2) = "PM" Тогда + Часы = ЧасыБезСдвигаЧисло + 12; + Иначе + Часы = ЧасыБезСдвигаЧисло; + КонецЕсли; + + МинутыСекунды = СтрЗаменить(МинутыСекунды, " AM", ""); + МинутыСекунды = СтрЗаменить(МинутыСекунды, " PM", ""); + КонецЕсли; + + СтрокаВремя = Строка(Часы) + ":" + МинутыСекунды; + КонецЕсли; + + Если РазрядыФормата[0] = "1" Тогда + РазделительРазрядов = "."; + ИначеЕсли РазрядыФормата[0] = "2" Тогда + РазделительРазрядов = "/"; + ИначеЕсли РазрядыФормата[0] = "3" Тогда + РазделительРазрядов = "-"; + Иначе + РазделительРазрядов = " "; + КонецЕсли; + + МассивГодМесяцДата = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ТолькоДата, РазделительРазрядов, Истина, Истина); + + Если РазрядыФормата[1] = "1" Тогда + Год = МассивГодМесяцДата[0]; + Месяц = МассивГодМесяцДата[1]; + День = МассивГодМесяцДата[2]; + ИначеЕсли РазрядыФормата[1] = "2" Тогда + Год = МассивГодМесяцДата[2]; + Месяц = МассивГодМесяцДата[1]; + День = МассивГодМесяцДата[0]; + Иначе + Год = МассивГодМесяцДата[2]; + СокрМесяц = ТРег(Лев(МассивГодМесяцДата[1], 3)); + Месяц = пбп_ОбщегоНазначенияКлиентСервер.ПолучитьНомерМесяцаПоСтроковомуПредставлению(СокрМесяц); + День = МассивГодМесяцДата[0]; + КонецЕсли; + + Если Число(Месяц) < 10 И Лев(Месяц, 1) <> "0" Тогда + Месяц = "0" + Месяц; + КонецЕсли; + + Если Число(День) < 10 И Лев(День, 1) <> "0" Тогда + День = "0" + День; + КонецЕсли; + + СтрокаДата = День + "." + Месяц + "." + Год; + + ПреобразованнаяДата = Дата(СтрокаДата + " " + СтрокаВремя); + + КонецЕсли; + + Возврат ПреобразованнаяДата; + +КонецФункции + +#КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" index 5dc2e80f..573b9bd3 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" @@ -1076,7 +1076,7 @@ Функция ПолучитьДатуИзТестовогоФорматаBASHLinux(СтрокаСвойств) ГодЧислом = ?(СтрокаСвойств.ЭтоВремя, Год(ТекущаяДатаСеанса()), Число(СтрокаСвойств.ГодВремя)); - Месяц = ПолучитьНомерМесяцаПоСтроковомуПредставлению(СтрокаСвойств.Месяц); + Месяц = пбп_ОбщегоНазначенияКлиентСервер.ПолучитьНомерМесяцаПоСтроковомуПредставлению(СтрокаСвойств.Месяц); ЧислоМесяца = СтрокаСвойств.Число; ЧасВремя = ?(СтрокаСвойств.ЭтоВремя, СтрокаСвойств.ГодВремя, "00:00"); @@ -1089,52 +1089,6 @@ КонецФункции -Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) - - МесяцВРег = ВРег(МесяцСтрокойСокр); - // BSLLS:Typo-off - Если МесяцВРег = "ЯНВ" - Или МесяцВРег = "JAN" Тогда - МесяцЧислом = 1; - ИначеЕсли МесяцВРег = "ФЕВ" - Или МесяцВРег = "FEB" Тогда - МесяцЧислом = 2; - ИначеЕсли МесяцВРег = "МАР" - Или МесяцВРег = "MAR" Тогда - МесяцЧислом = 3; - ИначеЕсли МесяцВРег = "АПР" - Или МесяцВРег = "APR" Тогда - МесяцЧислом = 4; - ИначеЕсли МесяцВРег = "МАЙ" - Или МесяцВРег = "MAY" Тогда - МесяцЧислом = 5; - ИначеЕсли МесяцВРег = "ИЮН" - Или МесяцВРег = "JUN" Тогда - МесяцЧислом = 6; - ИначеЕсли МесяцВРег = "ИЮЛ" - Или МесяцВРег = "JUL" Тогда - МесяцЧислом = 7; - ИначеЕсли МесяцВРег = "АВГ" - Или МесяцВРег = "AUG" Тогда - МесяцЧислом = 8; - ИначеЕсли МесяцВРег = "СЕН" - Или МесяцВРег = "SEP" Тогда - МесяцЧислом = 9; - ИначеЕсли МесяцВРег = "ОКТ" - Или МесяцВРег = "OCT" Тогда - МесяцЧислом = 10; - ИначеЕсли МесяцВРег = "НОЯ" - Или МесяцВРег = "NOV" Тогда - МесяцЧислом = 11; - Иначе // Декабрь - МесяцЧислом = 12; - КонецЕсли; - // BSLLS:Typo-on - - Возврат МесяцЧислом; - -КонецФункции - #Область SFTPWindows Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows() diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" index 9fed4fac..b37b490f 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" @@ -144,14 +144,168 @@ ВнешниеИсточникиДанных[ИмяВнешнегоИсточникаДанных].УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения); + ПользовательСсылка = пбп_ПользователиСлужебный.ТекущийПользователь(); + ТекущийПользователь = пбп_ПользователиСлужебный.НайтиПоСсылке(ПользовательСсылка); ВнешниеИсточникиДанных[ИмяВнешнегоИсточникаДанных].УстановитьПараметрыСоединенияПользователя( - пбп_Пользователи.ТекущийПользователь(), ПараметрыСоединения); + ТекущийПользователь.Имя, ПараметрыСоединения); ВнешниеИсточникиДанных[ИмяВнешнегоИсточникаДанных].УстановитьПараметрыСоединенияСеанса(ПараметрыСоединения); ВнешниеИсточникиДанных[ИмяВнешнегоИсточникаДанных].УстановитьСоединение(); КонецПроцедуры +// Получает таблицу данных из внешнего источника посредством выполнения запроса по условиям +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - ссылка на интеграционный поток +// ПоляЗапроса - Строка - название полей таблицы, перечисленных через запятую +// ПараметрыЗапроса - Структура - ключом является наименование поля запроса, по которому необходимо +// установить условие, значением - значение параметра запроса +// КоличествоПервых - Число - количество первых строк выборки. Если не заполнено, то условия по ПЕРВЫЕ нет +// СтруктураИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +// Возвращаемое значение: +// Строка, ТаблицаЗначений - таблица значений с данными, полученными из внешнего источника, +// с типизированными колонками или строка с ошибкой +// +Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток, + ПоляЗапроса = "", ПараметрыЗапроса = Неопределено, КоличествоПервых = 0, СтруктураИстории = Неопределено) Экспорт + + ЗаголовокОшибки = "Данные не были получены из внешнего источника данных"; + СообщениеОбОшибке = ""; + + РеквизитыОбъекта = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода"); + + Если Не ЗначениеЗаполнено(РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта) Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + "в настройках интеграции не заполнено наименование внешнего источника данных"); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + + Если Не ЗначениеЗаполнено(РеквизитыОбъекта.ТочкаВхода) Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + "в интеграционном потоке не заполнено имя таблицы внешнего источника данных"); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + + Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда + Возврат СообщениеОбОшибке; + КонецЕсли; + + Попытка + ТаблицаВыборки = ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника( + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта, РеквизитыОбъекта.ТочкаВхода, ПоляЗапроса); + + Запрос = Новый Запрос; + + ТекстЗапроса = "ВЫБРАТЬ + | &ПоляЗапроса + |ИЗ + | ВнешнийИсточникДанных." + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта + + ".Таблица." + РеквизитыОбъекта.ТочкаВхода + " КАК Таблица"; + + Если КоличествоПервых <> 0 Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + КоличествоПервых); + КонецЕсли; + + Если Не ПустаяСтрока(ПоляЗапроса) Тогда + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", ПоляЗапроса); + Иначе + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", "Таблица.*"); + КонецЕсли; + + УсловияЗапроса = ""; + + // Установка предопределенных параметров запроса из интеграционного потока + Для Каждого СтрокаПредопределенногоПараметра Из ИнтеграционныйПоток.ПараметрыВхода Цикл + УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", " + | И "), СтрокаПредопределенногоПараметра.Имя); + + Запрос.УстановитьПараметр(СтрокаПредопределенногоПараметра.Имя, СтрокаПредопределенногоПараметра.ЗначениеПоУмолчанию); + КонецЦикла; + + // Установка опциональных параметров запроса + Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл + УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", " + | И "), КлючИЗначение.Ключ); + + Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение); + КонецЦикла; + + Если Не ПустаяСтрока(УсловияЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + " + |ГДЕ + | " + УсловияЗапроса; + КонецЕсли; + + Запрос.Текст = ТекстЗапроса; + + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ИсходящееСообщение = пбп_ИнтеграцииСлужебный + .ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос); + НачалоВызова = ТекущаяДатаСеанса(); + КонецЕсли; + + РезультатЗапроса = Запрос.Выполнить(); + + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; + КонецЕсли; + + ВыборкаРезультатаЗапроса = РезультатЗапроса.Выбрать(); + + Пока ВыборкаРезультатаЗапроса.Следующий() Цикл + ЗаполнитьЗначенияСвойств(ТаблицаВыборки.Добавить(), ВыборкаРезультатаЗапроса); + КонецЦикла; + + Возврат ТаблицаВыборки; + Исключение + СообщениеОбОшибке = ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке()); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Возвращает инициализированную таблицу значений из таблицы внешнего +// источника по метаданным с типизированными колонками +// +// Параметры: +// ИмяВнешнегоИсточника - Строка - имя внешнего источника данных +// ИмяТаблицы - Строка - имя таблицы внешнего источника данных +// НеобходимыеПоля - Строка - название полей таблицы, перечисленных через запятую +// +// Возвращаемое значение: +// ТаблицаЗначений - пустая таблица значений с типизированными колонками +// +Функция ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника( + ИмяВнешнегоИсточника, ИмяТаблицы, НеобходимыеПоля = "") Экспорт + + ТаблицаДанных = Новый ТаблицаЗначений; + + МетаданныеИсточника = Метаданные.ВнешниеИсточникиДанных[ИмяВнешнегоИсточника]; + МетаданныеТаблицы = МетаданныеИсточника.Таблицы[ИмяТаблицы]; + + МассивНужныхПолей = Новый Массив; + Если Не ПустаяСтрока(НеобходимыеПоля) Тогда + МассивНужныхПолей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + НеобходимыеПоля, ",", Истина, Истина); + КонецЕсли; + + КоличествоНужныхПолей = МассивНужныхПолей.Количество(); + Для Каждого ПолеТаблицы Из МетаданныеТаблицы.Поля Цикл + Если КоличествоНужныхПолей <> 0 И МассивНужныхПолей.Найти(ПолеТаблицы.Имя) = Неопределено Тогда + Продолжить; + КонецЕсли; + + ТаблицаДанных.Колонки.Добавить(ПолеТаблицы.Имя, ПолеТаблицы.Тип); + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + #КонецОбласти // ПрямоеПодключениеКБД #Область REST diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" index fb73b276..51484855 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" @@ -74,7 +74,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "ПроектнаяБиблиотекаПодсистем"; - Описание.Версия = "1.0.3.10"; + Описание.Версия = "1.0.3.11"; // Требуется библиотека стандартных подсистем. Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы"); diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/Ext/Module.bsl" index f3179c2f..ec2beb28 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/Ext/Module.bsl" @@ -36,6 +36,24 @@ КонецФункции +// Аналог метода БСП. Возвращает пользователя ИБ по ссылке справочника Пользователи или ВнешниеПользователи. +// Для поиска требуются административные права. Если административных прав нет, +// допустимо искать только пользователя для текущего пользователя ИБ. +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// +// Возвращаемое значение: +// ПользовательИнформационнойБазы - если найден. +// Неопределено - если пользователь ИБ не существует. +// +Функция НайтиПоСсылке(Пользователь) Экспорт + + Возврат Неопределено; + +КонецФункции + #КонецОбласти #КонецОбласти diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" index 8f7def2b..d290de30 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" @@ -30,6 +30,14 @@ КонецФункции +// См. пбп_Пользователи.НайтиПоСсылке. +Функция НайтиПоСсылке(Пользователь) Экспорт + + Модуль = ПолучитьМодуль(); + Возврат Модуль.НайтиПоСсылке(Пользователь); + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml index c2d306ac..9d7e748d 100644 --- a/src/cf/Configuration.xml +++ b/src/cf/Configuration.xml @@ -57,7 +57,7 @@ Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок Первый БИТ - 1.0.3.10 + 1.0.3.11 false false @@ -280,9 +280,10 @@ пбп_ЖурналРегистрацииСлужебный пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент + пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер + пбп_ИнтеграцииFTPSFTP пбп_ИнтеграцииСервер пбп_ИнтеграцииСлужебный - пбп_ИнтеграцииFTPSFTP пбп_КоннекторHTTP пбп_МетодыРегламентныхЗаданийСервер пбп_МодификацияКонфигурацииКлиентПереопределяемый @@ -327,9 +328,9 @@ пбп_СтроковыеФункцииСлужебныйКлиентСервер пбп_СхемыЗапросов пбп_ФайловаяСистема - пбп_ФайловаяСистемаПереадресация - пбп_ФайловаяСистемаКлиентПереадресация пбп_ФайловаяСистемаКлиент + пбп_ФайловаяСистемаКлиентПереадресация + пбп_ФайловаяСистемаПереадресация пбп_ФайловаяСистемаСлужебныйКлиент пбп_ДокументыОбработкаЗаполнения пбп_ДокументыОбработкаПроведения diff --git "a/src/cf/Subsystems/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\230\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\320\276\320\263\320\276\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260.xml" "b/src/cf/Subsystems/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\230\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\320\276\320\263\320\276\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260.xml" index 0e1d5b2e..33c1722f 100644 --- "a/src/cf/Subsystems/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\230\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\320\276\320\263\320\276\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260.xml" +++ "b/src/cf/Subsystems/\320\277\320\261\320\277_\320\227\320\260\320\263\321\200\321\203\320\267\320\272\320\260\320\230\320\267\320\242\320\260\320\261\320\273\320\270\321\207\320\275\320\276\320\263\320\276\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\260.xml" @@ -18,6 +18,7 @@ CommonModule.пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера CommonModule.пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент + CommonModule.пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер