RDT1C/DataProcessors/ирЗагрузкаТабличныхДанных/Ext/ObjectModule.bsl
Администратор e4a02edfe7 .
2021-06-24 22:45:14 +03:00

2522 lines
186 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.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
// Структура примитивных типов (Булево, Дата, Строка, Число)
Перем ПримитивныеТипы;
Перем мИмяКолонкиНомерСтроки Экспорт;
Перем мИмяКолонкиРезультатПоиска Экспорт;
Перем мИмяКолонкиРезультатЗаписи Экспорт;
Перем мИмяКолонкиСообщенияОбработки Экспорт;
Перем мАлгоритмКонвертацииЗначенияПараметры Экспорт;
Перем мЭтоСсылочныйОбъект Экспорт;
Перем мПлатформа Экспорт;
Перем мКоличествоУспешно Экспорт;
Перем мКоличествоНеуспешно Экспорт;
Перем мТекущееПолноеИмяТаблицы Экспорт;
Перем мКонсольЗапросов Экспорт;
Перем мДополнениеЗапросом Экспорт;
Перем мСуффиксСырыхДанных Экспорт;
// Выводит сообщение об ошибке и выставляет параметр Отказ в "Истина".
// В случае работы на клиенте или на сервере выводит в окно сообщений,
// в случае внешнего соединения вызывает исключение.
//
// Параметры:
// ТекстСообщения - строка, текст сообщения.
// Отказ - булево, признак отказа (необязательный).
//
Функция ПолучитьПричинуОшибки(ТекстСообщения, Отказ = Ложь, Заголовок = "") Экспорт
НачалоСлужебногоСообщения = Найти(ТекстСообщения, "{");
ОкончаниеСлужебногоСообщения = Найти(ТекстСообщения, "}:");
Если ОкончаниеСлужебногоСообщения > 0 И НачалоСлужебногоСообщения > 0 Тогда
ТекстСообщения = Лев(ТекстСообщения, (НачалоСлужебногоСообщения - 1)) +
Сред(ТекстСообщения, (ОкончаниеСлужебногоСообщения + 2));
КонецЕсли;
Отказ = Истина;
Возврат ТекстСообщения;
КонецФункции
// Функция приводит строковое представление числа к его значению
//
// Параметры:
// Представление - Представление числа
// ОписаниеТипов - Допустимое описание типов численного значения
//
// Возвращаемое значение:
// Значение типа число
//
Функция мПривестиКЧислу(Представление, Знач ОписаниеТипов = Неопределено, Примечание = "") Экспорт
Если ОписаниеТипов = Неопределено Тогда
ОписаниеТипов = Новый ОписаниеТипов("Число");
КонецЕсли;
НРегПредставление = НРег(Представление);
Если НРегПредставление = "да" или НРегПредставление = "истина" или НРегПредставление = "включено" Тогда
Возврат 1;
ИначеЕсли НРегПредставление = "нет" или НРегПредставление = "ложь" или НРегПредставление = "выключено" Тогда
Возврат 0;
КонецЕсли;
Результат = СтрЗаменить(Представление, " ", "");
Попытка
Результат = Число(Результат);
Исключение
Примечание = "Неправильный формат числа";
Возврат 0;
КонецПопытки;
Результат1 = ОписаниеТипов.ПривестиЗначение(Результат);
Если Не Результат1 = Результат Тогда
Примечание = "Недопустимое числовое значение";
КонецЕсли;
Возврат Результат1;
КонецФункции
// Функция возвращает части представления даты
//
// Параметры:
// Представление - Представление даты
//
// Возвращаемое значение:
// массив частей даты
//
Функция ПолучитьЧастиПредставленияДаты(Знач Представление)
МассивЧастей = Новый Массив;
НачалоЦифры = 0;
Для к = 1 По СтрДлина(Представление) Цикл
Символ = Сред(Представление, к ,1);
ЭтоЦифра = Символ >= "0" и Символ <= "9";
Если ЭтоЦифра Тогда
Если НачалоЦифры = 0 Тогда
НачалоЦифры = к;
КонецЕсли;
Иначе
Если Не НачалоЦифры = 0 Тогда
МассивЧастей.Добавить(Число(Сред(Представление, НачалоЦифры, к - НачалоЦифры)));
КонецЕсли;
НачалоЦифры = 0;
КонецЕсли;
КонецЦикла;
Если Не НачалоЦифры = 0 Тогда
МассивЧастей.Добавить(Число(Сред(Представление, НачалоЦифры)));
КонецЕсли;
Возврат МассивЧастей;
КонецФункции
// Функция приводит строковое представление даты к его значению
//
// Параметры:
// Представление - Представление числа
// ОписаниеТипов - Допустимое описание типов значения типа дата
//
// Возвращаемое значение:
// Значение типа дата
//
Функция мПривестиКДате(Представление, ОписаниеТипов = Неопределено, Примечание = "", АмериканскоеПоложениеМесяца = Ложь) Экспорт
Если ОписаниеТипов = Неопределено Тогда
ОписаниеТипов = Новый ОписаниеТипов("Дата");
КонецЕсли;
Результат = ОписаниеТипов.ПривестиЗначение(Представление);
Если Результат = '00010101' Тогда
МассивЧастей = ПолучитьЧастиПредставленияДаты(Представление);
Если ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время Тогда
Попытка
Если МассивЧастей.Количество() = 3 Тогда
Результат = Дата(1,1,1, МассивЧастей[0], МассивЧастей[1], МассивЧастей[2]);
ИначеЕсли МассивЧастей.Количество() = 6 Тогда
Результат = Дата(1,1,1, МассивЧастей[3], МассивЧастей[4], МассивЧастей[5]);
КонецЕсли;
Исключение
Примечание = "Неправильный формат даты";
КонецПопытки;
ИначеЕсли Ложь
Или МассивЧастей.Количество() = 3
Или МассивЧастей.Количество() = 6
Или МассивЧастей.Количество() = 7 // С миллисекундами. Просто выбрасываем их
Тогда
Если МассивЧастей[0] >= 1000 Тогда
Временно = МассивЧастей[0];
МассивЧастей[0] = МассивЧастей[2];
МассивЧастей[2] = Временно;
КонецЕсли;
Если МассивЧастей[2] < 100 Тогда
МассивЧастей[2] = МассивЧастей[2] + ?(МассивЧастей[2] < 30, 2000,1900);
КонецЕсли;
//Если МассивЧастей.Количество() = 7 Тогда
// ДробнаяЧасть = МассивЧастей[7];
//Иначе
// ДробнаяЧасть = 0;
//КонецЕсли;
Если АмериканскоеПоложениеМесяца Тогда
Временно = МассивЧастей[0];
МассивЧастей[0] = МассивЧастей[1];
МассивЧастей[1] = Временно;
КонецЕсли;
Попытка
Если МассивЧастей.Количество() = 3 или ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
Результат = Дата(МассивЧастей[2], МассивЧастей[1], МассивЧастей[0]);
Иначе
Результат = Дата(МассивЧастей[2], МассивЧастей[1], МассивЧастей[0], МассивЧастей[3], МассивЧастей[4], МассивЧастей[5]);
КонецЕсли;
Исключение
Примечание = "Неправильный формат даты";
КонецПопытки;
Иначе
Примечание = "Неправильный формат даты";
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция мПривестиКУникальномуИдентификатору(Представление, Примечание = "")
Попытка
Результат = Новый УникальныйИдентификатор(Представление);
Исключение
Примечание = "Неправильный формат уникального идентификатора";
КонецПопытки;
Возврат Результат;
КонецФункции
Функция мПривестиКОписаниюТипов(Представление, Примечание = "")
Попытка
Результат = Новый ОписаниеТипов(Представление);
Исключение
Примечание = "Неправильный формат описания типов";
КонецПопытки;
Возврат Результат;
КонецФункции
// Функция вычисляет значение ячейки для режима "Вычислять"
//
// Параметры:
// Алгоритм - програмный код, который необходимо выполнить
// ТекущиеДанные - структура загруженных значений
// ТекстЯчейки - текст текущей ячейки
// ТекстыЯчеек - массив текстов ячеек строки
// Результат - результат вычисления
//
// Возвращаемое значение:
// Структура, сордержащая Результат и ОписаниеОшибки
Функция ВычислитьЗначениеЯчейки(Знач АлгоритмОбъект, Знач ТекущиеДанные, Знач ТекстЯчейки, Знач ТекстыЯчеек, Знач Результат)
ТекстЯчейки = СокрЛП(ТекстЯчейки);
ОписаниеОшибки = "";
Попытка
мПлатформа.ВыполнитьМетодАлгоритма(АлгоритмОбъект, 0, Результат, ТекстЯчейки, ТекстыЯчеек, ТекущиеДанные, ОписаниеОшибки);
Исключение
ОписаниеОшибки = ПолучитьПричинуОшибки(ОписаниеОшибки());
КонецПопытки;
Возврат Новый Структура("Результат, ОписаниеОшибки", Результат, ОписаниеОшибки);
КонецФункции
// Функция записывает объект в информационную базу данных, используя
// события определенные пользователем в форме редактирования событий
//
// Параметры:
// Объект - записываемый объект
// ТекстыЯчеек - массив текстов ячеек, загружаемой строки
//
// Возвращаемое значение:
// Истина, если объект записан, Ложь - иначе
//
Функция ЗаписатьОбъект(ОбъектБД, выхОписаниеОшибки, СтрокиТаблицыБД)
Отказ = Ложь;
НачатьТранзакцию();
Успех = ирОбщий.ОбработатьСобытиеЛкс(СобытияОбработкиОбъектов, Метаданные().Макеты.АлгоритмПередЗаписьюОбъекта.Имя, выхОписаниеОшибки,, ОбъектБД.Данные, ОбъектБД.Методы, Отказ);
Если Не Успех Тогда
Отказ = Истина;
КонецЕсли;
Если Не Отказ Тогда
Попытка
ирОбщий.ЗаписатьОбъектЛкс(ОбъектБД.Методы);
ИмяПоляСсылка = "";
Для каждого СтрокаСопоставленияБД Из СопоставлениеКолонокБД Цикл
Если Истина
И ЗначениеЗаполнено(СтрокаСопоставленияБД.ДопРеквизит)
И СтрокаСопоставленияБД.ДоступноИзменение
И СтрокаСопоставленияБД.Пометка
Тогда
НовоеЗначение = СтрокиТаблицыБД[0][СтрокаСопоставленияБД.ИмяКолонкиПриемника];
ирОбщий.УстановитьЗначениеДопРеквизитаБСПЛкс(ОбъектБД.Методы, СтрокаСопоставленияБД.ДопРеквизит, НовоеЗначение, ИмяПоляСсылка, Ложь, Истина);
КонецЕсли;
КонецЦикла;
Исключение
Отказ = Истина;
выхОписаниеОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если Не Отказ Тогда
Успех = ирОбщий.ОбработатьСобытиеЛкс(СобытияОбработкиОбъектов, Метаданные().Макеты.АлгоритмПриЗаписиОбъекта.Имя, выхОписаниеОшибки,, ОбъектБД.Данные, ОбъектБД.Методы, Отказ);
Если Не Успех Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Если Не Отказ Тогда
ЗафиксироватьТранзакцию();
Иначе
//выхОписаниеОшибки = ПолучитьПричинуОшибки(выхОписаниеОшибки); // https://www.hostedredmine.com/issues/891037
ОтменитьТранзакцию();
КонецЕсли;
Возврат Не Отказ;
КонецФункции
#Если Клиент Тогда
Процедура УстановитьИсточник() Экспорт
мКонсольЗапросов = Неопределено;
ЭтотОбъект.ПредставлениеТаблицы = "";
ЭтотОбъект.мЭтоСсылочныйОбъект = Ложь;
МетаданныеИсточника = МетаданныеТаблицыБД();
Если МетаданныеИсточника <> Неопределено Тогда
ЭтотОбъект.ПредставлениеТаблицы = МетаданныеИсточника.Представление();
ЭтотОбъект.мЭтоСсылочныйОбъект = ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(МетаданныеИсточника);
ИначеЕсли ЗначениеЗаполнено(ПолноеИмяТаблицы) Тогда
Если Не ирОбщий.ЛиТаблицаБДСуществуетЛкс(ПолноеИмяТаблицы) Тогда
ирОбщий.СообщитьЛкс("Таблица БД " + ПолноеИмяТаблицы + " не найдена");
ЭтотОбъект.ПолноеИмяТаблицы = "";
КонецЕсли;
КонецЕсли;
Если Ложь
Или ТаблицаЗначений.Колонки.Количество() < 2
Или (Истина
И ТаблицаЗначений.Колонки.Количество() <= 2
И ЗначениеЗаполнено(ПолноеИмяТаблицы))
Тогда
ОбновитьКолонкиТаблицыЗначений(, ЗначениеЗаполнено(ПолноеИмяТаблицы));
КонецЕсли;
СопоставлениеКолонокТЗЗаполнить();
ЗаполнитьСопоставлениеКолонокБД();
Если ТабличныйДокумент.ВысотаТаблицы <= СтрокаЗаголовковТД Тогда
ОбновитьДанныеТабличногоДокумента(Истина);
КонецЕсли;
мТекущееПолноеИмяТаблицы = ПолноеИмяТаблицы;
КонецПроцедуры
// Процедура выполняет контроль заполнения данных табличного документа
// сообщает об ошибках и устанавливает коментарии к ошибочным ячейкам
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, у которого необходимо сформировать шапку
//
Процедура КонтрольЗаполнения() Экспорт
СтруктураПозицийТД = СтруктураПозицийТД();
КоличествоЭлементов = ТабличныйДокумент.ВысотаТаблицы - СтруктураПозицийТД.НомерСтрокиДанных + 1;
ОчиститьСообщения();
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЭлементов, "Контроль заполнения");
КоличествоОшибокКонвертации = 0;
Для К = 0 По КоличествоЭлементов - 1 Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
КонтрольЗаполненияСтроки(ТабличныйДокумент, К + СтруктураПозицийТД.НомерСтрокиДанных,, КоличествоОшибокКонвертации);
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
СообщитьИтогиКонвертации(КоличествоОшибокКонвертации);
КонецПроцедуры // КонтрольЗаполнения()
// Функция считывает в табличный документ данные из файла в формате Excel
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, в который необходимо прочитать данные
// ИмяФайла - имя файла в формате Excel, из которого необходимо прочитать данные
// НомерЛистаExcel - номер листа книги Excel, из которого необходимо прочитать данные
//
// Возвращаемое значение:
// Истина, если файл прочитан, Ложь - иначе
//
Функция _мПрочитатьТабличныйДокументИзExcel(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт
#Если Сервер И Не Сервер Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
#КонецЕсли
xlLastCell = 11;
ВыбФайл = Новый Файл(ИмяФайла);
Если НЕ ВыбФайл.Существует() Тогда
ирОбщий.СообщитьЛкс("Файл не существует!");
Возврат Ложь;
КонецЕсли;
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяФайла);
Состояние("Обработка файла Microsoft Excel...");
ExcelЛист = Excel.Sheets(НомерЛистаExcel);
Исключение
ирОбщий.СообщитьЛкс("Ошибка. Возможно неверно указан номер листа книги Excel.");
Возврат ложь;
КонецПопытки;
ТабличныйДокумент.Очистить();
ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
RowCount = ActiveCell.Row;
ColumnCount = ActiveCell.Column;
Для Column = 1 По ColumnCount Цикл
ТабличныйДокумент.Область("C" + Формат(Column, "ЧГ=")).ШиринаКолонки = ExcelЛист.Columns(Column).ColumnWidth;
КонецЦикла;
Для Row = 1 По RowCount Цикл
Для Column = 1 По ColumnCount Цикл
ТабличныйДокумент.Область("R" + Формат(Row, "ЧГ=") +"C" + Формат(Column, "ЧГ=")).Текст = ExcelЛист.Cells(Row,Column).Text;
КонецЦикла;
КонецЦикла;
Excel.WorkBooks.Close();
Excel = 0;
Возврат Истина;
КонецФункции // ()
// Функция интерактивно предлагает выбрать значение в зависимости от переданных параметров
// В форме, в списке выбора или выдает сообщение, что "Данная ячейка не может содержать значение"
//
// Параметры:
// Значение - значение, которое необходимо выбрать
// ОписаниеТипов - Описание типов выбираемого значения
// СвязьПоТипу - ПВХ связи значения по типу
// ЭлементСвязиПоТипу - номер элемента связи по типу
//
// Возвращаемое значение:
// Истина - значение выбрано, ложь - иначе.
//
Функция мВыбратьЗначение(Значение, ОписаниеТипов, СвязьПоТипу, ЭлементСвязиПоТипу, СвязьПоВладельцу, ВыборГруппы = Ложь)
Если СвязьПоТипу = Неопределено Тогда
Типы = ОписаниеТипов;
Иначе
ВидыСубконто = СвязьПоТипу.ВидыСубконто;
Если ЭлементСвязиПоТипу > ВидыСубконто.Количество() Тогда
Предупреждение("Данная ячейка не может содержать значение");
Возврат ложь;
КонецЕсли;
Типы = СвязьПоТипу.ВидыСубконто[ЭлементСвязиПоТипу-1].ВидСубконто.ТипЗначения;
КонецЕсли;
Если Типы.Типы().Количество() = 1 Тогда
Тип = Типы.Типы()[0];
Менеджер = ирОбщий.ПолучитьМенеджерЛкс(Тип);
Если Менеджер = Неопределено Тогда
Возврат ВвестиЗначение(Значение,,Типы);
Иначе
//Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда
// Если ВыборГруппы Тогда
// ФормаВыбора = Менеджер.ПолучитьФормуВыбораГруппы();
// Иначе
// ФормаВыбора = Менеджер.ПолучитьФормуВыбора();
// КонецЕсли;
// ФормаВыбора.ПараметрВыборПоВладельцу = СвязьПоВладельцу;
// ФормаВыбора.ПараметрОтборПоВладельцу = СвязьПоВладельцу;
//Иначе
// ФормаВыбора = Менеджер.ПолучитьФормуВыбора();
//КонецЕсли;
//ФормаВыбора.НачальноеЗначениеВыбора = Значение;
//Значение = ФормаВыбора.ОткрытьМодально();
Отбор = Новый Структура();
Если ЗначениеЗаполнено(СвязьПоВладельцу) Тогда
Отбор.Вставить("Владелец", СвязьПоВладельцу);
КонецЕсли;
Если ВыборГруппы Тогда
Отбор.Вставить("ЭтоГруппа", Истина);
КонецЕсли;
Значение = ирОбщий.ОткрытьФормуСпискаЛкс(Тип, Отбор,,, Истина,, Значение, Истина);
Возврат Значение <> Неопределено;
КонецЕсли;
Иначе
ФормаВыбораЗначения = ПолучитьФорму("ФормаВыбораЗначения");
ФормаВыбораЗначения.ЭлементыФормы.Значение.ВыборПоВладельцу = СвязьПоВладельцу;
ФормаВыбораЗначения.ЭлементыФормы.Значение.ТипЗначения = ОписаниеТипов;
ФормаВыбораЗначения.ЭлементыФормы.Значение.ОграничениеТипа = Типы;
ФормаВыбораЗначения.ЭлементыФормы.Значение.ЭлементСвязиПоТипу = ЭлементСвязиПоТипу;
ФормаВыбораЗначения.ЭлементыФормы.Значение.Значение = Значение;
Значение = ФормаВыбораЗначения.ОткрытьМодально();
Возврат Не Значение = Неопределено;
КонецЕсли;
КонецФункции
// Функция выполняет загрузку данных из табличного документа в справочник или табличную часть документа
//
// Параметры:
// ТолькоВыделенныеСтрокиТД - Булево -
// ЭтаФорма - Форма - ирЗагрузкаТабличныхДанных
//
// Возвращаемое значение:
// Истина, если - загрузка прошла без ошибок, Ложь - иначе
//
Функция ЗагрузитьВТаблицуЗначенийИзТабличногоДокумента(ТолькоВыделенныеСтрокиТД = Ложь, ЭтаФорма = Неопределено) Экспорт
#Если Сервер И Не Сервер Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
#КонецЕсли
Если СопоставлениеКолонокТЗ.НайтиСтроки(Новый Структура("Пометка", Истина)).Количество() = 0 Тогда
ирОбщий.СообщитьЛкс("Не отмечено колонок для преобразования!");
Возврат Ложь;
КонецЕсли;
СтруктураПозицийТД = СтруктураПозицийТД();
КэшПоиска = Неопределено;
КоличествоОшибокКонвертации = 0;
НачальнаяСтрока = СтруктураПозицийТД.НомерСтрокиДанных;
КонечнаяСтрока = ТабличныйДокумент.ВысотаТаблицы;
Если ТолькоВыделенныеСтрокиТД Тогда
Если ТабличныйДокумент.ТекущаяОбласть.Верх <= КонечнаяСтрока Тогда
НачальнаяСтрока = Макс(НачальнаяСтрока, ТабличныйДокумент.ТекущаяОбласть.Верх);
КонецЕсли;
Если ТабличныйДокумент.ТекущаяОбласть.Низ >= НачальнаяСтрока Тогда
КонечнаяСтрока = Мин(КонечнаяСтрока, ТабличныйДокумент.ТекущаяОбласть.Низ);
КонецЕсли;
КонецЕсли;
КоличествоЭлементов = КонечнаяСтрока - НачальнаяСтрока + 1;
Если КоличествоЭлементов <= 0 Тогда
ирОбщий.СообщитьЛкс("Нет данных для конвертации. Задайте ""Начало данных"" на странице ""Табличный документ""");
Возврат Ложь;
КонецЕсли;
СоответствиеКолонок = ПолучитьКолонкиТабличногоДокумента(СтруктураПозицийТД);
ОчиститьСообщения();
ТаблицаЗначений.Очистить();
Если ДобавлятьСырыеДанныеВТЗ Тогда
Для каждого СтрокаСопоставления Из СопоставлениеКолонокТЗ.НайтиСтроки(Новый Структура("Пометка", Истина)) Цикл
Если СтрокаСопоставления.РежимКонвертации = "Устанавливать" Тогда
Продолжить;
КонецЕсли;
ИмяСыройКолонки = СтрокаСопоставления.ИмяКолонкиПриемника + мСуффиксСырыхДанных;
Если ТаблицаЗначений.Колонки.Найти(ИмяСыройКолонки) = Неопределено Тогда
ЗаголовокКолонки = ТаблицаЗначений.Колонки[СтрЗаменить(ИмяСыройКолонки, мСуффиксСырыхДанных, "")].Заголовок + ". Сырое";
ТаблицаЗначений.Колонки.Добавить(ИмяСыройКолонки, Новый ОписаниеТипов("Строка"), ЗаголовокКолонки);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЭтаФорма <> Неопределено Тогда
ЭтаФорма.ТаблицаЗначенийОтобранное = ТаблицаЗначений;
ЭтаФорма.ОбновитьКолонкиТабличногоПоляТаблицыЗначений();
ЭтаФорма.ТаблицаЗначенийОтобранное = ТаблицаЗначений;
ЭтаФорма.ТекущийЭлемент = ЭтаФорма.ЭлементыФормы.ТаблицаЗначений;
ЭтаФорма.ЭлементыФормы.ТаблицаЗначений.ОбновитьСтроки();
КонецЕсли;
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЭлементов, "Конвертация ТД => ТЗ");
Для НомерСтроки = НачальнаяСтрока По КонечнаяСтрока Цикл
Если ирОбщий.ОбработатьИндикаторЛкс(Индикатор) Тогда
Если Истина
И ЭтаФорма <> Неопределено
И ТаблицаЗначений.Количество() < 40
Тогда
ЭтаФорма.ЭлементыФормы.ТаблицаЗначений.ОбновитьСтроки();
КонецЕсли;
КонецЕсли;
ТекущаяСтрока = КонтрольЗаполненияСтроки(ТабличныйДокумент, НомерСтроки, , КоличествоОшибокКонвертации, КэшПоиска);
#Если Сервер И Не Сервер Тогда
ТекущаяСтрока = Новый Структура;
#КонецЕсли
СтрокаДанных = ТаблицаЗначений.Добавить();
СтрокаДанных[мИмяКолонкиНомерСтроки] = НомерСтроки;
Для каждого КлючИЗначение Из ТекущаяСтрока Цикл
СтрокаДанных[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
СообщитьИтогиКонвертации(КоличествоОшибокКонвертации);
Возврат Истина;
КонецФункции
// Функция интерактивно предлагает выбрать значение в текущей ячейке табличного документа
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, в текущей ячейке которого необходимо выбрать значение
//
// Возвращаемое значение:
// Истина, если значение выбрано, Ложь - иначе
//
Процедура ВыбратьЗначениеВЯчейке() Экспорт
ОчиститьСообщения();
ТекущаяОбласть = ТабличныйДокумент.ТекущаяОбласть;
Если ТекущаяОбласть.Верх <> ТекущаяОбласть.Низ Или ТекущаяОбласть.Лево <> ТекущаяОбласть.Право Тогда
Предупреждение("Для непосредственного выбора значения необходимо выбирать только одну ячейку");
Возврат;
КонецЕсли;
ТекущаяКолонка = ПолучитьКолонку(ТекущаяОбласть);
Если ТекущаяКолонка = Неопределено Тогда
Предупреждение("Значение данной колонки не выбирается");
Возврат;
КонецЕсли;
ТекущаяСтрока = КонтрольЗаполненияСтроки(ТабличныйДокумент, ТекущаяОбласть.Верх);
Значение = ТекущаяОбласть.Расшифровка;
СвязьПоТипу = Неопределено;
Если Не ПустаяСтрока(ТекущаяКолонка.СвязьПоТипу) Тогда
Если ТипЗНЧ(ТекущаяКолонка.СвязьПоТипу) = Тип("Строка") Тогда
ТекущаяСтрока.Свойство(ТекущаяКолонка.СвязьПоТипу,СвязьПоТипу);
Иначе
СвязьПоТипу = ТекущаяКолонка.СвязьПоТипу;
КонецЕсли;
КонецЕсли;
СвязьПоВладельцу = Неопределено;
Если Не ПустаяСтрока(ТекущаяКолонка.СвязьПоВладельцу) Тогда
Если ТипЗНЧ(ТекущаяКолонка.СвязьПоВладельцу) = Тип("Строка") Тогда
ТекущаяСтрока.Свойство(ТекущаяКолонка.СвязьПоВладельцу,СвязьПоВладельцу);
Иначе
СвязьПоВладельцу = ТекущаяКолонка.СвязьПоВладельцу;
КонецЕсли;
КонецЕсли;
ЭлементСвязиПоТипу = ?(ТекущаяКолонка.ЭлементСвязиПоТипу = 0,1,ТекущаяКолонка.ЭлементСвязиПоТипу);
Если мВыбратьЗначение(Значение, ТекущаяКолонка.ОписаниеТипов, СвязьПоТипу, ЭлементСвязиПоТипу, СвязьПоВладельцу, ТекущаяКолонка.ИмяКолонкиПриемника = "Родитель") Тогда
ТекущаяОбласть.Расшифровка = Значение;
Если ПустаяСтрока(ТекущаяКолонка.ИскатьПо) Тогда
ТекущаяОбласть.Текст = Строка(Значение);
Иначе
ТекущаяОбласть.Текст = Строка(Значение[ТекущаяКолонка.ИскатьПо]);
КонецЕсли;
ОчиститьСообщения();
КонтрольЗаполненияСтроки(ТабличныйДокумент, ТекущаяОбласть.Верх);
КонецЕсли;
КонецПроцедуры // ()
// Процедура обновляет содержимое табличного документа, в соответствии с таблицей загружаемых реквизитов
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, который необходимо обновить
// БезВопросов - булево, если Ложь, спрашивать об очистке табличного документа, если он не пустой, Истина - иначе
//
Процедура ОбновитьДанныеТабличногоДокумента(БезВопросов = Ложь) Экспорт
#Если Сервер И Не Сервер Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
#КонецЕсли
Если ТабличныйДокумент.ВысотаТаблицы > 1 И Не БезВопросов Тогда
Результат = Вопрос("Табличный документ содержит данные. Очистить?", РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет);
Если Результат = КодВозвратаДиалога.Да Тогда
ТабличныйДокумент.Очистить();
ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда
Возврат;
Иначе
СтруктураПозицийТД = СтруктураПозицийТД(Истина);
Для К = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиЗаголовков, К).Текст = "";
КонецЦикла;
КонецЕсли;
Иначе
ТабличныйДокумент.Очистить();
КонецЕсли;
Если ТабличныйДокумент.ВысотаТаблицы = 0 Тогда
СтрокаЗаголовковТД = 0;
ПерваяСтрокаДанныхТД = 0;
КонецЕсли;
//СформироватьСтруктуруКолонок();
СформироватьШапкуТабличногоДокумента(СтруктураПозицийТД);
КонецПроцедуры
#КонецЕсли
// Функция возвращает метаданные источника данных
//
// Параметры:
// нет
//
// Возвращаемое значение:
// Объект метаданных
//
Функция МетаданныеТаблицыБД() Экспорт
Результат = ирОбщий.ОбъектМДПоПолномуИмениТаблицыБДЛкс(ПолноеИмяТаблицы);
Возврат Результат;
КонецФункции
// Функция возвращает значение структуры "Колонки" по области табличного документа,
// содержащее описание свойств колонки
//
// Параметры:
// область - область табличного документа
//
// Возвращаемое значение:
// значение структуры "Колонки"
//
Функция ПолучитьКолонку(Область)
Для каждого СтрокаСопоставления Из СопоставлениеКолонокТЗ Цикл
Если "" + Область.Лево = СтрокаСопоставления.ИмяКолонкиИсточника Тогда
Возврат СтрокаСопоставления;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции // ()
// Процедура формирует шапку табличного документа, в соответствии с таблицей загружаемых реквизитов
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, у которого необходимо сформировать шапку
//
Процедура СформироватьШапкуТабличногоДокумента(СтруктураПозицийТД = Неопределено) Экспорт
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
Таблица = СопоставлениеКолонокТЗ.Скопировать();
Таблица.Сортировать("ИмяКолонкиИсточника");
Для каждого СтрокаСопоставления Из СопоставлениеКолонокТЗ Цикл
НомерКолонки = СтрокаСопоставления.ИмяКолонкиИсточника;
Если Не СтрокаСопоставления.Пометка Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(НомерКолонки) Тогда
Для Счетчик = 1 По СопоставлениеКолонокТЗ.Количество() Цикл
Если СопоставлениеКолонокТЗ.Найти("" + Счетчик, "ИмяКолонкиИсточника") = Неопределено Тогда
НомерКолонки = Счетчик;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(НомерКолонки) Тогда
Продолжить;
КонецЕсли;
ОписаниеКолонки = Новый Структура("Имя, Заголовок, ПримерДанных", "" + НомерКолонки, СтрокаСопоставления.СинонимКолонкиПриемника, "");
СопоставитьКолонкуТЗ(СтрокаСопоставления, ОписаниеКолонки);
КонецЕсли;
Если СтрокаСопоставления.ШиринаКолонки = 0 Тогда
ШиринаКолонки = 40;
Если СтрокаСопоставления.ОписаниеТипов.Типы().Количество() = 1 Тогда
ПервыйТип = СтрокаСопоставления.ОписаниеТипов.Типы()[0];
Если ПервыйТип = Тип("Строка") Тогда
Если СтрокаСопоставления.ОписаниеТипов.КвалификаторыСтроки.Длина = 0 Тогда
ШиринаКолонки = 80;
Иначе
ШиринаКолонки = Мин(Макс(СтрокаСопоставления.ОписаниеТипов.КвалификаторыСтроки.Длина,10),80);
КонецЕсли;
ИначеЕсли ПервыйТип = Тип("Число") Тогда
ШиринаКолонки = Макс(СтрокаСопоставления.ОписаниеТипов.КвалификаторыЧисла.Разрядность,10);
ИначеЕсли ПервыйТип = Тип("Булево") Тогда
ШиринаКолонки = 10;
КонецЕсли;
КонецЕсли;
Иначе
ШиринаКолонки = СтрокаСопоставления.ШиринаКолонки;
КонецЕсли;
Если СтруктураПозицийТД = Неопределено Тогда
СтруктураПозицийТД = СтруктураПозицийТД(Истина);
КонецЕсли;
Область = ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиЗаголовков, НомерКолонки);
БылТекст = Не ПустаяСтрока(Область.Текст);
Область.Текст = ?(БылТекст, Область.Текст + Символы.ПС,"") + СтрокаСопоставления.СинонимКолонкиПриемника;
Область.Расшифровка = СтрокаСопоставления.ИмяКолонкиПриемника;
Область.ЦветФона = ЦветаСтиля.ЦветФонаФормы;
Область.Обвести(Линия, Линия, Линия, Линия);
ОбластьКолонки = ТабличныйДокумент.Область("C"+НомерКолонки);
ОбластьКолонки.ШиринаКолонки = ?(БылТекст, Макс(ОбластьКолонки.ШиринаКолонки,ШиринаКолонки),ШиринаКолонки);
КонецЦикла;
//ОбновитьКолонкиТаблицыЗначений(, Ложь);
КонецПроцедуры
// Параметры:
// ИзБД - Булево - Истина - из БД, иначе из табличного документа
//
Процедура ОбновитьКолонкиТаблицыЗначений(ОчиститьСуществующие = Ложь, ИзБД = Истина) Экспорт
Если ОчиститьСуществующие Тогда
ТаблицаЗначений.Очистить();
ТаблицаЗначений.Колонки.Очистить();
КонецЕсли;
ПроверитьДобавитьКолонкуИдентификатораСтроки(ТаблицаЗначений);
Если ИзБД Тогда
Если ЗначениеЗаполнено(ПолноеИмяТаблицы) Тогда
Если Истина
И СопоставлениеКолонокБД.НайтиСтроки(Новый Структура("Пометка", Истина)).Количество() = 0
И СопоставлениеКолонокБД.НайтиСтроки(Новый Структура("ПолеПоиска", Истина)).Количество() = 0
Тогда
СопоставлениеКолонокБД.ЗаполнитьЗначения(Истина, "Пометка");
КонецЕсли;
Для каждого СтрокаСопоставленияБД Из СопоставлениеКолонокБД Цикл
Если Ложь
Или СтрокаСопоставленияБД = Неопределено
Или ТаблицаЗначений.Колонки.Найти(СтрокаСопоставленияБД.ИмяКолонкиПриемника) <> Неопределено
Или (Не СтрокаСопоставленияБД.Пометка И Не СтрокаСопоставленияБД.ПолеПоиска)
Тогда
Продолжить;
КонецЕсли;
ТаблицаЗначений.Колонки.Добавить(СтрокаСопоставленияБД.ИмяКолонкиПриемника, СтрокаСопоставленияБД.ОписаниеТиповПриемника, СтрокаСопоставленияБД.СинонимКолонкиПриемника);
КонецЦикла;
КонецЕсли;
Иначе
СтруктураПозицийТД = СтруктураПозицийТД();
ИндикаторКолонок = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТабличныйДокумент.ШиринаТаблицы, "Анализ документа");
Для Счетчик = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторКолонок);
СинонимКолонки = "";
Если ЗначениеЗаполнено(СтруктураПозицийТД.НомерСтрокиЗаголовков) Тогда
СинонимКолонки = ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиЗаголовков, Счетчик).Текст;
КонецЕсли;
Если Не ЗначениеЗаполнено(СинонимКолонки) Тогда
СинонимКолонки = "Колонка " + Счетчик;
КонецЕсли;
ИмяКолонки = ирОбщий.ИдентификаторИзПредставленияЛкс(СинонимКолонки);
ШиринаКолонки = ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиДанных, Счетчик).ШиринаКолонки;
//Если ЛиВтораяСтрокаСодержитТипыЗначений Тогда
Если Ложь Тогда
ИменаТипов = ТабличныйДокумент.Область(2, Счетчик).Текст;
Иначе
ИменаТипов = Новый Массив;
МаксДлинаСтроки = 0;
УспешныеТипы = Новый Соответствие;
НеуспешныеТипы = Новый Соответствие;
Для Каждого ПримитивныйТип Из ПримитивныеТипы Цикл
ПримитивныйТип = ПримитивныйТип.Ключ;
УспешныеТипы[ПримитивныйТип] = 0;
НеуспешныеТипы[ПримитивныйТип] = 0;
КонецЦикла;
Для НомерСтроки = СтруктураПозицийТД.НомерСтрокиДанных По Мин(ТабличныйДокумент.ВысотаТаблицы, 1000) Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
ОбластьЯчейки = ТабличныйДокумент.Область(НомерСтроки, Счетчик);
Расшифровка = ОбластьЯчейки.Расшифровка;
Если Истина
И Расшифровка <> Неопределено
И ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных")
Тогда
ИменаТипов.Добавить(ТипЗнч(Расшифровка));
Иначе
ТекстЯчейки = ОбластьЯчейки.Текст;
Если ЗначениеЗаполнено(ТекстЯчейки) Тогда
Для Каждого ПримитивныйТип Из ПримитивныеТипы Цикл
ПримитивныйТип = ПримитивныйТип.Ключ;
Если ПримитивныйТип = "Строка" Тогда
Продолжить;
ИначеЕсли ПримитивныйТип = "Дата" Тогда
ОшибкиКонвертации = "";
РезультатКонвертации = мПривестиКДате(ТекстЯчейки,, ОшибкиКонвертации);
Если ЗначениеЗаполнено(ОшибкиКонвертации) Тогда
РезультатКонвертации = Неопределено;
КонецЕсли;
Иначе
Попытка
РезультатКонвертации = Вычислить(ПримитивныйТип + "(ТекстЯчейки)");
Исключение
РезультатКонвертации = Неопределено;
КонецПопытки;
КонецЕсли;
Если Истина
И РезультатКонвертации <> Неопределено
И Не (Истина
И ПримитивныйТип = "Число"
И Лев(ТекстЯчейки, 1) = "0"
И СтрДлина(ТекстЯчейки) > 1
И Найти(ТекстЯчейки, ".") > 2)
Тогда
УспешныеТипы[ПримитивныйТип] = УспешныеТипы[ПримитивныйТип] + 1;
Иначе
НеуспешныеТипы[ПримитивныйТип] = НеуспешныеТипы[ПримитивныйТип] + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если МаксДлинаСтроки < СтрДлина(ОбластьЯчейки.Текст) Тогда
МаксДлинаСтроки = СтрДлина(ОбластьЯчейки.Текст);
КонецЕсли;
КонецЦикла;
Для Каждого ПримитивныйТип Из ПримитивныеТипы Цикл
ПримитивныйТип = ПримитивныйТип.Ключ;
Если УспешныеТипы[ПримитивныйТип] > 0 И НеуспешныеТипы[ПримитивныйТип] <= 1 Тогда // 1 неуспешный допускается, т.к. иногда в анализируемую область попадает подвал
ИменаТипов.Добавить(Тип(ПримитивныйТип));
Прервать;
КонецЕсли;
КонецЦикла;
Если ИменаТипов.Количество() = 0 Тогда
ИменаТипов = "Строка";
КонецЕсли;
КонецЕсли;
Если ТаблицаЗначений.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ТаблицаЗначений.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов(ИменаТипов,,,, Новый КвалификаторыСтроки(МаксДлинаСтроки)), СинонимКолонки, ШиринаКолонки);
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЕсли;
КонецПроцедуры
Функция СтруктураПозицийТД(ОбязательноЗаголовки = Ложь) Экспорт
#Если Сервер И Не Сервер Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
#КонецЕсли
Результат = Новый Структура("НомерСтрокиЗаголовков, НомерСтрокиДанных");
Результат.НомерСтрокиЗаголовков = СтрокаЗаголовковТД;
Результат.НомерСтрокиДанных = ПерваяСтрокаДанныхТД;
Если Не ЗначениеЗаполнено(ПерваяСтрокаДанныхТД) Тогда
МаксКоличествоЗаполненыхЯчеекДанных = 0;
КоличествоЗаполненыхЯчеекЗаголовков = 0;
Для НомерСтроки = Макс(1, СтрокаЗаголовковТД) По Мин(10, ТабличныйДокумент.ВысотаТаблицы) Цикл
//КоличествоЯчеек = 0;
КоличествоЗаполненыхЯчеек = 0;
УникальныеЗначения = Новый Соответствие;
КоличествоЯчеекСнизу = 0;
КоличествоЗаполненыхЯчеекСнизу = 0;
КоличествоСовпаденийЯчеекСнизу = 0;
МожетБытьСтрокойЗаголовков = Не ЗначениеЗаполнено(СтрокаЗаголовковТД);
Для НомерКолонки = 1 По Мин(20, ТабличныйДокумент.ШиринаТаблицы) Цикл
ОбластьЦ = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
//ЛиНезависимаяЯчейка = ОбластьЦ.Верх = НомерСтроки И ОбластьЦ.Лево = НомерКолонки;
ОбластьСнизу = ТабличныйДокумент.Область(НомерСтроки + 1, НомерКолонки);
ЛиНезависимаяЯчейкаСнизу = ОбластьСнизу.Верх = НомерСтроки + 1 И ОбластьСнизу.Лево = НомерКолонки;
Если ЛиНезависимаяЯчейкаСнизу Тогда
КоличествоЯчеекСнизу = КоличествоЯчеекСнизу + 1;
ТекстЯчейкиСнизу = ОбластьСнизу.Текст;
Если ЗначениеЗаполнено(ТекстЯчейкиСнизу) Тогда
КоличествоЗаполненыхЯчеекСнизу = КоличествоЗаполненыхЯчеекСнизу + 1;
КонецЕсли;
КонецЕсли;
//Если ЛиНезависимаяЯчейка Тогда
// //КоличествоЯчеек = КоличествоЯчеек + 1;
ТекстЯчейки = ОбластьЦ.Текст;
Если ЗначениеЗаполнено(ТекстЯчейки) Тогда
КоличествоЗаполненыхЯчеек = КоличествоЗаполненыхЯчеек + 1;
УникальныеЗначения[Лев(ТекстЯчейки, 50)] = 1; // Обрезаем для ускорения
КонецЕсли;
Если Истина
//И ЛиНезависимаяЯчейкаСнизу
И ЗначениеЗаполнено(ТекстЯчейки)
И ТекстЯчейки = ТекстЯчейкиСнизу
Тогда
КоличествоСовпаденийЯчеекСнизу = КоличествоСовпаденийЯчеекСнизу + 1;
КонецЕсли;
//КонецЕсли;
//Если Истина
// И Не ЛиНезависимаяЯчейка
// И ЛиНезависимаяЯчейкаСнизу
// И ЗначениеЗаполнено(ТекстЯчейкиСнизу)
//Тогда
// МожетБытьСтрокойЗаголовков = Ложь;
//КонецЕсли;
КонецЦикла;
Если НомерСтроки = Результат.НомерСтрокиЗаголовков Тогда
КоличествоЗаполненыхЯчеекЗаголовков = УникальныеЗначения.Количество();
ИначеЕсли Истина
И МожетБытьСтрокойЗаголовков
И КоличествоЗаполненыхЯчеекЗаголовков < УникальныеЗначения.Количество()
Тогда
Результат.НомерСтрокиЗаголовков = НомерСтроки;
КоличествоЗаполненыхЯчеекЗаголовков = УникальныеЗначения.Количество();
Если Результат.НомерСтрокиЗаголовков >= Результат.НомерСтрокиДанных Тогда
Результат.НомерСтрокиДанных = Результат.НомерСтрокиЗаголовков + 1;
МаксКоличествоЗаполненыхЯчеекДанных = 0;
КонецЕсли;
КонецЕсли;
Если КоличествоЗаполненыхЯчеекСнизу > МаксКоличествоЗаполненыхЯчеекДанных Тогда
Если КоличествоСовпаденийЯчеекСнизу = 0 Тогда
Если КоличествоЗаполненыхЯчеекЗаголовков <= КоличествоЯчеекСнизу Тогда
Результат.НомерСтрокиДанных = НомерСтроки + 1;
МаксКоличествоЗаполненыхЯчеекДанных = КоличествоЗаполненыхЯчеекСнизу;
КонецЕсли;
ИначеЕсли Ложь
Или МаксКоличествоЗаполненыхЯчеекДанных = 0
Или КоличествоЗаполненыхЯчеек / МаксКоличествоЗаполненыхЯчеекДанных >= 2
Тогда
Если КоличествоЗаполненыхЯчеекЗаголовков <= КоличествоЯчеекСнизу Тогда
Результат.НомерСтрокиДанных = НомерСтроки;
КонецЕсли;
КонецЕсли;
ИначеЕсли Истина
И Не ЗначениеЗаполнено(Результат.НомерСтрокиЗаголовков)
И КоличествоЗаполненыхЯчеекСнизу <= КоличествоЗаполненыхЯчеек
Тогда
Если КоличествоЗаполненыхЯчеекЗаголовков <= КоличествоЯчеекСнизу Тогда
Результат.НомерСтрокиДанных = НомерСтроки + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ОбязательноЗаголовки И Не ЗначениеЗаполнено(Результат.НомерСтрокиЗаголовков) Тогда
Результат.НомерСтрокиЗаголовков = 1;
Если Результат.НомерСтрокиДанных <= 1 Тогда
Результат.НомерСтрокиДанных = 2;
ТабличныйДокумент.ВставитьОбласть(ТабличныйДокумент.Область(1,1), ТабличныйДокумент.Область(1,1), ТипСмещенияТабличногоДокумента.ПоВертикали, Ложь);
ТабличныйДокумент.Область(1,1).Текст = "";
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьКолонкиТабличногоДокумента(СтруктураПозицийТД = Неопределено, ТолькоВыделенныеСтрокиТД = Ложь) Экспорт
СтруктураПозицийТД = Неопределено;
КолонкиТабличногоДокумента = Новый Соответствие;
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
ТабличныйДокумент = Новый ТабличныйДокумент;
#КонецЕсли
Если СтруктураПозицийТД = Неопределено Тогда
СтруктураПозицийТД = СтруктураПозицийТД();
КонецЕсли;
НачальнаяСтрока = СтруктураПозицийТД.НомерСтрокиДанных;
Если ТолькоВыделенныеСтрокиТД Тогда
Если ТабличныйДокумент.ТекущаяОбласть.Верх <= ТабличныйДокумент.ВысотаТаблицы Тогда
НачальнаяСтрока = Макс(НачальнаяСтрока, ТабличныйДокумент.ТекущаяОбласть.Верх);
КонецЕсли;
КонецЕсли;
Для Счетчик = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
СинонимКолонки = "";
Если ЗначениеЗаполнено(СтруктураПозицийТД.НомерСтрокиЗаголовков) Тогда
СинонимКолонки = ТабличныйДокумент.Область(СтруктураПозицийТД.НомерСтрокиЗаголовков, Счетчик).Текст;
КонецЕсли;
Если Не ЗначениеЗаполнено(СинонимКолонки) Тогда
СинонимКолонки = "Колонка " + Счетчик;
КонецЕсли;
ИмяКолонки = "" + Счетчик;
ПримерДанных = ТабличныйДокумент.Область(НачальнаяСтрока, Счетчик).Текст;
КолонкиТабличногоДокумента[ИмяКолонки] = Новый Структура("Имя, Заголовок, ПримерДанных", ИмяКолонки, СинонимКолонки, ПримерДанных);
КонецЦикла;
Возврат КолонкиТабличногоДокумента;
КонецФункции
Процедура СообщитьИтогиКонвертации(Знач КоличествоОшибокКонвертации)
Если КоличествоОшибокКонвертации Тогда
ирОбщий.СообщитьЛкс("Выявлено ячеек, содержащих ошибки/неоднозначное представление: " + КоличествоОшибокКонвертации, СтатусСообщения.Внимание);
Иначе
ирОбщий.СообщитьЛкс("Не выявлено ячеек, содержащих ошибки");
КонецЕсли;
КонецПроцедуры
Функция ЗагрузитьВТаблицуБДИзТаблицыЗначений(Параметры) Экспорт
Записывать = Параметры.Записывать;
ЗаписыватьОбъект = Истина;
КоличествоЭлементов = ТаблицаЗначенийОтобранное.Количество();
Если КоличествоЭлементов <= 0 Тогда
ирОбщий.СообщитьЛкс("В источнике данных нет строк");
Возврат Неопределено;
КонецЕсли;
ТекстВопросаИсточника = " строк в таблице БД " + ПолноеИмяТаблицы;
мКоличествоУспешно = 0;
мКоличествоНеуспешно = 0;
ОбновитьКоличествоУспешноДляОтображения();
ОбновитьКолонкиТаблицыБД(, Записывать);
// Поиск строк БД
Запрос = Неопределено;
СтруктураКлючаСтроки = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ПолноеИмяТаблицы, Истина);
СтрокаКлючаСтрокиБД = "";
Для Каждого КлючИЗначение Из СтруктураКлючаСтроки Цикл
Если СтрокаКлючаСтрокиБД <> "" Тогда
СтрокаКлючаСтрокиБД = СтрокаКлючаСтрокиБД + ", ";
КонецЕсли;
СтрокаКлючаСтрокиБД = СтрокаКлючаСтрокиБД + "Т." + КлючИЗначение.Ключ;
КонецЦикла;
ПоляПоиска = СопоставлениеКолонокБД.НайтиСтроки(Новый Структура("ПолеПоиска", Истина));
Если ПоляПоиска.Количество() > 0 Тогда
ТекстЗапроса =
"ВЫБРАТЬ Первые 2
|" + СтрокаКлючаСтрокиБД + "
|ИЗ " + ПолноеИмяТаблицы + " КАК Т
|ГДЕ ИСТИНА";
Для каждого СтрокаПоиска Из ПоляПоиска Цикл
ТекстЗапроса = ТекстЗапроса + "
Т." + СтрокаПоиска.ИмяКолонкиПриемника + " = &" + СтрокаПоиска.ИмяКолонкиПриемника + "";
КонецЦикла;
Запрос = Новый Запрос(ТекстЗапроса);
КонецЕсли;
ПроверитьДобавитьКолонкуИдентификатораСтроки(ТаблицаЗначенийОтобранное);
ПредставлениеПроцесса = "Поиск" + ТекстВопросаИсточника;
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЭлементов, ПредставлениеПроцесса);
МакетныйОбъект = Неопределено;
ТекущаяГруппаТипаМетаданных = Неопределено;
ирОбщий.ПолучитьМакетныйОбъектДанныхТаблицыБДЛкс(ПолноеИмяТаблицы, МакетныйОбъект, ТекущаяГруппаТипаМетаданных);
Если ТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(ПолноеИмяТаблицы);
КонецЕсли;
Для Каждого СтрокаТЗ Из ТаблицаЗначенийОтобранное Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
Если Не ЗначениеЗаполнено(СтрокаТЗ[мИмяКолонкиНомерСтроки]) Тогда
СтрокаТЗ[мИмяКолонкиНомерСтроки] = ТаблицаЗначенийОтобранное.Индекс(СтрокаТЗ) + 1;
КонецЕсли;
Отказ = Ложь;
СтрокаТаблицыБД = ТаблицаБД.Добавить();
СтрокаТаблицыБД[мИмяКолонкиНомерСтроки] = СтрокаТЗ[мИмяКолонкиНомерСтроки];
РезультатПоиска = "Не найдено";
Для каждого СтрокаСопоставления Из СопоставлениеКолонокБД Цикл
Если СтрокаСопоставления.Пометка Или СтрокаСопоставления.ПолеПоиска Тогда
Если СтрокаСопоставления.ИзИсточника Тогда
НовоеЗначение = СтрокаТЗ[СтрокаСопоставления.ИмяКолонкиИсточника];
Иначе
НовоеЗначение = СтрокаСопоставления.Значение;
КонецЕсли;
СтрокаТаблицыБД[СтрокаСопоставления.ИмяКолонкиПриемника] = НовоеЗначение;
КонецЕсли;
КонецЦикла;
Если Запрос <> Неопределено Тогда
СтрокаОшибок = "";
Для каждого СтрокаПоиска Из ПоляПоиска Цикл
Запрос.УстановитьПараметр(СтрокаПоиска.ИмяКолонкиПриемника, СтрокаТаблицыБД[СтрокаПоиска.ИмяКолонкиПриемника]);
КонецЦикла;
Если Не ПустаяСтрока(СтрокаОшибок) Тогда
СтрокаТаблицыБД[мИмяКолонкиРезультатПоиска] = "Не указаны значения полей поиска: " + СтрокаОшибок;
Продолжить;
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.Количество() > 1 Тогда
РезультатПоиска = "Найдено > 1";
Иначе
РезультатПоиска = "Найдено 1";
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаТаблицыБД, Выборка);
КонецЕсли;
КонецЕсли;
СтрокаНайдена = Найти(РезультатПоиска, "Найдено") = 1;
Если Не СтрокаНайдена Тогда
Если ТекущаяГруппаТипаМетаданных = "ВложеннаяТаблица" Тогда
Если Не ЗначениеЗаполнено(СтрокаТаблицыБД.Ссылка) Тогда
РезультатПоиска = "Не указано значение ссылки объекта-владельца вложенной таблицы";
КонецЕсли;
ИначеЕсли ТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
СтрокаТаблицыБД.Ссылка = МенеджерТипа.ПолучитьСсылку();
КонецЕсли;
КонецЕсли;
СтрокаТаблицыБД[мИмяКолонкиРезультатПоиска] = РезультатПоиска;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Если Записывать Тогда
#Если Сервер И Не Сервер Тогда
ЗагрузитьРезультатОбработкиОбъекта();
ОбработатьЭлементыОбъекта();
#КонецЕсли
СтруктураПотоков = ирОбщий.НоваяСтруктураМногопоточнойОбработкиЛкс("ОбработатьЭлементыОбъекта", ЭтотОбъект, "ЗагрузитьРезультатОбработкиОбъекта", КоличествоОбъектовВПорции,
ВыполнятьНаСервере, КоличествоПотоков);
// Установка значений реквизитов и запись в БД
СтруктураКлючаОбъекта = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ПолноеИмяТаблицы, Ложь);
Если ТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
СтруктураКлючаОбъекта.Вставить(мИмяКолонкиРезультатПоиска); // Опасно
КонецЕсли;
СтрокаКлючаОбъектаБД = "";
Для Каждого КлючИЗначение Из СтруктураКлючаОбъекта Цикл
Если СтрокаКлючаОбъектаБД <> "" Тогда
СтрокаКлючаОбъектаБД = СтрокаКлючаОбъектаБД + ", ";
КонецЕсли;
СтрокаКлючаОбъектаБД = СтрокаКлючаОбъектаБД + КлючИЗначение.Ключ;
КонецЦикла;
ТаблицаКлючейОбъектовБД = ТаблицаБД.Скопировать(, СтрокаКлючаОбъектаБД);
ТаблицаКлючейОбъектовБД.Свернуть(СтрокаКлючаОбъектаБД);
ирОбщий.ДобавитьИндексВТаблицуЛкс(ТаблицаЗначенийОтобранное, мИмяКолонкиНомерСтроки);
ПредставлениеПроцесса = "Загрузка" + ТекстВопросаИсточника;
ирОбщий.СообщитьЛкс("Всего: " + КоличествоЭлементов, СтатусСообщения.Информация);
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЭлементов, ПредставлениеПроцесса);
Для Каждого КлючОбъектаБД Из ТаблицаКлючейОбъектовБД Цикл
Если ирОбщий.ОбработатьИндикаторЛкс(Индикатор) Тогда
ОбновитьКоличествоУспешноДляОтображения();
КонецЕсли;
ОбъектБД = Неопределено;
ЗаполнитьЗначенияСвойств(СтруктураКлючаОбъекта, КлючОбъектаБД);
СтрокиОбъекта = ТаблицаБД.НайтиСтроки(СтруктураКлючаОбъекта);
КопияСтрокОбъекта = ТаблицаБД.Скопировать(СтрокиОбъекта);
Если Истина
И ТекущаяГруппаТипаМетаданных = "ВложеннаяТаблица"
И Не ЗначениеЗаполнено(КлючОбъектаБД.Ссылка)
Тогда
КоличествоНеуспешно = КоличествоНеуспешно + КопияСтрокОбъекта.Количество();
Продолжить;
КонецЕсли;
СтрокиТЗ = Новый Массив;
Для Каждого СтрокаОбъекта Из СтрокиОбъекта Цикл
СтрокаТЗ = ТаблицаЗначенийОтобранное.Найти(СтрокаОбъекта[мИмяКолонкиНомерСтроки], мИмяКолонкиНомерСтроки);
СтрокиТЗ.Добавить(СтрокаТЗ);
КонецЦикла;
КопияСтрокТЗ = ТаблицаЗначенийОтобранное.Скопировать(СтрокиТЗ);
ДобавитьОбъектВОчередьОбработки(ирОбщий.СтруктураИзСтрокиТаблицыИлиДереваИлиВыборкиЛкс(КлючОбъектаБД), СтруктураКлючаСтроки, ПолноеИмяТаблицы, КопияСтрокОбъекта,
КопияСтрокТЗ, СобытияОбработкиОбъектов, СтрокиОбъекта, СтруктураПотоков);
КонецЦикла;
ирОбщий.ОжидатьЗавершенияВсехПотоковОбработкиЛкс(СтруктураПотоков);
ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
ОбновитьКоличествоУспешноДляОтображения();
ирОбщий.СообщитьЛкс("Загружено строк " + КоличествоУспешно + " из " + КоличествоЭлементов + " строк.", СтатусСообщения.Информация);
КонецЕсли;
РеквизитыДляРезультата = "ТаблицаБД, КоличествоУспешно, КоличествоНеуспешно";
Результат = Новый Структура(РеквизитыДляРезультата);
ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект, РеквизитыДляРезультата);
Возврат Результат;
КонецФункции
Процедура ДобавитьОбъектВОчередьОбработки(КлючОбъектаБД, СтруктураКлючаСтроки, ПолноеИмяТаблицы, КопияСтрокОбъекта, КопияСтрокТЗ, СобытияОбработкиОбъектов,
СтрокиРезультатовОбъекта = Неопределено, СтруктураПотоков)
ПараметрыОбработкиОбъекта = Новый Структура;
ПараметрыОбработкиОбъекта.Вставить("КлючОбъектаБД", КлючОбъектаБД);
ПараметрыОбработкиОбъекта.Вставить("ПолноеИмяТаблицы", ПолноеИмяТаблицы);
ПараметрыОбработкиОбъекта.Вставить("СтруктураКлючаСтроки", СтруктураКлючаСтроки);
ПараметрыОбработкиОбъекта.Вставить("КопияСтрокОбъекта", КопияСтрокОбъекта);
ПараметрыОбработкиОбъекта.Вставить("КопияСтрокТЗ", КопияСтрокТЗ);
ПараметрыОбработкиОбъекта.Вставить("СобытияОбработкиОбъектов", СобытияОбработкиОбъектов);
ПараметрыОбработкиОбъекта.Вставить("СопоставлениеКолонокБД", СопоставлениеКолонокБД);
ирОбщий.ДобавитьОбъектВОчередьМногопоточнойОбработкиЛкс(СтруктураПотоков, ПараметрыОбработкиОбъекта, СтрокиРезультатовОбъекта);
КонецПроцедуры
// Обработать элементы объекта
//
// Параметры:
// ПараметрыОбработкиОбъекта - Структура -
//
// Возвращаемое значение:
// -
//
Функция ОбработатьЭлементыОбъекта(ПараметрыОбработкиОбъекта) Экспорт
#Если Сервер И Не Сервер Тогда
ПараметрыОбработкиОбъекта = Новый Структура;
#КонецЕсли
КлючОбъектаБД = ПараметрыОбработкиОбъекта.КлючОбъектаБД;
СтруктураКлючаСтроки = ПараметрыОбработкиОбъекта.СтруктураКлючаСтроки;
ПолноеИмяТаблицы = ПараметрыОбработкиОбъекта.ПолноеИмяТаблицы;
СтрокиОбъекта = ПараметрыОбработкиОбъекта.КопияСтрокОбъекта;
КопияСтрокТЗ = ПараметрыОбработкиОбъекта.КопияСтрокТЗ;
СобытияОбработкиОбъектов = ПараметрыОбработкиОбъекта.СобытияОбработкиОбъектов;
СопоставлениеКолонокБД = ПараметрыОбработкиОбъекта.СопоставлениеКолонокБД;
#Если Сервер И Не Сервер Тогда
СтрокиОбъекта = Новый ТаблицаЗначений;
КопияСтрокТЗ = Новый ТаблицаЗначений;
#КонецЕсли
ирОбщий.ДобавитьИндексВТаблицуЛкс(КопияСтрокТЗ, мИмяКолонкиНомерСтроки);
МакетныйОбъект = Неопределено;
ТекущаяГруппаТипаМетаданных = Неопределено;
ирОбщий.ПолучитьМакетныйОбъектДанныхТаблицыБДЛкс(ПолноеИмяТаблицы, МакетныйОбъект, ТекущаяГруппаТипаМетаданных);
МетаданныеИсточника = МетаданныеТаблицыБД();
ИмяПоляСсылка = "";
СтрокаОбъекта = СтрокиОбъекта[0];
Если ТекущаяГруппаТипаМетаданных = "ВложеннаяТаблица" Тогда
Фрагменты = ирОбщий.СтрРазделитьЛкс(ПолноеИмяТаблицы);
ИмяТабличнойЧасти = Фрагменты[2];
Фрагменты.Удалить(2);
ПолноеИмяТаблицыВладельца = ирОбщий.СтрСоединитьЛкс(Фрагменты, ".");
ОбъектБД = ирОбщий.ОбъектБДПоКлючуЛкс(ПолноеИмяТаблицыВладельца, СтрокаОбъекта.Ссылка);
ТабличнаяЧасть = ОбъектБД.Данные[ИмяТабличнойЧасти];
ИначеЕсли ТекущаяГруппаТипаМетаданных <> "Ссылочный" Или Найти(КлючОбъектаБД[мИмяКолонкиРезультатПоиска], "Найдено") = 1 Тогда
ОбъектБД = ирОбщий.ПолучитьОбъектДанныхИзСтрокиРезультатаЗапросаЛкс(КлючОбъектаБД, МакетныйОбъект, ТекущаяГруппаТипаМетаданных, Истина);
Иначе// Если ТекущаяГруппаТипаМетаданных = "Ссылочный" И Не СтрокаНайдена Тогда
Если ЗначениеЗаполнено(СтрокаОбъекта.Ссылка) Тогда
// Лишние обращения к БД
ОбъектБД = ирОбщий.ОбъектБДПоКлючуЛкс(МетаданныеИсточника.ПолноеИмя(), СтрокаОбъекта.Ссылка);
КонецЕсли;
Если ОбъектБД.Методы.ЭтоНовый() Тогда
ЭтоГруппаДляНового = Ложь;
Если ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаданныеИсточника) Тогда
СтрокаСопоставленияЭтоГруппа = СопоставлениеКолонокБД.Найти("ЭтоГруппа", "ИмяКолонкиПриемника");
Если СтрокаСопоставленияЭтоГруппа.Пометка Или СтрокаСопоставленияЭтоГруппа.ПолеПоиска Тогда
ЭтоГруппаДляНового = СтрокаОбъекта.ЭтоГруппа;
КонецЕсли;
КонецЕсли;
ОбъектБД = ирОбщий.ОбъектБДПоКлючуЛкс(МетаданныеИсточника.ПолноеИмя(), ЭтоГруппаДляНового, Истина,,, ирОбщий.ИдентификаторСсылкиЛкс(СтрокаОбъекта.Ссылка));
КонецЕсли;
КонецЕсли;
#Если Не Клиент Тогда
ПолучитьСообщенияПользователю(Истина);
СообщенияОбработки = Новый ЗаписьXML;
СообщенияОбработки.УстановитьСтроку("");
#КонецЕсли
ОтказОбъекта = Ложь;
ОписаниеОшибки = "";
УспехОбработчика = ирОбщий.ОбработатьСобытиеЛкс(СобытияОбработкиОбъектов, Метаданные().Макеты.АлгоритмПередОбработкойОбъекта.Имя, ОписаниеОшибки,, ОбъектБД.Данные, ОбъектБД.Методы, ОтказОбъекта);
Если Не УспехОбработчика Тогда
ОтказОбъекта = Истина;
КонецЕсли;
КоличествоУспешныхСтрокОбъекта = 0;
Для Каждого СтрокаОбъекта Из СтрокиОбъекта Цикл
Если ОтказОбъекта Тогда
СтрокаОбъекта[мИмяКолонкиРезультатЗаписи] = "Отказ в событии ПередОбработкойОбъекта: " + ОписаниеОшибки;
КоличествоНеуспешно = КоличествоНеуспешно + 1;
Продолжить;
КонецЕсли;
ОтказСтроки = Ложь;
СтрокаНайдена = Найти(СтрокаОбъекта[мИмяКолонкиРезультатПоиска], "Найдено") = 1;
Если Ложь
Или (СтрокаНайдена И Не ОбновлятьСтрокиБД)
Или (Не СтрокаНайдена И Не ДобавлятьСтрокиБД)
Тогда
//Для каждого СтрокаСопоставления Из ПоляПоиска Цикл
// СтрокаТаблицыБД[СтрокаСопоставления.ИмяКолонкиПриемника] = СтрокаТаблицыБД[СтрокаСопоставления.ИмяКолонкиИсточника];
//КонецЦикла;
Если СтрокаНайдена Тогда
СтрокаОбъекта[мИмяКолонкиРезультатЗаписи] = "Не разрешено обновлять строки";
Иначе
СтрокаОбъекта[мИмяКолонкиРезультатЗаписи] = "Не разрешено добавлять строки";
КонецЕсли;
КоличествоНеуспешно = КоличествоНеуспешно + 1;
Продолжить;
КонецЕсли;
Если СтрокаНайдена Тогда
Если ТекущаяГруппаТипаМетаданных = "Ссылочный" Тогда
СтрокаОбъектаБД = ОбъектБД.Данные;
ИначеЕсли ТекущаяГруппаТипаМетаданных = "Регистр" Тогда
Если СтруктураКлючаСтроки.Свойство("НомерСтроки") Тогда
СтрокаОбъектаБД = ОбъектБД.Данные[СтрокаОбъекта.НомерСтроки - 1];
Иначе
СтрокаОбъектаБД = ОбъектБД.Данные[0];
КонецЕсли;
ИначеЕсли ТекущаяГруппаТипаМетаданных = "ВложеннаяТаблица" Тогда
СтрокаОбъектаБД = ТабличнаяЧасть[СтрокаОбъекта.НомерСтроки - 1];
Иначе
СтрокаОбъектаБД = ОбъектБД.Данные;
КонецЕсли;
Иначе
Если ТекущаяГруппаТипаМетаданных = "ВложеннаяТаблица" Тогда
СтрокаОбъектаБД = ТабличнаяЧасть.Добавить();
Если ирОбщий.ЛиТипИмитатораОбъектаЛкс(ТипЗнч(ОбъектБД.Методы)) Тогда
СтрокаОбъектаБД.НомерСтроки = ТабличнаяЧасть.Количество();
КонецЕсли;
СтрокаОбъекта.НомерСтроки = СтрокаОбъектаБД.НомерСтроки;
ИначеЕсли ТекущаяГруппаТипаМетаданных = "Регистр" Тогда
СтрокаОбъектаБД = ОбъектБД.Данные.Добавить();
Если СтруктураКлючаСтроки.Свойство("НомерСтроки") Тогда
Если ирОбщий.ЛиТипИмитатораОбъектаЛкс(ТипЗнч(ОбъектБД.Методы)) Тогда
СтрокаОбъектаБД.НомерСтроки = ОбъектБД.Данные.Количество();
КонецЕсли;
СтрокаОбъекта.НомерСтроки = СтрокаОбъектаБД.НомерСтроки;
КонецЕсли;
Иначе
СтрокаОбъектаБД = ОбъектБД.Данные;
КонецЕсли;
КонецЕсли;
ОписаниеОшибки = "";
КопияСтрокиТЗ = КопияСтрокТЗ.Найти(СтрокаОбъекта[мИмяКолонкиНомерСтроки], мИмяКолонкиНомерСтроки);
УспехОбработчика = ирОбщий.ОбработатьСобытиеЛкс(СобытияОбработкиОбъектов, Метаданные().Макеты.АлгоритмПередЗагрузкойСтроки.Имя, ОписаниеОшибки,, ОбъектБД.Данные, ОбъектБД.Методы,
СтрокаОбъектаБД, КопияСтрокиТЗ, СтрокаНайдена, ОтказСтроки);
Если Не УспехОбработчика Тогда
ОтказСтроки = Истина;
КонецЕсли;
Если Не ОтказСтроки Тогда
Для каждого СтрокаСопоставления Из СопоставлениеКолонокБД Цикл
Если Ложь
Или Не СтрокаСопоставления.ДоступноИзменение
Или (Истина
И Не СтрокаСопоставления.Пометка
И Не СтрокаСопоставления.ПолеПоиска)
Или (Истина
И СтрокаСопоставления.Принадлежность = "" + Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы
И Не ОбъектБД.Данные.ЭтоГруппа)
Или (Истина
И СтрокаСопоставления.Принадлежность = "" + Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента
И ОбъектБД.Данные.ЭтоГруппа)
Тогда
Продолжить;
КонецЕсли;
Если Ложь
//Или Не СтрокаНайдена
Или СтрокаСопоставления.Пометка
Тогда
НовоеЗначение = СтрокаОбъекта[СтрокаСопоставления.ИмяКолонкиПриемника];
Попытка
Если ЗначениеЗаполнено(СтрокаСопоставления.ДопРеквизит) Тогда
ирОбщий.УстановитьЗначениеДопРеквизитаБСПЛкс(СтрокаОбъектаБД, СтрокаСопоставления.ДопРеквизит, НовоеЗначение, ИмяПоляСсылка, Истина, Ложь);
Иначе
СтрокаОбъектаБД[СтрокаСопоставления.ИмяКолонкиПриемника] = НовоеЗначение;
КонецЕсли;
Исключение
ОписаниеОшибки = "Ошибка при установке значения реквизита """ + СтрокаСопоставления.ИмяКолонкиПриемника + """: " + ОписаниеОшибки();
Если ВыводитьОшибкаЗагрузкиСразу Тогда
ирОбщий.СообщитьЛкс(ОписаниеОшибки, СтатусСообщения.Внимание);
КонецЕсли;
ОтказСтроки = Истина;
Прервать;
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Не ОтказСтроки Тогда
ОписаниеОшибки = "";
УспехОбработчика = ирОбщий.ОбработатьСобытиеЛкс(СобытияОбработкиОбъектов, Метаданные().Макеты.АлгоритмПослеЗагрузкиСтроки.Имя, ОписаниеОшибки,, ОбъектБД.Данные, ОбъектБД.Методы,
СтрокаОбъектаБД, КопияСтрокиТЗ, СтрокаНайдена, ОтказСтроки);
Если Не УспехОбработчика Тогда
ОтказСтроки = Истина;
КонецЕсли;
КонецЕсли;
//ЗаполнитьЗначенияСвойств(СтрокаТаблицыБД, СтрокаОбъектаБД,, СтрокаКлючаОбъектаБД);
Если ОтказСтроки Тогда
ОписаниеОшибки = "Загрузка строки отменена: " + ОписаниеОшибки;
СтрокаОбъекта[мИмяКолонкиРезультатЗаписи] = ОписаниеОшибки;
Иначе
СтрокаОбъекта[мИмяКолонкиРезультатЗаписи] = "Обработана";
КоличествоУспешныхСтрокОбъекта = КоличествоУспешныхСтрокОбъекта + 1;
КонецЕсли;
КонецЦикла;
ОписаниеОшибки = "";
//Если Записывать Тогда
Если Не ОтказОбъекта И КоличествоУспешныхСтрокОбъекта > 0 Тогда
ЗаписатьОбъект(ОбъектБД, ОписаниеОшибки, СтрокиОбъекта);
Если ВыводитьОшибкаЗагрузкиСразу И ЗначениеЗаполнено(ОписаниеОшибки) Тогда
ирОбщий.СообщитьЛкс(ОписаниеОшибки, СтатусСообщения.Внимание);
КонецЕсли;
КонецЕсли;
//КонецЕсли;
ТекстСообщений = "";
#Если Не Клиент Тогда
СообщенияОбъекта = ПолучитьСообщенияПользователю(Истина);
ТекстСообщений = ирОбщий.СоединитьСообщенияПользователюЛкс(СообщенияОбъекта);
#КонецЕсли
СтрокиОбъекта[0][мИмяКолонкиСообщенияОбработки] = ТекстСообщений;
СтрокиРезультатов = СтрокиОбъекта.Скопировать(, мИмяКолонкиНомерСтроки + "," + мИмяКолонкиРезультатЗаписи + "," + мИмяКолонкиСообщенияОбработки);
РезультатОбработки = Новый Структура("СтрокиРезультатов, ОшибкаЗаписи", СтрокиРезультатов, ОписаниеОшибки);
Возврат РезультатОбработки;
КонецФункции
Процедура ЗагрузитьРезультатОбработкиОбъекта(Знач Результат, Знач СтрокиТаблицыБД) Экспорт
СтрокиРезультатов = Результат.СтрокиРезультатов;
#Если Сервер И Не Сервер Тогда
СтрокиТаблицыБД = Новый ТаблицаЗначений;
СтрокиРезультатов = Новый ТаблицаЗначений;
#КонецЕсли
ОшибкаЗаписи = Результат.ОшибкаЗаписи;
ирОбщий.ДобавитьИндексВТаблицуЛкс(СтрокиРезультатов, мИмяКолонкиНомерСтроки);
Для Каждого СтрокаТаблицыБД Из СтрокиТаблицыБД Цикл
СтрокаРезультата = СтрокиРезультатов.Найти(СтрокаТаблицыБД[мИмяКолонкиНомерСтроки], мИмяКолонкиНомерСтроки);
ЗаполнитьЗначенияСвойств(СтрокаТаблицыБД, СтрокаРезультата);
Если СтрокаТаблицыБД[мИмяКолонкиРезультатЗаписи] = "Обработана" Тогда
Если ЗначениеЗаполнено(ОшибкаЗаписи) Тогда
СтрокаТаблицыБД[мИмяКолонкиРезультатЗаписи] = "Ошибка записи: " + ОшибкаЗаписи;
мКоличествоНеуспешно = мКоличествоНеуспешно + 1;
Иначе
СтрокаТаблицыБД[мИмяКолонкиРезультатЗаписи] = "Успех";
мКоличествоУспешно = мКоличествоУспешно + 1;
КонецЕсли;
Иначе
мКоличествоНеуспешно = мКоличествоНеуспешно + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьКоличествоУспешноДляОтображения()
ЭтотОбъект.КоличествоУспешно = мКоличествоУспешно;
ЭтотОбъект.КоличествоНеуспешно = мКоличествоНеуспешно;
КонецПроцедуры
Функция ОбработатьСобытиеЛкс(ТаблицаСобытий, ИмяСобытия, выхОписаниеОшибки, П1 = null, П2 = null, П3 = null, П4 = null, П5 = null, П6 = null, П7 = null, П8 = null) Экспорт
Алгоритм = СобытияОбработкиОбъектов.Найти(ИмяСобытия).Алгоритм;
Попытка
Выполнить(Алгоритм);
Исключение
выхОписаниеОшибки = ПолучитьПричинуОшибки(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
// Функция выполняет контроль заполнения строки данных табличного документа
// сообщает об ошибках и устанавливает коментарии к ошибочным ячейкам
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, у которого необходимо сформировать шапку
// НомерСтроки - Число, номер строки табличного документа
// ТекстыЯчеек - возвращает массив текстов ячеек строки,
//
// Возвращаемое значение:
// структура, ключ - Имя загружаемого реквизита, Значение - Значение загружаемого реквизита
//
Функция КонтрольЗаполненияСтроки(ТабличныйДокумент, НомерСтроки, ТекстыЯчеек = Неопределено, КоличествоОшибок = 0, КэшПоиска = Неопределено)
ТекстыЯчеек = Новый Массив;
ТекстыЯчеек.Добавить(Неопределено);
ЯчейкиСтроки = Новый Массив;
ЯчейкиСтроки.Добавить(Неопределено);
Для СчетчикЯчейки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
Ячейка = ТабличныйДокумент.Область(НомерСтроки, СчетчикЯчейки);
ЯчейкиСтроки.Добавить(Ячейка);
ТекстыЯчеек.Добавить(СокрЛП(Ячейка.Текст));
КонецЦикла;
ТекущаяСтрока = Новый Структура;
Для каждого СтрокаСопоставления Из СопоставлениеКолонокТЗ Цикл
Если Не СтрокаСопоставления.Пометка Тогда
Продолжить;
КонецЕсли;
Если СтрокаСопоставления.РежимКонвертации = "Устанавливать" Тогда
Результат = СтрокаСопоставления.Значение;
ТекущаяСтрока.Вставить(СтрокаСопоставления.ИмяКолонкиПриемника, Результат);
ИначеЕсли СтрокаСопоставления.РежимКонвертации = "Вычислять" Тогда
Попытка
АлгоритмОбъект = ирОбщий.ДесериализоватьАлгоритмОбъектЛкс(СтрокаСопоставления.Алгоритм);
#Если Сервер И Не Сервер Тогда
АлгоритмОбъект = Обработки.ирИмитаторАлгоритмОбъект.Создать();
#КонецЕсли
Исключение
ВызватьИсключение "Ошибка десериализации алгоритма вычисления значения колонки " + СтрокаСопоставления.ИмяКолонкиПриемника + ": " + ОписаниеОшибки();
КонецПопытки;
ВнутренниеПараметры = АлгоритмОбъект.Параметры.Выгрузить();
АлгоритмОбъект.Параметры.Загрузить(мАлгоритмКонвертацииЗначенияПараметры);
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(ВнутренниеПараметры, АлгоритмОбъект.Параметры);
Если ЗначениеЗаполнено(СтрокаСопоставления.ИмяКолонкиИсточника) Тогда
ТекстЯчейки = ТекстыЯчеек[Число(СтрокаСопоставления.ИмяКолонкиИсточника)];
Если ДобавлятьСырыеДанныеВТЗ Тогда
ТекущаяСтрока.Вставить(СтрокаСопоставления.ИмяКолонкиПриемника + мСуффиксСырыхДанных, ТекстЯчейки);
КонецЕсли;
Иначе
ТекстЯчейки = "";
КонецЕсли;
Вычисление = ВычислитьЗначениеЯчейки(АлгоритмОбъект, ТекущаяСтрока, ТекстЯчейки, ТекстыЯчеек, СтрокаСопоставления.Значение);
Результат = Вычисление.Результат;
Примечание = Вычисление.ОписаниеОшибки;
ТекущаяСтрока.Вставить(СтрокаСопоставления.ИмяКолонкиПриемника, Результат);
Если Не ПустаяСтрока(Примечание) Тогда
Если ВыводитьОшибкиКонвертацииСразу Тогда
ирОбщий.СообщитьЛкс("Строка ["+НомерСтроки+"]("+СтрокаСопоставления.СинонимКолонкиПриемника+"): "+ Примечание);
КонецЕсли;
КоличествоОшибок = КоличествоОшибок + 1;
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(СтрокаСопоставления.ИмяКолонкиИсточника) Тогда
Если Не ОбработатьОбласть(ЯчейкиСтроки[Число(СтрокаСопоставления.ИмяКолонкиИсточника)], СтрокаСопоставления, ТекущаяСтрока, ТекстыЯчеек, КэшПоиска) Тогда
КоличествоОшибок = КоличествоОшибок + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ТекущаяСтрока;
КонецФункции
// Процедура выполняет обработку области табличного документа:
// заполняет расшифровку по представлению ячейки в соответствии со структурой загружаемых реквизитов
// сообщает об ошибке и устанавливает коментарий, если ячейка содержит ошибку
//
// Параметры:
// Область - область табличного документа
// Колонка - Структура, свойства, в соответствии с которыми необходимо выполнить обработку области
// ТекущиеДанные - структура загруженных значений
// ТекстыЯчеек - массив текстов ячеек строки
//
Функция ОбработатьОбласть(Знач Область, СтрокаСопоставления, ТекущиеДанные, ТекстыЯчеек, КэшПоиска)
#Если Сервер И Не Сервер Тогда
Область = Новый ТабличныйДокумент;
Область = Область.Область();
#КонецЕсли
Представление = Область.Текст;
Если ДобавлятьСырыеДанныеВТЗ Тогда
ТекущиеДанные.Вставить(СтрокаСопоставления.ИмяКолонкиПриемника + мСуффиксСырыхДанных, Представление);
КонецЕсли;
Если СтрокаСопоставления.ОбрезатьКрайниеПробелы Тогда
Представление = СокрЛП(Представление);
КонецЕсли;
ПредставлениеКраткое = ирОбщий.ПредставлениеЗначенияСОграничениемДлиныЛкс(Представление, 50);
Примечание = "";
Расшифровка = Область.Расшифровка;
Если СтрокаСопоставления.РежимКонвертации = "Вычислять" Тогда
Вычисление = ВычислитьЗначениеЯчейки(СтрокаСопоставления.Алгоритм, ТекущиеДанные, Представление, ТекстыЯчеек, СтрокаСопоставления.Значение);
Если Не ПустаяСтрока(Вычисление.ОписаниеОшибки) Тогда
Результат = Неопределено;
Примечание = "Ошибка вычисления: " + Вычисление.ОписаниеОшибки;
Иначе
Результат = Вычисление.Результат;
КонецЕсли;
ИначеЕсли Истина
И ТипЗнч(Расшифровка) <> Тип("Строка")
И ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных")
И ТипЗнч(Расшифровка) <> Тип("Неопределено")
И СтрокаСопоставления.ОписаниеТипов.СодержитТип(ТипЗнч(Расшифровка))
И Не СтрокаСопоставления.ИгнорироватьРасшифровку
Тогда
Результат = Расшифровка;
ИначеЕсли ПустаяСтрока(Представление) Тогда
Результат = Неопределено;
Иначе
НайденныеЗначения = ПолучитьВозможныеЗначения(СтрокаСопоставления, Представление, Примечание, ТекущиеДанные, КэшПоиска);
Если НайденныеЗначения.Количество() = 0 Тогда
Примечание = "Не найден" + ?(Примечание = "", "", Символы.ПС+Примечание);
Результат = Неопределено;
ИначеЕсли НайденныеЗначения.Количество() = 1 Тогда
Результат = НайденныеЗначения[0];
Иначе
Примечание = "Неоднозначное (" + НайденныеЗначения.Количество() + " вариантов) представление" +?(Примечание = "","", Символы.ПС+Примечание);
Нашли = Ложь;
НашлиЗначениеПоУмолчанию = Ложь;
Для каждого НайденноеЗначение Из НайденныеЗначения Цикл
Если НайденноеЗначение = Область.Расшифровка Тогда
Нашли = Истина;
Прервать;
КонецЕсли;
Если НайденноеЗначение = СтрокаСопоставления.Значение Тогда
НашлиЗначениеПоУмолчанию = Истина;
КонецЕсли;
КонецЦикла;
Если Не Нашли Тогда
Если НашлиЗначениеПоУмолчанию Тогда
НайденноеЗначение = СтрокаСопоставления.Значение;
Иначе
НайденноеЗначение = НайденныеЗначения[0];
КонецЕсли;
КонецЕсли;
Результат = НайденноеЗначение;
КонецЕсли;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Результат = СтрокаСопоставления.Значение;
КонецЕсли;
ТекущиеДанные.Вставить(СтрокаСопоставления.ИмяКолонкиПриемника, Результат);
//Область.Расшифровка = Результат;
Если Область.СодержитЗначение Или ЗначениеЗаполнено(Примечание) Тогда
// Используем флаг СодержитЗначение для обозначения наличия установленного нами примечания
Область.Примечание.Текст = Примечание; // Первое обращение к Область.Примечание выполняется долго, второе в 2 раза быстрее но все равно долго
Область.СодержитЗначение = ЗначениеЗаполнено(Примечание);
КонецЕсли;
Если Не ПустаяСтрока(Примечание) И ВыводитьОшибкиКонвертацииСразу Тогда
ирОбщий.СообщитьЛкс("Ячейка["+Область.Имя+"->"+СтрокаСопоставления.СинонимКолонкиПриемника+"](" + ПредставлениеКраткое + "): " + Примечание, СтатусСообщения.Внимание);
КонецЕсли;
Возврат ПустаяСтрока(Примечание);
КонецФункции
// Функция возвращает массив возможных значений для текущей колонки по представлению
//
// Параметры:
// Колонка - Структура, свойства, в соответствии с которыми необходимо получить возможные значения
// Представление - Строка, по которой необходимо вернуть массив значений
// Примечание - массив текстов ячеек строки
// ТекущиеДанные - структура загруженных значений
//
// Возвращаемое значение:
// массив возможных значений
//
Функция ПолучитьВозможныеЗначения(Знач Колонка, Знач Представление, выхПримечание, Знач ТекущиеДанные, КэшПоиска = Неопределено)
выхПримечание = "";
НайденныеЗначения = Новый Массив;
Если ПустаяСтрока(Представление) Тогда
Возврат НайденныеЗначения;
КонецЕсли;
Если КэшПоиска = Неопределено Тогда
КэшПоиска = Новый Соответствие;
КонецЕсли;
КэшПоискаКолонки = КэшПоиска[Колонка];
Если КэшПоискаКолонки = Неопределено Тогда
КэшПоискаКолонки = Новый Соответствие;
КэшПоиска[Колонка] = КэшПоискаКолонки;
КонецЕсли;
ОписаниеТипов = Колонка.ОписаниеТипов;
СвязьПоТипу = Неопределено;
Если Не ПустаяСтрока(Колонка.СвязьПоТипу) Тогда
Если ТипЗНЧ(Колонка.СвязьПоТипу) = Тип("Строка") Тогда
ТекущиеДанные.Свойство(Колонка.СвязьПоТипу, СвязьПоТипу);
Иначе
СвязьПоТипу = Колонка.СвязьПоТипу;
КонецЕсли;
Если Не СвязьПоТипу = Неопределено Тогда
ЭлементСвязиПоТипу = Колонка.ЭлементСвязиПоТипу;
Если ЭлементСвязиПоТипу = 0 Тогда
ЭлементСвязиПоТипу = 1;
КонецЕсли;
ВидыСубконто = СвязьПоТипу.ВидыСубконто;
Если ЭлементСвязиПоТипу > ВидыСубконто.Количество() Тогда
Возврат НайденныеЗначения;
КонецЕсли;
ОписаниеТипов = СвязьПоТипу.ВидыСубконто[ЭлементСвязиПоТипу-1].ВидСубконто.ТипЗначения;
КонецЕсли;
КонецЕсли;
Для каждого ТипРеквизита Из ОписаниеТипов.Типы() Цикл
Если ТипРеквизита = Тип("Null") Тогда
НайденныеЗначения.Добавить(Null);
ИначеЕсли Ложь
Или ТипРеквизита = ПримитивныеТипы.Число
Или ТипРеквизита = ПримитивныеТипы.Булево
Тогда
НайденныеЗначения.Добавить(мПривестиКЧислу(Представление, Колонка.ОписаниеТипов, выхПримечание));
ИначеЕсли Ложь
Или ТипРеквизита = ПримитивныеТипы.Строка
или ТипРеквизита = ПримитивныеТипы.Дата
Тогда
НайденныеЗначения.Добавить(мПривестиКДате(Представление, Колонка.ОписаниеТипов, выхПримечание, Колонка.АмериканскоеПоложениеМесяца));
ИначеЕсли ТипРеквизита = Тип("УникальныйИдентификатор") Тогда
НайденныеЗначения.Добавить(мПривестиКУникальномуИдентификатору(Представление, выхПримечание));
ИначеЕсли ТипРеквизита = Тип("ОписаниеТипов") Тогда
НайденныеЗначения.Добавить(мПривестиКОписаниюТипов(Представление, выхПримечание));
Иначе
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
Если Перечисления.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
//Это Перечисление
Для каждого ЗначениеПеречисления Из ирОбщий.ПолучитьМенеджерЛкс(ТипРеквизита) Цикл
Если Колонка.ИскатьПо = "Имя" Тогда
КлючЗначенияПеречисления = XMLСтрока(ЗначениеПеречисления);
Иначе
КлючЗначенияПеречисления = Строка(ЗначениеПеречисления);
КонецЕсли;
Если ирОбщий.СтрокиРавныЛкс(КлючЗначенияПеречисления, Представление) Тогда
НайденныеЗначения.Добавить(ЗначениеПеречисления);
КонецЕсли;
КонецЦикла;
ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
//Это документ
//ИскатьПо = Колонка.ИскатьПо;
//Если ИскатьПо = "Идентификатор" Тогда
СписокДокументов = ирОбщий.ПреобразоватьПредставлениеВСсылкуЛкс(МетаданныеТипа, Представление, КэшПоискаКолонки);
Если СписокДокументов <> Неопределено Тогда
Если ТипЗнч(СписокДокументов) = Тип("СписокЗначений") Тогда
Для Каждого ЭлементСписка Из СписокДокументов Цикл
НайденныеЗначения.Добавить(ЭлементСписка.Значение);
КонецЦикла;
Иначе
НайденныеЗначения.Добавить(СписокДокументов);
КонецЕсли;
КонецЕсли;
//Иначе
// ДлиннаСинонима = СтрДлина(""+МетаданныеТипа);
// Если Лев(Представление, ДлиннаСинонима) = ""+МетаданныеТипа Тогда
// НомерИДата = СокрЛП(Сред(Представление, ДлиннаСинонима+1));
// ПозицияОт = Найти(НомерИДата, " от ");
// Если Не ПозицияОт = 0 Тогда
// НомерДок = Лев(НомерИДата, ПозицияОт-1);
// Попытка
// ДатаДок = Дата(Сред(НомерИДата, ПозицияОт+4));
// Исключение
// ДатаДок = Неопределено;
// КонецПопытки;
// Если Не ДатаДок = Неопределено Тогда
// Менеджер = ирОбщий.ПолучитьМенеджерЛкс(ТипРеквизита);
// НайденноеЗначение = Менеджер.НайтиПоНомеру(НомерДок, ДатаДок);
// Если Не НайденноеЗначение.Пустая() Тогда
// НайденныеЗначения.Добавить(НайденноеЗначение);
// КонецЕсли;
// КонецЕсли;
// КонецЕсли;
// КонецЕсли;
//КонецЕсли;
ИначеЕсли МетаданныеТипа <> Неопределено Тогда
ИскатьПо = Колонка.ИскатьПо;
Если ИскатьПо = "Идентификатор" Тогда
НайденныеЗначения.Добавить(ирОбщий.ПреобразоватьПредставлениеВСсылкуЛкс(МетаданныеТипа, Представление));
Иначе
ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(МетаданныеТипа.ПолноеИмя());
НайденныеЗначения = КэшПоискаКолонки[Представление];
Если НайденныеЗначения = Неопределено Тогда
НайденныеЗначения = Новый Массив;
ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипРеквизита);
Если ПустаяСтрока(ИскатьПо) Или ПоляТаблицыБД.Найти(ИскатьПо) = Неопределено Тогда
СтрокаОсновногоПредставления = Строка(МетаданныеТипа.ОсновноеПредставление);
Если СтрокаОсновногоПредставления = "ВВидеКода" Тогда
ИскатьПо = "Код";
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНаименования" Тогда
ИскатьПо = "Наименование";
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНомера" Тогда
ИскатьПо = "Номер";
КонецЕсли;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| _Таблица.Ссылка
|ИЗ
| " + МетаданныеТипа.ПолноеИмя() + " КАК _Таблица
|ГДЕ";
Запрос.Текст = Запрос.Текст + "
| _Таблица." + ИскатьПо + " = &Представление";
Запрос.УстановитьПараметр("Представление",Представление);
Если Истина
И ЭтоСправочник
И Не ПустаяСтрока(Колонка.СвязьПоВладельцу)
И Колонка.СвязьПоВладельцу <> "<Создаваемый объект>"
И МетаданныеТипа.Владельцы.Количество() > 0
Тогда
СвязьПоВладельцу = Неопределено;
Если ТипЗНЧ(Колонка.СвязьПоВладельцу) = Тип("Строка") Тогда
ТекущиеДанные.Свойство(Колонка.СвязьПоВладельцу, СвязьПоВладельцу);
Иначе
СвязьПоВладельцу = Колонка.СвязьПоВладельцу;
КонецЕсли;
Если СвязьПоВладельцу <> Неопределено Тогда
Запрос.Текст = Запрос.Текст + "
| И _Таблица.Владелец = &СвязьПоВладельцу";
Запрос.УстановитьПараметр("СвязьПоВладельцу", СвязьПоВладельцу);
КонецЕсли;
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НайденныеЗначения.Добавить(Выборка.Ссылка);
КонецЦикла;
КэшПоискаКолонки[Представление] = НайденныеЗначения;
КонецЕсли;
КонецЕсли;
Иначе
выхПримечание = "Для типа значения """ + ТипРеквизита + """ не описан способ поиска";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат НайденныеЗначения;
КонецФункции
Функция мПолучитьНастройку(ДляФайла = Ложь) Экспорт
#Если Сервер И Не Сервер Тогда
ТабличныйДокумент = Новый ТабличныйДокумент;
#КонецЕсли
ДокументРезультат = Новый Структура;
ДокументРезультат.Вставить("ВыводитьОшибкаЗагрузкиСразу", ВыводитьОшибкаЗагрузкиСразу);
ДокументРезультат.Вставить("ВыводитьОшибкиКонвертацииСразу", ВыводитьОшибкиКонвертацииСразу);
ДокументРезультат.Вставить("ДополнятьЗапросом", ДополнятьЗапросом);
ДокументРезультат.Вставить("ДобавлятьСтрокиБД", ДобавлятьСтрокиБД);
ДокументРезультат.Вставить("ОбновлятьСтрокиБД", ОбновлятьСтрокиБД);
ДокументРезультат.Вставить("ВыполнятьНаСервере", ВыполнятьНаСервере);
ДокументРезультат.Вставить("КоличествоПотоков", КоличествоПотоков);
ДокументРезультат.Вставить("КоличествоОбъектовВПорции", КоличествоОбъектовВПорции);
ДокументРезультат.Вставить("ПолноеИмяТаблицы", мТекущееПолноеИмяТаблицы); // Для загрузки настройки из файла
ДокументРезультат.Вставить("СобытияОбработкиОбъектов", СобытияОбработкиОбъектов.Скопировать(, "ИмяСобытия, Алгоритм"));
ДокументРезультат.Вставить("ПерваяСтрокаДанныхТД", ПерваяСтрокаДанныхТД);
ДокументРезультат.Вставить("СтрокаЗаголовковТД", СтрокаЗаголовковТД);
ДокументРезультат.Вставить("СопоставлениеКолонокТЗ", СопоставлениеКолонокТЗ.Скопировать());
ДокументРезультат.Вставить("СопоставлениеКолонокБД", СопоставлениеКолонокБД.Скопировать());
ДокументРезультат.Вставить("НастройкаКомпоновки", ТаблицаЗначенийКомпоновщик.ПолучитьНастройки());
ДокументРезультат.Вставить("ТаблицаЗначенийИспользоватьОтбор", ТаблицаЗначенийИспользоватьОтбор);
ДокументРезультат.Вставить("ДобавлятьСырыеДанныеВТЗ", ДобавлятьСырыеДанныеВТЗ);
Если мКонсольЗапросов <> Неопределено Тогда
ДополнениеЗапросом = мКонсольЗапросов.ДеревоЗапросов.Скопировать();
КонецЕсли;
СтруктураПозицийТД = СтруктураПозицийТД();
ДокументРезультат.Вставить("ДополнениеЗапросом", ДополнениеЗапросом);
Если ДляФайла Или СохранятьДанныеТД Тогда
ДокументРезультат.Вставить("ТабличныйДокумент", ТабличныйДокумент.ПолучитьОбласть());
Если Не ДляФайла И ТабличныйДокумент.ВысотаТаблицы > 1000 Тогда
ирОбщий.СообщитьЛкс("В хранилище настроек БД помещено большое количество строк табличного документа. Рекомендуется хранить такие настройки в файлах");
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(СтруктураПозицийТД.НомерСтрокиЗаголовков) Тогда
ДокументРезультат.Вставить("ТабличныйДокумент", ТабличныйДокумент.ПолучитьОбласть(СтруктураПозицийТД.НомерСтрокиЗаголовков, 1, СтруктураПозицийТД.НомерСтрокиЗаголовков, ТабличныйДокумент.ШиринаТаблицы));
Иначе
ДокументРезультат.Вставить("ТабличныйДокумент", Новый ТабличныйДокумент);
КонецЕсли;
Если ДляФайла Или СохранятьДанныеТЗ Тогда
ДокументРезультат.Вставить("ТаблицаЗначений", ТаблицаЗначений.Скопировать());
Если Не ДляФайла И ТаблицаЗначений.Количество() > 5000 Тогда
ирОбщий.СообщитьЛкс("В хранилище настроек БД помещено большое количество строк таблицы значений. Рекомендуется хранить такие настройки в файлах");
КонецЕсли;
Иначе
ДокументРезультат.Вставить("ТаблицаЗначений", ТаблицаЗначений.СкопироватьКолонки());
КонецЕсли;
Возврат ДокументРезультат;
КонецФункции // ()
Процедура мЗагрузитьНастройку(Настройка, ЗаменитьДанныеТДиТЗ = Истина, ЗаменитьМетаданныеТДиТЗ = Истина) Экспорт
#Если Сервер И Не Сервер Тогда
Настройка = Новый Структура;
#КонецЕсли
мДополнениеЗапросом = Неопределено;
Если Настройка <> Неопределено Тогда
Если ЗаменитьДанныеТДиТЗ Тогда
Если Настройка.Свойство("ШапкаТабличногоДокумента") Тогда
// Старый формат
НовыйТабличныйДокумент = Настройка.ШапкаТабличногоДокумента;
Иначе
НовыйТабличныйДокумент = Настройка.ТабличныйДокумент;
КонецЕсли;
// Это нужно делать до загрузки свойства СохранятьДанныеТД через ЗаполнитьЗначенияСвойств!
ТабличныйДокумент.Очистить();
ТабличныйДокумент.Вывести(НовыйТабличныйДокумент);
КонецЕсли;
Если Не Настройка.Свойство("ДополнятьЗапросом") Тогда
Настройка.Вставить("ДополнятьЗапросом", Ложь);
КонецЕсли;
Если Не Настройка.Свойство("ДополнениеЗапросом") Тогда
Настройка.Вставить("ДополнениеЗапросом");
КонецЕсли;
Если Не Настройка.Свойство("НастройкаКомпоновки") Тогда
Настройка.Вставить("НастройкаКомпоновки", Новый НастройкиКомпоновкиДанных);
КонецЕсли;
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Настройка,, "ТабличныйДокумент, ТаблицаЗначений, СобытияОбработкиОбъектов, СопоставлениеКолонокТЗ, СопоставлениеКолонокБД, ПолноеИмяТаблицы, ДополнятьЗапросом");
Если ЗаменитьДанныеТДиТЗ Тогда
ТаблицаЗначений.Очистить();
ЭтотОбъект.ТаблицаЗначений = Настройка.ТаблицаЗначений.Скопировать();
КонецЕсли;
Если ЗаменитьМетаданныеТДиТЗ Тогда
СопоставлениеКолонокТЗ.Очистить();
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(Настройка.СопоставлениеКолонокТЗ, СопоставлениеКолонокТЗ);
СобытияОбработкиОбъектов.ЗаполнитьЗначения(, "Алгоритм, АлгоритмОбъект");
Если Настройка.Свойство("СобытияОбработкиОбъектов") Тогда
Для Каждого СохраненнаяСтрокаСобытияОбработкиОбъектов Из Настройка.СобытияОбработкиОбъектов Цикл
СтрокаСобытияОбработкиОбъектов = СобытияОбработкиОбъектов.Найти(СохраненнаяСтрокаСобытияОбработкиОбъектов.ИмяСобытия, "ИмяСобытия");
СтрокаСобытияОбработкиОбъектов.Алгоритм = СохраненнаяСтрокаСобытияОбработкиОбъектов.Алгоритм;
КонецЦикла;
КонецЕсли;
мДополнениеЗапросом = Настройка.ДополнениеЗапросом;
ЭтотОбъект.ДополнятьЗапросом = мДополнениеЗапросом <> Неопределено И Настройка.ДополнятьЗапросом;
ТаблицаЗначенийКомпоновщик.ЗагрузитьНастройки(Настройка.НастройкаКомпоновки);
КонецЕсли;
Если Настройка.Свойство("ПолноеИмяТаблицы") И ирОбщий.СтрокиРавныЛкс(Настройка.ПолноеИмяТаблицы, ПолноеИмяТаблицы) Тогда
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(Настройка.СопоставлениеКолонокБД, СопоставлениеКолонокБД,,, Истина);
ЗаполнитьСопоставлениеКолонокБД();
КонецЕсли;
Иначе
ОбновитьСопоставлениеКолонокТЗ();
КонецЕсли;
СопоставлениеКолонокТЗЗаполнить(Ложь);
СопоставлениеКолонокБДЗаполнитьПоИменамСинонимам();
КонецПроцедуры
// Функция возвращает список, элементами которого выступают возможные имена представления загружаемого реквизита
//
// Параметры:
// ЗагружаемыйРеквизит - Строка таблицы значений загружаемого реквизита
//
// Возвращаемое значение:
// список значений; значение списка - строка имя представления
//
Функция ПолучитьСписокИменПредставлений(ЗагружаемыйРеквизит) Экспорт
СписокВыбора = Новый СписокЗначений;
Если ЗагружаемыйРеквизит.ОписаниеТипов.Типы().Количество() = 1 Тогда
Тип = ЗагружаемыйРеквизит.ОписаниеТипов.Типы()[0];
МетаданныеТипа = Метаданные.НайтиПоТипу(Тип);
Если МетаданныеТипа <> Неопределено Тогда
ПолноеИмяМД = МетаданныеТипа.ПолноеИмя();
КорневойТип = ирОбщий.ПервыйФрагментЛкс(ПолноеИмяМД);
КонецЕсли;
ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(Тип);
ЭтоСчет = ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип);
ЭтоВидХарактеристик = ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип);
Если ЭтоСправочник ИЛИ ЭтоСчет Или ЭтоВидХарактеристик Тогда
ЕстьКод = МетаданныеТипа.ДлинаКода > 0;
ЕстьИмя = МетаданныеТипа.ДлинаНаименования > 0;
ВидОсновногоПредставление = ?(ЭтоСправочник, Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСправочника,
?(ЭтоСчет,Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСчета,Метаданные.СвойстваОбъектов.ОсновноеПредставлениеВидаХарактеристики));
Если МетаданныеТипа.ОсновноеПредставление = ВидОсновногоПредставление.ВВидеКода Тогда
Если ЕстьКод Тогда
СписокВыбора.Добавить("Код", "Код");
КонецЕсли;
Если ЕстьИмя Тогда
СписокВыбора.Добавить("Наименование", "Наименование");
КонецЕсли;
Иначе
Если ЕстьИмя Тогда
СписокВыбора.Добавить("Наименование", "Наименование");
КонецЕсли;
Если ЕстьКод Тогда
СписокВыбора.Добавить("Код", "Код");
КонецЕсли;
КонецЕсли;
Для каждого Реквизит Из МетаданныеТипа.Реквизиты Цикл
Если Не Реквизит.Индексирование = Метаданные.СвойстваОбъектов.Индексирование.НеИндексировать
И Реквизит.Тип.Типы().Количество() = 1 и Реквизит.Тип.Типы()[0] = Тип ("Строка")
Тогда
СписокВыбора.Добавить(Реквизит.Имя, Реквизит.Представление());
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ирОбщий.ЛиКорневойТипПеречисленияЛкс(КорневойТип) Тогда
СписокВыбора.Добавить("Синоним");
СписокВыбора.Добавить("Имя");
ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда
СписокВыбора.Добавить("Авто", "<Авто>");
ИначеЕсли МетаданныеТипа <> Неопределено Тогда
СписокВыбора.Добавить("Идентификатор", "<Идентификатор>");
КонецЕсли;
КонецЕсли;
Возврат СписокВыбора;
КонецФункции // ()
Функция ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит) Экспорт
ЕстьТипСамогоОбъекта = Ложь;
Если мЭтоСсылочныйОбъект Тогда
ОписаниеТиповСправочника = Тип(СтрЗаменить(ПолноеИмяТаблицы, ".", "Ссылка."));
КонецЕсли;
СписокВыбора = Новый СписокЗначений;
ТипыВладельцев = Новый Соответствие;
Для каждого ТипКолонки Из ЗагружаемыйРеквизит.ОписаниеТипов.Типы() Цикл
Если Справочники.ТипВсеСсылки().СодержитТип(ТипКолонки) Тогда
Для каждого Владелец Из Метаданные.НайтиПоТипу(ТипКолонки).Владельцы Цикл
ТипВладельца = Тип(СтрЗаменить(Владелец.ПолноеИмя(), ".", "Ссылка."));
Если ТипыВладельцев[ТипВладельца] = Неопределено Тогда
Если ТипВладельца = ОписаниеТиповСправочника Тогда
ЕстьТипСамогоОбъекта = Истина;
КонецЕсли;
ТипыВладельцев.Вставить(ТипВладельца, Владелец.ПолноеИмя());
Для каждого КолонкаСвязиПоВладельцу Из СопоставлениеКолонокТЗ Цикл
Если КолонкаСвязиПоВладельцу.ОписаниеТипов.Типы()[0] = ТипВладельца Тогда
// Возможно надо будет по всем типам проходить
СписокВыбора.Добавить(КолонкаСвязиПоВладельцу.ИмяКолонкиПриемника,КолонкаСвязиПоВладельцу.ИмяКолонкиПриемника);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если Не ТипыВладельцев.Количество() = 0 Тогда
СписокВыбора.Добавить(Неопределено, "<пустое значение>");
КонецЕсли;
Для каждого КлючИЗначение Из ТипыВладельцев Цикл
СписокВыбора.Добавить(СтрЗаменить(КлючИЗначение.Значение, ".", "Ссылка."), "<"+КлючИЗначение.Значение+">");
КонецЦикла;
Если ЕстьТипСамогоОбъекта Тогда
СписокВыбора.Вставить(0, "<Создаваемый объект>", "<Создаваемый объект>");
КонецЕсли;
Возврат СписокВыбора;
КонецФункции // ()
// Функция возвращает список, элементами которого выступают возможные связи по типу для загружаемого реквизита
//
// Параметры:
// ЗагружаемыйРеквизит - Строка таблицы значений загружаемого реквизита
//
// Возвращаемое значение:
// список значений; значение списка - строка имя колонки связи или ссылка на элемент связи
//
Функция ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит) Экспорт
СписокВыбора = Новый СписокЗначений;
ВозможныеПланыСчетов = Новый Структура;
Для каждого ПланСчетов Из Метаданные.ПланыСчетов Цикл
Если ПланСчетов.ВидыСубконто <> Неопределено
И ПланСчетов.ВидыСубконто.Тип = ЗагружаемыйРеквизит.ОписаниеТипов Тогда
ВозможныеПланыСчетов.Вставить(ПланСчетов.Имя,ПланыСчетов[ПланСчетов.Имя]);
КонецЕсли;
КонецЦикла;
Для каждого ПланСчетов Из ВозможныеПланыСчетов Цикл
ТипЗНЧПланСчетов = ТипЗНЧ(ПланСчетов.Значение.ПустаяСсылка());
Для каждого КолонкаСвязиПоТипу Из СопоставлениеКолонокТЗ Цикл
Если КолонкаСвязиПоТипу.ОписаниеТипов.Типы()[0] = ТипЗНЧПланСчетов Тогда
СписокВыбора.Добавить(КолонкаСвязиПоТипу.ИмяКолонкиПриемника,КолонкаСвязиПоТипу.ИмяКолонкиПриемника);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Не ВозможныеПланыСчетов.Количество() = 0 Тогда
СписокВыбора.Добавить(Неопределено, "< пустое значение >");
КонецЕсли;
Для каждого ПланСчетов Из ВозможныеПланыСчетов Цикл
СписокВыбора.Добавить("ПланСчетовСсылка."+ПланСчетов.Ключ,"<"+ПланСчетов.Ключ+">");
КонецЦикла;
Возврат СписокВыбора;
КонецФункции // ()
Процедура ЗаполнитьСопоставлениеКолонокБД() Экспорт
КопияСопоставления = СопоставлениеКолонокБД.Скопировать();
СопоставлениеКолонокБД.Очистить();
Если Не ЗначениеЗаполнено(ПолноеИмяТаблицы) Тогда
Возврат;
КонецЕсли;
МетаданныеИсточника = МетаданныеТаблицыБД();
ПоляТаблицы = ирОбщий.ПоляТаблицыБДЛкс(ПолноеИмяТаблицы);
СтруктураКлючаОбъекта = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ПолноеИмяТаблицы, Ложь);
МассивВозможныхПолейПоиска = Новый Массив;
МассивВозможныхПолейПоиска.Добавить("Код");
МассивВозможныхПолейПоиска.Добавить("Наименование");
МассивВозможныхПолейПоиска.Добавить("Период");
МассивВозможныхПолейПоиска.Добавить("Регистратор");
МассивВозможныхПолейПоиска.Добавить("НомерСтроки");
МассивВозможныхПолейПоиска.Добавить("Ссылка");
МассивВозможныхПолейПоиска.Добавить("Номер");
МассивВозможныхПолейПоиска.Добавить("Владелец");
МассивВозможныхПолейПоиска.Добавить("Дата");
МассивВозможныхПолейПоиска.Добавить("Родитель");
МассивВозможныхПолейПоиска.Добавить("ЭтоГруппа");
ТипТаблицыБД = ирОбщий.ТипТаблицыБДЛкс(ПолноеИмяТаблицы);
Если ирОбщий.ЛиКорневойТипРегистраБДЛкс(ТипТаблицыБД) Тогда
Для каждого МетаИзмерение Из МетаданныеИсточника.Измерения Цикл
МассивВозможныхПолейПоиска.Добавить(МетаИзмерение.Имя);
КонецЦикла;
КонецЕсли;
Для Каждого ПолеТаблицы Из ПоляТаблицы Цикл
Если Ложь
Или ПолеТаблицы.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений"))
//Или ПолеТаблицы.ТипЗначения.СодержитТип(Тип("ХранилищеЗначения"))
//Или (Истина
// И ПолеТаблицы.Метаданные = Неопределено
// И (Ложь
// Или ПолеТаблицы.Имя = "ВерсияДанных"
// Или ПолеТаблицы.Имя = "Предопределенный"))
Тогда
Продолжить;
КонецЕсли;
ЗагружаемыйРеквизит = СопоставлениеКолонокБД.Добавить();
ЗагружаемыйРеквизит.ИмяКолонкиПриемника = ПолеТаблицы.Имя;
ЗагружаемыйРеквизит.СинонимКолонкиПриемника = ПолеТаблицы.Заголовок;
ЗагружаемыйРеквизит.ОписаниеТиповПриемника = ПолеТаблицы.ТипЗначения;
ЗагружаемыйРеквизит.ДоступноИзменение = Истина
И Не (Истина
И ирОбщий.ЛиТипВложеннойТаблицыБДЛкс(ТипТаблицыБД)
И (Ложь
Или ПолеТаблицы.Имя = "Ссылка"
Или ПолеТаблицы.Имя = "НомерСтроки"))
И (Ложь
Или Не мЭтоСсылочныйОбъект
Или Не ирОбщий.НедоступноИзменениеПоляСсылочногоОбъектаЛкс(ПолеТаблицы.Имя));
Если ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаданныеИсточника) Тогда
Если Истина
И ПолеТаблицы.Метаданные <> Неопределено
И (Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() < 802014
Или Метаданные.ОбщиеРеквизиты.Найти(ПолеТаблицы.Метаданные.Имя) = Неопределено)
Тогда
ЗагружаемыйРеквизит.Принадлежность = ПолеТаблицы.Метаданные.Использование;
Иначе
ЗагружаемыйРеквизит.Принадлежность = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппыИЭлемента;
КонецЕсли;
КонецЕсли;
Если СтруктураКлючаОбъекта.Свойство(ПолеТаблицы.Имя) Тогда
ЗагружаемыйРеквизит.МожетБытьПолемПоиска = Истина;
ЗагружаемыйРеквизит.Ключевое = Истина;
ЗагружаемыйРеквизит.ПолеПоиска = Не мЭтоСсылочныйОбъект;
ИначеЕсли ПолеТаблицы.Метаданные = Неопределено Тогда
ЗагружаемыйРеквизит.МожетБытьПолемПоиска = МассивВозможныхПолейПоиска.Найти(ПолеТаблицы.Имя) <> Неопределено;
Иначе
Попытка
Индексирован = ПолеТаблицы.Метаданные.Индексирование <> Метаданные.СвойстваОбъектов.Индексирование.НеИндексировать;
Исключение
Индексирован = Ложь;
КонецПопытки;
ЗагружаемыйРеквизит.МожетБытьПолемПоиска = Индексирован;
КонецЕсли;
Если ПолеТаблицы.Метаданные <> Неопределено Тогда
ЗагружаемыйРеквизит.Подсказка = ПолеТаблицы.Метаданные.Подсказка;
КонецЕсли;
ЗагружаемыйРеквизит.Значение = ЗагружаемыйРеквизит.ОписаниеТиповПриемника.ПривестиЗначение(Неопределено);
ВосстановитьИзменяемыеСвойстваСтрокиСопоставленияБД(ЗагружаемыйРеквизит, КопияСопоставления);
Если СтруктураКлючаОбъекта.Свойство(ПолеТаблицы.Имя) Тогда
ЗагружаемыйРеквизит.Пометка = Не мЭтоСсылочныйОбъект;
//ЗагружаемыйРеквизит.ПолеПоиска = Не мЭтоСсылочныйОбъект;
КонецЕсли;
КонецЦикла;
Если ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(ТипТаблицыБД) Тогда
ТипСсылки = Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(МетаданныеИсточника));
СписокСвойств = ирОбщий.ДопРеквизитыБСПОбъектаЛкс(Новый(ТипСсылки));
Для Каждого Свойство Из СписокСвойств Цикл
#Если Сервер И Не Сервер Тогда
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПустаяСсылка();
#КонецЕсли
ЗагружаемыйРеквизит = СопоставлениеКолонокБД.Добавить();
ЗагружаемыйРеквизит.ОписаниеТиповПриемника = Свойство.ТипЗначения;
ЗагружаемыйРеквизит.ИмяКолонкиПриемника = Свойство.Имя;
ЗагружаемыйРеквизит.СинонимКолонкиПриемника = Свойство.Наименование;
ЗагружаемыйРеквизит.Принадлежность = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппыИЭлемента;
ЗагружаемыйРеквизит.ДопРеквизит = Свойство;
ЗагружаемыйРеквизит.Подсказка = Свойство.Подсказка;
ЗагружаемыйРеквизит.ДоступноИзменение = Истина;
ВосстановитьИзменяемыеСвойстваСтрокиСопоставленияБД(ЗагружаемыйРеквизит, КопияСопоставления);
КонецЦикла;
КонецЕсли;
СопоставлениеКолонокБД.Сортировать("СинонимКолонкиПриемника");
СопоставлениеКолонокБДЗаполнитьПоИменамСинонимам(Ложь);
ВыявитьНеуникальныеКлючи();
КонецПроцедуры
Процедура ВосстановитьИзменяемыеСвойстваСтрокиСопоставленияБД(Знач ЗагружаемыйРеквизит, Знач КопияСопоставления)
СтараяСтрока = КопияСопоставления.Найти(ЗагружаемыйРеквизит.ИмяКолонкиПриемника, "ИмяКолонкиПриемника");
Если СтараяСтрока <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(ЗагружаемыйРеквизит, СтараяСтрока, "ИзИсточника, ПолеПоиска, Пометка, Значение");
Если ЗагружаемыйРеквизит.ИзИсточника Тогда
СопоставитьКолонкуБД(ЗагружаемыйРеквизит, ТаблицаЗначений.Колонки.Найти(СтараяСтрока.ИмяКолонкиИсточника));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ВыявитьНеуникальныеКлючи(выхСтрокаКлючаИсточника = "") Экспорт
выхСтрокаКлючаИсточника = Новый Массив;
Для Каждого СтрокаСопоставления Из СопоставлениеКолонокБД.НайтиСтроки(Новый Структура("ПолеПоиска", Истина)) Цикл
Если Истина
И ЗначениеЗаполнено(СтрокаСопоставления.ИмяКолонкиИсточника)
И выхСтрокаКлючаИсточника.Найти(СтрокаСопоставления.ИмяКолонкиИсточника) = Неопределено
Тогда
выхСтрокаКлючаИсточника.Добавить(СтрокаСопоставления.ИмяКолонкиИсточника);
КонецЕсли;
КонецЦикла;
выхСтрокаКлючаИсточника = ирОбщий.СтрСоединитьЛкс(выхСтрокаКлючаИсточника);
НеуникальныеКлючи = ирОбщий.НеуникальныеКлючиТаблицыЛкс(ТаблицаЗначений, выхСтрокаКлючаИсточника);
ЭтотОбъект.КоличествоНеуникально = НеуникальныеКлючи.Количество();
Возврат НеуникальныеКлючи;
КонецФункции
Процедура СопоставлениеКолонокБДЗаполнитьПоИменамСинонимам(РазрешитьМенятьИзИсточника = Истина) Экспорт
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если Колонка.Имя = мИмяКолонкиНомерСтроки Тогда
Продолжить;
КонецЕсли;
СтрокаИмен = "";
СтруктураОтбора = Новый Структура("СинонимКолонкиИсточника", "");
СтрокиСопоставления = СопоставлениеКолонокБД.НайтиСтроки(СтруктураОтбора);
// Сначала ищем пару по пересечению типов и именам
Для Каждого СтрокаСопоставления Из СтрокиСопоставления Цикл
Если Не ирОбщий.ЛиОписаниеТипов1ВходитВОписаниеТипов2Лкс(Колонка.ТипЗначения, СтрокаСопоставления.ОписаниеТиповПриемника) Тогда
Продолжить;
КонецЕсли;
Если Ложь
Или ирОбщий.СтрокиРавныЛкс(СтрокаСопоставления.ИмяКолонкиПриемника, Колонка.Имя)
Или ирОбщий.СтрокиРавныЛкс(СтрокаСопоставления.СинонимКолонкиПриемника, Колонка.Заголовок)
Тогда
СопоставитьКолонкуБД(СтрокаСопоставления, Колонка, РазрешитьМенятьИзИсточника);
СтрокаИмен = СтрокаИмен + ", " + СтрокаСопоставления.ИмяКолонкиПриемника;
КонецЕсли;
КонецЦикла;
СтрокиСопоставления = СопоставлениеКолонокБД.НайтиСтроки(СтруктураОтбора);
// Затем ищем пару по совпадаению ссылочного моно типа
Для Каждого СтрокаСопоставления Из СтрокиСопоставления Цикл
Если Не ирОбщий.ЛиОписаниеТипов1ВходитВОписаниеТипов2Лкс(Колонка.ТипЗначения, СтрокаСопоставления.ОписаниеТиповПриемника) Тогда
Продолжить;
КонецЕсли;
Если Истина
И Колонка.ТипЗначения.Типы().Количество() = 1
И ирОбщий.ЛиТипСсылкиБДЛкс(Колонка.ТипЗначения.Типы()[0])
И СтрокаСопоставления.ОписаниеТиповПриемника.Типы().Количество() = 1
Тогда
СопоставитьКолонкуБД(СтрокаСопоставления, Колонка, РазрешитьМенятьИзИсточника);
СтрокаИмен = СтрокаИмен + ", " + СтрокаСопоставления.ИмяКолонкиПриемника;
КонецЕсли;
КонецЦикла;
Если СтрокиСопоставления.Количество() > 0 Тогда
СтрокаКолонки = КолонкиТЗ.Найти(Колонка.Имя, "ИмяКолонки");
Если СтрокаКолонки <> Неопределено Тогда
СтрокаКолонки.КолонкиПриемника = СтрокаКолонки.КолонкиПриемника + СтрокаИмен;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьКолонкиТаблицыБД(ОчиститьСуществующие = Истина, ДобавитьКолонкуРезультатаЗаписи = Истина) Экспорт
Если ОчиститьСуществующие Тогда
ТаблицаБД.Очистить();
ТаблицаБД.Колонки.Очистить();
КонецЕсли;
ПроверитьДобавитьКолонкуИдентификатораСтроки(ТаблицаБД);
Если ТаблицаБД.Колонки.Найти(мИмяКолонкиРезультатПоиска) = Неопределено Тогда
ТаблицаБД.Колонки.Добавить(мИмяКолонкиРезультатПоиска, Новый ОписаниеТипов("Строка"), "<Результат поиска>");
КонецЕсли;
Если ДобавитьКолонкуРезультатаЗаписи Тогда
Если ТаблицаБД.Колонки.Найти(мИмяКолонкиРезультатЗаписи) = Неопределено Тогда
ТаблицаБД.Колонки.Добавить(мИмяКолонкиРезультатЗаписи, Новый ОписаниеТипов("Строка"), "<Результат записи>");
КонецЕсли;
Если ТаблицаБД.Колонки.Найти(мИмяКолонкиСообщенияОбработки) = Неопределено Тогда
ТаблицаБД.Колонки.Добавить(мИмяКолонкиСообщенияОбработки, Новый ОписаниеТипов("Строка"), "<Сообщения>");
КонецЕсли;
КонецЕсли;
СтруктураКлючаОбъекта = ирОбщий.СтруктураКлючаТаблицыБДЛкс(ПолноеИмяТаблицы);
Для каждого КлючИЗначение Из СтруктураКлючаОбъекта Цикл
СтрокаСопоставленияБД = СопоставлениеКолонокБД.Найти(КлючИЗначение.Ключ, "ИмяКолонкиПриемника");
ТаблицаБД.Колонки.Добавить(СтрокаСопоставленияБД.ИмяКолонкиПриемника, СтрокаСопоставленияБД.ОписаниеТиповПриемника, СтрокаСопоставленияБД.СинонимКолонкиПриемника + " (ключ)");
КонецЦикла;
КопияСопоставленияБД = СопоставлениеКолонокБД.Скопировать();
КопияСопоставленияБД.Сортировать("ПолеПоиска Убыв, Пометка Убыв");
Для каждого СтрокаСопоставленияБД Из КопияСопоставленияБД Цикл
Если Ложь
Или СтруктураКлючаОбъекта.Свойство(СтрокаСопоставленияБД.ИмяКолонкиПриемника) // Колонка уже добавлена выше
Или (Истина
И Не СтрокаСопоставленияБД.ПолеПоиска
И Не СтрокаСопоставленияБД.Пометка)
Тогда
Продолжить;
КонецЕсли;
ЗаголовокКолонки = СтрокаСопоставленияБД.СинонимКолонкиПриемника;
Если СтрокаСопоставленияБД.ПолеПоиска Тогда
ЗаголовокКолонки = ЗаголовокКолонки + " (поиск)";
ИначеЕсли Не СтрокаСопоставленияБД.Пометка Тогда
ЗаголовокКолонки = ЗаголовокКолонки + " (новая)";
КонецЕсли;
ТаблицаБД.Колонки.Добавить(СтрокаСопоставленияБД.ИмяКолонкиПриемника, СтрокаСопоставленияБД.ОписаниеТиповПриемника, ЗаголовокКолонки);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьДобавитьКолонкуИдентификатораСтроки(Таблица) Экспорт
Если Таблица.Колонки.Найти(мИмяКолонкиНомерСтроки) = Неопределено Тогда
Таблица.Колонки.Вставить(0, мИмяКолонкиНомерСтроки, Новый ОписаниеТипов("Число"), "<№>");
Счетчик = 1;
Для Каждого СтрокаТаблицы Из Таблица Цикл
СтрокаТаблицы[мИмяКолонкиНомерСтроки] = Счетчик;
Счетчик = Счетчик + 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СопоставлениеКолонокТЗЗаполнить(УстановитьПометкуДляСопоставленных = Истина) Экспорт
ОбновитьСопоставлениеКолонокТЗ(УстановитьПометкуДляСопоставленных);
КолонкиТабличногоДокумента = ПолучитьКолонкиТабличногоДокумента();
Для Каждого КлючИЗначение Из КолонкиТабличногоДокумента Цикл
Колонка = КлючИЗначение.Значение;
СтруктураОтбора = Новый Структура("СинонимКолонкиИсточника", "");
СтрокиСопоставления = СопоставлениеКолонокТЗ.НайтиСтроки(СтруктураОтбора);
КолонкаСопоставлена = Ложь;
Для Каждого СтрокаСопоставления Из СтрокиСопоставления Цикл
Если ирОбщий.СтрокиРавныЛкс(СтрокаСопоставления.СинонимКолонкиПриемника, Колонка.Заголовок) Тогда
СопоставитьКолонкуТЗ(СтрокаСопоставления, Колонка);
КолонкаСопоставлена = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если КолонкаСопоставлена Тогда
СтрокаКолонки = НесопоставленныеКолонкиТД.Найти(Колонка.Имя, "ИмяКолонки");
Если СтрокаКолонки <> Неопределено Тогда
НесопоставленныеКолонкиТД.Удалить(СтрокаКолонки);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СопоставитьКолонкуБД(Знач СтрокаСопоставления, Знач Колонка = Неопределено, РазрешитьМенятьИзИсточника = Истина) Экспорт
Если РазрешитьМенятьИзИсточника Тогда
СтрокаСопоставления.ИзИсточника = Колонка <> Неопределено;
Если Не СтрокаСопоставления.ИзИсточника Тогда
СтрокаСопоставления.Пометка = Ложь;
КонецЕсли;
КонецЕсли;
Если Колонка <> Неопределено Тогда
СтрокаСопоставления.ИмяКолонкиИсточника = Колонка.Имя;
СтрокаСопоставления.СинонимКолонкиИсточника = Колонка.Заголовок;
СтрокаСопоставления.ОписаниеТиповИсточника = Колонка.ТипЗначения;
Иначе
СтрокаСопоставления.ИмяКолонкиИсточника = "";
СтрокаСопоставления.СинонимКолонкиИсточника = "";
СтрокаСопоставления.ОписаниеТиповИсточника = Неопределено;
КонецЕсли;
КонецПроцедуры
Процедура СопоставитьКолонкуТЗ(Знач СтрокаСопоставления, Знач Колонка = Неопределено, УстановитьДопСвойства = Истина) Экспорт
Если Колонка <> Неопределено Тогда
Если УстановитьДопСвойства Тогда
СтрокаСопоставления.Пометка = Истина;
Если СтрокаСопоставления.РежимКонвертации = "Устанавливать" Тогда
СтрокаСопоставления.РежимКонвертации = "Искать";
КонецЕсли;
КонецЕсли;
СтрокаСопоставления.ИмяКолонкиИсточника = Колонка.Имя;
СтрокаСопоставления.СинонимКолонкиИсточника = Колонка.Заголовок;
СтрокаСопоставления.ПримерДанных = Колонка.ПримерДанных;
Иначе
Если СтрокаСопоставления.РежимКонвертации = "Искать" Тогда
СтрокаСопоставления.РежимКонвертации = "Устанавливать";
КонецЕсли;
СтрокаСопоставления.ИмяКолонкиИсточника = "";
СтрокаСопоставления.СинонимКолонкиИсточника = "";
СтрокаСопоставления.ПримерДанных = Неопределено;
КонецЕсли;
КонецПроцедуры
Процедура ОчиститьСопоставлениеКолонокБД() Экспорт
Для Каждого СтрокаКолонкиБД Из СопоставлениеКолонокБД Цикл
СопоставитьКолонкуБД(СтрокаКолонкиБД);
КонецЦикла;
ОбновитьСопоставлениеКолонокБД();
КонецПроцедуры
Процедура ОчиститьСопоставлениеКолонокТЗ() Экспорт
Для Каждого СтрокаКолонкиТЗ Из СопоставлениеКолонокТЗ Цикл
СопоставитьКолонкуТЗ(СтрокаКолонкиТЗ);
КонецЦикла;
ОбновитьСопоставлениеКолонокТЗ();
КонецПроцедуры
Процедура ОбновитьСопоставлениеКолонокБД() Экспорт
Для Каждого СтрокаКолонкиБД Из СопоставлениеКолонокБД Цикл
Если Не СтрокаКолонкиБД.ИзИсточника Тогда
Продолжить;
КонецЕсли;
Колонка = ТаблицаЗначений.Колонки.Найти(СтрокаКолонкиБД.ИмяКолонкиИсточника);
СопоставитьКолонкуБД(СтрокаКолонкиБД, Колонка);
КонецЦикла;
КолонкиТЗ.Очистить();
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если Ложь
Или Колонка.Имя = мИмяКолонкиНомерСтроки
Или ирОбщий.СтрКончаетсяНаЛкс(Колонка.Имя, мСуффиксСырыхДанных)
Тогда
Продолжить;
КонецЕсли;
СтрокаКолонки = КолонкиТЗ.Добавить();
СтрокаКолонки.ИмяКолонки = Колонка.Имя;
СтрокаКолонки.СинонимКолонки = Колонка.Заголовок;
СтрокаКолонки.ОписаниеТипов = Колонка.ТипЗначения;
ИменаКолонокПриемника = СопоставлениеКолонокБД.Скопировать(Новый Структура("ИмяКолонкиИсточника", Колонка.Имя), "ИмяКолонкиПриемника").ВыгрузитьКолонку(0);
СтрокаКолонки.КолонкиПриемника = ирОбщий.СтрСоединитьЛкс(ИменаКолонокПриемника);
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьСопоставлениеКолонокТЗ(УстановитьПометкуДляСопоставленных = Ложь, УстановитьПометкуДляНовых = Истина, ТолькоВыделенныеСтрокиТД = Ложь) Экспорт
Для Каждого КолонкаТаблицы Из ТаблицаЗначений.Колонки Цикл
Если Не ЗначениеЗаполнено(КолонкаТаблицы.Заголовок) Тогда
КолонкаТаблицы.Заголовок = КолонкаТаблицы.Имя;
КонецЕсли;
КонецЦикла;
КопияСопоставления = СопоставлениеКолонокТЗ.Скопировать();
СопоставлениеКолонокТЗ.Очистить();
КолонкиТабличногоДокумента = ПолучитьКолонкиТабличногоДокумента(, ТолькоВыделенныеСтрокиТД);
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если Ложь
Или (Колонка.ТипЗначения.СодержитТип(Тип("ХранилищеЗначения")) И Колонка.ТипЗначения.Типы().Количество() = 1)
Или (Колонка.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) И Колонка.ТипЗначения.Типы().Количество() = 1)
Или ирОбщий.СтрокиРавныЛкс(Колонка.Имя, мИмяКолонкиНомерСтроки)
Или ирОбщий.СтрКончаетсяНаЛкс(Колонка.Имя, мСуффиксСырыхДанных)
Тогда
Продолжить;
КонецЕсли;
ЗагружаемыйРеквизит = СопоставлениеКолонокТЗ.Добавить();
ЗагружаемыйРеквизит.ИмяКолонкиПриемника = Колонка.Имя;
ЗагружаемыйРеквизит.Пометка = УстановитьПометкуДляНовых;
ЗагружаемыйРеквизит.СинонимКолонкиПриемника = Колонка.Заголовок;
ЗагружаемыйРеквизит.ДоступноеОписаниеТипов = Колонка.ТипЗначения;
ЗагружаемыйРеквизит.ОписаниеТипов = Колонка.ТипЗначения;
СписокВыбора = ПолучитьСписокИменПредставлений(ЗагружаемыйРеквизит);
ЗагружаемыйРеквизит.ИскатьПо = ?(СписокВыбора.Количество() = 0, "",СписокВыбора[0].Значение);
СписокВыбора = ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит);
ЗагружаемыйРеквизит.СвязьПоВладельцу = ?(СписокВыбора.Количество() = 0, "", СписокВыбора[0].Значение);
СписокВыбора = ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит);
Если СписокВыбора.Количество() = 0 Тогда
ЗагружаемыйРеквизит.СвязьПоТипу = "";
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 0;
Иначе
ЗагружаемыйРеквизит.СвязьПоТипу = СписокВыбора[0].Значение;
Если Найти(ЗагружаемыйРеквизит.ИмяКолонкиПриемника, "3") <> 0 Тогда
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 3;
ИначеЕсли Найти(ЗагружаемыйРеквизит.ИмяКолонкиПриемника, "2") <> 0 Тогда
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 2;
Иначе
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 1;
КонецЕсли;
КонецЕсли;
ЗагружаемыйРеквизит.Значение = ЗагружаемыйРеквизит.ОписаниеТипов.ПривестиЗначение(Неопределено);
ЗагружаемыйРеквизит.РежимКонвертации = "Искать";
СтараяСтрока = КопияСопоставления.Найти(ЗагружаемыйРеквизит.ИмяКолонкиПриемника, "ИмяКолонкиПриемника");
Если СтараяСтрока <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(ЗагружаемыйРеквизит, СтараяСтрока,, "СинонимКолонкиПриемника, ОписаниеТипов, ДоступноеОписаниеТипов");
ПересечениеТипов = ирОбщий.ПересечьОписанияТиповЛкс(СтараяСтрока.ОписаниеТипов, ЗагружаемыйРеквизит.ОписаниеТипов,, 2);
#Если Сервер И Не Сервер Тогда
ПересечениеТипов = Новый ОписаниеТипов;
#КонецЕсли
Если ПересечениеТипов.Типы().Количество() > 0 Тогда
ЗагружаемыйРеквизит.ОписаниеТипов = ПересечениеТипов;
КонецЕсли;
Если ЗагружаемыйРеквизит.РежимКонвертации = "Искать" Тогда
СопоставитьКолонкуТЗ(ЗагружаемыйРеквизит, КолонкиТабличногоДокумента[СтараяСтрока.ИмяКолонкиИсточника], УстановитьПометкуДляСопоставленных);
КонецЕсли;
КонецЕсли;
КонецЦикла;
СопоставлениеКолонокТЗ.Сортировать("СинонимКолонкиПриемника");
Счетчик = 0;
Для Каждого СтараяСтрока Из КопияСопоставления Цикл
НоваяСтрока = СопоставлениеКолонокТЗ.Найти(СтараяСтрока.ИмяКолонкиПриемника, "ИмяКолонкиПриемника");
Если НоваяСтрока = Неопределено Тогда
Продолжить;
КонецЕсли;
СопоставлениеКолонокТЗ.Сдвинуть(НоваяСтрока, Счетчик - СопоставлениеКолонокТЗ.Индекс(НоваяСтрока));
Счетчик = Счетчик + 1;
КонецЦикла;
//КолонкиТабличногоДокумента = ПолучитьКолонкиТабличногоДокумента();
Для Каждого СтрокаКолонкиТЗ Из СопоставлениеКолонокТЗ Цикл
//Если Не СтрокаКолонкиТЗ.РежимКонвертации = "Искать" Тогда
// Продолжить;
//КонецЕсли;
Если ЗначениеЗаполнено(СтрокаКолонкиТЗ.ИмяКолонкиИсточника) Тогда
Колонка = КолонкиТабличногоДокумента[СтрокаКолонкиТЗ.ИмяКолонкиИсточника];
СопоставитьКолонкуТЗ(СтрокаКолонкиТЗ, Колонка, УстановитьПометкуДляСопоставленных);
КонецЕсли;
КонецЦикла;
НесопоставленныеКолонкиТД.Очистить();
Для Каждого КлючИЗначение Из КолонкиТабличногоДокумента Цикл
Колонка = КлючИЗначение.Значение;
Если СопоставлениеКолонокТЗ.Найти(Колонка.Имя, "ИмяКолонкиИсточника") = Неопределено Тогда
СтрокаКолонки = НесопоставленныеКолонкиТД.Добавить();
СтрокаКолонки.ИмяКолонки = Колонка.Имя;
СтрокаКолонки.СинонимКолонки = Колонка.Заголовок;
СтрокаКолонки.ПримерДанных = Колонка.ПримерДанных;
КонецЕсли;
КонецЦикла;
НесопоставленныеКолонкиТД.Сортировать("СинонимКолонки");
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
мПлатформа = ирКэш.Получить();
мИмяКолонкиНомерСтроки = ирОбщий.ИмяКолонкиВнутреннегоИДСтрокиЛкс();
мИмяКолонкиРезультатПоиска = "_РезультатПоиска" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяКолонкиРезультатЗаписи = "_РезультатЗаписи" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мИмяКолонкиСообщенияОбработки = "_Сообщения" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мСуффиксСырыхДанных = "_Сырое" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
мЭтоСсылочныйОбъект = Ложь;
//СтрокаЗаголовковТД = 1;
//ПерваяСтрокаДанныхТД = 2;
ВыводитьОшибкиКонвертацииСразу = Истина;
ВыводитьОшибкаЗагрузкиСразу = Истина;
ДобавлятьСтрокиБД = Истина;
ОбновлятьСтрокиБД = Истина;
ОтбиратьСразу = Истина;
СвязиИПараметрыВыбора = Истина;
ЭтотОбъект.КоличествоПотоков = 1;
ЭтотОбъект.КоличествоОбъектовВПорции = 10;
ЭтотОбъект.ВыполнятьНаСервере = ирОбщий.ПолучитьРежимОбъектыНаСервереПоУмолчаниюЛкс(Ложь);
ПримитивныеТипы = Новый Структура;
// Порядок важен!
ПримитивныеТипы.Вставить("Число", Тип("Число"));
ПримитивныеТипы.Вставить("Дата", Тип("Дата"));
ПримитивныеТипы.Вставить("Булево", Тип("Булево"));
ПримитивныеТипы.Вставить("Строка", Тип("Строка"));