Files
SSL/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl
T
2020-12-03 22:59:00 +03:00

1823 lines
130 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2020, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныйПрограммныйИнтерфейс
// Сообщает все требуемые сведения о процедуре загрузки данных из файла для внешней обработки.
//
// Параметры:
// ИмяКоманды - Строка - имя команды (Идентификатор).
// СсылкаНаОбработку - ЛюбаяСсылка - ссылка на обработку.
// ПараметрыЗагрузки - Структура
// Возвращаемое значение
// Структура - содержит структуру со свойствами:
// * Представление - Строка - представление в списке вариантов загрузки.
// * ИмяМакетаСШаблоном - Строка - название макета со структурой данных(необязательный
// параметр, значение по умолчанию - "ЗагрузкаДанныхИзФайла").
// * ОбязательныеКолонкиМакета - Массив - содержит список обязательных полей для заполнения.
// * ЗаголовокКолонкиСопоставления - Строка - представление колонки сопоставления в шапке таблицы
// сопоставления данных(необязательный параметр, значение по
// умолчанию формируются - "Справочник: <синоним
// справочника>").
// * ИмяОбъекта - Строка - имя Объекта.
//
Процедура ПараметрыЗагрузкиИзФайлаВнешняяОбработка(ИмяКоманды, СсылкаНаОбработку, ПараметрыЗагрузки) Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
ВнешнийОбъект = МодульДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаОбработку);
ВнешнийОбъект.ОпределитьПараметрыЗагрузкиДанныхИзФайла(ИмяКоманды, ПараметрыЗагрузки);
ПараметрыЗагрузки.Вставить("Макет", ВнешнийОбъект.ПолучитьМакет(ПараметрыЗагрузки.ИмяМакетаСШаблоном));
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Сообщает все требуемые сведения о процедуре загрузки данных из файла в Табличную часть.
Функция ПараметрыЗагрузкиИзФайлаВТЧ(ИмяТабличнойЧасти, ДополнительныеПараметры)
ПараметрыПоУмолчанию= Новый Структура;
ПараметрыПоУмолчанию.Вставить("ОбязательныеКолонки", Новый Массив);
ПараметрыПоУмолчанию.Вставить("ИмяМакетаСШаблоном", "ЗагрузкаИзФайла");
ПараметрыПоУмолчанию.Вставить("ИмяТабличнойЧасти", ИмяТабличнойЧасти);
ПараметрыПоУмолчанию.Вставить("ТипДанныхКолонки", Новый Соответствие);
ПараметрыПоУмолчанию.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
Возврат ПараметрыПоУмолчанию;
КонецФункции
Процедура СоздатьСписокСправочниковДляЗагрузки(СписокСправочниковДляЗагрузки) Экспорт
ТипСтрока = Новый ОписаниеТипов("Строка");
ТипБулево = Новый ОписаниеТипов("Булево");
ИнформацияОСправочниках = Новый ТаблицаЗначений;
ИнформацияОСправочниках.Колонки.Добавить("ПолноеИмя", ТипСтрока);
ИнформацияОСправочниках.Колонки.Добавить("Представление", ТипСтрока);
ИнформацияОСправочниках.Колонки.Добавить("ПрикладнаяЗагрузка", ТипБулево);
Для каждого ОбъектМетаданныхДляВывода Из Метаданные.Справочники Цикл
Если НЕ СправочникСодержитРеквизитИсключение(ОбъектМетаданныхДляВывода) Тогда
Строка = ИнформацияОСправочниках.Добавить();
Строка.Представление = ОбъектМетаданныхДляВывода.Представление();
Строка.ПолноеИмя = ОбъектМетаданныхДляВывода.ПолноеИмя();
КонецЕсли;
КонецЦикла;
ИнтеграцияПодсистемБСП.ПриОпределенииСправочниковДляЗагрузкиДанных(ИнформацияОСправочниках);
ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных(ИнформацияОСправочниках);
ИнформацияОСправочниках.Колонки.Добавить("ИнформацияОТипеЗагрузки");
Для каждого ИнформацияОСправочнике Из ИнформацияОСправочниках Цикл
ИнформацияОТипеЗагрузки = Новый Структура;
Если ИнформацияОСправочнике.ПрикладнаяЗагрузка Тогда
ИнформацияОТипеЗагрузки.Вставить("Тип", "ПрикладнаяЗагрузка");
Иначе
ИнформацияОТипеЗагрузки.Вставить("Тип", "УниверсальнаяЗагрузка");
КонецЕсли;
ИнформацияОТипеЗагрузки.Вставить("ПолноеИмяОбъектаМетаданных", ИнформацияОСправочнике.ПолноеИмя);
ИнформацияОСправочнике.ИнформацияОТипеЗагрузки = ИнформацияОТипеЗагрузки;
КонецЦикла;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
Запрос = МодульДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам(Перечисления["ВидыДополнительныхОтчетовИОбработок"].ДополнительнаяОбработка,
Неопределено, Ложь, Перечисления["СпособыВызоваДополнительныхОбработок"].ЗагрузкаДанныхИзФайла);
ТаблицаКоманд = Запрос.Выполнить().Выгрузить(); // см. ДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам
Для Каждого СтрокаТаблицы Из ТаблицаКоманд Цикл
ИнформацияОТипеЗагрузки = Новый Структура("Тип", "ВнешняяЗагрузка");
ИнформацияОТипеЗагрузки.Вставить("ПолноеИмяОбъектаМетаданных", СтрокаТаблицы.Модификатор);
ИнформацияОТипеЗагрузки.Вставить("Ссылка", СтрокаТаблицы.Ссылка);
ИнформацияОТипеЗагрузки.Вставить("Идентификатор", СтрокаТаблицы.Идентификатор);
ИнформацияОТипеЗагрузки.Вставить("Представление", СтрокаТаблицы.Представление);
Строка = ИнформацияОСправочниках.Добавить();
Строка.ПолноеИмя = ОбъектМетаданныхДляВывода.ПолноеИмя();
Строка.ИнформацияОТипеЗагрузки = ИнформацияОТипеЗагрузки;
Строка.Представление = СтрокаТаблицы.Представление;
КонецЦикла;
КонецЕсли;
СписокСправочниковДляЗагрузки.Очистить();
Для каждого строка Из ИнформацияОСправочниках Цикл
СписокСправочниковДляЗагрузки.Добавить(Строка.ИнформацияОТипеЗагрузки, Строка.Представление);
КонецЦикла;
СписокСправочниковДляЗагрузки.СортироватьПоПредставлению();
КонецПроцедуры
Функция СправочникСодержитРеквизитИсключение(Справочник)
Для каждого Реквизит Из Справочник.ТабличныеЧасти Цикл
Если Реквизит.Имя <> "КонтактнаяИнформация"
И Реквизит.Имя <> "ДополнительныеРеквизиты"
И Реквизит.Имя <> "СертификатыШифрования" Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для каждого Реквизит Из Справочник.Реквизиты Цикл
Для каждого ТипРеквизита Из Реквизит.Тип.Типы() Цикл
Если ТипРеквизита = Тип("ХранилищеЗначения") Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если СтрНачинаетсяС(ВРег(Справочник.Имя), "УДАЛИТЬ") Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
#Область ПоискСсылок
// Описание
//
// Параметры:
// ШаблонСДанными - ТабличныйДокумент
// ИнформацияПоКолонкам - ТаблицаЗначений:
// * ИмяКолонки - Строка
// * Идентификатор - Строка
// * ПредставлениеКолонки - Строка
// * ТипКолонки - Произвольный
// * ОбязательнаДляЗаполнения - Булево
// * Позиция - Число
// * Группа - Строка
// * Видимость - Булево
// * Примечание - Строка
// * Ширина - Число
// ОписаниеТипов - ОписаниеТипов
//
Процедура УстановитьРежимВставкиИзБуфераОбмена(ШаблонСДанными, ИнформацияПоКолонкам, ОписаниеТипов) Экспорт
СоответствиеКолонок = Новый Соответствие;
ЗаголовокКолонки = "";
Разделитель = "";
ТипыОбъектовПоддерживающиеВводПоСтроке = ТипыОбъектовПоддерживающиеВводПоСтроке();
Для каждого Тип Из ОписаниеТипов.Типы() Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент
Если ОбъектМетаданных <> Неопределено Тогда
СтруктураОбъекта = РазложитьПолноеИмяОбъекта(ОбъектМетаданных.ПолноеИмя());
Если ТипыОбъектовПоддерживающиеВводПоСтроке[СтруктураОбъекта.ТипОбъекта] = Истина Тогда
Для каждого Колонка Из ОбъектМетаданных.ВводПоСтроке Цикл
Если СоответствиеКолонок.Получить(Колонка.Имя) = Неопределено Тогда
ЗаголовокКолонки = ЗаголовокКолонки + Разделитель + Колонка.Имя;
Разделитель = ", ";
СоответствиеКолонок.Вставить(Колонка.Имя, Колонка.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если СтруктураОбъекта.ТипОбъекта = "Документ" Тогда
ЗаголовокКолонки = ЗаголовокКолонки + Разделитель + "Представление";
КонецЕсли;
КонецЕсли;
ЗаголовокКолонки = НСтр("ru = 'Введенные данные'");
КонецЦикла;
ДобавитьИнформациюПоКолонке(ИнформацияПоКолонкам, "Ссылки", ЗаголовокКолонки, Новый ОписаниеТипов("Строка"), Ложь, 1);
Шапка = ШапкаБланкаДляЗаполненияПоИнформацииПоКолонкам(ИнформацияПоКолонкам);
ШаблонСДанными.Очистить();
ШаблонСДанными.Вывести(Шапка);
КонецПроцедуры
Функция ТипыОбъектовПоддерживающиеВводПоСтроке()
СписокОбъектов = Новый Соответствие;
СписокОбъектов.Вставить("БизнесПроцесс", Истина);
СписокОбъектов.Вставить("Документ", Истина);
СписокОбъектов.Вставить("Задача", Истина);
СписокОбъектов.Вставить("ПланВидовРасчета", Истина);
СписокОбъектов.Вставить("ПланВидовХарактеристик", Истина);
СписокОбъектов.Вставить("ПланОбмена", Истина);
СписокОбъектов.Вставить("ПланСчетов", Истина);
СписокОбъектов.Вставить("Справочник", Истина);
Возврат СписокОбъектов;
КонецФункции
Процедура СопоставитьЗначениеКолонкиАвто(ТаблицаСопоставления, ИмяКолонки) Экспорт
Типы = ТаблицаСопоставления.Колонки.ОбъектСопоставления.ТипЗначения.Типы();
ТипыОбъектовПоддерживающиеВводПоСтроке = ТипыОбъектовПоддерживающиеВводПоСтроке();
ТекстЗапроса = "";
Для каждого Тип Из Типы Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент
Если ОбъектМетаданных <> Неопределено И ПравоДоступа("Чтение", ОбъектМетаданных) Тогда
СтруктураОбъекта = РазложитьПолноеИмяОбъекта(ОбъектМетаданных.ПолноеИмя());
МассивКолонок = Новый Массив;
Если ТипыОбъектовПоддерживающиеВводПоСтроке[СтруктураОбъекта.ТипОбъекта] = Истина Тогда
Для каждого Поле Из ОбъектМетаданных.ВводПоСтроке Цикл
МассивКолонок.Добавить(Поле.Имя);
КонецЦикла;
Если СтруктураОбъекта.ТипОбъекта = "Документ" Тогда
МассивКолонок.Добавить("Ссылка");
КонецЕсли;
КонецЕсли;
ТекстЗапроса = СтрокаЗапроса(ТекстЗапроса, СтруктураОбъекта.ТипОбъекта,
СтруктураОбъекта.НазваниеОбъекта, МассивКолонок);
КонецЕсли;
КонецЦикла;
Для каждого Строка Из ТаблицаСопоставления Цикл
Если НЕ ЗначениеЗаполнено(Строка[ИмяКолонки]) Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
Значение = ДокументПоПредставлению(Строка[ИмяКолонки], Типы);
Если Значение = Неопределено Тогда
Значение = Строка[ИмяКолонки];
КонецЕсли;
МассивСсылок = НайтиСсылкиПоПараметрамОтбора(ТекстЗапроса, Значение);
Если МассивСсылок.Количество() = 1 Тогда
Строка.ОбъектСопоставления = МассивСсылок[0];
Строка.РезультатСопоставленияСтроки = "СтрокаСопоставлена";
ИначеЕсли МассивСсылок.Количество() > 1 Тогда
Строка.СписокНеоднозначностей.ЗагрузитьЗначения(МассивСсылок);
Строка.РезультатСопоставленияСтроки = "Неоднозначность";
Иначе
Строка.РезультатСопоставленияСтроки = "НеСопоставлен";
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Распознает документ по представлению для режима поиска ссылок.
//
Функция ДокументПоПредставлению(Представление, Типы)
Для каждого Тип Из Типы Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
СтруктураИмениОбъекта = РазложитьПолноеИмяОбъекта(ОбъектМетаданных.ПолноеИмя());
Если СтруктураИмениОбъекта.ТипОбъекта <> "Документ" Тогда
Продолжить;
КонецЕсли;
ПредставлениеЭлемента = ОбщегоНазначения.ПредставлениеОбъекта(ОбъектМетаданных);
Если СтрНайти(Представление, ПредставлениеЭлемента) > 0 Тогда
ПредставлениеНомерИДата = СокрЛП(Сред(Представление, СтрДлина(ПредставлениеЭлемента) + 1));
ПозицияОкончанияНомера = СтрНайти(ПредставлениеНомерИДата, " ");
Номер = Лев(ПредставлениеНомерИДата, ПозицияОкончанияНомера - 1);
ПозицияОт = СтрНайти(НРег(ПредставлениеНомерИДата), "от");
ПредставлениеДата = СокрЛ(Сред(ПредставлениеНомерИДата, ПозицияОт + 2));
ПозицияОкончаниеДаты = СтрНайти(ПредставлениеДата, " ");
ДатаОкругленнаяДоДня = Лев(ПредставлениеДата, ПозицияОкончаниеДаты - 1) + " 00:00:00";
НомерДокумент = Номер;
ДатаДокумента = СтроковыеФункцииКлиентСервер.СтрокаВДату(ДатаОкругленнаяДоДня);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Документ = Документы[ОбъектМетаданных.Имя].НайтиПоНомеру(НомерДокумент, ДатаДокумента); // ОбъектМетаданныхДокумент
УстановитьПривилегированныйРежим(Ложь);
Если Документ = Неопределено ИЛИ Документ = Документы[ОбъектМетаданных.Имя].ПустаяСсылка() Тогда
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос; // Проверка доступности документа с учетом ограничения на уровне записей.
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДокументДляПроверки.Ссылка
|ИЗ
| &ДокументИмя КАК ДокументДляПроверки
|ГДЕ
| ДокументДляПроверки.Ссылка = &Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДокументИмя", "Документ." + ОбъектМетаданных.Имя);
Запрос.УстановитьПараметр("Ссылка", Документ.Ссылка);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
Возврат Документ;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция СтрокаЗапроса(ТекстЗапроса, ТипОбъекта, ИмяОбъекта, МассивКолонок)
Если МассивКолонок.Количество() > 0 Тогда
ТекстГде = "";
РазделительГде = "";
Для Каждого Поле Из МассивКолонок Цикл
ТекстГде = ТекстГде + РазделительГде + ИмяОбъекта + "." + Поле + " = &ПараметрПоиска";
РазделительГде = " ИЛИ ";
КонецЦикла;
ТекстРазрешенные = ?(ПустаяСтрока(ТекстЗапроса), "РАЗРЕШЕННЫЕ ", "");
ТекстШаблон = "ВЫБРАТЬ " + ТекстРазрешенные + "%1.Ссылка КАК СсылкаНаОбъект ИЗ %2.%1 КАК %1 ГДЕ " + ТекстГде;
Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
ТекстОбъединитьВсе = Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС;
Иначе
ТекстОбъединитьВсе = "";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + ТекстОбъединитьВсе + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстШаблон, ИмяОбъекта, ТипОбъекта);
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции
Функция НайтиСсылкиПоПараметрамОтбора(ТекстЗапроса, Значение)
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ПараметрПоиска", Значение);
ТаблицаРезультатов = Запрос.Выполнить().Выгрузить();
МассивРезультат = ТаблицаРезультатов.ВыгрузитьКолонку("СсылкаНаОбъект");
Возврат МассивРезультат;
КонецФункции
// Добавление информации по колонке для режима поиска ссылок.
//
Процедура ДобавитьИнформациюПоКолонке(ИнформацияПоКолонкам, Имя, Представление, Тип, ОбязательнаДляЗаполнения, Позиция, Группа = "")
СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить();
СтрокаИнфоПроКолонки.ИмяКолонки = Имя;
СтрокаИнфоПроКолонки.ПредставлениеКолонки = Представление;
СтрокаИнфоПроКолонки.ТипКолонки = Тип;
СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = ОбязательнаДляЗаполнения;
СтрокаИнфоПроКолонки.Позиция = Позиция;
СтрокаИнфоПроКолонки.Группа = ?(ЗначениеЗаполнено(Группа), Группа, Имя);
СтрокаИнфоПроКолонки.Видимость = Истина;
КонецПроцедуры
#КонецОбласти
// Заполняет таблицу значений сопоставленные данные по данным из макета.
//
// Параметры:
// ПараметрыВыгрузки - Структура:
// * ТаблицаСопоставления - ТаблицаЗначений:
// ** Идентификатор - Строка
// * ИнформацияПоКолонкам - ТаблицаЗначений
// АдресХранилища- Строка
//
Процедура ЗаполнитьТаблицуСопоставленияДаннымиИзШаблонаФон(ПараметрыВыгрузки, АдресХранилища) Экспорт
ШаблонСДанными = ПараметрыВыгрузки.ШаблонСДанными;
ТаблицаСопоставления = ПараметрыВыгрузки.ТаблицаСопоставления;
ИнформацияПоКолонкам = ПараметрыВыгрузки.ИнформацияПоКолонкам;
ТаблицаСопоставления.Очистить();
ЗаполнитьТаблицуСопоставленияЗагружаемымиДанными(ШаблонСДанными, ИнформацияПоКолонкам, ТаблицаСопоставления, Истина);
ПоместитьВоВременноеХранилище(ТаблицаСопоставления, АдресХранилища);
КонецПроцедуры
Процедура ЗаполнитьТаблицуСопоставленияДаннымиИзШаблона(ШаблонСДанными, ТаблицаСопоставления, ИнформацияПоКолонкам) Экспорт
ОпределитьПозицииКолонокВМакете(ШаблонСДанными, ИнформацияПоКолонкам);
ТаблицаСопоставления.Очистить();
ЗаполнитьТаблицуСопоставленияЗагружаемымиДанными(ШаблонСДанными, ИнформацияПоКолонкам, ТаблицаСопоставления);
КонецПроцедуры
Процедура ЗаполнитьТаблицуСопоставленияЗагружаемымиДанными(ШаблонСДанными, ТаблицаИнформацияПоКолонкам, ТаблицаСопоставления, ФоновоеЗадание = Ложь)
ПерваяСтрокаТаблицы = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ТаблицаИнформацияПоКолонкам), 3, 2);
КорректировкаИдентификатора = ПерваяСтрокаТаблицы - 2;
Для НомерСтроки = ПерваяСтрокаТаблицы По ШаблонСДанными.ВысотаТаблицы Цикл
СтрокаТаблицыПустая = Истина;
НоваяСтрока = ТаблицаСопоставления.Добавить();
НоваяСтрока.Идентификатор = НомерСтроки - 1 - КорректировкаИдентификатора;
НоваяСтрока.РезультатСопоставленияСтроки = "НеСопоставлено";
Для НомерКолонки = 1 По ШаблонСДанными.ШиринаТаблицы Цикл
Ячейка = ШаблонСДанными.ПолучитьОбласть(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).ТекущаяОбласть;
Колонка = НайтиИнформациюОКолонке(ТаблицаИнформацияПоКолонкам, "Позиция", НомерКолонки);
Если Колонка <> Неопределено Тогда
ИмяКолонки = Колонка.ИмяКолонки;
ТипДанных = ТипЗнч(НоваяСтрока[ИмяКолонки]);
Если ТипДанных <> Тип("Строка") И ТипДанных <> Тип("Булево") И ТипДанных <> Тип("Число") И ТипДанных <> Тип("Дата") И ТипДанных <> Тип("УникальныйИдентификатор") Тогда
ДанныеЯчейки = ЗначениеЯчейки(Колонка.ТипКолонки.Типы(), Ячейка.Текст);
Иначе
ДанныеЯчейки = Ячейка.Текст;
КонецЕсли;
Если СтрокаТаблицыПустая Тогда
СтрокаТаблицыПустая = НЕ ЗначениеЗаполнено(ДанныеЯчейки);
КонецЕсли;
НоваяСтрока[ИмяКолонки] = ДанныеЯчейки;
КонецЕсли;
КонецЦикла;
Если СтрокаТаблицыПустая Тогда
ТаблицаСопоставления.Удалить(НоваяСтрока);
КорректировкаИдентификатора = КорректировкаИдентификатора + 1;
КонецЕсли;
Если ФоновоеЗадание Тогда
Процент = Окр(НомерСтроки *100 / ШаблонСДанными.ВысотаТаблицы);
МодульДлительныеОперации = ОбщегоНазначения.ОбщийМодуль("ДлительныеОперации");
МодульДлительныеОперации.СообщитьПрогресс(Процент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ЗначениеЯчейки(Типы, ЗначениеЯчейки)
ДанныеЯчейки = "";
Для каждого ТипДанных Из Типы Цикл
Объект = Метаданные.НайтиПоТипу(ТипДанных);
Если Объект = Неопределено Тогда
Продолжить;
КонецЕсли;
ОписаниеОбъекта = РазложитьПолноеИмяОбъекта(Объект.ПолноеИмя());
Если ОписаниеОбъекта.ТипОбъекта = "Справочник" Тогда
Если НЕ Объект.Автонумерация И Объект.ДлинаКода > 0 Тогда
ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки, Истина);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда
ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоНаименованию(ЗначениеЯчейки, Истина);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда
ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки, Истина);
КонецЕсли;
ИначеЕсли ОписаниеОбъекта.ТипОбъекта = "Перечисление" Тогда
Для каждого ЗначениеПеречисления Из Перечисления[ОписаниеОбъекта.НазваниеОбъекта] Цикл
Если Строка(ЗначениеПеречисления) = СокрЛП(ЗначениеЯчейки) Тогда
ДанныеЯчейки = ЗначениеПеречисления;
КонецЕсли;
КонецЦикла;
ИначеЕсли ОписаниеОбъекта.ТипОбъекта = "ПланСчетов" Тогда
ДанныеЯчейки = ПланыСчетов[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки);
Если ДанныеЯчейки.Пустая() Тогда
ДанныеЯчейки = ПланыСчетов[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоНаименованию(ЗначениеЯчейки, Истина);
КонецЕсли;
ИначеЕсли ОписаниеОбъекта.ТипОбъекта = "ПланВидовХарактеристик" Тогда
Если НЕ Объект.Автонумерация И Объект.ДлинаКода > 0 Тогда
ДанныеЯчейки = ПланыВидовХарактеристик[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки, Истина);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда
ДанныеЯчейки = ПланыВидовХарактеристик[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоНаименованию(ЗначениеЯчейки, Истина);
КонецЕсли;
Иначе
ДанныеЯчейки = Строка(ЗначениеЯчейки);
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеЯчейки) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ДанныеЯчейки;
КонецФункции
Процедура ОпределитьПозицииКолонокВМакете(ШаблонСДанными, ИнформацияПоКолонкам)
ОбластьЗаголовка = ОбластьЗаголовкаШаблонаТаблицы(ШаблонСДанными);
СоответствиеКолонок = Новый Соответствие;
Для НомерКолонки = 1 По ОбластьЗаголовка.ШиринаТаблицы Цикл
Ячейка=ШаблонСДанными.ПолучитьОбласть(1, НомерКолонки, 1, НомерКолонки).ТекущаяОбласть;
ИмяКолонкиВМакете = Ячейка.Текст;
СоответствиеКолонок.Вставить(ИмяКолонкиВМакете, НомерКолонки);
КонецЦикла;
Для каждого Колонка Из ИнформацияПоКолонкам Цикл
Позиция = СоответствиеКолонок.Получить(Колонка.ПредставлениеКолонки);
Если Позиция <> Неопределено Тогда
Колонка.Позиция = Позиция;
Иначе
Колонка.Позиция = -1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#Область ПодготовкаКЗагрузкеДанных
Функция ОбластьЗаголовкаШаблонаТаблицы(Шаблон)
ВысотаШапки = 1;
Для НомерКолонки = 1 По Шаблон.ШиринаТаблицы Цикл
Ячейка = Шаблон.ПолучитьОбласть(2, НомерКолонки, 2, НомерКолонки).ТекущаяОбласть;
Если ЗначениеЗаполнено(Ячейка.Текст) Тогда
ВысотаШапки = 2;
Прервать;
КонецЕсли;
КонецЦикла;
ОбластьЗаголовокТаблицы = Шаблон.ПолучитьОбласть(1, 1, ВысотаШапки, Шаблон.ШиринаТаблицы);
Возврат ОбластьЗаголовокТаблицы;
КонецФункции
// Формирует макет табличного документа на основание реквизитов справочника для универсальной загрузки.
//
Процедура ИнформациюПоКолонкамИзРеквизитовСправочника(ПараметрыЗагрузки, ИнформацияПоКолонкам)
ИнформацияПоКолонкам.Очистить();
Позиция = 1;
МетаданныеСправочника= Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузки.ПолноеИмяОбъекта);
Если НЕ МетаданныеСправочника.Автонумерация И МетаданныеСправочника.ДлинаКода > 0 Тогда
СоздатьКолонкуСтандартныеРеквизиты(ИнформацияПоКолонкам, МетаданныеСправочника, "Код", Позиция);
Позиция = Позиция + 1;
КонецЕсли;
Если МетаданныеСправочника.ДлинаНаименования > 0 Тогда
СоздатьКолонкуСтандартныеРеквизиты(ИнформацияПоКолонкам, МетаданныеСправочника, "Наименование", Позиция);
Позиция = Позиция + 1;
КонецЕсли;
Если МетаданныеСправочника.Иерархический Тогда
СоздатьКолонкуСтандартныеРеквизиты(ИнформацияПоКолонкам, МетаданныеСправочника, "Родитель", Позиция);
Позиция = Позиция + 1;
КонецЕсли;
Если МетаданныеСправочника.Владельцы.Количество() > 0 Тогда
СоздатьКолонкуСтандартныеРеквизиты(ИнформацияПоКолонкам, МетаданныеСправочника, "Владелец", Позиция);
Позиция = Позиция + 1;
КонецЕсли;
Для каждого Реквизит Из МетаданныеСправочника.Реквизиты Цикл
Если Реквизит.Имя = "Идентификатор" Тогда
Продолжить;
КонецЕсли;
Если Реквизит.Тип.СодержитТип(Тип("ХранилищеЗначения")) Тогда
Продолжить;
КонецЕсли;
ОписаниеТипаКолонки = "";
Если Реквизит.Тип.СодержитТип(Тип("Булево")) Тогда
ОписаниеТипаКолонки = НСтр("ru = 'Флаг, Да или 1 / Нет или 0'");
ИначеЕсли Реквизит.Тип.СодержитТип(Тип("Число")) Тогда
ОписаниеТипаКолонки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Число, Длина: %1, Точность: %2'"),
Строка(Реквизит.Тип.КвалификаторыЧисла.Разрядность),
Строка(Реквизит.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти));
ИначеЕсли Реквизит.Тип.СодержитТип(Тип("Строка")) Тогда
Если Реквизит.Тип.КвалификаторыСтроки.Длина > 0 Тогда
ДлинаСтроки = Строка(Реквизит.Тип.КвалификаторыСтроки.Длина);
ОписаниеТипаКолонки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Строка, макс. количество символов: %1'"), ДлинаСтроки);
Иначе
ОписаниеТипаКолонки = НСтр("ru = 'Строка неограниченной длины'");
КонецЕсли;
ИначеЕсли Реквизит.Тип.СодержитТип(Тип("Дата")) Тогда
ОписаниеТипаКолонки = Строка(Реквизит.Тип.КвалификаторыДаты.ЧастиДаты);
ИначеЕсли Реквизит.Тип.СодержитТип(Тип("УникальныйИдентификатор")) Тогда
ОписаниеТипаКолонки = НСтр("ru = 'УникальныйИдентификатор'");
КонецЕсли;
ШиринаКолонки = ШиринаКолонкиПоТипу(Реквизит.Тип);
Подсказка = ?(ЗначениеЗаполнено(Реквизит.Подсказка), Реквизит.Подсказка, Реквизит.Представление()) + Символы.ПС + ОписаниеТипаКолонки;
ОбязательноеПоле = ?(Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку, Истина, Ложь);
СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить();
СтрокаИнфоПроКолонки.ИмяКолонки = Реквизит.Имя;
СтрокаИнфоПроКолонки.ПредставлениеКолонки = Реквизит.Представление();
СтрокаИнфоПроКолонки.ТипКолонки = Реквизит.Тип;
СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = ОбязательноеПоле;
СтрокаИнфоПроКолонки.Позиция = Позиция;
СтрокаИнфоПроКолонки.Группа = МетаданныеСправочника.Представление();
СтрокаИнфоПроКолонки.Видимость = Истина;
СтрокаИнфоПроКолонки.Примечание = Подсказка;
СтрокаИнфоПроКолонки.Ширина = ШиринаКолонки;
Позиция = Позиция + 1;
КонецЦикла;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
МодульУправлениеКонтактнойИнформацией.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный");
МодульУправлениеСвойствамиСлужебный.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам);
КонецЕсли;
КонецПроцедуры
// Добавление информации о колонке для стандартного реквизита при универсальной загрузке.
//
Процедура СоздатьКолонкуСтандартныеРеквизиты(ИнформацияПоКолонкам, МетаданныеСправочника, ИмяКолонки, Позиция)
Реквизит = МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки];
Представление = МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки].Представление();
ТипДанных = МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки].Тип.Типы()[0];
ОписаниеТипа = МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки].Тип;
ШиринаКолонки = 11;
Если ТипДанных = Тип("Строка") Тогда
ПредставлениеТипа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Строка (не более %1 символов)'"), ОписаниеТипа.КвалификаторыСтроки.Длина);
ШиринаКолонки = ?(ОписаниеТипа.КвалификаторыСтроки.Длина < 30, ОписаниеТипа.КвалификаторыСтроки.Длина + 1, 30);
ИначеЕсли ТипДанных = Тип("Число") Тогда
ПредставлениеТипа = НСтр("ru = 'Число'");
Иначе
Если МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки].Тип.Типы().Количество() = 1 Тогда
ПредставлениеТипа = Строка(ТипДанных);
Иначе
ПредставлениеТипа = "";
Разделитель = "";
Для каждого ТипДанные Из МетаданныеСправочника.СтандартныеРеквизиты[ИмяКолонки].Тип.Типы() Цикл
ПредставлениеТипа = ПредставлениеТипа + Разделитель + Строка(ТипДанные);
Разделитель = " или ";
КонецЦикла;
КонецЕсли;
КонецЕсли;
ТекстПримечания = Реквизит.Подсказка + Символы.ПС + ПредставлениеТипа;
ОбязательнаДляЗаполнения = ?(Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку, Истина, Ложь);
СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить();
СтрокаИнфоПроКолонки.ИмяКолонки = ИмяКолонки;
СтрокаИнфоПроКолонки.ПредставлениеКолонки = Представление;
СтрокаИнфоПроКолонки.ТипКолонки = ОписаниеТипа;
СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = ОбязательнаДляЗаполнения;
СтрокаИнфоПроКолонки.Позиция = Позиция;
СтрокаИнфоПроКолонки.Группа = МетаданныеСправочника.Представление();
СтрокаИнфоПроКолонки.Видимость = Истина;
СтрокаИнфоПроКолонки.Примечание = ТекстПримечания;
СтрокаИнфоПроКолонки.Ширина = ШиринаКолонки;
КонецПроцедуры
// Определяет состав колонок для загрузки данных.
//
// Параметры:
// ПараметрыЗагрузки - Структура
// ИнформацияПоКолонкам - ТаблицаЗначений:
// * ИмяКолонки - Строка
// * ПредставлениеКолонки - Строка
// * ТипКолонки - ОписаниеТипов
// * ОбязательнаДляЗаполнения - Булево
// * Позиция - Число
// * Группа - Строка
// * Видимость - Булево
// * Примечание - Строка
// * Ширина - Число
// ИменаДобавляемыхКолонок - Неопределено
//
Процедура ОпределитьИнформацияПоКолонкам(ПараметрыЗагрузки, ИнформацияПоКолонкам, ИменаДобавляемыхКолонок = Неопределено) Экспорт
Если ПараметрыЗагрузки.ТипЗагрузки = "ПрикладнаяЗагрузка" Тогда
Если ПараметрыЗагрузки.Свойство("Макет") Тогда
Макет = ПараметрыЗагрузки.Макет;
Иначе
Макет = МенеджерОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта).ПолучитьМакет("ЗагрузкаИзФайла");
КонецЕсли;
ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет);
Если ИнформацияПоКолонкам.Количество() = 0 Тогда
СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ОбластьЗаголовокТаблицы, ПараметрыЗагрузки, ИнформацияПоКолонкам, Неопределено);
КонецЕсли;
ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "УниверсальнаяЗагрузка" Тогда
ИнформацияПоКолонкамНаОснованиеРеквизитов = ИнформацияПоКолонкам.СкопироватьКолонки();
Если ИнформацияПоКолонкам.Количество() = 0 Тогда
ИнформациюПоКолонкамИзРеквизитовСправочника(ПараметрыЗагрузки, ИнформацияПоКолонкам);
Иначе
ИнформациюПоКолонкамИзРеквизитовСправочника(ПараметрыЗагрузки, ИнформацияПоКолонкамНаОснованиеРеквизитов);
КонецЕсли;
ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "ВнешняяЗагрузка" Тогда
ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(ПараметрыЗагрузки.Макет);
ОбластьЗаголовокТаблицы.Защита = Истина;
Если ИнформацияПоКолонкам.Количество() = 0 Тогда
СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ОбластьЗаголовокТаблицы, ПараметрыЗагрузки, ИнформацияПоКолонкам);
КонецЕсли;
ИначеЕсли ПараметрыЗагрузки.ТипЗагрузки = "ТабличнаяЧасть" Тогда
Если ИнформацияПоКолонкам.Количество() = 0 Тогда
ОпределитьИнформацияПоКолонкамТабличнаяЧасть(ИнформацияПоКолонкам, Макет, ОбластьЗаголовокТаблицы, ПараметрыЗагрузки);
Иначе
Макет = МенеджерОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта).ПолучитьМакет(ПараметрыЗагрузки.Макет);
ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет);
КонецЕсли;
КонецЕсли;
ТребуетсяПересчетПозиций = Ложь;
СписокКолонокСФункциональнымиОпциями = КолонкиЗависимыеОтФункциональныхОпций(ПараметрыЗагрузки.ПолноеИмяОбъекта);
Для каждого ФункциональнаяОпцияКолонкиВключена Из СписокКолонокСФункциональнымиОпциями Цикл
СтрокаСИнформациейОКолонке = ИнформацияПоКолонкам.Найти(ФункциональнаяОпцияКолонкиВключена.Ключ, "ИмяКолонки");
Если СтрокаСИнформациейОКолонке <> Неопределено Тогда
Если НЕ ФункциональнаяОпцияКолонкиВключена.Значение Тогда
ИнформацияПоКолонкам.Удалить(СтрокаСИнформациейОКолонке);
ТребуетсяПересчетПозиций = Истина;
КонецЕсли;
Иначе
Если ФункциональнаяОпцияКолонкиВключена.Значение Тогда
Если ПараметрыЗагрузки.ТипЗагрузки = "УниверсальнаяЗагрузка" Тогда
СтрокаСКолонкой = ИнформацияПоКолонкамНаОснованиеРеквизитов.Найти(ФункциональнаяОпцияКолонкиВключена.Ключ, "ИмяКолонки");
НоваяСтрока = ИнформацияПоКолонкам.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСКолонкой);
Иначе
СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ОбластьЗаголовокТаблицы, ПараметрыЗагрузки, ИнформацияПоКолонкам, ФункциональнаяОпцияКолонкиВключена.Ключ);
КонецЕсли;
ТребуетсяПересчетПозиций = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ТребуетсяПересчетПозиций Тогда
ИнформацияПоКолонкам.Сортировать("Позиция");
Позиция = 1;
Для каждого Колонка Из ИнформацияПоКолонкам Цикл
Колонка.Позиция = Позиция;
Позиция = Позиция + 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ОпределитьИнформацияПоКолонкамТабличнаяЧасть(Знач ИнформацияПоКолонкам, Макет, ОбластьЗаголовокТаблицы, Знач ПараметрыЗагрузки)
СтруктураНаименованияОбъекта = РазложитьПолноеИмяОбъекта(ПараметрыЗагрузки.ПолноеИмяОбъекта);
ИмяОбъектаМетаданных = СтруктураНаименованияОбъекта.ТипОбъекта + "." + СтруктураНаименованияОбъекта.НазваниеОбъекта;
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаМетаданных);
Если ОбъектМетаданных = Неопределено Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Загрузка данных из файла в табличную часть не поддерживается для объектов типа: %1'"),
ИмяОбъектаМетаданных);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
МакетыОбъектаМетаданных = ОбъектМетаданных.Макеты;
ПараметрыЗагрузкиИзФайла = ПараметрыЗагрузкиИзФайлаВТЧ(ПараметрыЗагрузки.ПолноеИмяОбъекта, ПараметрыЗагрузки.ДополнительныеПараметры);
ПараметрыЗагрузкиИзФайла.Вставить("ПолноеИмяОбъекта", ПараметрыЗагрузки.ПолноеИмяОбъекта);
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПараметрыЗагрузки.ПолноеИмяОбъекта);
МенеджерОбъекта.УстановитьПараметрыЗагрузкиИзФайлаВТЧ(ПараметрыЗагрузкиИзФайла);
МакетМетаданные = МакетыОбъектаМетаданных.Найти(ПараметрыЗагрузки.Макет); // ОбъектМетаданныхМакет
Если МакетМетаданные = Неопределено Тогда
МакетМетаданные= МакетыОбъектаМетаданных.Найти("ЗагрузкаИзФайла" + СтруктураНаименованияОбъекта.ИмяТабличнойЧасти);
Если МакетМетаданные = Неопределено Тогда
МакетМетаданные = МакетыОбъектаМетаданных.Найти("ЗагрузкаИзФайла");
КонецЕсли;
КонецЕсли;
Если МакетМетаданные <> Неопределено Тогда
Макет = МенеджерОбъекта.ПолучитьМакет(МакетМетаданные.Имя);
Иначе
ВызватьИсключение НСтр("ru = 'Не найден макет для загрузки данных из файла'");
КонецЕсли;
ЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет);
Если ИнформацияПоКолонкам.Количество() = 0 Тогда
СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ЗаголовокТаблицы, ПараметрыЗагрузкиИзФайла, ИнформацияПоКолонкам);
КонецЕсли;
ОбластьЗаголовокТаблицы = ОбластьЗаголовкаШаблонаТаблицы(Макет);
КонецПроцедуры
// Заполняет таблицу о колонках в макете. Информация используется для построения таблицы сопоставления.
//
// Параметры:
// ОбластьЗаголовокТаблицы - ТабличныйДокумент - область заголовка макета.
// ПараметрыЗагрузкиИзФайла - Структура - параметры загрузки.
// ИнформацияПоКолонкам - ТаблицаЗначений - ОписаниеТабличнойЧасти с описание колонок.
// ИменаДобавляемыхКолонок - Строка - список добавляемых колонок через запятую. Если значение не заполонено, то
// добавляются все.
//
Процедура СоздатьИнформациюПоКолонкамНаОснованиеШаблона(ОбластьЗаголовокТаблицы, ПараметрыЗагрузкиИзФайла, ИнформацияПоКолонкам, ИменаДобавляемыхКолонок = Неопределено)
ВыборочноеДобавление = Ложь;
Если ЗначениеЗаполнено(ИменаДобавляемыхКолонок) Тогда
ВыборочноеДобавление = Истина;
МассивДобавляемыхКолонок = СтрРазделить(ИменаДобавляемыхКолонок, ",", Ложь);
Позиция = ИнформацияПоКолонкам.Количество() + 1;
Иначе
ИнформацияПоКолонкам.Очистить();
Позиция = 1;
КонецЕсли;
Если ПараметрыЗагрузкиИзФайла.Свойство("ТипДанныхКолонки") Тогда
СоответствиеТипаДанныхКолонок = ПараметрыЗагрузкиИзФайла.ТипДанныхКолонки;
Иначе
СоответствиеТипаДанныхКолонок = Новый Соответствие;
КонецЕсли;
ВысотаШапки = ОбластьЗаголовокТаблицы.ВысотаТаблицы;
Если ВысотаШапки = 2 Тогда
НомерКолонки = 1;
Группы = Новый Соответствие;
ИспользуетсяГруппировка = Истина;
Пока НомерКолонки <= ОбластьЗаголовокТаблицы.ШиринаТаблицы Цикл
Область = ОбластьЗаголовокТаблицы.ПолучитьОбласть(1, НомерКолонки);
Ячейка = ОбластьЗаголовокТаблицы.ПолучитьОбласть(1, НомерКолонки, 1, НомерКолонки).ТекущаяОбласть;
Группа = Ячейка.Текст;
Для Индекс = НомерКолонки По НомерКолонки + Область.ШиринаТаблицы -1 Цикл
Группы.Вставить(Индекс, Группа);
КонецЦикла;
НомерКолонки = НомерКолонки + Область.ШиринаТаблицы;
КонецЦикла;
Иначе
ИспользуетсяГруппировка = Ложь;
КонецЕсли;
Для НомерКолонки = 1 По ОбластьЗаголовокТаблицы.ШиринаТаблицы Цикл
Ячейка = ОбластьЗаголовокТаблицы.ПолучитьОбласть(ВысотаШапки, НомерКолонки, ВысотаШапки, НомерКолонки).ТекущаяОбласть;
Если СтрНайти(Ячейка.Имя, "R") > 0 И СтрНайти(Ячейка.Имя, "C") > 0 Тогда
ИмяРеквизита = ?(ЗначениеЗаполнено(Ячейка.ПараметрРасшифровки), Ячейка.ПараметрРасшифровки, Ячейка.Текст);
ПредставлениеРеквизита = ?(ЗначениеЗаполнено(Ячейка.Текст), Ячейка.Текст, Ячейка.ПараметрРасшифровки);
Родитель = ?(ЗначениеЗаполнено(Ячейка.ПараметрРасшифровки), Ячейка.ПараметрРасшифровки, Ячейка.Текст);
Иначе
ИмяРеквизита = Ячейка.Имя;
ПредставлениеРеквизита = ?(ЗначениеЗаполнено(Ячейка.Текст), Ячейка.Текст, Ячейка.Имя);
Родитель = ?(ЗначениеЗаполнено(Ячейка.ПараметрРасшифровки), Ячейка.ПараметрРасшифровки, Ячейка.Имя);
КонецЕсли;
Если ПредставлениеРеквизита = НСтр("ru = '<Дополнительные реквизиты>'") Тогда
МетаданныеСправочника = Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузкиИзФайла.ПолноеИмяОбъекта);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный");
МодульУправлениеСвойствамиСлужебный.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам);
КонецЕсли;
ИначеЕсли ПредставлениеРеквизита = НСтр("ru = '<Контактная информация>'") Тогда
МетаданныеСправочника = Метаданные.НайтиПоПолномуИмени(ПараметрыЗагрузкиИзФайла.ПолноеИмяОбъекта);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
МодульУправлениеКонтактнойИнформацией.КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам);
КонецЕсли;
Иначе
ТипДанныхКолонки = Новый ОписаниеТипов("Строка");
Если СоответствиеТипаДанныхКолонок <> Неопределено Тогда
ТипДанныхКолонкиПереопределенный = СоответствиеТипаДанныхКолонок.Получить(ИмяРеквизита);
Если ТипДанныхКолонкиПереопределенный <> Неопределено Тогда
ТипДанныхКолонки = ТипДанныхКолонкиПереопределенный;
КонецЕсли;
КонецЕсли;
Если ВыборочноеДобавление И МассивДобавляемыхКолонок.Найти(ИмяРеквизита) = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(ИмяРеквизита) Тогда
ОбязательнаДляЗаполнения = Ячейка.Шрифт.Полужирный = Истина
Или ПараметрыЗагрузкиИзФайла.ОбязательныеКолонки.Найти(ИмяРеквизита) <> Неопределено;
ПримечаниеВШапкеКолонки = Ячейка.Примечание.Текст + ?(ОбязательнаДляЗаполнения,
Символы.ПС + НСтр("ru='Обязательно для заполнения.'"), "");
СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить();
СтрокаИнфоПроКолонки.ИмяКолонки = ИмяРеквизита;
СтрокаИнфоПроКолонки.ПредставлениеКолонки = ПредставлениеРеквизита;
СтрокаИнфоПроКолонки.ТипКолонки = ТипДанныхКолонки;
СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = ОбязательнаДляЗаполнения;
СтрокаИнфоПроКолонки.Позиция = Позиция;
СтрокаИнфоПроКолонки.Родитель = Родитель;
СтрокаИнфоПроКолонки.Видимость = Истина;
СтрокаИнфоПроКолонки.Примечание = ПримечаниеВШапкеКолонки;
СтрокаИнфоПроКолонки.Ширина = Ячейка.ШиринаКолонки;
Если ИспользуетсяГруппировка Тогда
СтрокаИнфоПроКолонки.Группа = Группы.Получить(НомерКолонки);
КонецЕсли;
Позиция = Позиция + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ШиринаКолонкиПоТипу(Тип)
ШиринаКолонки = 20;
Если Тип.СодержитТип(Тип("Булево")) Тогда
ШиринаКолонки = 3;
ИначеЕсли Тип.СодержитТип(Тип("Число")) Тогда
ШиринаКолонки = Тип.КвалификаторыЧисла.Разрядность + 1;
ИначеЕсли Тип.СодержитТип(Тип("Строка")) Тогда
Если Тип.КвалификаторыСтроки.Длина > 0 Тогда
ШиринаКолонки = ?(Тип.КвалификаторыСтроки.Длина > 20, 20, Тип.КвалификаторыСтроки.Длина);
Иначе
ШиринаКолонки = 20;
КонецЕсли;
ИначеЕсли Тип.СодержитТип(Тип("Дата")) Тогда
ШиринаКолонки = 12;
ИначеЕсли Тип.СодержитТип(Тип("УникальныйИдентификатор")) Тогда
ШиринаКолонки = 20;
Иначе
Для каждого ТипОбъекта Из Тип.Типы() Цикл
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипОбъекта);
СтруктураОбъекта = РазложитьПолноеИмяОбъекта(МетаданныеОбъекта.ПолноеИмя());
Если СтруктураОбъекта.ТипОбъекта = "Справочник" Тогда
Если НЕ МетаданныеОбъекта.Автонумерация И МетаданныеОбъекта.ДлинаКода > 0 Тогда
ШиринаКолонки = МетаданныеОбъекта.ДлинаКода + 1;
КонецЕсли;
Если МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
Если МетаданныеОбъекта.ДлинаНаименования > ШиринаКолонки Тогда
ШиринаКолонки = ?(МетаданныеОбъекта.ДлинаНаименования > 30, 30, МетаданныеОбъекта.ДлинаНаименования + 1);
КонецЕсли;
КонецЕсли;
ИначеЕсли СтруктураОбъекта.ТипОбъекта = "Перечисление" Тогда
ДлинаПредставления = СтрДлина(МетаданныеОбъекта.Представление());
ШиринаКолонки = ?( ДлинаПредставления > 30, 30, ДлинаПредставления + 1);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ШиринаКолонки;
КонецФункции
Процедура ЗаполнитьЯчейкуЗаголовкаМакета(Ячейка, Текст, Ширина, Подсказка, ОбязательноеПоле, Имя = "")
Ячейка.ТекущаяОбласть.Текст = Текст;
Ячейка.ТекущаяОбласть.Имя = Имя;
Ячейка.ТекущаяОбласть.ПараметрРасшифровки = Имя;
Ячейка.ТекущаяОбласть.ЦветФона = ЦветаСтиля.ЦветФонаШапкиОтчета;
Ячейка.ТекущаяОбласть.ШиринаКолонки = Ширина;
Ячейка.ТекущаяОбласть.Примечание.Текст = Подсказка;
Если ОбязательноеПоле Тогда
Ячейка.ТекущаяОбласть.Шрифт = ШрифтыСтиля.ВажнаяНадписьШрифт;
Иначе
Ячейка.ТекущаяОбласть.Шрифт = Неопределено;
КонецЕсли;
КонецПроцедуры
// Создает шапку бланка по информации о колонках.
//
Функция ШапкаБланкаДляЗаполненияПоИнформацииПоКолонкам(ИнформацияПоКолонкам) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
КолонкиИмеютГруппировку = ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам);
Если КолонкиИмеютГруппировку Тогда
ОбластьЗаголовок = ПолучитьМакет("ПростойШаблон").ПолучитьОбласть("Шапка2Строки");
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
НомерСтроки = 2;
Иначе
ОбластьЗаголовок = ПолучитьМакет("ПростойШаблон").ПолучитьОбласть("Заголовок");
НомерСтроки = 1;
КонецЕсли;
ИнформацияПоКолонкам.Сортировать("Позиция");
Группа = Неопределено;
ПозицияНачалоГруппы = 1;
Сдвиг = 0;
Для Позиция = 0 По ИнформацияПоКолонкам.Количество() -1 Цикл
Колонка = ИнформацияПоКолонкам.Получить(Позиция);
Если Колонка.Видимость = Истина Тогда
Если Группа = Неопределено Тогда
Группа = Колонка.Группа;
КонецЕсли;
ОбластьИмяКолонки = ОбластьЗаголовок.Область(НомерСтроки, 1, НомерСтроки, 1);
ОбластьИмяКолонки.Имя = Колонка.ИмяКолонки;
ОбластьИмяКолонки.Расшифровка = Колонка.Группа;
ОбластьИмяКолонки.Примечание.Текст = Колонка.Примечание;
Если Колонка.ОбязательнаДляЗаполнения Тогда
ОбластьИмяКолонки.Шрифт = ШрифтыСтиля.ВажнаяНадписьШрифт;
Иначе
ОбластьИмяКолонки.Шрифт = Неопределено;
КонецЕсли;
ОбластьИмяКолонки.ШиринаКолонки = ?(Колонка.Ширина = 0, ШиринаКолонкиПоТипу(Колонка.ТипКолонки), Колонка.Ширина);
ОбластьЗаголовок.Параметры.Заголовок = ?(ПустаяСтрока(Колонка.Синоним), Колонка.ПредставлениеКолонки, Колонка.Синоним);
ТабличныйДокумент.Присоединить(ОбластьЗаголовок);
Если КолонкиИмеютГруппировку Тогда
Если Колонка.Группа <> Группа Тогда
Область = ТабличныйДокумент.Область(1, ПозицияНачалоГруппы, 1, Позиция - Сдвиг);
Область.Текст = Группа;
Область.Объединить();
Область.Обвести(Линия, Линия, Линия,Линия);
ПозицияНачалоГруппы = Позиция + 1 - Сдвиг ;
Группа = Колонка.Группа;
КонецЕсли;
КонецЕсли;
Иначе
Сдвиг = Сдвиг + 1;
КонецЕсли;
КонецЦикла;
Если КолонкиИмеютГруппировку Тогда
Область = ТабличныйДокумент.Область(1, ПозицияНачалоГруппы, 1, Позиция - Сдвиг);
Область.Текст = Группа;
Область.Объединить();
Область.Обвести(Линия, Линия, Линия,Линия);
КонецЕсли;
Возврат ТабличныйДокумент;
КонецФункции
#КонецОбласти
// Создает таблицу значений по данным из шаблона и сохраняет ее во временное хранилище.
//
Процедура ТабличныйДокументВТаблицуЗначений(ШаблонСДанными, ИнформацияПоКолонкам, АдресЗагруженныхДанных) Экспорт
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка");
ТаблицаИнформацияПоКолонкам = ИнформацияПоКолонкам.Скопировать();
ЗагружаемыеДанные = Новый ТаблицаЗначений;
Для каждого Колонка Из ТаблицаИнформацияПоКолонкам Цикл
Если Колонка.ТипКолонки = Неопределено Тогда
ТипКолонки = ОписаниеТипаСтрока;
Иначе
ТипКолонки = Колонка.ТипКолонки;
КонецЕсли;
ЗагружаемыеДанные.Колонки.Добавить(Колонка.ИмяКолонки, ТипКолонки, Колонка.ПредставлениеКолонки);
КонецЦикла;
ЗагружаемыеДанные.Колонки.Добавить("Идентификатор", ОписаниеТипаЧисло, "Идентификатор");
ЗагружаемыеДанные.Колонки.Добавить("РезультатСопоставленияСтроки", ОписаниеТипаСтрока, "Результат");
ЗагружаемыеДанные.Колонки.Добавить("ОписаниеОшибки", ОписаниеТипаСтрока, "Причина");
КорректировкаИдентификатора = 0;
ВысотаШапки = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ТаблицаИнформацияПоКолонкам), 2, 1);
ИнициализироватьКолонки(ТаблицаИнформацияПоКолонкам, ШаблонСДанными, ВысотаШапки);
Для НомерСтроки = ВысотаШапки + 1 По ШаблонСДанными.ВысотаТаблицы Цикл
СтрокаТаблицыПустая = Истина;
НоваяСтрока = ЗагружаемыеДанные.Добавить();
НоваяСтрока.Идентификатор = НомерСтроки - КорректировкаИдентификатора - 1;
Для НомерКолонки = 1 По ШаблонСДанными.ШиринаТаблицы Цикл
Ячейка = ШаблонСДанными.ПолучитьОбласть(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).ТекущаяОбласть;
НайденнаяКолонка = НайтиИнформациюОКолонке(ТаблицаИнформацияПоКолонкам, "Позиция", НомерКолонки);
Если НайденнаяКолонка <> Неопределено Тогда
ИмяКолонки = НайденнаяКолонка.ИмяКолонки;
НоваяСтрока[ИмяКолонки] = ПриведениеЗначениеКТипу(Ячейка.Текст, НайденнаяКолонка.ТипКолонки);
Если Не ЗначениеЗаполнено(НоваяСтрока[ИмяКолонки]) И ЗначениеЗаполнено(Ячейка.Текст) Тогда
НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки( НайденнаяКолонка.ТипКолонки.Типы(), Ячейка.Текст);
КонецЕсли;
Если СтрокаТаблицыПустая Тогда
СтрокаТаблицыПустая = Не ЗначениеЗаполнено(Ячейка.Текст);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если СтрокаТаблицыПустая Тогда
ЗагружаемыеДанные.Удалить(НоваяСтрока);
КорректировкаИдентификатора = КорректировкаИдентификатора + 1;
КонецЕсли;
КонецЦикла;
АдресЗагруженныхДанных = ПоместитьВоВременноеХранилище(ЗагружаемыеДанные);
КонецПроцедуры
Функция ПриведениеЗначениеКТипу(Значение, ОписаниеТипов)
Для каждого Тип Из ОписаниеТипов.Типы() Цикл
Если Тип = Тип("Дата") Тогда
Возврат СтроковыеФункцииКлиентСервер.СтрокаВДату(Значение, ОписаниеТипов.КвалификаторыДаты.ЧастиДаты);
ИначеЕсли Тип = Тип("Булево") Тогда
ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");
Возврат ОписаниеТипаБулево.ПривестиЗначение(Значение);
ИначеЕсли Тип = Тип("Строка") Тогда
ОписаниеТипаБулево = Новый ОписаниеТипов("Строка");
Возврат ОписаниеТипаБулево.ПривестиЗначение(Значение);
ИначеЕсли Тип = Тип("Число") Тогда
НецифровыеСимволы = СтрСоединить(СтрРазделить(Значение, "1234567890,."));
Значение = СтрСоединить(СтрРазделить(Значение, НецифровыеСимволы));
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
Возврат ОписаниеТипаЧисло.ПривестиЗначение(Значение);
КонецЕсли;
КонецЦикла;
Возврат Значение;
КонецФункции
Процедура ЗаполнитьТаблицуПоЗагруженнымДаннымИзФайла(ДанныеИзФайла, ШаблонСДанными, ИнформацияПоКолонкам)
СтрокаЗаголовок= ДанныеИзФайла.Получить(0);
СоответствиеКолонок = Новый Соответствие;
Для каждого Колонка Из ДанныеИзФайла.Колонки Цикл
НайденнаяКолонка = НайтиИнформациюОКолонке(ИнформацияПоКолонкам, "Синоним", СтрокаЗаголовок[Колонка.Имя]);
Если НайденнаяКолонка = Неопределено Тогда
НайденнаяКолонка = НайтиИнформациюОКолонке(ИнформацияПоКолонкам, "ПредставлениеКолонки", СтрокаЗаголовок[Колонка.Имя]);
КонецЕсли;
Если НайденнаяКолонка <> Неопределено Тогда
СоответствиеКолонок.Вставить(НайденнаяКолонка.Позиция, Колонка.Имя);
КонецЕсли;
КонецЦикла;
Для Индекс= 1 По ДанныеИзФайла.Количество() - 1 Цикл
СтрокаТЗ = ДанныеИзФайла.Получить(Индекс);
НоваяСтрока = Истина;
Для НомерКолонки =1 По ШаблонСДанными.ШиринаТаблицы Цикл
КолонкаВТаблице = СоответствиеКолонок.Получить(НомерКолонки);
Колонка = ИнформацияПоКолонкам.Найти(НомерКолонки, "Позиция");
Если Колонка <> Неопределено И Колонка.Видимость = Ложь Тогда
Продолжить;
КонецЕсли;
Ячейка = ШаблонСДанными.ПолучитьОбласть(2, НомерКолонки, 2, НомерКолонки);
Если КолонкаВТаблице <> Неопределено Тогда
Ячейка.ТекущаяОбласть.Текст = СтрокаТЗ[КолонкаВТаблице];
Ячейка.ТекущаяОбласть.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Обрезать;
Иначе
Ячейка.ТекущаяОбласть.Текст = "";
КонецЕсли;
Если НоваяСтрока Тогда
ШаблонСДанными.Вывести(Ячейка);
НоваяСтрока = Ложь;
Иначе
ШаблонСДанными.Присоединить(Ячейка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция НайтиИнформациюОКолонке(ТаблицаИнформацияПоКолонкам, ИмяКолонки, Значение)
Отбор = Новый Структура(ИмяКолонки, Значение);
НайденныеКолонки = ТаблицаИнформацияПоКолонкам.НайтиСтроки(Отбор);
Колонка = Неопределено;
Если НайденныеКолонки.Количество() > 0 Тогда
Колонка = НайденныеКолонки[0];
КонецЕсли;
Возврат Колонка;
КонецФункции
Функция ПолноеИмяОбъектаТабличнаяЧасть(ИмяОбъекта) Экспорт
Результат = СтрРазделить(ИмяОбъекта, ".", Ложь);
Если Результат.Количество() = 4 Тогда
Объект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект <> Неопределено Тогда
Возврат ИмяОбъекта;
КонецЕсли;
ИначеЕсли Результат.Количество() = 3 Тогда
Если Результат[2] <> "ТабличнаяЧасть" Тогда
ИмяОбъекта = Результат[0] + "." + Результат[1] + ".ТабличнаяЧасть." + Результат[2];
Объект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект <> Неопределено Тогда
Возврат ИмяОбъекта;
КонецЕсли;
ИначеЕсли Результат[1] = "ТабличнаяЧасть" Тогда
ИмяОбъекта = "Документ." + Результат[0] + ".ТабличнаяЧасть." + Результат[2];
Объект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект <> Неопределено Тогда
Возврат ИмяОбъекта;
КонецЕсли;
ИмяОбъекта = "Справочник." + Результат[0] + ".ТабличнаяЧасть." + Результат[2];
Объект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект <> Неопределено Тогда
Возврат ИмяОбъекта;
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
Возврат Неопределено;
ИначеЕсли Результат.Количество() = 2 Тогда
Если Результат[0] <> "Документ" ИЛИ Результат[0] <> "Справочник" Тогда
ИмяОбъекта = "Документ." + Результат[0] + ".ТабличнаяЧасть." + Результат[1];
Объект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект <> Неопределено Тогда
Возврат ИмяОбъекта;
КонецЕсли;
ИмяОбъекта = "Справочник." + Результат[0] + ".ТабличнаяЧасть." + Результат[1];
Объект = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);
Если Объект <> Неопределено Тогда
Возврат ИмяОбъекта;
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
НазваниеОбъектаМетаданных = Результат[0];
ТипОбъектаМетаданных = Метаданные.Справочники.Найти(НазваниеОбъектаМетаданных);
Если ТипОбъектаМетаданных <> Неопределено Тогда
ТипОбъектаМетаданных = "Справочник";
Иначе
ТипОбъектаМетаданных = Метаданные.Документы.Найти(НазваниеОбъектаМетаданных);
Если ТипОбъектаМетаданных <> Неопределено Тогда
ТипОбъектаМетаданных = "Документ";
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// Возвращает имя объекта в виде структуры.
//
// Параметры:
// ПолноеИмяОбъекта - Структура:
// * ТипОбъекта - Строка - тип объекта.
// * НазваниеОбъекта - Строка - название объекта.
// * ИмяТабличнойЧасти - Строка - имя табличной части.
//
Функция РазложитьПолноеИмяОбъекта(ПолноеИмяОбъекта) Экспорт
Результат = СтрРазделить(ПолноеИмяОбъекта, ".", Ложь);
ИмяОбъекта = Новый Структура;
ИмяОбъекта.Вставить("ПолноеИмяОбъекта", ПолноеИмяОбъекта);
ИмяОбъекта.Вставить("ТипОбъекта");
ИмяОбъекта.Вставить("НазваниеОбъекта");
ИмяОбъекта.Вставить("ИмяТабличнойЧасти");
Если Результат.Количество() = 2 Тогда
Если Результат[0] = "Документ" ИЛИ Результат[0] = "Справочник" ИЛИ Результат[0] = "БизнесПроцесс"
ИЛИ Результат[0] = "Перечисление" ИЛИ Результат[0] = "ПланВидовХарактеристик"
ИЛИ Результат[0] = "ПланСчетов" Тогда
ИмяОбъекта.ТипОбъекта = Результат[0];
ИмяОбъекта.НазваниеОбъекта = Результат[1];
Иначе
ИмяОбъекта.ТипОбъекта = ОпределитьТипОбъектаМетаданныхПоИмени(Результат[0]);
ИмяОбъекта.НазваниеОбъекта = Результат[0];
ИмяОбъекта.ИмяТабличнойЧасти = Результат[1];
КонецЕсли;
ИначеЕсли Результат.Количество() = 3 Тогда
ИмяОбъекта.ТипОбъекта = Результат[0];
ИмяОбъекта.НазваниеОбъекта = Результат[1];
ИмяОбъекта.ИмяТабличнойЧасти = Результат[2];
ИначеЕсли Результат.Количество() = 4 Тогда
ИмяОбъекта.ТипОбъекта = Результат[0];
ИмяОбъекта.НазваниеОбъекта = Результат[1];
ИмяОбъекта.ИмяТабличнойЧасти = Результат[3];
ИначеЕсли Результат.Количество() = 1 Тогда
ИмяОбъекта.ТипОбъекта = ОпределитьТипОбъектаМетаданныхПоИмени(Результат[0]);
ИмяОбъекта.НазваниеОбъекта = Результат[0];
КонецЕсли;
Возврат ИмяОбъекта;
КонецФункции
Функция ОпределитьТипОбъектаМетаданныхПоИмени(Имя)
Для каждого Объект Из Метаданные.Справочники Цикл
Если Объект.Имя = Имя Тогда
Возврат "Справочник";
КонецЕсли;
КонецЦикла;
Для каждого Объект Из Метаданные.Документы Цикл
Если Объект.Имя = Имя Тогда
Возврат "Документ";
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция МенеджерОбъекта(ИмяОбъектаСопоставления)
МассивОбъекта = РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления);
Если МассивОбъекта.ТипОбъекта = "Документ" Тогда
МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта];
ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда
МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта];
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления);
КонецЕсли;
Возврат МенеджерОбъекта;
КонецФункции
/////////////// Загрузка данных //////////////////////////
Процедура ИнициализироватьКолонки(ИнформацияПоКолонкам, ШаблонСДанными, ВысотаШапки = 1)
Для каждого Строка Из ИнформацияПоКолонкам Цикл
Строка.Позиция = -1;
КонецЦикла;
Для НомерКолонки = 1 По ШаблонСДанными.ШиринаТаблицы Цикл
ЯчейкаЗаголовок = ШаблонСДанными.ПолучитьОбласть(ВысотаШапки, НомерКолонки, ВысотаШапки, НомерКолонки).ТекущаяОбласть;
Если ЗначениеЗаполнено(ЯчейкаЗаголовок.Текст) Тогда
Отбор = Новый Структура("Синоним", СокрЛП(ЯчейкаЗаголовок.Текст));
НайденныеКолонка = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
Если НайденныеКолонка.Количество() > 0 Тогда
НайденныеКолонка[0].Позиция = НомерКолонки;
Иначе
Отбор = Новый Структура("ПредставлениеКолонки", СокрЛП(ЯчейкаЗаголовок.Текст));
НайденныеКолонка = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
Если НайденныеКолонка.Количество() > 0 Тогда
НайденныеКолонка[0].Позиция = НомерКолонки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗагрузитьФайлВТаблицу(ПараметрыВызоваСервера, АдресХранилища) Экспорт
Расширение = ПараметрыВызоваСервера.Расширение;
ШаблонСДанными = ПараметрыВызоваСервера.ШаблонСДанными;
ИмяВременногоФайла = ПараметрыВызоваСервера.ИмяВременногоФайла;
ИнформацияПоКолонкам = ПараметрыВызоваСервера.ИнформацияПоКолонкам;
Если Расширение = "csv" Тогда
ЗагрузитьCSVФайлВТаблицу(ИмяВременногоФайла, ШаблонСДанными, ИнформацияПоКолонкам);
Иначе
ЗагруженныйШаблонСДанными = Новый ТабличныйДокумент;
ЗагруженныйШаблонСДанными.Прочитать(ИмяВременногоФайла);
НомерСтрокиСШапкойТаблицы = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам), 2, 1);
Адрес = "";
ТабличныйДокументВТаблицуЗначений(ЗагруженныйШаблонСДанными, ИнформацияПоКолонкам, Адрес);
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ОбластьВывода = ШаблонСДанными.ПолучитьОбласть(НомерСтрокиСШапкойТаблицы + 1, 1, НомерСтрокиСШапкойТаблицы + 1, ЗагруженныеДанные.Колонки.Количество());
Для Счетчик = 1 По ЗагруженныеДанные.Колонки.Количество() Цикл
ОбластьЗаполнения = ОбластьВывода.Область(1, Счетчик, 1, Счетчик);
Колонка = ИнформацияПоКолонкам.Найти(Счетчик, "Позиция");
Если Колонка <> Неопределено И Колонка.Видимость Тогда
ОбластьЗаполнения.Параметр = Колонка.ИмяКолонки;
ОбластьЗаполнения.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
КонецЕсли;
КонецЦикла;
ВсегоСтрок = ЗагруженныеДанные.Количество();
НомерСтроки = 1;
Для Каждого Выборка Из ЗагруженныеДанные Цикл
УстановитьПроцентПрогресса(ВсегоСтрок, НомерСтроки);
ОбластьВывода.Параметры.Заполнить(Выборка);
ШаблонСДанными.Вывести(ОбластьВывода);
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецЕсли;
АдресХранилища = ПоместитьВоВременноеХранилище(ШаблонСДанными, АдресХранилища);
ФайловаяСистема.УдалитьВременныйФайл(ИмяВременногоФайла);
КонецПроцедуры
#Область РаботаСCSVФайлами
Процедура ЗагрузитьCSVФайлВТаблицу(ИмяФайла, ШаблонСДанными, ИнформацияПоКолонкам)
Файл = Новый Файл(ИмяФайла);
Если НЕ Файл.Существует() Тогда
Возврат;
КонецЕсли;
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);
Строка = ЧтениеТекста.ПрочитатьСтроку();
Если Строка = Неопределено Тогда
ТекстСообщения = НСтр("ru = 'Не получилось загрузить данные из этого файла. Убедитесь в корректности данных в файле.'");
ВызватьИсключение ТекстСообщения;
КонецЕсли;
КолонкиШапки = СтрРазделить(Строка, ";", Ложь);
Источник = Новый ТаблицаЗначений;
ПозицияКолонкиВФайле = Новый Соответствие();
Позиция = 1;
Для каждого Колонка Из КолонкиШапки Цикл
НайденнаяКолонка = НайтиИнформациюОКолонке(ИнформацияПоКолонкам, "Синоним", Колонка);
Если НайденнаяКолонка = Неопределено Тогда
НайденнаяКолонка = НайтиИнформациюОКолонке(ИнформацияПоКолонкам, "ПредставлениеКолонки", Колонка);
КонецЕсли;
Если НайденнаяКолонка <> Неопределено Тогда
НоваяКолонка = Источник.Колонки.Добавить();
НоваяКолонка.Имя = НайденнаяКолонка.ИмяКолонки;
НоваяКолонка.Заголовок = Колонка;
ПозицияКолонкиВФайле.Вставить(Позиция, НоваяКолонка.Имя);
Позиция = Позиция + 1;
КонецЕсли;
КонецЦикла;
Если Источник.Колонки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Пока Строка <> Неопределено Цикл
НоваяСтрока = Источник.Добавить();
Позиция = СтрНайти(Строка, ";");
Индекс = 0;
Пока Позиция > 0 Цикл
Если Источник.Колонки.Количество() < Индекс + 1 Тогда
Прервать;
КонецЕсли;
ИмяКолонки = ПозицияКолонкиВФайле.Получить(Индекс + 1);
Если ИмяКолонки <> Неопределено Тогда
НоваяСтрока[ИмяКолонки] = Лев(Строка, Позиция - 1);
КонецЕсли;
Строка = Сред(Строка, Позиция + 1);
Позиция = СтрНайти(Строка, ";");
Индекс = Индекс + 1;
КонецЦикла;
Если Источник.Колонки.Количество() = Индекс + 1 Тогда
НоваяСтрока[Индекс] = Строка;
КонецЕсли;
Строка = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
ЗаполнитьТаблицуПоЗагруженнымДаннымИзФайла(Источник, ШаблонСДанными, ИнформацияПоКолонкам);
КонецПроцедуры
Процедура СохранитьТаблицуВCSVФайл(ПутьКФайлу, ИнформацияПоКолонкам) Экспорт
ФорматЗаголовкаДляCSV = "";
Для каждого Колонка Из ИнформацияПоКолонкам Цикл
ФорматЗаголовкаДляCSV = ФорматЗаголовкаДляCSV + Колонка.ПредставлениеКолонки + ";";
КонецЦикла;
Если СтрДлина(ФорматЗаголовкаДляCSV) > 0 Тогда
ФорматЗаголовкаДляCSV = Лев(ФорматЗаголовкаДляCSV, СтрДлина(ФорматЗаголовкаДляCSV)-1);
КонецЕсли;
Файл = Новый ЗаписьТекста(ПутьКФайлу);
Файл.ЗаписатьСтроку(ФорматЗаголовкаДляCSV);
Файл.Закрыть();
КонецПроцедуры
#КонецОбласти
#Область ДлительныеОперации
// Запись сопоставленных данных в программу.
//
Процедура ЗаписатьСопоставленныеДанные(ПараметрыВыгрузки, АдресХранилища) Экспорт
СопоставленныеДанные = ПараметрыВыгрузки.СопоставленныеДанные;
ИмяОбъектаСопоставления =ПараметрыВыгрузки.ИмяОбъектаСопоставления;
ПараметрыЗагрузки = ПараметрыВыгрузки.ПараметрыЗагрузки;
ИнформацияПоКолонкам = ПараметрыВыгрузки.ИнформацияПоКолонкам;
СоздаватьЕслиНеСопоставлено = ПараметрыЗагрузки.СоздаватьЕслиНеСопоставлено;
ОбновлятьСуществующие = ПараметрыЗагрузки.ОбновлятьСуществующие;
ИмяСправочника = РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления).НазваниеОбъекта;
МенеджерСправочника = Справочники[ИмяСправочника]; //СправочникМенеджер
ИспользуетсяУправлениеДоступом = Ложь;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
ИспользуетсяУправлениеДоступом = Истина;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
ВидыКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.ВидыКонтактнойИнформацииОбъекта(Справочники[ИмяСправочника].ПустаяСсылка());
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
Свойства = Новый Соответствие;
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
ПустаяСсылкаНаОбъект = Справочники[ИмяСправочника].ПустаяСсылка();
Если МодульУправлениеСвойствами.ИспользоватьДопРеквизиты(ПустаяСсылкаНаОбъект)
ИЛИ МодульУправлениеСвойствами.ИспользоватьДопСведения(ПустаяСсылкаНаОбъект) Тогда
СписокСвойств = МодульУправлениеСвойствами.СвойстваОбъекта(ПустаяСсылкаНаОбъект);
Для каждого Свойство Из СписокСвойств Цикл
Свойства.Вставить(Свойство.Наименование, Свойство);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ТаблицаСвойств = Новый ТаблицаЗначений;
ТаблицаСвойств.Колонки.Добавить("Свойство");
ТаблицаСвойств.Колонки.Добавить("Значение");
НомерСтроки = 0;
ВсегоСтрок = СопоставленныеДанные.Количество();
Для каждого СтрокаТаблицы Из СопоставленныеДанные Цикл
НеобходимоОчиститьКонтактнуюИнформацию = Ложь;
НомерСтроки = НомерСтроки + 1;
Если (ЗначениеЗаполнено(СтрокаТаблицы.ОбъектСопоставления) И НЕ ОбновлятьСуществующие)
ИЛИ (НЕ ЗначениеЗаполнено(СтрокаТаблицы.ОбъектСопоставления) И НЕ СоздаватьЕслиНеСопоставлено) Тогда
СтрокаТаблицы.РезультатСопоставленияСтроки = "Пропущен";
УстановитьПроцентПрогресса(ВсегоСтрок, НомерСтроки);
Продолжить;
КонецЕсли;
Если ИспользуетсяУправлениеДоступом Тогда
МодульУправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Истина);
КонецЕсли;
НачатьТранзакцию();
Попытка
Если ЗначениеЗаполнено(СтрокаТаблицы.ОбъектСопоставления) Тогда
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник." + ИмяСправочника);
ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаТаблицы.ОбъектСопоставления);
Блокировка.Заблокировать();
ЭлементСправочника = СтрокаТаблицы.ОбъектСопоставления.ПолучитьОбъект();
СтрокаТаблицы.РезультатСопоставленияСтроки = "Обновлен";
НеобходимоОчиститьКонтактнуюИнформацию = Истина;
Если ЭлементСправочника = Неопределено Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Номенклатура с артикулом %1 не существует.'"),
СтрокаТаблицы.Артикул);
КонецЕсли;
Иначе
ЭлементСправочника = МенеджерСправочника.СоздатьЭлемент();
СтрокаТаблицы.ОбъектСопоставления = ЭлементСправочника;
СтрокаТаблицы.РезультатСопоставленияСтроки = "Создан";
КонецЕсли;
Для каждого Колонка Из ИнформацияПоКолонкам Цикл
Если Колонка.Видимость Тогда
Если СтрНачинаетсяС(Колонка.ИмяКолонки, "КонтактнаяИнформация_") Тогда
ИмяВидаКИ = СтандартныеПодсистемыСервер.ПреобразоватьАдаптированноеНаименованиеКолонкиВСтроку(Сред(Колонка.ИмяКолонки, СтрДлина("КонтактнаяИнформация_") + 1));
ВидКонтактнойИнформации = ВидыКонтактнойИнформации.Найти(ИмяВидаКИ, "Наименование");
Если НеобходимоОчиститьКонтактнуюИнформацию Тогда
ЭлементСправочника.КонтактнаяИнформация.Очистить();
НеобходимоОчиститьКонтактнуюИнформацию = Ложь;
КонецЕсли;
Если ВидКонтактнойИнформации <> Неопределено Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
ЗначениеКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(СтрокаТаблицы[Колонка.ИмяКолонки], ВидКонтактнойИнформации.Ссылка);
МодульУправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ЭлементСправочника, ЗначениеКонтактнойИнформации, ВидКонтактнойИнформации.Ссылка, ВидКонтактнойИнформации.Тип);
КонецЕсли;
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(Колонка.ИмяКолонки, "ДополнительныйРеквизит_") Тогда
ДобавитьЗначениеСвойства(ТаблицаСвойств, Свойства, "ДополнительныйРеквизит_", Колонка.ИмяКолонки, СтрокаТаблицы[Колонка.ИмяКолонки]);
ИначеЕсли СтрНачинаетсяС(Колонка.ИмяКолонки, "Свойство_") Тогда
ДобавитьЗначениеСвойства(ТаблицаСвойств, Свойства, "Свойство_", Колонка.ИмяКолонки, СтрокаТаблицы[Колонка.ИмяКолонки]);
Иначе
ЭлементСправочника[Колонка.ИмяКолонки] = СтрокаТаблицы[Колонка.ИмяКолонки];
КонецЕсли;
КонецЕсли;
КонецЦикла;
УстановитьПроцентПрогресса(ВсегоСтрок, НомерСтроки);
Если НЕ ЭлементСправочника.ПроверитьЗаполнение() Тогда
СообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
ТекстСообщений = "";
Разделитель = "";
Для каждого СообщениеПользователю Из СообщенияПользователю Цикл
Если ЗначениеЗаполнено(СообщениеПользователю.Поле) Тогда
ТекстСообщений = ТекстСообщений + Разделитель + СообщениеПользователю.Текст;
Разделитель = Символы.ПС;
КонецЕсли;
КонецЦикла;
ВызватьИсключение ТекстСообщений;
КонецЕсли;
ЭлементСправочника.Записать();
// Свойства записываем когда объект уже существует.
Если ТаблицаСвойств.Количество() > 0 И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ЭлементСправочника.Ссылка, ТаблицаСвойств);
КонецЕсли;
Если ИспользуетсяУправлениеДоступом Тогда
МодульУправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Ложь);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Если ИспользуетсяУправлениеДоступом Тогда
МодульУправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Ложь, Ложь);
КонецЕсли;
ИнформацияОбОшибке = ИнформацияОбОшибке();
СтрокаТаблицы.РезультатСопоставленияСтроки = "Пропущен";
СтрокаТаблицы.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось записать элемент справочника %1 по причине:
|%2'"),
ИмяСправочника, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,
МенеджерСправочника, ЭлементСправочника.Ссылка, ТекстСообщения);
КонецПопытки;
КонецЦикла;
АдресХранилища = ПоместитьВоВременноеХранилище(СопоставленныеДанные, АдресХранилища);
КонецПроцедуры
Процедура УстановитьПроцентПрогресса(Всего, НомерСтроки)
Процент = НомерСтроки * 50 / Всего;
МодульДлительныеОперации = ОбщегоНазначения.ОбщийМодуль("ДлительныеОперации");
МодульДлительныеОперации.СообщитьПрогресс(Процент);
КонецПроцедуры
Процедура СформироватьОтчетОЗагрузкеФон(ПараметрыВыгрузки, АдресХранилища) Экспорт
ТаблицаОтчет = ПараметрыВыгрузки.ТаблицаОтчет;
СопоставленныеДанные = ПараметрыВыгрузки.СопоставленныеДанные;
ИнформацияПоКолонкам = ПараметрыВыгрузки.ИнформацияПоКолонкам;
ШаблонСДанными = ПараметрыВыгрузки.ШаблонСДанными;
ТипОтчета = ПараметрыВыгрузки.ТипОтчета;
РассчитыватьПроцентПрогресса = ПараметрыВыгрузки.РассчитыватьПроцентПрогресса;
Если Не ЗначениеЗаполнено(ТипОтчета) Тогда
ТипОтчета = "ВсеЭлементы";
КонецЕсли;
СформироватьМакетОтчета(ТаблицаОтчет, ШаблонСДанными);
КоличествоСозданных = 0;
КоличествоОбновленных = 0;
КоличествоПропущенных = 0;
КоличествоПропущенныхСОшибкой = 0;
Для НомерСтроки = 1 По СопоставленныеДанные.Количество() Цикл
Строка = СопоставленныеДанные.Получить(НомерСтроки - 1);
Ячейка = ТаблицаОтчет.ПолучитьОбласть(НомерСтроки + 1, 1, НомерСтроки + 1, 1);
Ячейка.ТекущаяОбласть.Текст = Строка.РезультатСопоставленияСтроки;
Ячейка.ТекущаяОбласть.Расшифровка = Строка.ОбъектСопоставления;
Ячейка.ТекущаяОбласть.Примечание.Текст = Строка.ОписаниеОшибки;
Если Строка.РезультатСопоставленияСтроки = "Создан" Тогда
Ячейка.ТекущаяОбласть.ЦветТекста = ЦветаСтиля.РезультатУспехЦвет;
КоличествоСозданных = КоличествоСозданных + 1;
ИначеЕсли Строка.РезультатСопоставленияСтроки = "Обновлен" Тогда
Ячейка.ТекущаяОбласть.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
КоличествоОбновленных = КоличествоОбновленных + 1;
Иначе
Ячейка.ТекущаяОбласть.ЦветТекста = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет;
КоличествоПропущенных = КоличествоПропущенных + 1;
Если ЗначениеЗаполнено(Строка.ОписаниеОшибки) Тогда
КоличествоПропущенныхСОшибкой = КоличествоПропущенныхСОшибкой + 1;
КонецЕсли;
КонецЕсли;
Если ТипОтчета = "Новые" И Строка.РезультатСопоставленияСтроки <> "Создан" Тогда
Продолжить;
КонецЕсли;
Если ТипОтчета = "Обновленные" И Строка.РезультатСопоставленияСтроки <> "Обновлен" Тогда
Продолжить;
КонецЕсли;
Если ТипОтчета = "Пропущенные" И Строка.РезультатСопоставленияСтроки <> "Пропущен" Тогда
Продолжить;
КонецЕсли;
ТаблицаОтчет.Вывести(Ячейка);
Для Индекс = 1 По ИнформацияПоКолонкам.Количество() Цикл
Ячейка = ТаблицаОтчет.ПолучитьОбласть(НомерСтроки + 1, Индекс + 1, НомерСтроки + 1, Индекс + 1);
Отбор = Новый Структура("Позиция", Индекс);
НайденныеКолонки = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
Если НайденныеКолонки.Количество() > 0 Тогда
ИмяКолонки = НайденныеКолонки[0].ИмяКолонки;
Ячейка.ТекущаяОбласть.Расшифровка = Строка.ОбъектСопоставления;
Ячейка.ТекущаяОбласть.Текст = Строка[ИмяКолонки];
Ячейка.ТекущаяОбласть.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Обрезать;
КонецЕсли;
ТаблицаОтчет.Присоединить(Ячейка);
КонецЦикла;
Если РассчитыватьПроцентПрогресса Тогда
Процент = Окр(НомерСтроки * 50 / СопоставленныеДанные.Количество()) + 50;
МодульДлительныеОперации = ОбщегоНазначения.ОбщийМодуль("ДлительныеОперации");
МодульДлительныеОперации.СообщитьПрогресс(Процент);
КонецЕсли;
КонецЦикла;
Результат = Новый Структура;
Результат.Вставить("ТипОтчета", ТипОтчета);
Результат.Вставить("Всего", СопоставленныеДанные.Количество());
Результат.Вставить("Создано", КоличествоСозданных);
Результат.Вставить("Обновлено", КоличествоОбновленных);
Результат.Вставить("Пропущено", КоличествоПропущенных);
Результат.Вставить("Некорректных", КоличествоПропущенныхСОшибкой);
Результат.Вставить("ТаблицаОтчет", ТаблицаОтчет);
АдресХранилища = ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры
Процедура СформироватьМакетОтчета(ТаблицаОтчет, ШаблонСДанными)
ТаблицаОтчет.Очистить();
Ячейка = ШаблонСДанными.ПолучитьОбласть(1, 1, 1, 1);
ШапкаТаблицы = ШаблонСДанными.ПолучитьОбласть("R1");
ЗаполнитьЯчейкуЗаголовкаМакета(Ячейка, НСтр("ru = 'Результат'"), 12, НСтр("ru = 'Результат загрузки данных'"), Истина);
ТаблицаОтчет.Присоединить(ШапкаТаблицы);
ТаблицаОтчет.ВставитьОбласть(Ячейка.ТекущаяОбласть, ТаблицаОтчет.Область("C1"), ТипСмещенияТабличногоДокумента.ПоГоризонтали);
ТаблицаОтчет.ФиксацияСверху = 1;
КонецПроцедуры
#КонецОбласти
//////////////////// Функциональные опции ///////////////////////////////////////
// Возвращает колонки-реквизиты зависимые от функциональных опций.
//
// Параметры:
// ПолноеИмяОбъекта - Строка - полное наименование объекта.
// Возвращаемое значение:
// - Соответствие:
// * Ключ - Строка - имя колонки.
// * Значение - Булево - признак доступности.
//
Функция КолонкиЗависимыеОтФункциональныхОпций(ПолноеИмяОбъекта)
ИнформацияОФункциональныхОпциях = Новый Соответствие;
ИмяОбъектаССуффиксомРеквизит = ПолноеИмяОбъекта + ".Реквизит.";
ФункциональныеОпции = СтандартныеПодсистемыПовтИсп.ДоступностьОбъектовПоОпциям();
Для Каждого ФункциональнаяОпция Из ФункциональныеОпции Цикл
Если СтрНачинаетсяС(ФункциональнаяОпция.Ключ, ИмяОбъектаССуффиксомРеквизит) Тогда
ИнформацияОФункциональныхОпциях.Вставить(Сред(ФункциональнаяОпция.Ключ, СтрДлина(ИмяОбъектаССуффиксомРеквизит) + 1), ФункциональнаяОпция.Значение);
КонецЕсли;
КонецЦикла;
Возврат ИнформацияОФункциональныхОпциях;
КонецФункции
//////////////////// Служебные методы ///////////////////////////////////////////
Процедура ДобавитьЗначениеСвойства(ТаблицаСвойств, Свойства, Префикс, ИмяКолонки, Значение)
ИмяСвойства = СокрЛП(СтандартныеПодсистемыСервер.ПреобразоватьАдаптированноеНаименованиеКолонкиВСтроку(Сред(ИмяКолонки, СтрДлина(Префикс) + 1)));
Свойство = Свойства.Получить(ИмяСвойства); // ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения
Если Свойство <> Неопределено Тогда
НоваяСтрокаСвойств = ТаблицаСвойств.Добавить();
НоваяСтрокаСвойств.Свойство = Свойство.Ссылка;
НоваяСтрокаСвойств.Значение = Значение;
КонецЕсли;
КонецПроцедуры
// Возвращает строковую константу для формирования сообщений журнала регистрации.
//
// Возвращаемое значение:
// Строка
//
Функция СобытиеЖурналаРегистрации()
Возврат НСтр("ru = 'Загрузка данных из файла'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецФункции
#КонецОбласти
#КонецЕсли