From 2a8daf17c3fc6613f9b3cdd5b208038ddcc0b86b Mon Sep 17 00:00:00 2001 From: Ivan Smirnov Date: Tue, 9 Apr 2024 18:41:44 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=20https://github.com/Bayselonarrend/uniloadXLS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1\200\320\262\320\265\321\200\320\260.xml" | 23 ++ .../Ext/Module.bsl" | 266 ++++++++++++++++++ ...0\273\320\270\320\265\320\275\321\202.xml" | 23 ++ .../Ext/Module.bsl" | 74 +++++ src/Configuration.xml | 11 +- ...0\274\320\265\320\275\321\202\320\260.xml" | 25 ++ 6 files changed, 418 insertions(+), 4 deletions(-) create mode 100644 "src/CommonModules/__\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.xml" create mode 100644 "src/CommonModules/__\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" create mode 100644 "src/CommonModules/__\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.xml" create mode 100644 "src/CommonModules/__\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" create mode 100644 "src/Subsystems/__\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" diff --git "a/src/CommonModules/__\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.xml" "b/src/CommonModules/__\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.xml" new file mode 100644 index 00000000..4cb12eac --- /dev/null +++ "b/src/CommonModules/__\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.xml" @@ -0,0 +1,23 @@ + + + + + __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера + + + ru + Загрузка файла через табличный документ вызов сервера + + + + false + false + true + false + false + true + false + DontUse + + + \ No newline at end of file diff --git "a/src/CommonModules/__\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/CommonModules/__\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" new file mode 100644 index 00000000..dffe234b --- /dev/null +++ "b/src/CommonModules/__\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" @@ -0,0 +1,266 @@ +//MIT License + +//Copyright (c) 2024 Anton Tsitavets + +//Permission is hereby granted, free of charge, to any person obtaining a copy +//of this software and associated documentation files (the "Software"), to deal +//in the Software without restriction, including without limitation the rights +//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +//copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions: + +//The above copyright notice and this permission notice shall be included in all +//copies or substantial portions of the Software. + +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +//SOFTWARE. + +#Область ПрограммныйИнтерфейс + +// Процедура - Формирование таблицы +// +// Параметры: +// Адрес - Строка - Адрес файла во временном хранилище +// ИмяФайла - Строка - Начальное полное имя файла +// Параметры - Структура - Параметры загрузки +// +Процедура ФормированиеТаблицы(Адрес, ИмяФайла, Параметры) Экспорт + + Макет = Параметры.Макет; + АдресХран = Параметры.АдресХр; + НазваниеЛиста = Параметры.НазваниеЛиста; + НомерСтроки = Параметры.НомерПервойСтроки; + Данные = ПолучитьИзВременногоХранилища(Адрес); + ФайлДанных = КаталогВременныхФайлов() + + СтрЗаменить(Формат(ТекущаяДата(), "ДЛФ=T"), ":", "") + + ИмяФайла; + + Данные.Записать(ФайлДанных); + ТабДок = Новый ТабличныйДокумент; + + ТабДок.Прочитать(ФайлДанных,СпособЧтенияЗначенийТабличногоДокумента.Текст); + Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); + + ПервыйЛист = ТабДок.Области[0].Имя; + Для Каждого ЛистДок Из ТабДок.Области Цикл + Если ЛистДок.Верх = 1 Тогда + ПервыйЛист = ЛистДок.Имя; + КонецЕсли; + КонецЦикла; + + ТабДок = ТабДок.ПолучитьОбласть(?(Лист = Неопределено, ПервыйЛист, СтрЗаменить(НазваниеЛиста, " ", "_"))); + + Если Не НомерСтроки = 1 Тогда + ТабДок.УдалитьОбласть(ТабДок.Область("R1:R" + Строка(НомерСтроки - 1)), ТипСмещенияТабличногоДокумента.ПоВертикали); + КонецЕсли; + + ТабДок.ВставитьОбласть( + ТабДок.Область("R1") + ,ТабДок.Область("R1") + ,ТипСмещенияТабличногоДокумента.ПоГоризонтали); + + Табдок.Область("R1").Очистить(Истина, Истина, Истина); + + Счетчик = 0; + Для каждого Колонка Из Макет Цикл + Счетчик = Счетчик + 1; + Если Не ЗначениеЗаполнено(Колонка.Значение) Тогда + Продолжить; + КонецЕсли; + ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст = Колонка.Ключ; + КонецЦикла; + + ПЗ = Новый ПостроительЗапроса; + ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область()); + ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.Добавлять; + ПЗ.ЗаполнитьНастройки(); + ПЗ.Выполнить(); + ТЗ = ПЗ.Результат.Выгрузить(); + + ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число")); + + Порядок = 1; + ПоследняяСтатья = 0; + + КоллекцияОтборов = Новый ТаблицаЗначений; + КоллекцияОтборов.Колонки.Добавить("ТипДанных"); + КоллекцияОтборов.Колонки.Добавить("НомерСтрокиДочерней"); + КоллекцияОтборов.Колонки.Добавить("МассивДанных"); + КоллекцияОтборов.Колонки.Добавить("НазваниеКолонки"); + + ВременнаяТЗ = Новый ТаблицаЗначений; + Н = ТЗ.Количество() - 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)); + + Для Каждого СтрокаТаблицы Из ТЗ Цикл + Для Каждого ИмяМассива Из МассивИменСсылочных Цикл + СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОТЧ.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]); + КонецЦикла; + + Для Каждого Колонка Из СоответствиеПеречислений Цикл + + Для Каждого ТекЭлемент Из Метаданные.Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")].ЗначенияПеречисления Цикл + Если нРег(ТекЭлемент.Синоним) = нРег(СтрокаТаблицы[Колонка.Ключ]) Тогда + СтрокаТаблицы[Колонка.Ключ + "НеОбрабатывать"] = Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")][ТекЭлемент.Имя]; + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | #ВставкаВТ + |ПОМЕСТИТЬ ВходнаяТаблица + |ИЗ + | &ВходнаяТаблица КАК ВходнаяТаблица + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | #ВставкаСсылочные + | #ВставкаБазовые + |ИЗ + | ВходнаяТаблица КАК ВходнаяТаблица + | #ВставкаИсточники + | + | УПОРЯДОЧИТЬ ПО + | ВходнаяТаблица.ПорядковыйНомер"; + + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники); + + Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ); + РезультатЗапроса = Запрос.Выполнить(); + + ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресХран); + +КонецПроцедуры + +// Функция - Поместить заглушку +// +// Параметры: +// Макет - Структура - Список колонок загружаемого файла +// +// Возвращаемое значение: +// - Строка - Адрес файла во временном хранилище +// +Функция ПоместитьЗаглушку(Макет) Экспорт + + Заглушка = Новый ТаблицаЗначений; + + Для Каждого Колонка Из Макет Цикл + Заглушка.Колонки.Добавить(Колонка.Ключ, Новый ОписаниеТипов(Колонка.Значение)); + КонецЦикла; + + ИД = ПоместитьВоВременноеХранилище(Заглушка, Новый УникальныйИдентификатор); + + Возврат ИД; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git "a/src/CommonModules/__\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.xml" "b/src/CommonModules/__\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.xml" new file mode 100644 index 00000000..f89426f9 --- /dev/null +++ "b/src/CommonModules/__\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.xml" @@ -0,0 +1,23 @@ + + + + + __ЗагрузкаФайлаЧерезТабличныйДокументКлиент + + + ru + Загрузка файла через табличный документ клиент + + + + false + true + false + false + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/CommonModules/__\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/CommonModules/__\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" new file mode 100644 index 00000000..cf1eecae --- /dev/null +++ "b/src/CommonModules/__\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" @@ -0,0 +1,74 @@ +//MIT License + +//Copyright (c) 2024 Anton Tsitavets + +//Permission is hereby granted, free of charge, to any person obtaining a copy +//of this software and associated documentation files (the "Software"), to deal +//in the Software without restriction, including without limitation the rights +//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +//copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions: + +//The above copyright notice and this permission notice shall be included in all +//copies or substantial portions of the Software. + +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +//SOFTWARE. + +#Область ПрограммныйИнтерфейс + +// Функция - Загрузить из XLS +// +// Параметры: +// СоответствиеКолонок - Структура - Описание колонок загружаемого файла +// НазваниеЛиста - Строка - Имя загружаемого листа (по-умолчанию не заполнено) +// НомерПервойСтроки - Число - Номер строки с которой начинается загрузка данных (по-умолчанию 1) +// +// Возвращаемое значение: +// - Строка - Адрес файла во временном хранилище +// +Функция ЗагрузитьИзXLS(СоответствиеКолонок, НазваниеЛиста = "", НомерПервойСтроки = 1) Экспорт + + ИД = __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(СоответствиеКолонок); + + ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогВыбораФайла.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; + ДиалогВыбораФайла.Заголовок = "Выберите файл"; + ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь; + ДиалогВыбораФайла.МножественныйВыбор = Ложь; + ДиалогВыбораФайла.ИндексФильтра = 0; + + Параметры = Новый Структура("Макет, АдресХр, НазваниеЛиста, НомерПервойСтроки", СоответствиеКолонок, ИД, НазваниеЛиста, НомерПервойСтроки); + + Если ДиалогВыбораФайла.Выбрать() Тогда + ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогВыбораФайла.ПолноеИмяФайла), ИД); + ЗагрузитьФайлЗавершение(ИД, ДиалогВыбораФайла.ПолноеИмяФайла, Параметры); + КонецЕсли; + + Возврат ИД; + +КонецФункции + +// Процедура - Загрузить файл завершение +// +// Параметры: +// Адрес - Строка - Адрес файла во временном хранилище +// ВыбранноеИмяФайла - Строка - Начальное полное имя файла +// ДополнительныеПараметры - Структура - Параметры необходимые для корректной загрузки файла +// +Процедура ЗагрузитьФайлЗавершение(Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + + ИмяФайла = Прав(ВыбранноеИмяФайла, СтрДлина(ВыбранноеИмяФайла) - СтрНайти(ВыбранноеИмяФайла, "\", НаправлениеПоиска.СКонца)); + + Если Не Адрес = "" Тогда + __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ФормированиеТаблицы(Адрес, ИмяФайла, ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ No newline at end of file diff --git a/src/Configuration.xml b/src/Configuration.xml index 6510147f..5a7f62c2 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -232,11 +232,11 @@ Managed NotAutoFree - DontUse + UseWithWarnings DontUse - Taxi + TaxiEnableVersion8_2 DontUse - Version8_3_14 + Version8_3_18 @@ -249,6 +249,7 @@ __ПредопределенныеЗначения __СоответствиеОбъектовИБ __УправлениеИнтеграциями + __ЗагрузкаИзТабличногоДокумента __ПодсистемаУправлениеИнтеграциями __Реквизит __Реквизиты @@ -269,11 +270,14 @@ __XMLEditor __ВспомогательныйМодульНеПереносить __ВспомогательныйМодульНеПереноситьКлиент + __ВспомогательныйМодульНеПереноситьКлиентСервер __ДокументыОбработкаЗаполнения __ДокументыОбработкаПроведения __ДокументыПередЗаписью __ДокументыПриЗаписи __ДокументыПриКопировании + __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера + __ЗагрузкаФайлаЧерезТабличныйДокументКлиент __ИнтеграцииСервер __КоннекторHTTP __МетодыРегламентныхЗаданийСервер @@ -298,7 +302,6 @@ __СправочникиПриКопировании __СтроковыеФункцииКлиентСервер __ТипСоответствияОбъектовИБПереопределяемый - __ВспомогательныйМодульНеПереноситьКлиентСервер __ДокументыОбработкаЗаполнения __ДокументыОбработкаПроведения __ДокументыПередЗаписью diff --git "a/src/Subsystems/__\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/Subsystems/__\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" new file mode 100644 index 00000000..20058b50 --- /dev/null +++ "b/src/Subsystems/__\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" @@ -0,0 +1,25 @@ + + + + + __ЗагрузкаИзТабличногоДокумента + + + ru + Загрузка из табличного документа + + + + true + false + false + + + + CommonModule.__ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера + CommonModule.__ЗагрузкаФайлаЧерезТабличныйДокументКлиент + + + + + \ No newline at end of file From c46792aca8149e1ebc24924d21b3a962d29b222e Mon Sep 17 00:00:00 2001 From: Ivan Smirnov Date: Wed, 10 Apr 2024 14:25:33 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=92=D1=8B=D0=B7=D0=BE=D0=B2=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=B0=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC,=20=D0=B2=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\203\320\274\320\265\320\275\321\202.md" | 29 +++++ .../Ext/Module.bsl" | 105 +++++++++--------- .../Ext/Module.bsl" | 84 ++++++-------- 3 files changed, 116 insertions(+), 102 deletions(-) create mode 100644 "docs/\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.md" diff --git "a/docs/\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.md" "b/docs/\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.md" new file mode 100644 index 00000000..d8e1edf8 --- /dev/null +++ "b/docs/\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.md" @@ -0,0 +1,29 @@ +# Подсистема загрузки файлов Excel через табличный документ + +Пример вызова на форме + +```1C (BSL) +&НаКлиенте +Асинх Процедура ЗагрузитьXLS(Команда) + + СтруктураКолонок = Новый Структура; + СтруктураКолонок.Вставить("Спр2" , "СправочникСсылка.Спр2"); + СтруктураКолонок.Вставить("Перечисление1" , "ПеречислениеСсылка.Перечисление1"); + СтруктураКолонок.Вставить("ЛюбоеИмя" , ""); + СтруктураКолонок.Вставить("Док1" , "ДокументСсылка.Док1"); + СтруктураКолонок.Вставить("Спр1" , "СправочникСсылка.Спр1"); + + ИД = Ждать __ЗагрузкаФайлаЧерезТабличныйДокументКлиент.ЗагрузитьИзXLS(СтруктураКолонок, , 2); + + Если ЗначениеЗаполнено(ИД) Тогда + ЗагрузкаНаСервере(ИД); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузкаНаСервере(ИД) + ТЗ = ПолучитьИзВременногоХранилища(ИД); +КонецПроцедуры + +``` diff --git "a/src/CommonModules/__\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/CommonModules/__\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 dffe234b..e23d2cac 100644 --- "a/src/CommonModules/__\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/CommonModules/__\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" @@ -1,49 +1,48 @@ -//MIT License +// MIT License -//Copyright (c) 2024 Anton Tsitavets +// Copyright (c) 2024 Anton Tsitavets -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: -//The above copyright notice and this permission notice shall be included in all -//copies or substantial portions of the Software. +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -//SOFTWARE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. #Область ПрограммныйИнтерфейс // Процедура - Формирование таблицы // // Параметры: -// Адрес - Строка - Адрес файла во временном хранилище -// ИмяФайла - Строка - Начальное полное имя файла -// Параметры - Структура - Параметры загрузки +// АдресВХранилище - Строка - Адрес файла во временном хранилище +// Расширение - Строка - Расширение файла (xls, xlsx) +// Параметры - Структура - Параметры загрузки // -Процедура ФормированиеТаблицы(Адрес, ИмяФайла, Параметры) Экспорт +Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, Параметры) Экспорт Макет = Параметры.Макет; - АдресХран = Параметры.АдресХр; + АдресПомещения = Параметры.АдресПомещения; НазваниеЛиста = Параметры.НазваниеЛиста; НомерСтроки = Параметры.НомерПервойСтроки; - Данные = ПолучитьИзВременногоХранилища(Адрес); - ФайлДанных = КаталогВременныхФайлов() - + СтрЗаменить(Формат(ТекущаяДата(), "ДЛФ=T"), ":", "") - + ИмяФайла; - Данные.Записать(ФайлДанных); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище); + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); + ДвоичныеДанные.Записать(ИмяВременногоФайла); + ТабДок = Новый ТабличныйДокумент; + ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); - ТабДок.Прочитать(ФайлДанных,СпособЧтенияЗначенийТабличногоДокумента.Текст); Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); ПервыйЛист = ТабДок.Области[0].Имя; @@ -59,15 +58,14 @@ ТабДок.УдалитьОбласть(ТабДок.Область("R1:R" + Строка(НомерСтроки - 1)), ТипСмещенияТабличногоДокумента.ПоВертикали); КонецЕсли; - ТабДок.ВставитьОбласть( - ТабДок.Область("R1") - ,ТабДок.Область("R1") - ,ТипСмещенияТабличногоДокумента.ПоГоризонтали); + ТабДок.ВставитьОбласть(ТабДок.Область("R1"), + ТабДок.Область("R1"), + ТипСмещенияТабличногоДокумента.ПоГоризонтали); Табдок.Область("R1").Очистить(Истина, Истина, Истина); Счетчик = 0; - Для каждого Колонка Из Макет Цикл + Для Каждого Колонка Из Макет Цикл Счетчик = Счетчик + 1; Если Не ЗначениеЗаполнено(Колонка.Значение) Тогда Продолжить; @@ -84,17 +82,13 @@ ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число")); - Порядок = 1; - ПоследняяСтатья = 0; - КоллекцияОтборов = Новый ТаблицаЗначений; КоллекцияОтборов.Колонки.Добавить("ТипДанных"); КоллекцияОтборов.Колонки.Добавить("НомерСтрокиДочерней"); КоллекцияОтборов.Колонки.Добавить("МассивДанных"); КоллекцияОтборов.Колонки.Добавить("НазваниеКолонки"); - ВременнаяТЗ = Новый ТаблицаЗначений; - Н = ТЗ.Количество() - 1; + Н = ТЗ.Количество() - 1; Пока НЕ Н < 0 Цикл @@ -133,7 +127,7 @@ Если СтрНайти(Колонка.Значение, "Ссылка") <> 0 И СтрНайти(Колонка.Значение, "Перечисление") = 0 Тогда - ТЗ.Колонки.Добавить(Колонка.Ключ + "КодЧислом", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15))); + ТЗ.Колонки.Добавить(Колонка.Ключ + "КодЧислом", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15))); ВставкаВТ = ВставкаВТ + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом КАК " + Колонка.Ключ + "КодЧислом," + Символы.ПС; МассивИменСсылочных.Добавить(Колонка.Ключ); @@ -158,18 +152,18 @@ | И (ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + РеквизитСравнения + Символы.ПС; Если СтрНайти(РазбивкаТипа[1], "Номенклатура") > 0 Тогда - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Артикул" + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС - ИначеЕсли СтрНайти(Колонка.Значение, "Справочник") > 0 - И Не СтрНайти(Колонка.Значение, "Организации") > 0 Тогда - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; - ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС + ВставкаИсточники = ВставкаИсточники + " ИЛИ " + + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Артикул" + Символы.ПС; + ВставкаИсточники = ВставкаИсточники + " ИЛИ " + + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + ВставкаИсточники = ВставкаИсточники + " ИЛИ " + + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + ИначеЕсли СтрНайти(Колонка.Значение, "Справочник") > 0 + И Не СтрНайти(Колонка.Значение, "Организации") > 0 Тогда + ВставкаИсточники = ВставкаИсточники + " ИЛИ " + + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + ВставкаИсточники = ВставкаИсточники + " ИЛИ " + + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; КонецЕсли; ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "Служебный," + Символы.ПС; @@ -181,7 +175,7 @@ СоответствиеПеречислений.Вставить(Колонка.Ключ, Колонка.Значение); ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + Колонка.Ключ + " КАК", "." + КолонкаПеречисления.Имя + " КАК"); ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС; - ИначеЕсли Не СтрНайти(Колонка.Ключ, "НеОбрабатывать") > 0 Тогда + ИначеЕсли Не СтрНайти(Колонка.Ключ, "НеОбрабатывать") > 0 Тогда ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС; КонецЕсли; @@ -192,6 +186,7 @@ ОТЧ = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15)); Для Каждого СтрокаТаблицы Из ТЗ Цикл + Для Каждого ИмяМассива Из МассивИменСсылочных Цикл СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОТЧ.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]); КонецЦикла; @@ -211,7 +206,7 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ + "ВЫБРАТЬ | #ВставкаВТ |ПОМЕСТИТЬ ВходнаяТаблица |ИЗ @@ -226,7 +221,7 @@ | ВходнаяТаблица КАК ВходнаяТаблица | #ВставкаИсточники | - | УПОРЯДОЧИТЬ ПО + |УПОРЯДОЧИТЬ ПО | ВходнаяТаблица.ПорядковыйНомер"; Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ); @@ -237,7 +232,7 @@ Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ); РезультатЗапроса = Запрос.Выполнить(); - ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресХран); + ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресПомещения); КонецПроцедуры diff --git "a/src/CommonModules/__\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/CommonModules/__\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 cf1eecae..a3992afa 100644 --- "a/src/CommonModules/__\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/CommonModules/__\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" @@ -1,24 +1,24 @@ -//MIT License +// MIT License -//Copyright (c) 2024 Anton Tsitavets +// Copyright (c) 2024 Anton Tsitavets -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: -//The above copyright notice and this permission notice shall be included in all -//copies or substantial portions of the Software. +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -//SOFTWARE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. #Область ПрограммныйИнтерфейс @@ -32,43 +32,33 @@ // Возвращаемое значение: // - Строка - Адрес файла во временном хранилище // -Функция ЗагрузитьИзXLS(СоответствиеКолонок, НазваниеЛиста = "", НомерПервойСтроки = 1) Экспорт +Асинх Функция ЗагрузитьИзXLS(СоответствиеКолонок, НазваниеЛиста = "", НомерПервойСтроки = 1) Экспорт - ИД = __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(СоответствиеКолонок); + // ++ Обход ошибки отстутствия модуля БСП, не переносить + ОбщегоНазначенияКлиент = Неопределено; + // -- Обход ошибки отстутствия модуля БСП, не переносить - ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ДиалогВыбораФайла.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; - ДиалогВыбораФайла.Заголовок = "Выберите файл"; - ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь; - ДиалогВыбораФайла.МножественныйВыбор = Ложь; - ДиалогВыбораФайла.ИндексФильтра = 0; + АдресПомещения = __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(СоответствиеКолонок); - Параметры = Новый Структура("Макет, АдресХр, НазваниеЛиста, НомерПервойСтроки", СоответствиеКолонок, ИД, НазваниеЛиста, НомерПервойСтроки); - - Если ДиалогВыбораФайла.Выбрать() Тогда - ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогВыбораФайла.ПолноеИмяФайла), ИД); - ЗагрузитьФайлЗавершение(ИД, ДиалогВыбораФайла.ПолноеИмяФайла, Параметры); - КонецЕсли; - - Возврат ИД; + Параметры = Новый Структура("Макет, АдресПомещения, НазваниеЛиста, НомерПервойСтроки", СоответствиеКолонок, АдресПомещения, НазваниеЛиста, НомерПервойСтроки); -КонецФункции - -// Процедура - Загрузить файл завершение -// -// Параметры: -// Адрес - Строка - Адрес файла во временном хранилище -// ВыбранноеИмяФайла - Строка - Начальное полное имя файла -// ДополнительныеПараметры - Структура - Параметры необходимые для корректной загрузки файла -// -Процедура ЗагрузитьФайлЗавершение(Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов; + ПараметрыДиалога.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; + ПараметрыДиалога.МножественныйВыбор = Ложь; + ПараметрыДиалога.ИндексФильтра = 0; + ПараметрыДиалога.Заголовок = "Выберите файл для загрузки"; - ИмяФайла = Прав(ВыбранноеИмяФайла, СтрДлина(ВыбранноеИмяФайла) - СтрНайти(ВыбранноеИмяФайла, "\", НаправлениеПоиска.СКонца)); + ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх( , , , ПараметрыДиалога); - Если Не Адрес = "" Тогда - __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ФормированиеТаблицы(Адрес, ИмяФайла, ДополнительныеПараметры); + Если ТипЗнч(ОписаниеФайла) = Тип("ОписаниеПомещенногоФайла") И Не ОписаниеФайла.ПомещениеФайлаОтменено Тогда + __ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ФормированиеТаблицы(ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение, Параметры); + Иначе + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Помещение файла отменено'")); + АдресПомещения = Неопределено; КонецЕсли; -КонецПроцедуры + Возврат АдресПомещения; + +КонецФункции #КонецОбласти \ No newline at end of file From 46fa164bbbd186859307baf480ac5f0eaa58726d Mon Sep 17 00:00:00 2001 From: Ivan Smirnov Date: Wed, 10 Apr 2024 14:58:03 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Ext/Module.bsl" | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git "a/src/CommonModules/__\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/CommonModules/__\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 e23d2cac..5bbaa7f6 100644 --- "a/src/CommonModules/__\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/CommonModules/__\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" @@ -43,6 +43,12 @@ ТабДок = Новый ТабличныйДокумент; ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); + Попытка + УдалитьФайлы(ИмяВременногоФайла); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка файла через табличный документ.Удаление временного файла'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); ПервыйЛист = ТабДок.Области[0].Имя; @@ -135,7 +141,7 @@ ВхождениеИсточника = ХранилищеИсточников.Получить(РазбивкаТипа[1]); ХранилищеИсточников.Вставить(РазбивкаТипа[1], ?(ВхождениеИсточника = Неопределено, 1, ВхождениеИсточника + 1)); - Иттерация = ?(ХранилищеИсточников.Получить(РазбивкаТипа[1]) = 0, "", Строка(ХранилищеИсточников.Получить(РазбивкаТипа[1]))); + Итерация = ?(ХранилищеИсточников.Получить(РазбивкаТипа[1]) = 0, "", Строка(ХранилищеИсточников.Получить(РазбивкаТипа[1]))); Если РазбивкаТипа[0] = "Документ" Тогда РеквизитСравнения = "Номер"; @@ -143,27 +149,27 @@ РеквизитСравнения = "Наименование"; КонецЕсли; - ВставкаСсылочные = ВставкаСсылочные + РазбивкаТипа[1] + Иттерация + ".Ссылка КАК " + Колонка.Ключ + "," + Символы.ПС; + ВставкаСсылочные = ВставкаСсылочные + РазбивкаТипа[1] + Итерация + ".Ссылка КАК " + Колонка.Ключ + "," + Символы.ПС; Если Не СтрНайти(ВставкаИсточники, " " + РазбивкаТипа[1] + " ") > 0 Тогда ВставкаИсточники = ВставкаИсточники + " - | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(Колонка.Значение, "Ссылка", "") + " КАК " + РазбивкаТипа[1] + Иттерация + " + | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(Колонка.Значение, "Ссылка", "") + " КАК " + РазбивкаТипа[1] + Итерация + " | ПО " + "ВходнаяТаблица." + Колонка.Ключ + " <> """" И " + "ВходнаяТаблица." + Колонка.Ключ + " <> 0" + " - | И (ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + РеквизитСравнения + Символы.ПС; + | И (ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + РеквизитСравнения + Символы.ПС; Если СтрНайти(РазбивкаТипа[1], "Номенклатура") > 0 Тогда ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Артикул" + Символы.ПС; + + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Артикул" + Символы.ПС; ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; ИначеЕсли СтрНайти(Колонка.Значение, "Справочник") > 0 И Не СтрНайти(Колонка.Значение, "Организации") > 0 Тогда ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; ВставкаИсточники = ВставкаИсточники + " ИЛИ " - + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Иттерация + "." + "Код" + Символы.ПС; + + "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС; КонецЕсли; ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "Служебный," + Символы.ПС;