From 622c911e7e200d06fe26295c1c8ad617aa9f6079 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 18 Nov 2024 11:09:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3,=20=D0=B2=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=20"?= =?UTF-8?q?=D0=92=D0=98=D0=A0=D0=A2"=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B8?= =?UTF-8?q?=D1=80=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Ext/Module.bsl" | 38 +- .../Ext/Module.bsl" | 50 +- .../Ext/Module.bsl" | 464 +++++++++++++++--- 3 files changed, 446 insertions(+), 106 deletions(-) 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 9bd133e6..e7b162dd 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,23 +27,18 @@ // Параметры: // АдресВХранилище - Строка - Адрес файла во временном хранилище // Расширение - Строка - Расширение файла (xls, xlsx) -// Параметры - Структура - структура параметров загрузки Excel-файла -// см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент.ИнициализироватьСтруктуруПередачиПараметровНаСервер +// ПараметрыЧтения - Структура - структура параметров загрузки Excel-файла +// см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла // -Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, Параметры) Экспорт +Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, ПараметрыЧтения) Экспорт - ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета); - - ПараметрыЧтения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла(); - ПараметрыЧтения.НазваниеЛиста = Параметры.НазваниеЛиста; - ПараметрыЧтения.НомерСтроки = Параметры.НомерПервойСтроки; - ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию; + ТаблицаСвойств = ПолучитьИзВременногоХранилища(ПараметрыЧтения.АдресМакета); ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер .КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений( АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения); - ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения); + ПоместитьВоВременноеХранилище(ТаблицаДанных, ПараметрыЧтения.АдресПомещения); КонецПроцедуры @@ -78,19 +73,18 @@ // Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт - СвойстваКолонок = Новый ТаблицаЗначений; - ДлинаСтроки = 150; - СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); - СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); - СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); - СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); - СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); - СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); - // BSLLS:MagicNumber-off - СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3)); - // BSLLS:MagicNumber-on + Возврат пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ИнициализироватьТаблицуСоСвойствамиКолонок(); + +КонецФункции + +// Получить параметры чтения файла +// +// Возвращаемое значение: +// Структура - см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла +// +Функция ПолучитьПараметрыЧтенияФайла() Экспорт - Возврат СвойстваКолонок; + Возврат пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла(); КонецФункции 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 b5da4cba..629055c3 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,34 +22,41 @@ #Область ПрограммныйИнтерфейс +// Инициализировать структуру параметров чтения +// +// Возвращаемое значение: +// Структура - см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла +// +Функция ИнициализироватьСтруктуруПараметровЧтения() Экспорт + + СтруктураПараметров = пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПолучитьПараметрыЧтенияФайла(); + СтруктураПараметров.Вставить("АдресМакета" , ""); + СтруктураПараметров.Вставить("АдресПомещения" , ""); + + Возврат СтруктураПараметров; + +КонецФункции + // Загружает файл XLS, парсит его и помещает результат в таблицу значений, которая передается во временное хранилище // // Параметры: -// АдресСоответствияКолонок - Строка - описание колонок загружаемого файла в таблице значений, -// помещенное во временное хранилище на Сервере. -// см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ИнициализироватьТаблицуСоСвойствамиКолонок -// НазваниеЛиста - Строка - Имя загружаемого листа (по-умолчанию не заполнено) -// НомерПервойСтроки - Число - Номер строки с которой начинается загрузка данных (по-умолчанию 1) -// СопоставлениеПоНаименованию - Булево - если Истина, то колонки макета сопоставляются с табличным документом по -// наименованию; если Ложь, то сопоставляются в последовательности колонок макета, а наименования игнорируются. +// АдресСоответствияКолонок - Строка - описание колонок загружаемого файла в таблице значений, +// помещенное во временное хранилище на Сервере. +// см. пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ИнициализироватьТаблицуСоСвойствамиКолонок +// ПараметрыЧтения - Структура - см. ИнициализироватьСтруктуруПараметровЧтения // // Возвращаемое значение: // Строка - Адрес файла во временном хранилище // -Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок,НазваниеЛиста = "", - НомерПервойСтроки = 1, СопоставлениеПоНаименованию = Ложь) Экспорт +Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок, ПараметрыЧтения) Экспорт АдресПомещения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ПоместитьЗаглушку(АдресСоответствияКолонок); - Параметры = ИнициализироватьСтруктуруПередачиПараметровНаСервер(); - Параметры.АдресМакета = АдресСоответствияКолонок; - Параметры.АдресПомещения = АдресПомещения; - Параметры.НазваниеЛиста = НазваниеЛиста; - Параметры.НомерПервойСтроки = НомерПервойСтроки; - Параметры.ПоНаименованию = СопоставлениеПоНаименованию; + ПараметрыЧтения.АдресМакета = АдресСоответствияКолонок; + ПараметрыЧтения.АдресПомещения = АдресПомещения; ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов; - ПараметрыДиалога.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; + ПараметрыДиалога.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|CSV-файл (*.csv)|*.csv"; ПараметрыДиалога.МножественныйВыбор = Ложь; ПараметрыДиалога.ИндексФильтра = 0; ПараметрыДиалога.Заголовок = "Выберите файл для загрузки"; @@ -58,7 +65,7 @@ Если ТипЗнч(ОписаниеФайла) = Тип("ОписаниеПомещенногоФайла") И Не ОписаниеФайла.ПомещениеФайлаОтменено Тогда пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера.ФормированиеТаблицы( - ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение, Параметры); + ОписаниеФайла.Адрес, ОписаниеФайла.СсылкаНаФайл.Расширение, ПараметрыЧтения); Иначе пбп_ОбщегоНазначенияСлужебныйКлиент.СообщитьПользователю(НСтр("ru = 'Помещение файла отменено'")); АдресПомещения = Неопределено; @@ -72,13 +79,6 @@ #Область СлужебныеПроцедурыИФункции -Функция ИнициализироватьСтруктуруПередачиПараметровНаСервер() - - СтруктураПараметров = Новый Структура( - "АдресМакета, АдресПомещения, НазваниеЛиста, НомерПервойСтроки, ПоНаименованию"); - - Возврат СтруктураПараметров; - -КонецФункции + #КонецОбласти // СлужебныеПроцедурыИФункции \ 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" index 505017bf..84a1ae90 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\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" @@ -20,12 +20,65 @@ #Область ПрограммныйИнтерфейс +// Инициализирует таблицу со свойствами колонок загружаемого файла +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица готовая для заполнения данных колонок +// +Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт + + СвойстваКолонок = Новый ТаблицаЗначений; + ДлинаСтроки = 150; + СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("Группа" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); + // BSLLS:MagicNumber-off + СвойстваКолонок.Колонки.Добавить("ОператорУсловия" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(4)); + СвойстваКолонок.Колонки.Добавить("ФункцияПреобразования", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(300)); + СвойстваКолонок.Колонки.Добавить("ФорматДаты" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(300)); + // BSLLS:MagicNumber-on + + Возврат СвойстваКолонок; + +КонецФункции + +// Инициализирует таблицу со свойствами колонок загружаемого CSV-файла. +// В отличие от ИнициализироватьТаблицуСоСвойствамиКолонок добавляются две колонки: +// - Начало - Число - порядковый номер символа, с которой начинается значение колонки строки файла; +// - Длина - Число - длина значения от начала в строке файла +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица готовая для заполнения данных колонок +// +Функция ИнициализироватьТаблицуСоСвойствамиCSV() Экспорт + + ТаблицаСвойств = ИнициализироватьТаблицуСоСвойствамиКолонок(); + // BSLLS:MagicNumber-off + ОписаниеЧислаНачала = пбп_ОбщегоНазначенияСервер.ОписаниеТипаЧисло(5, 0, ДопустимыйЗнак.Неотрицательный); + ОписаниеЧислаДлина = пбп_ОбщегоНазначенияСервер.ОписаниеТипаЧисло(5, 0, ДопустимыйЗнак.Неотрицательный); + // BSLLS:MagicNumber-on + ТаблицаСвойств.Колонки.Добавить("Начало", ОписаниеЧислаНачала); + ТаблицаСвойств.Колонки.Добавить("Длина", ОписаниеЧислаДлина); + + Возврат ТаблицаСвойств; + +КонецФункции + // Получить параметры чтения файла -// - НазваниеЛиста - Строка - наименование листа, с которого необходимо выполнить загрузку данных -// - НомерСтроки - Число - номер первой строки листа, с которой начинается парсинг данных -// - СопоставлениеПоНаименованию - Булево - если Истина, то колонки макета сопоставляются с табличным документом по +// +// - НазваниеЛиста - Строка - наименование листа, с которого необходимо выполнить загрузку данных +// - НомерСтроки - Число - номер первой строки листа, с которой начинается парсинг данных +// - СопоставлениеПоНаименованию - Булево - если Истина, то колонки макета сопоставляются с табличным документом по // наименованию; если Ложь, то сопоставляются в последовательности колонок макета, а наименования игнорируются. -// - КонвертироватьДаты - Булево - конвертировать значения с типом дата из строки в дату +// - КонвертироватьДаты - Булево - конвертировать значения с типом дата из строки в дату +// - ЗначениеИстина - Строка - строковое значение, при котором значение булево будет Истина +// - ОставитьСтроковыеЗначения - Булево - если истина, то оставляет колонки с исходными строковыми значениями +// конвертируемых типов: Булево, Число, Дата +// - ИскатьПомеченныеНаУдаление - Булево - если истина, то при поиске ссылок игнорирует пометку на удаление // // Возвращаемое значение: // Структура - параметры чтения @@ -33,10 +86,14 @@ Функция ПолучитьПараметрыЧтенияФайла() Экспорт ПараметрыЧтения = Новый Структура; - ПараметрыЧтения.Вставить("НазваниеЛиста", ""); - ПараметрыЧтения.Вставить("НомерСтроки", 0); - ПараметрыЧтения.Вставить("СопоставлениеПоНаименованию", Ложь); - ПараметрыЧтения.Вставить("КонвертироватьДаты", Истина); + ПараметрыЧтения.Вставить("НазваниеЛиста" , ""); + ПараметрыЧтения.Вставить("НомерСтроки" , 0); + ПараметрыЧтения.Вставить("СопоставлениеПоНаименованию" , Ложь); + ПараметрыЧтения.Вставить("КонвертироватьДаты" , Истина); + ПараметрыЧтения.Вставить("ВыдаватьОшибкуПриОтсутствииЛиста" , Ложь); + ПараметрыЧтения.Вставить("ЗначениеИстина" , ""); + ПараметрыЧтения.Вставить("ОставитьСтроковыеЗначения" , Ложь); + ПараметрыЧтения.Вставить("ИскатьПомеченныеНаУдаление" , Истина); Возврат ПараметрыЧтения; @@ -51,7 +108,7 @@ // ПараметрыЧтения - Структура - см. ПолучитьПараметрыЧтенияФайла // // Возвращаемое значение: -// ТаблицаЗначений - таблица с данными файла +// Строка, ТаблицаЗначений - таблица с данными файла или сообщение об ошибке // Функция КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений( АдресВХранилище, Расширение, Макет, ПараметрыЧтения) Экспорт @@ -60,6 +117,10 @@ НомерСтроки = ПараметрыЧтения.НомерСтроки; СопоставлениеПоНаименованию = ПараметрыЧтения.СопоставлениеПоНаименованию; КонвертироватьДаты = ПараметрыЧтения.КонвертироватьДаты; + ВыдаватьОшибку = ПараметрыЧтения.ВыдаватьОшибкуПриОтсутствииЛиста; + ЗначениеИстина = ПараметрыЧтения.ЗначениеИстина; + ОставитьСтроковые = ПараметрыЧтения.ОставитьСтроковыеЗначения; + ИскатьПомеченныеНаУдаление = ПараметрыЧтения.ИскатьПомеченныеНаУдаление; ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище); ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); @@ -81,6 +142,11 @@ Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); + Если ВыдаватьОшибку И Лист = Неопределено Тогда + СообщениеОбОшибке = НСтр("ru = 'Лист с указанным именем " + НазваниеЛиста + " не найден';"); + Возврат СообщениеОбОшибке; + КонецЕсли; + ПервыйЛист = ТабДок.Области[0].Имя; Для Каждого ЛистДок Из ТабДок.Области Цикл Если ЛистДок.Верх = 1 Тогда @@ -92,6 +158,113 @@ ТЗ = ПолучитьПромежуточнуюТаблицуЗначенийИзТабличногоДокумента( ТабДок, НомерСтроки, Макет, СопоставлениеПоНаименованию); + ГотоваяТаблица = ПреобразоватьСтроковыеЗначенияПоТипамСвойств(ТЗ, Макет, + КонвертироватьДаты, ЗначениеИстина, ОставитьСтроковые, ИскатьПомеченныеНаУдаление); + + Возврат ГотоваяТаблица; + +КонецФункции + +// Читает CSV-файл и выводит их в таблицу значений, заполненной согласно структуре макета +// +// Параметры: +// ПутьКФайлу - Строка - путь к csv-файлу во временном хранилище +// СтруктураМакета - ТаблицаЗначений - в таблице указано имя колонок, их тип и поле поиска ссылочного типа +// Кодировка - Строка - кодировка текста файла +// Разделитель - Строка - разделитель значений +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с данными, прочитанными из CSV-файла +// +Функция ПолучитьПромежуточнуюТаблицуИзCSVФайла(ПутьКФайлу, СтруктураМакета, Кодировка = "UTF8", Разделитель = "") Экспорт + + СыраяТаблица = Новый ТаблицаЗначений; + Для Каждого КолонкаТаблицы Из СтруктураМакета Цикл + СыраяТаблица.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(300)); + КонецЦикла; + + ЗагружаемыйФайл = Новый ЧтениеТекста(ПутьКФайлу, Кодировка); + + НомерСтроки = 1; + ТекущаяСтрока = ЗагружаемыйФайл.ПрочитатьСтроку(); + Пока ТекущаяСтрока <> Неопределено Цикл + Если НомерСтроки < 2 Тогда // в первой заголовок + НомерСтроки = НомерСтроки + 1; + ТекущаяСтрока = ЗагружаемыйФайл.ПрочитатьСтроку(); + Продолжить; + КонецЕсли; + + НоваяСтрока = СыраяТаблица.Добавить(); + + Если Разделитель = "" Тогда + Для Каждого СвойстваКолонок Из СтруктураМакета Цикл + Если Не ЗначениеЗаполнено(СвойстваКолонок.Начало) Тогда + Продолжить; + КонецЕсли; + + ЗначениеКолонки = Сред(ТекущаяСтрока, СвойстваКолонок.Начало, СвойстваКолонок.Длина); + ЗначениеБезПробелов = СокрЛП(ЗначениеКолонки); + НоваяСтрока[СвойстваКолонок.ИмяКолонки] = ЗначениеБезПробелов; + КонецЦикла; + Иначе + Если Прав(ТекущаяСтрока, 1) = Разделитель Тогда + ТекущаяСтрокаБезОкончания = Сред(ТекущаяСтрока, 1, СтрДлина(ТекущаяСтрока) - 1); + Иначе + ТекущаяСтрокаБезОкончания = ТекущаяСтрока; + КонецЕсли; + + МассивКолонок = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ТекущаяСтрокаБезОкончания, Разделитель, Ложь, Истина); + // Количество разделителей должно быть равно количеству строк колонок макета, иначе строка не будет загружена + КоличествоКолонок = МассивКолонок.Количество(); + Если КоличествоКолонок = 0 Или КоличествоКолонок <> СтруктураМакета.Количество() Тогда + Продолжить; + КонецЕсли; + + Для Инкремент = 0 По СтруктураМакета.Количество() - 1 Цикл + СвойстваКолонок = СтруктураМакета[Инкремент]; + ЗначениеБезПробелов = СокрЛП(МассивКолонок[Инкремент]); + НоваяСтрока[СвойстваКолонок.ИмяКолонки] = ЗначениеБезПробелов; + КонецЦикла; + КонецЕсли; + + НомерСтроки = НомерСтроки + 1; + ТекущаяСтрока = ЗагружаемыйФайл.ПрочитатьСтроку(); + КонецЦикла; + + ЗагружаемыйФайл.Закрыть(); + + Для Каждого КолонкаТаблицы Из СтруктураМакета Цикл + Если КолонкаТаблицы.ТипЗначения = "Дата" Тогда + СыраяТаблица.Колонки[КолонкаТаблицы.ИмяКолонки].Имя + = СыраяТаблица.Колонки[КолонкаТаблицы.ИмяКолонки].Имя + "Строкой"; + СыраяТаблица.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов("Дата")); + КонецЕсли; + КонецЦикла; + + СыраяТаблица.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число")); + + Возврат СыраяТаблица; + +КонецФункции + +// Преобразовывает строковые значения по типам свойств макета +// +// Параметры: +// ТЗ - ТаблицаЗначений - промежуточная таблица со значениями в типе строка +// Макет - ТаблицаЗначений - в таблице указано имя колонок, их тип и поле поиска ссылочного типа +// КонвертироватьДаты - Булево - конвертировать значения с типом дата из строки в дату +// ЗначениеИстина - Строка - строковое значение, при котором значение булево будет Истина +// ОставитьСтроковые - Булево - если истина, то оставляет колонки с исходными строковыми значениями +// конвертируемых типов: Булево, Число, Дата +// ИскатьПомеченныеНаУдаление - Булево - если истина, то при поиске ссылок игнорирует пометку на удаление +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с конвертированными данными +// +Функция ПреобразоватьСтроковыеЗначенияПоТипамСвойств(ТЗ, Макет, КонвертироватьДаты = Ложь, + ЗначениеИстина = "", ОставитьСтроковые = Ложь, ИскатьПомеченныеНаУдаление = Истина) Экспорт + КоллекцияОтборов = Новый ТаблицаЗначений; КоллекцияОтборов.Колонки.Добавить("ТипДанных"); КоллекцияОтборов.Колонки.Добавить("НомерСтрокиДочерней"); @@ -126,10 +299,14 @@ ХранилищеИсточников = Новый Соответствие; МассивИменСсылочных = Новый Массив; СтруктураИменКолонокДат = Новый Структура; + МассивИменКолонокЧисел = Новый Массив; + МассивИменКолонокБулево = Новый Массив; СоответствиеПеречислений = Новый Соответствие; + КолонкиСПреобразованием = Новый Структура; ДлинаЧисла = 15; - ОписаниеТипаЧисло15 = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(ДлинаЧисла)); + ЧислоСтрока = "Число"; + ОписаниеТипаЧисло15 = Новый ОписаниеТипов(ЧислоСтрока, , , Новый КвалификаторыЧисла(ДлинаЧисла)); ШаблонИмяКолонки = "ВходнаяТаблица.%1 КАК %1," + Символы.ПС; СтрокаНеОбрабатывать = "НеОбрабатывать"; СсылкаСтрока = "Ссылка"; @@ -170,8 +347,12 @@ + СтрокаТаблицы.ИмяКолонки + "," + Символы.ПС; КонецЕсли; - ОператорСравнения = ?(ПустаяСтрока(СтрокаТаблицы.ОператорСравнения), - "ИЛИ", СтрокаТаблицы.ОператорСравнения); + ОператорУсловия = ?(ПустаяСтрока(СтрокаТаблицы.ОператорУсловия), + "ИЛИ", СтрокаТаблицы.ОператорУсловия); + + Если ЗначениеЗаполнено(СтрокаТаблицы.ФункцияПреобразования) Тогда + КолонкиСПреобразованием.Вставить(СтрокаТаблицы.ИмяКолонки, СтрокаТаблицы.ФункцияПреобразования); + КонецЕсли; Если Не СтрНайти(ВставкаИсточники, " " + ИмяОбъекта + " ") > 0 И ЕстьПоляПоиска Тогда ВставкаУсловияСоединения = ""; @@ -184,9 +365,9 @@ // Возможно использование оператора И для сопоставления, но при его использовании // имена полей поиска должны равняться именам колонок обрабатываемой таблицы. Например: // Если в свойствах макета у колонки заполнен тип ДокументСсылка., ПолеПоиска1 = "Номер", - // а ПолеПоиска2 = "Дата" И ОператорСравнения = "И", тогда таблица построителя должна иметь + // а ПолеПоиска2 = "Дата" И ОператорУсловия = "И", тогда таблица построителя должна иметь // колонки "Номер", где лежит номер документа и "Дата", где лежит дата документа. - Если ОператорСравнения = "ИЛИ" Тогда + Если ВРег(ОператорУсловия) = "ИЛИ" Тогда ИмяКолонкиСравнения = СтрокаТаблицы.ИмяКолонки; Иначе ИмяКолонкиСравнения = РеквизитСравнения; @@ -194,17 +375,29 @@ ВставкаУсловияСоединения = ВставкаУсловияСоединения + ?(ПустаяСтрока(ВставкаУсловияСоединения), "", Символы.ПС + " - | " + ОператорСравнения + " ") + ВходнаяТаблицаСтрока + ИмяКолонкиСравнения + | " + ВРег(ОператорУсловия) + " ") + ВходнаяТаблицаСтрока + ИмяКолонкиСравнения + " = " + ИмяОбъекта + Итерация + "." + РеквизитСравнения; КонецЦикла; + Если Не ИскатьПомеченныеНаУдаление Тогда + УсловиеНаПомеченные = " + | И НЕ " + ИмяОбъекта + Итерация + ".ПометкаУдаления"; + КонецЕсли; + Если Не ПустаяСтрока(ВставкаУсловияСоединения) Тогда - ВставкаИсточники = ВставкаИсточники + " - | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(СтрокаТаблицы.ТипЗначения, СсылкаСтрока, "") - + " КАК " + ИмяОбъекта + Итерация + " - | ПО ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + " <> """" И " - + ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки + " <> 0 - | И (" + ВставкаУсловияСоединения + ")"; + Если ВРег(ОператорУсловия) = "И" Или ВРег(ОператорУсловия) = "ВИРТ" Тогда + ВставкаИсточники = ВставкаИсточники + " + | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(СтрокаТаблицы.ТипЗначения, СсылкаСтрока, "") + + " КАК " + ИмяОбъекта + Итерация + " + | ПО (" + ВставкаУсловияСоединения + ")" + УсловиеНаПомеченные; + Иначе + ВставкаИсточники = ВставкаИсточники + " + | ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(СтрокаТаблицы.ТипЗначения, СсылкаСтрока, "") + + " КАК " + ИмяОбъекта + Итерация + " + | ПО ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + " <> """" И " + + ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки + " <> 0 + | И (" + ВставкаУсловияСоединения + ")" + УсловиеНаПомеченные; + КонецЕсли; КонецЕсли; ВставкаБазовые = ВставкаБазовые + ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки @@ -219,9 +412,19 @@ ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); ИначеЕсли Не СтрНайти(СтрокаТаблицы.ИмяКолонки, СтрокаНеОбрабатывать) > 0 Тогда ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); - Если СтрНайти(СтрокаТаблицы.ТипЗначения, "Дата") <> 0 - И ТЗ.Колонки.Найти(СтрокаТаблицы.ИмяКолонки + "Строкой") <> Неопределено Тогда - СтруктураИменКолонокДат.Вставить(СтрокаТаблицы.ИмяКолонки, ""); + Если ТЗ.Колонки.Найти(СтрокаТаблицы.ИмяКолонки + "Строкой") <> Неопределено Тогда + Если ОставитьСтроковые Тогда + ВставкаВТ = ВставкаВТ + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки + "Строкой"); + ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки + "Строкой"); + КонецЕсли; + + Если СтрНайти(СтрокаТаблицы.ТипЗначения, "Дата") <> 0 Тогда + СтруктураИменКолонокДат.Вставить(СтрокаТаблицы.ИмяКолонки, СтрокаТаблицы.ФорматДаты); + ИначеЕсли СтрНайти(СтрокаТаблицы.ТипЗначения, ЧислоСтрока) <> 0 Тогда + МассивИменКолонокЧисел.Добавить(СтрокаТаблицы.ИмяКолонки); + ИначеЕсли СтрНайти(СтрокаТаблицы.ТипЗначения, "Булево") <> 0 Тогда + МассивИменКолонокБулево.Добавить(СтрокаТаблицы.ИмяКолонки); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -235,6 +438,9 @@ ПрисвоитьНомераФорматовКолонокДат(ТЗ, СтруктураИменКолонокДат); КонецЕсли; + ИмяСобытия = НСтр("ru = 'Загрузка файла через табличный документ'"); + КомментарийОшибки = "ru = 'Не удалось выполнить функцию преобразования %1 для колонки %2. Подробно: %3';"; + Для Каждого СтрокаТаблицы Из ТЗ Цикл Для Каждого ИмяМассива Из МассивИменСсылочных Цикл @@ -253,6 +459,20 @@ КонецЦикла; + Для Каждого КлючИЗначение Из КолонкиСПреобразованием Цикл + Попытка + Параметры = Новый Массив; + Параметры.Добавить(СтрокаТаблицы[КлючИЗначение.Ключ]); + СтрокаТаблицы[КлючИЗначение.Ключ] = пбп_ОбщегоНазначенияСервер.ВызватьФункциюКонфигурации( + КлючИЗначение.Значение, Параметры); + Исключение + СообщениеОбОшибке = СтрШаблон(КомментарийОшибки, КлючИЗначение.Значение, + КлючИЗначение.Ключ, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + пбп_ЖурналРегистрацииСлужебный.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия, + УровеньЖурналаРегистрации.Ошибка, , , НСтр(СообщениеОбОшибке)); + КонецПопытки; + КонецЦикла; + Если КонвертироватьДаты Тогда Для Каждого КлючИЗначение Из СтруктураИменКолонокДат Цикл СтрокаТаблицы[КлючИЗначение.Ключ] = ПреобразоватьДатуИзСтрокиПоФормату( @@ -260,6 +480,24 @@ КонецЦикла; КонецЕсли; + Для Каждого ИмяКолонкиЧисло Из МассивИменКолонокЧисел Цикл + Если ПустаяСтрока(СтрокаТаблицы[ИмяКолонкиЧисло + "Строкой"]) Тогда + СтрокаТаблицы[ИмяКолонкиЧисло] = 0; + Иначе + СтроковоеЗначение = СтрокаТаблицы[ИмяКолонкиЧисло + "Строкой"]; + СтрокаТаблицы[ИмяКолонкиЧисло] = ПреобразоватьЧислоИзСтроки(СтроковоеЗначение); + КонецЕсли; + КонецЦикла; + + Для Каждого ИмяКолонкиБулево Из МассивИменКолонокБулево Цикл + Если ПустаяСтрока(ЗначениеИстина) Тогда + СтрокаТаблицы[ИмяКолонкиБулево] = НСтр(СтрокаТаблицы[ИмяКолонкиБулево + "Строкой"]) = "да" + Или НСтр(СтрокаТаблицы[ИмяКолонкиБулево + "Строкой"]) = "истина"; + Иначе + СтрокаТаблицы[ИмяКолонкиБулево] = НСтр(СтрокаТаблицы[ИмяКолонкиБулево + "Строкой"]) = НСтр(ЗначениеИстина); + КонецЕсли; + КонецЦикла; + КонецЦикла; Запрос = Новый Запрос; @@ -359,16 +597,27 @@ ПЗ.Выполнить(); ТЗ = ПЗ.Результат.Выгрузить(); + ЧислоСтрока = "Число"; Если СопоставлениеПоНаименованию Тогда // Дополняем колонками из макета, если в ТД они отсутствовали Для Каждого СтрокаМакета Из Макет Цикл Если ТЗ.Колонки.Найти(СтрокаМакета.ИмяКолонки) = Неопределено Тогда ТЗ.Колонки.Добавить(СтрокаМакета.ИмяКолонки, Новый ОписаниеТипов(СтрокаМакета.ТипЗначения)); Иначе - // Для колонок с типом Дата необходимо преобразование + // Для колонок с типом Дата, Булево и Число необходимо преобразование Если СтрокаМакета.ТипЗначения = "Дата" Тогда + НовыйТип = Новый ОписаниеТипов("Дата"); + ИначеЕсли СтрокаМакета.ТипЗначения = "Булево" Тогда + НовыйТип = Новый ОписаниеТипов("Булево"); + ИначеЕсли СтрокаМакета.ТипЗначения = ЧислоСтрока Тогда + НовыйТип = Новый ОписаниеТипов(ЧислоСтрока); + Иначе + НовыйТип = Неопределено; + КонецЕсли; + + Если НовыйТип <> Неопределено Тогда ТЗ.Колонки[СтрокаМакета.ИмяКолонки].Имя = ТЗ.Колонки[СтрокаМакета.ИмяКолонки].Имя + "Строкой"; - ТЗ.Колонки.Добавить(СтрокаМакета.ИмяКолонки, Новый ОписаниеТипов("Дата")); + ТЗ.Колонки.Добавить(СтрокаМакета.ИмяКолонки, НовыйТип); КонецЕсли; КонецЕсли; КонецЦикла; @@ -390,7 +639,7 @@ КоличествоСтрок = КоличествоСтрок - 1; КонецЦикла; - ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число")); + ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов(ЧислоСтрока)); Возврат ТЗ; @@ -419,46 +668,111 @@ Счетчик = 1; КолонкиКУдалению = Новый Массив; - ТекстШапки = СокрЛП(ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст); - Пока Не ПустаяСтрока(ТекстШапки) Цикл - ИмяКолонки = ""; - // Сверяем наименование колонки ТД и наименование из макета - Для Каждого СтрокаТаблицы Из Макет Цикл - Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЗначения) Тогда - Продолжить; - КонецЕсли; - Если ПроверитьСоответствиеИменКолонок(ТекстШапки, СтрокаТаблицы.ИмяВТабДоке, СтрокаТаблицы.ИмяКолонки) Тогда - ИмяКолонки = СтрокаТаблицы.ИмяКолонки; - Прервать; - КонецЕсли; - КонецЦикла; - - // Подменяем имя для работы с построителем; если колонки нет, то готовим ее к удалению - Если Не ПустаяСтрока(ИмяКолонки) Тогда - ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст = ИмяКолонки; - Иначе - КолонкиКУдалению.Добавить(Счетчик); - КонецЕсли; - - Счетчик = Счетчик + 1; - ТекстШапки = СокрЛП(ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст); - КонецЦикла; + УдалитьСтрокиШапки = Новый Массив; + НомерСтроки = 0; + ШиринаТаблицы = ТабДок.ШиринаТаблицы; + + ОбойтиКолонкиДокументаПоНаименованиямРекурсивно(ТабДок, Макет, + ШиринаТаблицы, НомерСтроки, Счетчик, КолонкиКУдалению, УдалитьСтрокиШапки); + + // Удаляем лишние строки + Если УдалитьСтрокиШапки.Количество() Тогда + ОбластьКУдалению = ТабДок.Область("R" + УдалитьСтрокиШапки[0] + ":R" + + УдалитьСтрокиШапки[УдалитьСтрокиШапки.Количество() - 1]); + ТабДок.УдалитьОбласть(ОбластьКУдалению, ТипСмещенияТабличногоДокумента.ПоВертикали); + КонецЕсли; // Удаляем ненужные колонки КоличествоКолонокКУдалению = КолонкиКУдалению.Количество() - 1; Пока КоличествоКолонокКУдалению >= 0 Цикл НомерКолонки = КолонкиКУдалению[КоличествоКолонокКУдалению]; - ТабДок.УдалитьОбласть(ТабДок.Область("C" + Строка(НомерКолонки)), ТипСмещенияТабличногоДокумента.ПоГоризонтали); + ОбластьКУдалению = ТабДок.Область("C" + Строка(НомерКолонки)); + ТабДок.УдалитьОбласть(ОбластьКУдалению, ТипСмещенияТабличногоДокумента.ПоГоризонтали); КоличествоКолонокКУдалению = КоличествоКолонокКУдалению - 1; КонецЦикла; КонецПроцедуры +Процедура ОбойтиКолонкиДокументаПоНаименованиямРекурсивно(ТабДок, Макет, ШиринаТаблицы, + НомерСтроки, НомерКолонки, КолонкиКУдалению, УдалитьСтрокиШапки, ШиринаГруппы = 0) + + НомерСтроки = НомерСтроки + 1; + + ТекстШапки = СокрЛП(ТабДок.Область("R" + НомерСтроки + "C" + Строка(НомерКолонки)).Текст); + ТекущаяПроверкаШирины = ?(ШиринаГруппы = 0, ШиринаТаблицы, ШиринаГруппы); + + Пока НомерКолонки <= ТекущаяПроверкаШирины Цикл + Если ТекстШапки = "" Тогда + НомерКолонки = НомерКолонки + 1; + ТекстШапки = СокрЛП(ТабДок.Область("R" + НомерСтроки + "C" + Строка(НомерКолонки)).Текст); + Продолжить; + КонецЕсли; + + ИмяКолонки = ""; + + // Проверяем на группы колонок + ПоискПодчиненных = Макет.НайтиСтроки(Новый Структура("Группа", ТекстШапки)); + КоличествоПодчиненных = ПоискПодчиненных.Количество(); + Если КоличествоПодчиненных Тогда + ВременныйМакет = Макет.СкопироватьКолонки(); + Для Каждого НайденнаяСтрока Из ПоискПодчиненных Цикл + Если ВРег(НайденнаяСтрока.ОператорУсловия) = "И" + Или ВРег(НайденнаяСтрока.ОператорУсловия) = "ВИРТ" Тогда + КоличествоПодчиненных = КоличествоПодчиненных - 1; + Продолжить; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ВременныйМакет.Добавить(), НайденнаяСтрока); + КонецЦикла; + + НомерНовойСтроки = НомерСтроки + 1; + УдалитьСтрокиШапки.Добавить(НомерНовойСтроки); + + ОбойтиКолонкиДокументаПоНаименованиямРекурсивно(ТабДок, ВременныйМакет, ШиринаТаблицы, НомерСтроки, + НомерКолонки, КолонкиКУдалению, УдалитьСтрокиШапки, НомерКолонки + КоличествоПодчиненных - 1); + + // Возвращаем текст шапки на прошлую строку, если мы выходим из рекурсии + ТекстШапки = СокрЛП(ТабДок.Область("R" + НомерСтроки + "C" + Строка(НомерКолонки)).Текст); + Иначе + СверитьИмяКолонокДобавитьИмяВМакет(ТабДок, Макет, ТекстШапки, НомерСтроки, НомерКолонки, КолонкиКУдалению); + КонецЕсли; + + КонецЦикла; + + НомерСтроки = НомерСтроки - 1; + +КонецПроцедуры + +Процедура СверитьИмяКолонокДобавитьИмяВМакет(ТабДок, Макет, ТекстШапки, НомерСтроки, НомерКолонки, КолонкиКУдалению) + + // Сверяем наименование колонки ТД и наименование из макета + Для Каждого СтрокаТаблицы Из Макет Цикл + Если Не ЗначениеЗаполнено(СтрокаТаблицы.ТипЗначения) Тогда + Продолжить; + КонецЕсли; + Если ПроверитьСоответствиеИменКолонок(ТекстШапки, СтрокаТаблицы.ИмяВТабДоке, СтрокаТаблицы.ИмяКолонки) Тогда + ИмяКолонки = СтрокаТаблицы.ИмяКолонки; + Прервать; + КонецЕсли; + КонецЦикла; + + // Подменяем имя для работы с построителем; если колонки нет, то готовим ее к удалению + Если Не ПустаяСтрока(ИмяКолонки) Тогда + ТабДок.Область("R1" + "C" + Строка(НомерКолонки)).Текст = ИмяКолонки; + Иначе + КолонкиКУдалению.Добавить(НомерКолонки); + КонецЕсли; + + НомерКолонки = НомерКолонки + 1; + ТекстШапки = СокрЛП(ТабДок.Область("R" + НомерСтроки + "C" + Строка(НомерКолонки)).Текст); + +КонецПроцедуры + Функция ПроверитьСоответствиеИменКолонок(ТекстШапки, ИмяВТабДоке, ИмяКолонки) - Возврат (ЗначениеЗаполнено(ИмяВТабДоке) И ТекстШапки = ИмяВТабДоке) - Или (Не ЗначениеЗаполнено(ИмяВТабДоке) И ТекстШапки = ИмяКолонки); + Возврат (ЗначениеЗаполнено(ИмяВТабДоке) И НРег(ТекстШапки) = НРег(ИмяВТабДоке)) + Или (Не ЗначениеЗаполнено(ИмяВТабДоке) И НРег(ТекстШапки) = НРег(ИмяКолонки)); КонецФункции @@ -471,6 +785,10 @@ ПерваяСтрокаТаблицы = ТЗ[0]; Для Каждого КлючИЗначение Из СтруктураИменКолонокДат Цикл + Если ЗначениеЗаполнено(КлючИЗначение.Значение) Тогда + Продолжить; + КонецЕсли; + ЗначениеКолонки = ПерваяСтрокаТаблицы[КлючИЗначение.Ключ + "Строкой"]; Если ПустаяСтрока(ЗначениеКолонки) Тогда Продолжить; @@ -489,13 +807,14 @@ // Возвращаемое значение: // Строка - номер формата с разделителями "_". Первый разряд показывает какой разделитель используется // в представлении даты, второй разряд показывает положение дня, месяца и года по отношению друг к другу, третий разряд -// показывает представление времени в дате. Если номер формата "000" - преобразование происходит из функции XMLЗначение. +// показывает представление времени в дате. Если номер формата "0_0_0" - преобразование происходит из функции XMLЗначение. // Первый разряд принимает значения: // - 1 - разделитель "."; // - 2 - "/"; // - 3 - "-"; // - 4 - " "; // Второй разряд принимает значения: +// - 0 - месяц, день, год // - 1 - год идет первым, потом месяц и день; // - 2 - сначала день, потом месяц и год; // - 3 - сначала день, месяц СТРОКОЙ и год; @@ -611,8 +930,12 @@ // Функция ПреобразоватьДатуИзСтрокиПоФормату(ВхЗначение, НомерФормата) + Если Не ЗначениеЗаполнено(ВхЗначение) Тогда + Возврат Дата(1, 1, 1, 0, 0, 0); + КонецЕсли; + ПреобразованнаяДата = Неопределено; - Если НомерФормата = "000" Тогда + Если НомерФормата = "0_0_0" Тогда ПреобразованнаяДата = XMLЗначение(Тип("Дата"), ВхЗначение); Иначе РазрядыФормата = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(НомерФормата, "_"); @@ -666,7 +989,11 @@ МассивГодМесяцДата = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( ТолькоДата, РазделительРазрядов, Истина, Истина); - Если РазрядыФормата[1] = "1" Тогда + Если РазрядыФормата[1] = "0" Тогда + Год = МассивГодМесяцДата[2]; + Месяц = МассивГодМесяцДата[0]; + День = МассивГодМесяцДата[1]; + ИначеЕсли РазрядыФормата[1] = "1" Тогда Год = МассивГодМесяцДата[0]; Месяц = МассивГодМесяцДата[1]; День = МассивГодМесяцДата[2]; @@ -691,9 +1018,19 @@ День = "0" + День; КонецЕсли; - СтрокаДата = День + "." + Месяц + "." + Год; + Если ЗначениеЗаполнено(МинутыСекунды) Тогда + МассивСекМин = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(МинутыСекунды, ":", Истина, Истина); + + МинутыЧисло = Число(МассивСекМин[0]); + СекундыЧисло = Число(МассивСекМин[1]); + ЧасыЧисло = Часы; + Иначе + МинутыЧисло = 0; + СекундыЧисло = 0; + ЧасыЧисло = 0; + КонецЕсли; - ПреобразованнаяДата = Дата(СтрокаДата + " " + СтрокаВремя); + ПреобразованнаяДата = Дата(Год, Месяц, День, ЧасыЧисло, МинутыЧисло, СекундыЧисло); КонецЕсли; @@ -701,4 +1038,13 @@ КонецФункции +Функция ПреобразоватьЧислоИзСтроки(ВхЗначение) + + СтроковоеЗначение = СокрЛП(ВхЗначение); + СтроковоеЗначение = СтрЗаменить(ВхЗначение, ",", "."); + СтроковоеЗначение = СтрЗаменить(ВхЗначение, Символы.НПП, ""); + Возврат пбп_СтроковыеФункцииКлиентСервер.СтрокаВЧисло(СтроковоеЗначение); + +КонецФункции + #КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file