mirror of
https://github.com/tormozit/RDT1C.git
synced 2025-12-17 05:04:11 +00:00
6764 lines
430 KiB
Plaintext
6764 lines
430 KiB
Plaintext
// Выполняет текст алгоритма.
|
||
//
|
||
// Параметры:
|
||
// ТекстДляВыполнения – Строка;
|
||
// _АлгоритмОбъект - СправочникОбъект
|
||
// *СтруктураПараметров - Структура, *Неопределено.
|
||
//
|
||
Функция ВыполнитьАлгоритм(_ТекстДляВыполнения, _АлгоритмОбъект = Null, _Режим = Null,
|
||
_П0 = Null, _П1 = Null, _П2 = Null, _П3 = Null, _П4 = Null, _П5 = Null, _П6 = Null, _П7 = Null, _П8 = Null, _П9 = Null) Экспорт
|
||
|
||
Перем Результат;
|
||
Выполнить(_ТекстДляВыполнения);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ВыполнитьАлгоритмБезРезультата(_ТекстДляВыполнения) Экспорт
|
||
|
||
Выполнить(_ТекстДляВыполнения);
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ВычислитьВыражение(Выражение, лПараметры = Неопределено) Экспорт
|
||
|
||
Возврат Вычислить(Выражение);
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьПриглашениеОткрытьОтладчикЛкс() Экспорт
|
||
|
||
Возврат "Нажмите кнопку ""Подробно"", а затем ""Конфигуратор"", чтобы начать отладку!";
|
||
|
||
КонецФункции
|
||
|
||
Процедура ОткрытьОтладчикЛкс() Экспорт
|
||
|
||
ВызватьИсключение ПолучитьПриглашениеОткрытьОтладчикЛкс();
|
||
|
||
КонецПроцедуры
|
||
|
||
#Если Не ТонкийКлиент И Не ВебКлиент Тогда
|
||
|
||
Функция ПолучитьПостроительТабличногоПоляСОтборомКлиентаЛкс(ТабличноеПоле) Экспорт
|
||
|
||
ВременнныйПостроительЗапроса = Новый ПостроительЗапроса;
|
||
ВременнныйПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличноеПоле.Значение);
|
||
ЛксСкопироватьОтбор(ВременнныйПостроительЗапроса.Отбор, ТабличноеПоле.ОтборСтрок, Истина);
|
||
Возврат ВременнныйПостроительЗапроса;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСтруктуруВыделенияТекстаЛкс() Экспорт
|
||
|
||
Структура = Новый Структура();
|
||
Структура.Вставить("НачальнаяСтрока");
|
||
Структура.Вставить("НачальнаяКолонка");
|
||
Структура.Вставить("КонечнаяСтрока");
|
||
Структура.Вставить("КонечнаяКолонка");
|
||
Возврат Структура;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолеТекста_ПолучитьДиапазонВыделенияЛкс(ПолеТекста) Экспорт
|
||
|
||
СтруктуруВыделения = ПолучитьСтруктуруВыделенияТекстаЛкс();
|
||
ПолеТекста.ПолучитьГраницыВыделения(СтруктуруВыделения.НачальнаяСтрока, СтруктуруВыделения.НачальнаяКолонка,
|
||
СтруктуруВыделения.КонечнаяСтрока, СтруктуруВыделения.КонечнаяКолонка);
|
||
Возврат СтруктуруВыделения;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолеТекста_УстановитьДиапазонВыделенияЛкс(Знач ПолеТекста, Знач СтруктуруВыделения) Экспорт
|
||
|
||
ПолеТекста.УстановитьГраницыВыделения(СтруктуруВыделения.НачальнаяСтрока, СтруктуруВыделения.НачальнаяКолонка,
|
||
СтруктуруВыделения.КонечнаяСтрока, СтруктуруВыделения.КонечнаяКолонка);
|
||
Возврат Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
|
||
// Копирует таблицу значений из исходной таблицы значений с удалением типа Null из описаний типов колонок.
|
||
// Параметры:
|
||
// ОбработатьТолькоКолонки - Строка - имена колонок разделенные запятыми
|
||
// НеОбрабатыватьКолонки - Строка - имена колонок разделенные запятыми
|
||
//
|
||
// Возвращаемое значение:
|
||
// ТаблицаЗначений
|
||
//
|
||
Функция ПолучитьТаблицуСКолонкамиБезТипаNullЛкс(Знач Таблица, ЗагружатьДанныеВНовуюТаблицу = Истина, ОбрабатыватьТолькоКолонки = "", НеОбрабатыватьКолонки = "") Экспорт
|
||
|
||
Результат = Новый ТаблицаЗначений;
|
||
НовыеКолонки = Результат.Колонки;
|
||
ИсходныеКолонки = Таблица.Колонки;
|
||
ИменаОбрабатываемыхКолонок = Новый Массив();
|
||
Если ОбрабатыватьТолькоКолонки <> "" Тогда
|
||
ИменаОбрабатываемыхКолонок = ЛксПолучитьМассивИзСтрокиСРазделителем(ОбрабатыватьТолькоКолонки, ",", Истина);
|
||
КонецЕсли;
|
||
ИменаНеобрабатываемыхКолонок = Новый Массив();
|
||
Если НеОбрабатыватьКолонки <> "" Тогда
|
||
ИменаНеобрабатываемыхКолонок = ЛксПолучитьМассивИзСтрокиСРазделителем(НеОбрабатыватьКолонки, ",", Истина);
|
||
КонецЕсли;
|
||
Для Каждого Колонка Из ИсходныеКолонки Цикл
|
||
Если Ложь
|
||
Или (Истина
|
||
И ОбрабатыватьТолькоКолонки <> ""
|
||
И ИменаОбрабатываемыхКолонок.Найти(Колонка.Имя) = Неопределено)
|
||
Или (Истина
|
||
И НеОбрабатыватьКолонки <> ""
|
||
И ИменаНеобрабатываемыхКолонок.Найти(Колонка.Имя) <> Неопределено)
|
||
Тогда
|
||
ОписаниеТипов = Колонка.ТипЗначения;
|
||
Иначе
|
||
ОписаниеТипов = Новый ОписаниеТипов(Колонка.ТипЗначения, , "NULL");
|
||
КонецЕсли;
|
||
НовыеКолонки.Добавить(Колонка.Имя, ОписаниеТипов, Колонка.Заголовок, Колонка.Ширина);
|
||
КонецЦикла;
|
||
Если ЗагружатьДанныеВНовуюТаблицу Тогда
|
||
ЛксЗагрузитьВТаблицуЗначений(Таблица, Результат);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиСсылочныйОбъектМетаданных(ОбъектМД) Экспорт
|
||
|
||
Если ТипЗнч(Метаданные) <> Тип("Строка") Тогда
|
||
ПолноеИмя = ОбъектМД.ПолноеИмя();
|
||
Иначе
|
||
ПолноеИмя = ОбъектМД;
|
||
КонецЕсли;
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмя);
|
||
КорневойТип = МассивФрагментов[0];
|
||
Если ЛксЛиКорневойТипОбъектаБД(КорневойТип) Тогда
|
||
Возврат Истина;
|
||
ИначеЕсли Истина
|
||
И МассивФрагментов.Количество() = 4
|
||
И КорневойТип = "ВнешнийИсточникДанных"
|
||
Тогда
|
||
Возврат (ОбъектМД.ТипДанныхТаблицы = Метаданные.СвойстваОбъектов.ТипДанныхТаблицыВнешнегоИсточникаДанных.ОбъектныеДанные);
|
||
Иначе
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиРегистровыйОбъектМетаданных(ОбъектМД) Экспорт
|
||
|
||
Если ТипЗнч(Метаданные) <> Тип("Строка") Тогда
|
||
ПолноеИмя = ОбъектМД.ПолноеИмя();
|
||
Иначе
|
||
ПолноеИмя = ОбъектМД;
|
||
КонецЕсли;
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмя);
|
||
КорневойТип = МассивФрагментов[0];
|
||
Если ЛксЛиКорневойТипРегистраБД(КорневойТип) Тогда
|
||
Возврат Истина;
|
||
ИначеЕсли Истина
|
||
И МассивФрагментов.Количество() = 4
|
||
И КорневойТип = "ВнешнийИсточникДанных"
|
||
Тогда
|
||
Возврат (ОбъектМД.ТипДанныхТаблицы = Метаданные.СвойстваОбъектов.ТипДанныхТаблицыВнешнегоИсточникаДанных.НеобъектныеДанные);
|
||
Иначе
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиТипВнешнегоИсточникаДанных(Метаданные) Экспорт
|
||
|
||
Если ТипЗнч(Метаданные) <> Тип("Строка") Тогда
|
||
ПолноеИмя = Метаданные.ПолноеИмя();
|
||
Иначе
|
||
ПолноеИмя = Метаданные;
|
||
КонецЕсли;
|
||
КорневойТип = ЛксПолучитьПервыйФрагмент(ПолноеИмя);
|
||
Возврат КорневойТип = "ВнешнийИсточникДанных";
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИмяТипаИзМетаданныхЛкс(ОбъектМД, Расширение = "Ссылка") Экспорт
|
||
|
||
Если ТипЗнч(ОбъектМД) <> Тип("Строка") Тогда
|
||
ПолноеИмя = ОбъектМД.ПолноеИмя();
|
||
Иначе
|
||
ПолноеИмя = ОбъектМД;
|
||
КонецЕсли;
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмя);
|
||
Если Фрагменты.Количество() = 4 Тогда
|
||
СтрокаТипа = Фрагменты[0] + Фрагменты[2] + Расширение + "." + Фрагменты[1] + "." + Фрагменты[3];
|
||
Иначе
|
||
СтрокаТипа = Фрагменты[0] + Расширение + "." + Фрагменты[1];
|
||
КонецЕсли;
|
||
Возврат СтрокаТипа;
|
||
|
||
КонецФункции // ПолучитьИмяТипаИзМетаданныхЛкс()
|
||
|
||
Функция ПолучитьИмяТаблицыИзМетаданныхЛкс(Знач ОбъектМД, ЛиТаблицаИзменений = Ложь, ЛиДвиженияССубконтоДляРегистраБухгалтерии = Истина,
|
||
ТолькоРазрешенные = Истина) Экспорт
|
||
|
||
Если ТипЗнч(ОбъектМД) <> Тип("Строка") Тогда
|
||
ПолноеИмя = ОбъектМД.ПолноеИмя();
|
||
Иначе
|
||
ПолноеИмя = ОбъектМД;
|
||
КонецЕсли;
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмя);
|
||
Если ТипЗнч(ОбъектМД) = Тип("Строка") Тогда
|
||
Если Фрагменты.Количество() > 1 Тогда
|
||
ОбъектМД = Метаданные.НайтиПоПолномуИмени(Фрагменты[0] + "." + Фрагменты[1]);
|
||
Иначе
|
||
//ОбъектМД = Метаданные[Фрагменты[0]];
|
||
ОбъектМД = Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И ТолькоРазрешенные
|
||
И ОбъектМД <> Неопределено
|
||
И Не ПравоДоступа("Чтение", ОбъектМД)
|
||
Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И Фрагменты[0] = "Константа"
|
||
И Фрагменты.Количество() = 2
|
||
И Не ЛиТаблицаИзменений
|
||
Тогда
|
||
Если Ложь
|
||
Или ирКэш.Получить().ВерсияПлатформы <= 802013
|
||
Или Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1
|
||
Или (Истина
|
||
И ирКэш.Получить().ВерсияПлатформы > 802013
|
||
И Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13)
|
||
Тогда
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем("Константы");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Фрагменты.Количество() = 4 Тогда
|
||
Если СтрокиРавныЛкс(Фрагменты[2], "ТабличнаяЧасть") Тогда
|
||
Фрагменты.Удалить(2);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИмяТаблицы = ЛксПолучитьСтрокуСРазделителемИзМассива(Фрагменты, ".");
|
||
Если Истина
|
||
И ЛиПолноеИмяРегистраБухгалтерииЛкс(ПолноеИмя)
|
||
И Не ЛиТаблицаИзменений
|
||
И ЛиДвиженияССубконтоДляРегистраБухгалтерии
|
||
Тогда
|
||
//ИмяТаблицы = ИмяТаблицы + ".ДвиженияССубконто";
|
||
ИмяТаблицы = ИмяТаблицы + ".ДвиженияССубконто(,, {Регистратор.*, НомерСтроки, Активность})";
|
||
КонецЕсли;
|
||
Если ЛиТаблицаИзменений Тогда
|
||
ИмяТаблицы = ИмяТаблицы + ".Изменения";
|
||
КонецЕсли;
|
||
Возврат ИмяТаблицы;
|
||
|
||
КонецФункции // ПолучитьИмяТаблицыИзМетаданныхЛкс()
|
||
|
||
Функция ЛиПолноеИмяРегистраБухгалтерииЛкс(ПолноеИмяМД) Экспорт
|
||
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмяМД);
|
||
Результат = Истина
|
||
И Фрагменты.Количество() = 2
|
||
И (Ложь
|
||
Или Фрагменты[0] = "AccountingRegister"
|
||
Или Фрагменты[0] = "РегистрБухгалтерии");
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Создает тип из метаданных.
|
||
//
|
||
// Параметры:
|
||
// Метаданные – ОбъектМетаданных;
|
||
// *Расширение - Строка, "Ссылка" - расширение типа.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Тип.
|
||
//
|
||
Функция ПолучитьТипИзМетаданныхЛкс(ОбъектМД, Расширение = "Ссылка") Экспорт
|
||
|
||
Возврат Тип(ПолучитьИмяТипаИзМетаданныхЛкс(ОбъектМД, Расширение));
|
||
|
||
КонецФункции // ПолучитьТипИзМетаданных()
|
||
|
||
Функция ЛиОбщийРеквизитИспользуетсяВОбъектеМетаданныхЛкс(ОбщийРеквизит, ОбъектМетаданных) Экспорт
|
||
|
||
ЭлементСостава = ОбщийРеквизит.Состав.Найти(ОбъектМетаданных);
|
||
Результат = Истина
|
||
И ЭлементСостава <> Неопределено
|
||
И (Ложь
|
||
Или ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать
|
||
Или (Истина
|
||
И ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Авто
|
||
И ОбщийРеквизит.АвтоИспользование = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита.Использовать));
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьАлгоритмОбъектПоИдентификаторуЛкс(Знач Алгоритм) Экспорт
|
||
|
||
Если ТипЗнч(Алгоритм) <> Тип("СправочникСсылка.ирАлгоритмы") Тогда
|
||
Алгоритм = "" + Алгоритм;
|
||
Если Найти(Алгоритм, "-") > 0 Тогда
|
||
// Передан GUID
|
||
Алгоритм = Справочники.ирАлгоритмы.ПолучитьСсылку(Новый УникальныйИдентификатор(Алгоритм));
|
||
Иначе
|
||
// Передано имя алгоритма
|
||
Попытка
|
||
Алгоритм = ПредопределенноеЗначение("Справочник.ирАлгоритмы." + Алгоритм);
|
||
Исключение
|
||
КонецПопытки;
|
||
Если ТипЗнч(Алгоритм) <> Тип("СправочникСсылка.ирАлгоритмы") Тогда
|
||
Алгоритм = Справочники.ирАлгоритмы.НайтиПоНаименованию(Алгоритм, Истина);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Не ЗначениеЗаполнено(Алгоритм) Тогда
|
||
ВызватьИсключение "Алгоритм по идентификатору """ + Алгоритм + """ не найден";
|
||
КонецЕсли;
|
||
Возврат Алгоритм.ПолучитьОбъект();
|
||
|
||
КонецФункции
|
||
|
||
Функция СериализоватьЗначениеЛкс(Значение, Знач СериализаторИлиФабрика = Неопределено) Экспорт
|
||
|
||
ЗаписьXML = Новый ЗаписьXML;
|
||
ЗаписьXML.УстановитьСтроку();
|
||
Если ТипЗнч(Значение) = Тип("ОбъектXDTO") Тогда
|
||
Если СериализаторИлиФабрика = Неопределено Тогда
|
||
СериализаторИлиФабрика = ФабрикаXDTO;
|
||
КонецЕсли;
|
||
СериализаторИлиФабрика.ЗаписатьXML(ЗаписьXML, Значение);
|
||
Иначе
|
||
Если СериализаторИлиФабрика = Неопределено Тогда
|
||
СериализаторИлиФабрика = СериализаторXDTO;
|
||
КонецЕсли;
|
||
СериализаторИлиФабрика.ЗаписатьXML(ЗаписьXML, Значение);
|
||
КонецЕсли;
|
||
Результат = ЗаписьXML.Закрыть();
|
||
Возврат Результат;
|
||
|
||
КонецФункции // СериализоватьОбъектXDTO()
|
||
|
||
//Если объекту не назначена ссылка, назначает эту ссылку
|
||
Функция ПолучитьТочнуюСсылкуОбъектаЛкс(ОбъектБД) Экспорт
|
||
|
||
Ссылка = ОбъектБД.Ссылка;
|
||
Если Ссылка.Пустая() Тогда
|
||
Ссылка = ОбъектБД.ПолучитьСсылкуНового();
|
||
Если Ссылка.Пустая() Тогда
|
||
Ссылка = XMLЗначение(ТипЗнч(Ссылка), "" + Новый УникальныйИдентификатор);
|
||
ОбъектБД.УстановитьСсылкуНового(Ссылка);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Ссылка;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСтроковыйЛитералИзМногострочногоТекстаЛкс(Знач Текст) Экспорт
|
||
|
||
Текст = Символы.ПС + Текст;
|
||
Текст = СтрЗаменить(Текст, Символы.ПС, Символы.ПС + "|");
|
||
Текст = СтрЗаменить(Текст, """", """""");
|
||
Текст = """" + Текст + """";
|
||
Возврат Текст;
|
||
|
||
КонецФункции // ПолучитьСтроковыйЛитералИзМногострочногоТекста()
|
||
|
||
Функция ПолучитьВсеСтрокиДереваЗначенийЛкс(СтрокаИлиДеревоЗначений) Экспорт
|
||
|
||
Если ТипЗнч(СтрокаИлиДеревоЗначений) = Тип("СтрокаДереваЗначений") Тогда
|
||
ДеревоЗначений = СтрокаИлиДеревоЗначений.Владелец();
|
||
Иначе
|
||
ДеревоЗначений = СтрокаИлиДеревоЗначений;
|
||
КонецЕсли;
|
||
Идентификатор = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
|
||
ДеревоЗначений.Колонки.Добавить(Идентификатор);
|
||
ВсеСтроки = СтрокаИлиДеревоЗначений.Строки.НайтиСтроки(Новый Структура(Идентификатор,), Истина);
|
||
ДеревоЗначений.Колонки.Удалить(Идентификатор);
|
||
Возврат ВсеСтроки;
|
||
|
||
КонецФункции // ПолучитьВсеСтрокиДереваЗначений()
|
||
|
||
Функция СериализацииРавныЛкс(Таблица1, Таблица2) Экспорт
|
||
|
||
Хмл1 = СериализоватьЗначениеЛкс(Таблица1);
|
||
Хмл2 = СериализоватьЗначениеЛкс(Таблица2);
|
||
Возврат (Хмл1 = Хмл2);
|
||
|
||
КонецФункции
|
||
|
||
// ВариантОбрезания - 1
|
||
// ВариантОбрезания - 2
|
||
Функция ПолучитьИнформациюОбОшибкеБезВерхнегоМодуляЛкс(ИнформацияОбОшибке = Неопределено, ВариантОбрезания = 2) Экспорт
|
||
|
||
Если ИнформацияОбОшибке = Неопределено Тогда
|
||
ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
КонецЕсли;
|
||
Если ВариантОбрезания = 1 Тогда
|
||
ОписаниеОшибки = ИнформацияОбОшибке.Описание;
|
||
Если ИнформацияОбОшибке.Причина <> Неопределено Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке.Причина);
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И ВариантОбрезания = 2
|
||
И ИнформацияОбОшибке.Причина <> Неопределено
|
||
Тогда
|
||
ОписаниеОшибки = ИнформацияОбОшибке.Описание + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке.Причина);
|
||
Иначе
|
||
ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
КонецЕсли;
|
||
Возврат ОписаниеОшибки;
|
||
|
||
КонецФункции
|
||
|
||
// Первая строка табличного документа содержит заголовки
|
||
Функция ПолучитьТаблицуИзТабличногоДокументаЛкс(Знач ТабличныйДокумент, ЛиПерваяСтрокаСодержитИменаКолонок = Истина, ДлинаСтрокиТипаКолонки = 150,
|
||
ВычислятьНетипизированныеЗначения = Ложь, ЛиВтораяСтрокаСодержитТипыЗначений = Ложь) Экспорт
|
||
|
||
#Если _ Тогда
|
||
ТабличныйДокумент = Новый ТабличныйДокумент
|
||
#КонецЕсли
|
||
ТаблицаПриемник = Новый ТаблицаЗначений;
|
||
НачальнаяСтрока = 1;
|
||
Если ЛиПерваяСтрокаСодержитИменаКолонок Тогда
|
||
НачальнаяСтрока = НачальнаяСтрока + 1;
|
||
КонецЕсли;
|
||
Если ЛиВтораяСтрокаСодержитТипыЗначений Тогда
|
||
НачальнаяСтрока = НачальнаяСтрока + 1;
|
||
КонецЕсли;
|
||
ТипизированныеКолонки = Новый Соответствие;
|
||
Для Счетчик = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
|
||
Если ЛиПерваяСтрокаСодержитИменаКолонок Тогда
|
||
ИмяКолонки = ТабличныйДокумент.Область(1, Счетчик).Текст;
|
||
Иначе
|
||
ИмяКолонки = "Колонка" + Счетчик;
|
||
КонецЕсли;
|
||
Если ЛиВтораяСтрокаСодержитТипыЗначений Тогда
|
||
ИменаТипов = ТабличныйДокумент.Область(2, Счетчик).Текст;
|
||
ТипизированныеКолонки[Счетчик] = 1;
|
||
Иначе
|
||
ИменаТипов = "";
|
||
КонецЕсли;
|
||
ТаблицаПриемник.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов(ИменаТипов));
|
||
КонецЦикла;
|
||
// Цикл перебора строк табличного документа
|
||
ВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы;
|
||
//Индикатор = ОбщийИис.ПолучитьИндикаторПроцессаИис(ТабличныйДокумент.ВысотаТаблицы);
|
||
Для НомерСтроки = НачальнаяСтрока По ВысотаТаблицы Цикл
|
||
// Добавление строки результирующей таблицы
|
||
НоваяСтрокаТЗ = ТаблицаПриемник.Добавить();
|
||
Для НомерКолонки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
|
||
Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
|
||
ТекстЯчейки = Область.Текст;
|
||
Если Не ЗначениеЗаполнено(ТекстЯчейки) Тогда
|
||
Поддокумент = ТабличныйДокумент.ПолучитьОбласть(НомерСтроки, НомерКолонки);
|
||
Если Поддокумент.Рисунки.Количество() > 0 Тогда
|
||
ТекстЯчейки = Поддокумент.Рисунки[0].Картинка;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ЗначениеЯчейки = ТекстЯчейки;
|
||
Если Ложь
|
||
Или ВычислятьНетипизированныеЗначения
|
||
Или ТипизированныеКолонки[НомерКолонки] <> Неопределено
|
||
Тогда
|
||
Попытка
|
||
ЗначениеЯчейки = Вычислить(ЗначениеЯчейки);
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
НоваяСтрокаТЗ[НомерКолонки - 1] = ЗначениеЯчейки;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
Возврат ТаблицаПриемник;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИдентификаторТипаЛкс(Тип) Экспорт
|
||
|
||
Результат = ЛксПолучитьСтрокуМеждуМаркерами("" + ЗначениеВСтрокуВнутр(Тип), ",", "}", Ложь);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьПеременныеТекстаВстроенногоЯзыкаЛкс(Знач ТекстПрограммы = "") Экспорт
|
||
|
||
Если ПустаяСтрока(ТекстПрограммы) Тогда
|
||
ТекстПрограммы = ирНеглобальный.ПолучитьТекстИзБуфераОбменаОСЛкс();
|
||
КонецЕсли;
|
||
Параметры = Новый Структура();
|
||
ПолеВстроенногоЯзыка = Обработки.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой.Создать();
|
||
ПолеВстроенногоЯзыка.ИнициализироватьНеинтерактивно();
|
||
ПолеВстроенногоЯзыка.ЗаполнитьЛокальныеСвойстваИМетодыПоТексту(,,,, Истина, ТекстПрограммы);
|
||
СтрокиЛокальныхПеременных = ПолеВстроенногоЯзыка.ТаблицаСлов.НайтиСтроки(Новый Структура("ТипСлова, Определение", "Свойство", "Статистический"));
|
||
//СтрокиЛокальныхПеременных = ПолеВстроенногоЯзыка.ТаблицаСлов.НайтиСтроки(Новый Структура("ТипСлова", "Свойство"));
|
||
Для Каждого СтрокаПеременной Из СтрокиЛокальныхПеременных Цикл
|
||
Параметры.Вставить(СтрокаПеременной.Слово);
|
||
КонецЦикла;
|
||
Возврат Параметры;
|
||
|
||
КонецФункции
|
||
|
||
|
||
// КолонкиНабора - КоллекцияКолонокДереваЗначений, КоллекцияКолонокТаблицыЗначений, КоллекцияКолонокРезультатаЗапроса
|
||
Функция СоздатьИлиОбновитьНаборДанныхОбъектПоМетаданнымЛкс(Знач СхемаКомпоновкиДанных, Знач КолонкиНабора, Знач ИмяНабора = "Основной",
|
||
Знач СоздаватьПапкиПолей = Ложь, СоздаватьРесурсыЧисловыхПолей = Ложь) Экспорт
|
||
|
||
#Если _ Тогда
|
||
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
|
||
#КонецЕсли
|
||
Результат = СхемаКомпоновкиДанных.НаборыДанных.Найти(ИмяНабора);
|
||
Если Результат = Неопределено Тогда
|
||
Результат = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
|
||
КонецЕсли;
|
||
Результат.Имя = ИмяНабора;
|
||
Результат.ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных[0].Имя;
|
||
Результат.ИмяОбъекта = ИмяНабора;
|
||
Для Каждого ЭлементМетаданных Из КолонкиНабора Цикл
|
||
Если Ложь
|
||
Или ТипЗнч(ЭлементМетаданных) = Тип("КолонкаДереваЗначений")
|
||
Или ТипЗнч(ЭлементМетаданных) = Тип("КолонкаТаблицыЗначений")
|
||
Тогда
|
||
ИмяПоля = ЭлементМетаданных.Имя;
|
||
ЗаголовокПоля = ЭлементМетаданных.Заголовок;
|
||
ИначеЕсли Ложь
|
||
Или ТипЗнч(ЭлементМетаданных) = Тип("КолонкаРезультатаЗапроса")
|
||
Тогда
|
||
ИмяПоля = ЭлементМетаданных.Имя;
|
||
ЗаголовокПоля = ИмяПоля;
|
||
ИначеЕсли Ложь
|
||
Или ТипЗнч(ЭлементМетаданных) = Тип("ПолеНастройки")
|
||
Тогда
|
||
ИмяПоля = ЭлементМетаданных.Имя;
|
||
ЗаголовокПоля = ЭлементМетаданных.Представление;
|
||
ИначеЕсли Ложь
|
||
Или ТипЗнч(ЭлементМетаданных) = Тип("ДоступноеПолеОтбораКомпоновкиДанных")
|
||
Тогда
|
||
ИмяПоля = "" + ЭлементМетаданных.Поле;
|
||
ЗаголовокПоля = ЭлементМетаданных.Заголовок;
|
||
Иначе
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Поле = Результат.Поля.Найти(ИмяПоля);
|
||
Если Поле = Неопределено Тогда
|
||
Поле = Результат.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
|
||
КонецЕсли;
|
||
ПутьКДанным = ИмяПоля;
|
||
Если СоздаватьПапкиПолей Тогда
|
||
ПутьКДанным = Результат.Имя + "." + ПутьКДанным;
|
||
КонецЕсли;
|
||
Поле.ПутьКДанным = ПутьКДанным;
|
||
Поле.Поле = ИмяПоля;
|
||
Поле.Заголовок = ЗаголовокПоля;
|
||
Поле.ТипЗначения = ЭлементМетаданных.ТипЗначения;
|
||
Если Истина
|
||
И СоздаватьРесурсыЧисловыхПолей
|
||
И Поле.ТипЗначения.СодержитТип(Тип("Число"))
|
||
Тогда
|
||
Ресурс = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
|
||
Ресурс.Выражение = "Сумма(" + ИмяПоля + ")";
|
||
Ресурс.ПутьКДанным = ИмяПоля;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ЗаполнитьПараметрыСхемыПоЗапросуЛкс(Знач СхемаКомпоновкиДанных, Знач Запрос) Экспорт
|
||
|
||
Для Каждого КлючИЗначение Из Запрос.Параметры Цикл
|
||
ЗначениеПараметра = КлючИЗначение.Значение;
|
||
Если ТипЗнч(ЗначениеПараметра) = Тип("Массив") Тогда
|
||
Список = Новый СписокЗначений;
|
||
Список.ЗагрузитьЗначения(ЗначениеПараметра);
|
||
ЗначениеПараметра = Список;
|
||
КонецЕсли;
|
||
ПараметрСхемы = СхемаКомпоновкиДанных.Параметры.Найти(КлючИЗначение.Ключ);
|
||
Если ПараметрСхемы = Неопределено Тогда
|
||
ПараметрСхемы = СхемаКомпоновкиДанных.Параметры.Добавить();
|
||
КонецЕсли;
|
||
ПараметрСхемы.Имя = КлючИЗначение.Ключ;
|
||
ПараметрСхемы.ДоступенСписокЗначений = ТипЗнч(ЗначениеПараметра) = Тип("СписокЗначений");
|
||
//Тип надо задавать, чтобы значение корректно записалось. Иначе ссылки будут преобразованы к строке.
|
||
МассивТипов = Новый Массив;
|
||
МассивТипов.Добавить(ТипЗнч(КлючИЗначение.Значение));
|
||
Если Не ПараметрСхемы.ДоступенСписокЗначений Тогда
|
||
ПараметрСхемы.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
|
||
КонецЕсли;
|
||
ПараметрСхемы.Значение = ЗначениеПараметра;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция СоздатьИлиОбновитьНаборДанныхЗапросПоЗапросуЛкс(Знач СхемаКомпоновкиДанных, Знач Запрос, Знач ИмяНабора = "Основной",
|
||
Представления = Неопределено) Экспорт
|
||
|
||
НаборДанных = ЛксДобавитьНаборДанныхЗапрос(СхемаКомпоновкиДанных.НаборыДанных, СхемаКомпоновкиДанных.ИсточникиДанных[0]);
|
||
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
|
||
НаборДанных.Запрос = Запрос.Текст;
|
||
Если Представления <> Неопределено Тогда
|
||
Для Каждого КлючИЗначение Из Представления Цикл
|
||
ПолеНабора = НаборДанных.Поля.Найти(КлючИЗначение.Ключ);
|
||
Если ПолеНабора = Неопределено Тогда
|
||
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
|
||
КонецЕсли;
|
||
ПолеНабора.Поле = КлючИЗначение.Ключ;
|
||
ПолеНабора.ПутьКДанным = КлючИЗначение.Ключ;
|
||
ПолеНабора.Заголовок = КлючИЗначение.Значение;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
ЗаполнитьПараметрыСхемыПоЗапросуЛкс(СхемаКомпоновкиДанных, Запрос);
|
||
Возврат НаборДанных;
|
||
|
||
КонецФункции
|
||
|
||
// Представления - Структура
|
||
Функция ПолучитьСхемуКомпоновкиПоЗапросуЛкс(Знач ЗапросИлиТекст, ИмяНабораДанных = "НаборДанных1", Представления = Неопределено) Экспорт
|
||
|
||
Схема = Новый СхемаКомпоновкиДанных;
|
||
ЛксДобавитьЛокальныйИсточникДанных(Схема);
|
||
Если ТипЗнч(ЗапросИлиТекст) = Тип("Строка") Тогда
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст = ЗапросИлиТекст;
|
||
Иначе
|
||
Запрос = ЗапросИлиТекст;
|
||
КонецЕсли;
|
||
СоздатьИлиОбновитьНаборДанныхЗапросПоЗапросуЛкс(Схема, Запрос, ИмяНабораДанных, Представления);
|
||
Возврат Схема;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСхемуКомпоновкиПоОбъектуМетаданныхЛкс(Знач ПолноеИмяИлиОбъектМД, ИмяНабораДанных = "НаборДанных1",
|
||
ДобавитьАвтополеКоличествоСтрок = Истина, ПсевдонимТаблицы = "Т") Экспорт
|
||
|
||
Если ТипЗнч(ПолноеИмяИлиОбъектМД) = Тип("Строка") Тогда
|
||
ПолноеИмяМД = ПолноеИмяИлиОбъектМД;
|
||
Иначе
|
||
ПолноеИмяМД = ПолноеИмяИлиОбъектМД.ПолноеИмя();
|
||
КонецЕсли;
|
||
Схема = Новый СхемаКомпоновкиДанных;
|
||
ИсточникДанных = ЛксДобавитьЛокальныйИсточникДанных(Схема);
|
||
НаборДанных = ЛксДобавитьНаборДанныхЗапрос(Схема.НаборыДанных, ИсточникДанных);
|
||
#Если _ Тогда
|
||
НаборДанных = Схема.НаборыДанных.Добавить();
|
||
#КонецЕсли
|
||
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
|
||
ПолноеИмяТаблицыБД = ПолучитьИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД);
|
||
НаборДанных.Запрос = "ВЫБРАТЬ " + ПсевдонимТаблицы + ".* ИЗ " + ПолноеИмяТаблицыБД + " КАК " + ПсевдонимТаблицы;
|
||
Если ДобавитьАвтополеКоличествоСтрок Тогда
|
||
ДобавитьВСхемуКомпоновкиАвтополеКоличествоСтрок(Схема);
|
||
КонецЕсли;
|
||
// Антибаг платформы в режиме совместимости. Предопределенные реквизиты имеют англ. имена полей
|
||
Если Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1 Тогда
|
||
Построитель = Новый ПостроительЗапроса(НаборДанных.Запрос);
|
||
Построитель.ЗаполнитьНастройки();
|
||
Для Каждого ДоступноеПоле Из Построитель.ДоступныеПоля Цикл
|
||
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
|
||
ПолеНабора.Поле = ДоступноеПоле.ПутьКДанным;
|
||
//ПолеНабора.ПутьКДанным = ДоступноеПоле.ПутьКДанным;
|
||
ПолеНабора.Заголовок = ДоступноеПоле.Представление;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат Схема;
|
||
|
||
КонецФункции
|
||
|
||
|
||
Функция ПолучитьИндексКартинкиТипаТаблицыБДЛкс(ТипТаблицы) Экспорт
|
||
|
||
ИндексКартинки = 14;
|
||
Если ТипТаблицы = "Константы" Тогда
|
||
ИндексКартинки = 2;
|
||
ИначеЕсли ТипТаблицы = "Константа" Тогда
|
||
ИндексКартинки = 2;
|
||
//ИначеЕсли ТипТаблицы = "ТабличнаяЧасть" Тогда
|
||
ИначеЕсли ЛксЛиТипВложеннойТаблицыБД(ТипТаблицы) Тогда
|
||
ИндексКартинки = 20;
|
||
ИначеЕсли ТипТаблицы = "Изменения" Тогда
|
||
ИндексКартинки = 27;
|
||
ИначеЕсли ТипТаблицы = "ВиртуальнаяТаблица" Тогда
|
||
ИндексКартинки = 28;
|
||
ИначеЕсли ТипТаблицы = "ВнешнийИсточникДанных" Тогда
|
||
ИндексКартинки = 29;
|
||
ИначеЕсли ТипТаблицы = "Справочник" Тогда
|
||
ИндексКартинки = 3;
|
||
ИначеЕсли ТипТаблицы = "Перечисление" Тогда
|
||
ИндексКартинки = 4;
|
||
ИначеЕсли ТипТаблицы = "Документ" Тогда
|
||
ИндексКартинки = 5;
|
||
ИначеЕсли ТипТаблицы = "ЖурналДокументов" Тогда
|
||
ИндексКартинки = 6;
|
||
ИначеЕсли ТипТаблицы = "Последовательность" Тогда
|
||
ИндексКартинки = 7;
|
||
ИначеЕсли ТипТаблицы = "РегистрНакопления" Тогда
|
||
ИндексКартинки = 8;
|
||
ИначеЕсли ТипТаблицы = "РегистрСведений" Тогда
|
||
ИндексКартинки = 9;
|
||
ИначеЕсли ТипТаблицы = "РегистрБухгалтерии" Тогда
|
||
ИндексКартинки = 10;
|
||
ИначеЕсли ТипТаблицы = "РегистрРасчета" Тогда
|
||
ИндексКартинки = 11;
|
||
ИначеЕсли ТипТаблицы = "ПланОбмена" Тогда
|
||
ИндексКартинки = 19;
|
||
ИначеЕсли ТипТаблицы = "Задача" Тогда
|
||
ИндексКартинки = 17;
|
||
ИначеЕсли ТипТаблицы = "БизнесПроцесс" Тогда
|
||
ИндексКартинки = 18;
|
||
ИначеЕсли ТипТаблицы = "РегистрРасчета" Тогда
|
||
ИндексКартинки = 26;
|
||
ИначеЕсли ТипТаблицы = "ПланВидовРасчета" Тогда
|
||
ИндексКартинки = 25;
|
||
ИначеЕсли ТипТаблицы = "ПланВидовХарактеристик" Тогда
|
||
ИндексКартинки = 22;
|
||
ИначеЕсли ТипТаблицы = "Перечисление" Тогда
|
||
ИндексКартинки = 23;
|
||
ИначеЕсли ТипТаблицы = "ПланСчетов" Тогда
|
||
ИндексКартинки = 24;
|
||
ИначеЕсли ирНеглобальный.СтрокиРавныЛкс(ТипТаблицы, "Table") Тогда
|
||
ИндексКартинки = 3;
|
||
КонецЕсли;
|
||
Возврат ИндексКартинки;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(Знач Коллекция, Знач Свойство, Знач Значение, Знач ТипЭлемента = Неопределено) Экспорт
|
||
|
||
Структура = Новый Структура(Свойство);
|
||
Для каждого Элемент Из Коллекция Цикл
|
||
Если Истина
|
||
И ТипЭлемента <> Неопределено
|
||
И ТипЗнч(Элемент) <> ТипЭлемента
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ЗаполнитьЗначенияСвойств(Структура, Элемент, Свойство);
|
||
Если Структура[Свойство] = Значение Тогда
|
||
Результат = Элемент;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиДобавитьЭлементНастроекКомпоновкиПоПредставлениюЛкс(Знач ЭлементыНастройки, Знач Представление = "", Знач ПроверятьУникальность = Истина,
|
||
Знач ИспользованиеДляНового = Истина) Экспорт
|
||
|
||
Попытка
|
||
ЭлементыНастройки = ЭлементыНастройки.Элементы;
|
||
Исключение
|
||
КонецПопытки;
|
||
Если ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияЭлементовОтбораКомпоновкиДанных") Тогда
|
||
ТипЭлемента = Тип("ЭлементОтбораКомпоновкиДанных");
|
||
ИначеЕсли ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных") Тогда
|
||
ТипЭлемента = Неопределено;
|
||
КонецЕсли;
|
||
Если ПроверятьУникальность Тогда
|
||
ЭлементНастроек = НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ЭлементыНастройки, "Представление", Представление, ТипЭлемента);
|
||
КонецЕсли;
|
||
Если ЭлементНастроек = Неопределено Тогда
|
||
Если ТипЭлемента <> Неопределено Тогда
|
||
ЭлементНастроек = ЭлементыНастройки.Добавить(ТипЭлемента);
|
||
Иначе
|
||
ЭлементНастроек = ЭлементыНастройки.Добавить();
|
||
КонецЕсли;
|
||
ЭлементНастроек.Представление = Представление;
|
||
ЭлементНастроек.Использование = ИспользованиеДляНового;
|
||
КонецЕсли;
|
||
Возврат ЭлементНастроек;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(Знач ЭлементыНастройки, Знач Поле = "", Знач ПроверятьУникальность = Истина,
|
||
Знач ИспользованиеДляНового = Истина) Экспорт
|
||
|
||
Если ТипЗнч(Поле) = Тип("Строка") Тогда
|
||
Поле = Новый ПолеКомпоновкиДанных(Поле);
|
||
КонецЕсли;
|
||
Попытка
|
||
ЭлементыНастройки = ЭлементыНастройки.Элементы;
|
||
Исключение
|
||
КонецПопытки;
|
||
Если ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияЭлементовПорядкаКомпоновкиДанных") Тогда
|
||
ТипЭлемента = Тип("ЭлементПорядкаКомпоновкиДанных");
|
||
ИначеЕсли ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияВыбранныхПолейКомпоновкиДанных") Тогда
|
||
ТипЭлемента = Тип("ВыбранноеПолеКомпоновкиДанных");
|
||
ИначеЕсли ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияПолейГруппировкиКомпоновкиДанных") Тогда
|
||
ТипЭлемента = Тип("ПолеГруппировкиКомпоновкиДанных");
|
||
ИначеЕсли ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных") Тогда
|
||
ТипЭлемента = Неопределено;
|
||
//ИначеЕсли ТипЗнч(ЭлементыНастройки) = Тип("КоллекцияЭлементовОтбораКомпоновкиДанных") Тогда
|
||
// ТипЭлемента = Тип("ЭлементОтбораКомпоновкиДанных");
|
||
КонецЕсли;
|
||
Если ПроверятьУникальность Тогда
|
||
ЭлементНастроек = НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ЭлементыНастройки, "Поле", Поле, ТипЭлемента);
|
||
КонецЕсли;
|
||
Если ЭлементНастроек = Неопределено Тогда
|
||
Если ТипЭлемента <> Неопределено Тогда
|
||
ЭлементНастроек = ЭлементыНастройки.Добавить(ТипЭлемента);
|
||
Иначе
|
||
ЭлементНастроек = ЭлементыНастройки.Добавить();
|
||
КонецЕсли;
|
||
ЭлементНастроек.Поле = Поле;
|
||
ЭлементНастроек.Использование = ИспользованиеДляНового;
|
||
КонецЕсли;
|
||
Возврат ЭлементНастроек;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиДобавитьЭлементСтруктурыГруппировкаКомпоновкиЛкс(Знач Группировки, Знач Поле = "") Экспорт
|
||
|
||
Если ТипЗнч(Поле) = Тип("Строка") Тогда
|
||
Поле = Новый ПолеКомпоновкиДанных(Поле);
|
||
КонецЕсли;
|
||
ЭлементСуществует = Ложь;
|
||
Для Каждого Группировка Из Группировки Цикл
|
||
Поля = Группировка.ПоляГруппировки.Элементы;
|
||
Если Ложь
|
||
Или (Истина
|
||
И Поля.Количество() = 0
|
||
И "" + Поле = "")
|
||
Или (Истина
|
||
И Поля.Количество() = 1
|
||
И Поля[0].Поле = Поле)
|
||
Тогда
|
||
ЭлементСуществует = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если Не ЭлементСуществует Тогда
|
||
Группировка = Группировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
|
||
Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
|
||
Группировка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
|
||
Если "" + Поле <> "" Тогда
|
||
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
|
||
ПолеГруппировки.Поле = Поле;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Группировка.Использование = Истина;
|
||
Возврат Группировка;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиЭлементОтбораКомпоновкиЛкс(Знач Отбор, Знач ИменаПолей, Знач НайденныеЭлементы = Неопределено, Знач ТолькоВключенныеНаРавенствоЗначению = Ложь,
|
||
Знач ВключатьПодчиненные = Ложь) Экспорт
|
||
|
||
Если ТипЗнч(Отбор) = Тип("ОтборКомпоновкиДанных") Тогда
|
||
ЭлементыОтбора = Отбор.Элементы;
|
||
Иначе
|
||
ЭлементыОтбора = Отбор;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ИменаПолей) = Тип("Строка") Тогда
|
||
МассивИменПолей = ЛксПолучитьМассивИзСтрокиСРазделителем(ИменаПолей, ",", Истина);
|
||
Иначе
|
||
МассивИменПолей = ИменаПолей;
|
||
КонецЕсли;
|
||
МассивПолей = Новый Массив;
|
||
Для Каждого ИмяПоля Из МассивИменПолей Цикл
|
||
МассивПолей.Добавить(Новый ПолеКомпоновкиДанных(ИмяПоля));
|
||
КонецЦикла;
|
||
МассивПолейПуст = МассивПолей.Количество() = 0;
|
||
Если НайденныеЭлементы = Неопределено Тогда
|
||
НайденныеЭлементы = Новый Соответствие;
|
||
КонецЕсли;
|
||
Для Каждого ЭлементОтбора ИЗ ЭлементыОтбора Цикл
|
||
Если Истина
|
||
И ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных")
|
||
И (Ложь
|
||
Или Не ТолькоВключенныеНаРавенствоЗначению
|
||
Или (Истина
|
||
И ЭлементОтбора.Использование
|
||
И ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно
|
||
И ТипЗнч(ЭлементОтбора.ЛевоеЗначение) = Тип("ПолеКомпоновкиДанных")
|
||
И ТипЗнч(ЭлементОтбора.ПравоеЗначение) <> Тип("ПолеКомпоновкиДанных")))
|
||
Тогда
|
||
Если Ложь
|
||
Или МассивПолейПуст
|
||
Или МассивПолей.Найти(ЭлементОтбора.ЛевоеЗначение) <> Неопределено
|
||
Тогда
|
||
НайденныеЭлементы.Вставить("" + ЭлементОтбора.ЛевоеЗначение, ЭлементОтбора);
|
||
КонецЕсли;
|
||
ИначеЕсли Истина
|
||
И ВключатьПодчиненные
|
||
И ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных")
|
||
Тогда
|
||
НайтиЭлементОтбораКомпоновкиЛкс(ЭлементОтбора.Элементы, МассивИменПолей, НайденныеЭлементы, ТолькоВключенныеНаРавенствоЗначению);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если МассивИменПолей.Количество() = 1 Тогда
|
||
Результат = НайденныеЭлементы[МассивИменПолей[0]];
|
||
Иначе
|
||
Результат = НайденныеЭлементы;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиДобавитьЭлементОтбораКомпоновкиЛкс(Знач ЭлементыОтбора, Знач Поле = "", Знач Значение, Знач Сравнение = "", Знач ДоступныеПоляОтбора = Неопределено,
|
||
Знач ПроверятьУникальность = Истина) Экспорт
|
||
|
||
Если ТипЗнч(ЭлементыОтбора) = Тип("НастройкиКомпоновкиДанных") Тогда
|
||
ЭлементыОтбора = ЭлементыОтбора.Отбор;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ЭлементыОтбора) = Тип("ОтборКомпоновкиДанных") Тогда
|
||
ДоступныеПоляОтбора = ЭлементыОтбора.ДоступныеПоляОтбора;
|
||
ЭлементыОтбора = ЭлементыОтбора.Элементы;
|
||
Иначе
|
||
ЭлементыОтбора = ЭлементыОтбора;
|
||
КонецЕсли;
|
||
Если ТипЗнч(Поле) = Тип("Строка") Тогда
|
||
Поле = Новый ПолеКомпоновкиДанных(Поле);
|
||
КонецЕсли;
|
||
Если ПроверятьУникальность Тогда
|
||
ЭлементОтбора = НайтиЭлементОтбораКомпоновкиЛкс(ЭлементыОтбора, "" + Поле);
|
||
КонецЕсли;
|
||
Если ЭлементОтбора = Неопределено Тогда
|
||
ЭлементОтбора = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
|
||
ЭлементОтбора.ЛевоеЗначение = Поле;
|
||
КонецЕсли;
|
||
Если ТипЗнч(Значение) = Тип("Массив") Тогда
|
||
СписокЗначений = Новый СписокЗначений;
|
||
СписокЗначений.ЗагрузитьЗначения(Значение);
|
||
Значение = СписокЗначений;
|
||
КонецЕсли;
|
||
|
||
// Вид сравнения
|
||
Если ТипЗнч(Сравнение) = Тип("ВидСравненияКомпоновкиДанных") Тогда
|
||
Иначе
|
||
Если ТипЗнч(Значение) = Тип("СписокЗначений") Тогда
|
||
Сравнение = ВидСравненияКомпоновкиДанных.ВСписке;
|
||
Иначе
|
||
Сравнение = ВидСравненияКомпоновкиДанных.Равно;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И Сравнение = ВидСравненияКомпоновкиДанных.Равно
|
||
И Значение = Неопределено
|
||
И ДоступныеПоляОтбора <> Неопределено
|
||
Тогда
|
||
ДоступноеПолеОтбора = ДоступныеПоляОтбора.НайтиПоле(Поле);
|
||
Если ДоступноеПолеОтбора <> Неопределено Тогда
|
||
Значение = ДоступноеПолеОтбора.Тип.ПривестиЗначение(Значение);
|
||
Если Истина
|
||
И Значение = ""
|
||
И ДоступноеПолеОтбора.Тип.КвалификаторыСтроки.Длина = 0
|
||
Тогда
|
||
Сравнение = ВидСравненияКомпоновкиДанных.Содержит;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
ЭлементОтбора.ВидСравнения = Сравнение;
|
||
ЭлементОтбора.ПравоеЗначение = Значение;
|
||
ЭлементОтбора.Использование = Истина;
|
||
Возврат ЭлементОтбора;
|
||
|
||
КонецФункции
|
||
|
||
// Таблица - ТаблицаЗначений, ТабличнаяЧасть
|
||
Функция ПолучитьНеуникальныеЗначенияКолонкиТаблицыЛкс(Таблица, ИмяКолонки, ИгнорироватьРегистрДляПростогоСтрокогоТипа = Истина) Экспорт
|
||
|
||
Если ТипЗнч(Таблица) = Тип("ТаблицаЗначений") Тогда
|
||
КопияТаблицы = Таблица.Скопировать(, ИмяКолонки);
|
||
Иначе
|
||
КопияТаблицы = Таблица.Выгрузить(, ИмяКолонки);
|
||
КонецЕсли;
|
||
Типы = КопияТаблицы.Колонки[ИмяКолонки].ТипЗначения.Типы();
|
||
Если Истина
|
||
И Типы.Количество() = 1
|
||
И Типы[0] = Тип("Строка")
|
||
И ИгнорироватьРегистрДляПростогоСтрокогоТипа
|
||
Тогда
|
||
ИмяКолонкиНрег = ИмяКолонки + "_Нрег777233464645";
|
||
КопияТаблицы.Колонки.Добавить(ИмяКолонкиНрег);
|
||
Для Каждого СтрокаКопииТаблицы Из КопияТаблицы Цикл
|
||
СтрокаКопииТаблицы[ИмяКолонкиНрег] = НРег(СтрокаКопииТаблицы[ИмяКолонки]);
|
||
КонецЦикла;
|
||
Иначе
|
||
ИмяКолонкиНрег = ИмяКолонки;
|
||
КонецЕсли;
|
||
КолонкаКоличества = ИмяКолонки + "7773534765"; //гарантировано уникальное имя колонки
|
||
КопияТаблицы.Колонки.Добавить(КолонкаКоличества);
|
||
КопияТаблицы.ЗаполнитьЗначения(1, КолонкаКоличества);
|
||
КопияТаблицы.Свернуть(ИмяКолонкиНрег, КолонкаКоличества);
|
||
КопияТаблицы.Сортировать(КолонкаКоличества + " Убыв");
|
||
МассивНеуникальных = Новый Массив;
|
||
Для Индекс = 0 По КопияТаблицы.Количество() - 1 Цикл
|
||
СтрокаКопии = КопияТаблицы[Индекс];
|
||
Если СтрокаКопии[КолонкаКоличества] > 1 Тогда
|
||
МассивНеуникальных.Добавить(СтрокаКопии[ИмяКолонкиНрег]);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат МассивНеуникальных;
|
||
|
||
КонецФункции // ПолучитьНеуникальныеЗначенияКолонки()
|
||
|
||
Функция ПолучитьСтруктуруКлючаТаблицыБДЛкс(Знач ПолноеИмяТаблицыБД, ВключатьНомерСтроки = Истина, ВернутьСтруктуру = Истина) Экспорт
|
||
|
||
ТипТаблицы = ирНеглобальный.ПолучитьТипТаблицыБДЛкс(ПолноеИмяТаблицыБД);
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмяТаблицыБД);
|
||
СписокПолей = Новый СписокЗначений;
|
||
Если ЛксЛиКорневойТипОбъектаБД(ТипТаблицы) Тогда
|
||
СписокПолей.Добавить(Новый ОписаниеТипов(СтрЗаменить(ПолноеИмяТаблицыБД, ".", "Ссылка.")), "Ссылка");
|
||
ИначеЕсли ЛксЛиКорневойТипРегистраБД(ТипТаблицы) Тогда
|
||
НаборЗаписей = Новый (СтрЗаменить(ПолноеИмяТаблицыБД, ".", "НаборЗаписей."));
|
||
Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл
|
||
СписокПолей.Добавить(ЭлементОтбора.ТипЗначения, ЭлементОтбора.Имя);
|
||
КонецЦикла;
|
||
Если ВключатьНомерСтроки Тогда
|
||
ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмяТаблицыБД);
|
||
Если Ложь
|
||
Или ТипТаблицы <> "РегистрСведений"
|
||
Или ОбъектМД.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору
|
||
Тогда
|
||
СписокПолей.Добавить(Новый ОписаниеТипов("Число"), "НомерСтроки");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли ЛксЛиКорневойТипПоследовательности(ТипТаблицы) Тогда
|
||
НаборЗаписей = Новый (СтрЗаменить(ПолноеИмяТаблицыБД, ".", "НаборЗаписей."));
|
||
Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл
|
||
СписокПолей.Добавить(ЭлементОтбора.ТипЗначения, ЭлементОтбора.Имя);
|
||
КонецЦикла;
|
||
Если ВключатьНомерСтроки Тогда
|
||
СписокПолей.Добавить(Новый ОписаниеТипов("Дата"), "Период");
|
||
КонецЕсли;
|
||
ИначеЕсли ЛксЛиТипВложеннойТаблицыБД(ТипТаблицы) Тогда
|
||
СписокПолей.Добавить(Новый ОписаниеТипов(МассивФрагментов[0] + "Ссылка." + МассивФрагментов[1]), "Ссылка");
|
||
Если ВключатьНомерСтроки Тогда
|
||
СписокПолей.Добавить(Новый ОписаниеТипов("Число"), "НомерСтроки");
|
||
КонецЕсли;
|
||
ИначеЕсли ТипТаблицы = "Изменения" Тогда
|
||
ВызватьИсключение "Тип таблицы """ + ТипТаблицы + """ не поддерживается";
|
||
КонецЕсли;
|
||
Если ВернутьСтруктуру Тогда
|
||
Результат = Новый Структура();
|
||
Для Каждого ЭлементСписка Из СписокПолей Цикл
|
||
Результат.Вставить(ЭлементСписка.Представление, ЭлементСписка.Значение);
|
||
КонецЦикла;
|
||
Иначе
|
||
Результат = СписокПолей;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьXMLКлючОбъектаБДЛкс(Знач ОбъектДанных, Знач ИспользоватьСсылкуДляСсылочных = Ложь) Экспорт
|
||
|
||
Если ОбъектДанных = Неопределено Тогда
|
||
Результат = "Неопределено";
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
ПредставлениеОбъекта = "";
|
||
Если ТипЗнч(ОбъектДанных) = Тип("УдалениеОбъекта") Тогда
|
||
Класс = "Удаление";
|
||
Иначе
|
||
Попытка
|
||
ЭтоНовый = ОбъектДанных.ЭтоНовый();
|
||
Класс = "Ссылочный";
|
||
ПредставлениеОбъекта = "" + ОбъектДанных + ",";
|
||
Исключение
|
||
Попытка
|
||
УникальныйИдентификатор = ОбъектДанных.УникальныйИдентификатор();
|
||
Класс = "Ссылочный";
|
||
Исключение
|
||
Попытка
|
||
Пустышка = ОбъектДанных.Модифицированность();
|
||
Класс = "НаборЗаписей";
|
||
Исключение
|
||
Попытка
|
||
Пустышка = ОбъектДанных.Значение;
|
||
Класс = "Константы";
|
||
Исключение
|
||
Класс = "Примитив";
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
Если Истина
|
||
И Класс = "Ссылочный"
|
||
И ИспользоватьСсылкуДляСсылочных
|
||
Тогда
|
||
Результат = ОбъектДанных;
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
XMLКлюч = "" + XMLТипЗнч(ОбъектДанных).ИмяТипа + "(";
|
||
Если Класс = "Ссылочный" Тогда
|
||
Если ЭтоНовый = Истина Тогда
|
||
УникальныйИдентификатор = "!" + ОбъектДанных.ПолучитьСсылкуНового().УникальныйИдентификатор();
|
||
КонецЕсли;
|
||
Если УникальныйИдентификатор = Неопределено Тогда
|
||
УникальныйИдентификатор = ОбъектДанных.Ссылка.УникальныйИдентификатор();
|
||
КонецЕсли;
|
||
XMLКлюч = XMLКлюч + ПредставлениеОбъекта + УникальныйИдентификатор;
|
||
ИначеЕсли Класс = "Удаление" Тогда
|
||
XMLКлюч = XMLКлюч + ПолучитьXMLКлючОбъектаБДЛкс(ОбъектДанных.Ссылка);
|
||
ИначеЕсли Класс = "НаборЗаписей" Тогда
|
||
ПредставлениеОтбора = "";
|
||
Разделитель = ", ";
|
||
Для Каждого ЭлементОтбора Из ОбъектДанных.Отбор Цикл
|
||
Если ЭлементОтбора.Использование Тогда
|
||
ПредставлениеОтбора = ПредставлениеОтбора + Разделитель + ЭлементОтбора.Имя
|
||
+ ":" + ПолучитьXMLКлючОбъектаБДЛкс(ЭлементОтбора.Значение);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
XMLКлюч = XMLКлюч + Сред(ПредставлениеОтбора, СтрДлина(Разделитель) + 1);
|
||
ИначеЕсли Класс = "Константы" Тогда
|
||
//
|
||
Иначе
|
||
// Примитивный тип
|
||
XMLКлюч = XMLКлюч + ОбъектДанных;
|
||
КонецЕсли;
|
||
XMLКлюч = XMLКлюч + ")";
|
||
Результат = XMLКлюч;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьТабличныеЧастиОбъектаЛкс(Объект) Экспорт
|
||
|
||
Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда
|
||
мдОбъекта = Объект;
|
||
ОбъектБД = Неопределено;
|
||
Иначе
|
||
мдОбъекта = Объект.Метаданные();
|
||
ОбъектБД = Объект;
|
||
КонецЕсли;
|
||
СтруктураТЧ = Новый Структура();
|
||
ЭтоСправочник = Метаданные.Справочники.Индекс(мдОбъекта) >= 0;
|
||
Для Каждого МетаТЧ из мдОбъекта.ТабличныеЧасти Цикл
|
||
// Для реквизитов справочников, принадлежащих только группе или только элементу нужно игнорировать те объекты, для которых эти реквизиты не используются
|
||
Если Истина
|
||
И ЭтоСправочник
|
||
И ОбъектБД <> Неопределено
|
||
Тогда
|
||
Если Ложь
|
||
Или (Истина
|
||
И ОбъектБД.ЭтоГруппа
|
||
И МетаТЧ.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента)
|
||
Или (Истина
|
||
И Не ОбъектБД.ЭтоГруппа
|
||
И МетаТЧ.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы)
|
||
Тогда
|
||
Продолжить
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтруктураТЧ.Вставить(МетаТЧ.Имя, МетаТЧ.Представление());
|
||
КонецЦикла;
|
||
Если Метаданные.ПланыСчетов.Индекс(мдОбъекта) >= 0 Тогда
|
||
Если мдОбъекта.ВидыСубконто <> Неопределено Тогда
|
||
СтруктураТЧ.Вставить("ВидыСубконто", "Виды субконто");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Метаданные.ПланыВидовРасчета.Индекс(мдОбъекта) >= 0 Тогда
|
||
Если мдОбъекта.ЗависимостьОтВидовРасчета <> Метаданные.СвойстваОбъектов.ИспользованиеБазыПланаВидовРасчета.НеИспользовать Тогда
|
||
СтруктураТЧ.Вставить("БазовыеВидыРасчета", "Базовые виды расчета");
|
||
КонецЕсли;
|
||
СтруктураТЧ.Вставить("ВедущиеВидыРасчета", "Ведущие виды расчета");
|
||
Если мдОбъекта.ИспользованиеПериодаДействия Тогда
|
||
СтруктураТЧ.Вставить("ВытесняющиеВидыРасчета", "Вытесняющие виды расчета");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат СтруктураТЧ;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиСтрокаСодержитВсеПодстрокиЛкс(Знач Строка, Знач Подстроки) Экспорт
|
||
|
||
Если ТипЗнч(Подстроки) = Тип("Строка") Тогда
|
||
Подстроки = ЛксПолучитьМассивИзСтрокиСРазделителем(НРег(Подстроки), " ", Истина);
|
||
КонецЕсли;
|
||
НСтрока = НРег(Строка);
|
||
Для Каждого Фрагмент Из Подстроки Цикл
|
||
Если Найти(НСтрока, Фрагмент) = 0 Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Истина;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСтрокуТаблицыБДПоКлючуЛкс(ПолноеИмяТаблицы, СтруктураКлюча) Экспорт
|
||
|
||
Запрос = Новый Запрос;
|
||
ТекстЗапроса = "ВЫБРАТЬ Т.* ИЗ " + ПолноеИмяТаблицы + " КАК Т ГДЕ ИСТИНА ";
|
||
Для Каждого КлючИЗначение Из СтруктураКлюча Цикл
|
||
ТекстЗапроса = ТекстЗапроса + " И Т." + КлючИЗначение.Ключ + " = &" + КлючИЗначение.Ключ;
|
||
КонецЦикла;
|
||
ЛксСкопироватьУниверсальнуюКоллекцию(СтруктураКлюча, Запрос.Параметры);
|
||
Запрос.Текст = ТекстЗапроса;
|
||
СтрокаРезультата = Запрос.Выполнить().Выгрузить()[0];
|
||
Возврат СтрокаРезультата;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьТипТаблицыБДЛкс(ПолноеИмяТаблицыБД) Экспорт
|
||
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмяТаблицыБД);
|
||
ТипТаблицы = МассивФрагментов[0];
|
||
Если МассивФрагментов.Количество() > 2 Тогда
|
||
//ТипТаблицы = МассивФрагментов[2];
|
||
////Если МассивФрагментов[2] = "Изменения" Тогда
|
||
//// ТипТаблицы = МассивФрагментов[2];
|
||
////Иначе
|
||
//// Если ЛксЛиКорневойТипОбъектаБД(МассивФрагментов[0]) Тогда
|
||
//// //ТипТаблицы = "ТабличнаяЧасть";
|
||
//// ТипТаблицы = МассивФрагментов[2];
|
||
//// КонецЕсли;
|
||
////КонецЕсли;
|
||
ОбъектМД = НайтиОбъектМетаДанныхПоПолномуИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД);
|
||
Если ЛксЛиКорневойТипОбъектаБД(МассивФрагментов[0]) Тогда
|
||
Если ОбъектМД = Неопределено Тогда
|
||
ТипТаблицы = МассивФрагментов[2];
|
||
Иначе
|
||
ТипТаблицы = "ТабличнаяЧасть";
|
||
КонецЕсли;
|
||
//ИначеЕсли ирНеглобальный.СтрокиРавныЛкс(МассивФрагментов[2], "ДвиженияССубконто") Тогда
|
||
// ТипТаблицы = МассивФрагментов[0];
|
||
Иначе
|
||
ТипТаблицы = "ВиртуальнаяТаблица";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ТипТаблицы;
|
||
|
||
КонецФункции
|
||
|
||
// Присваивает ячейке по указателю значение. Если после этого ячейка получает другое значение, то ячейке присваивается ее старое значение.
|
||
Функция БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(П1, П2) Экспорт
|
||
|
||
СтароеП1 = П1;
|
||
П1 = П2;
|
||
Если П1 <> П2 Тогда
|
||
П1 = СтароеП1;
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
Возврат Истина;
|
||
|
||
КонецФункции // БезопасноПрисвоитьПроизвольнуюСсылку()
|
||
|
||
// Ищет все экземпляры значения ЧтоЗаменять в объекте и заменяет их на НаЧтоЗаменять
|
||
Функция ЗаменитьЗначениеВОбъектеБДЛкс(Объект, ЧтоЗаменять, НаЧтоЗаменять) Экспорт
|
||
|
||
ОбъектМД = Объект.Метаданные();
|
||
Компоновщик = ирКэш.ПолучитьКомпоновщикТаблицыМетаданныхЛкс(ОбъектМД.ПолноеИмя());
|
||
#Если _ Тогда
|
||
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
|
||
#КонецЕсли
|
||
ОбъектИзменен = Ложь;
|
||
Для Каждого ДоступноеПоле Из Компоновщик.Настройки.ДоступныеПоляВыбора.Элементы Цикл
|
||
Если ДоступноеПоле.Папка Тогда
|
||
Попытка
|
||
ТабличнаяЧасть = Объект["" + ДоступноеПоле.Поле];
|
||
Исключение
|
||
// Сюда например попадаем в случае системной папки СистемныеПоля
|
||
ТабличнаяЧасть = Неопределено;
|
||
КонецПопытки;
|
||
Если ТабличнаяЧасть <> Неопределено Тогда
|
||
Для Каждого ПолеРеквизита Из ДоступноеПоле.Элементы Цикл
|
||
ИмяРеквизита = "" + ЛксПолучитьПоследнийФрагмент(ПолеРеквизита.Поле);
|
||
Если ирНеглобальный.СтрокиРавныЛкс(ИмяРеквизита, "Ссылка") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ПолеРеквизита.Тип.СодержитТип(ТипЗнч(ЧтоЗаменять)) Тогда
|
||
СтрокиТабЧасти = ТабличнаяЧасть.НайтиСтроки(Новый Структура(ИмяРеквизита, ЧтоЗаменять));
|
||
Для Каждого СтрокаТабЧасти Из СтрокиТабЧасти Цикл
|
||
ОбъектИзменен = БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(СтрокаТабЧасти[ИмяРеквизита], НаЧтоЗаменять) Или ОбъектИзменен;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Иначе
|
||
ИмяРеквизита = "" + ДоступноеПоле.Поле;
|
||
Если ирНеглобальный.СтрокиРавныЛкс(ИмяРеквизита, "Ссылка") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ДоступноеПоле.Тип.СодержитТип(ТипЗнч(ЧтоЗаменять)) И Объект[ИмяРеквизита] = ЧтоЗаменять Тогда
|
||
ОбъектИзменен = БезопасноПрисвоитьПроизвольнуюСсылкуЛкс(Объект[ИмяРеквизита], НаЧтоЗаменять) Или ОбъектИзменен;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат ОбъектИзменен;
|
||
|
||
КонецФункции // ВыполнитьЗаменуЗначенияВОбъектеБДЛкс()
|
||
|
||
|
||
// ЛиНаходитьОбразующий - Булево - находить ближайший объект метаданных, если точный найти не удается
|
||
Функция НайтиОбъектМетаДанныхПоПолномуИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД, ЛиНаходитьОбразующий = Ложь) Экспорт
|
||
|
||
Результат = Неопределено;
|
||
Если Не ПустаяСтрока(ПолноеИмяТаблицыБД) Тогда
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмяТаблицыБД);
|
||
ОбразующийМД = Метаданные.НайтиПоПолномуИмени(Фрагменты[0] + "." + Фрагменты[1]);
|
||
Если Ложь
|
||
Или ОбразующийМД = Неопределено
|
||
Или Фрагменты.Количество() = 2
|
||
Тогда
|
||
Результат = ОбразующийМД;
|
||
Иначе
|
||
Если ЛксЛиКорневойТипОбъектаБД(Фрагменты[0]) Тогда
|
||
Если Фрагменты.Количество() = 3 Тогда
|
||
МетаТЧ = ОбразующийМД.ТабличныеЧасти.Найти(Фрагменты[2]);
|
||
Если МетаТЧ <> Неопределено Тогда
|
||
Результат = МетаТЧ;
|
||
ИначеЕсли ЛиНаходитьОбразующий Тогда
|
||
// ВидыСубконто, Изменения
|
||
Результат = ОбразующийМД;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ЛксПолучитьМетаданные()
|
||
|
||
Функция ПолучитьТекстЗапросаПоВыбраннымМетаданнымЛкс(МассивПолныхИменМД, ЛиТаблицыИзменения = Ложь) Экспорт
|
||
|
||
ЛитералЗаменыОтсутствующихПолей = "НЕОПРЕДЕЛЕНО"; // NULL нельзя использовать из-за ошибок платформы 8.2.14
|
||
|
||
// Сначала определим общие реквизиты
|
||
ТипыТаблицБД = Новый Структура;
|
||
Для Каждого ПолноеИмяМетаданных Из МассивПолныхИменМД Цикл
|
||
ТипТаблицы = ирНеглобальный.ПолучитьТипТаблицыБДЛкс(ПолноеИмяМетаданных);
|
||
ТипыТаблицБД.Вставить(ТипТаблицы);
|
||
КонецЦикла;
|
||
ПроверяемыеПоля = Новый Массив;
|
||
Если ТипыТаблицБД.Количество() = 1 Тогда
|
||
ирКэш.Получить().ИнициализацияОписанияМетодовИСвойств();
|
||
СтрокаКорневогоТипа = ирКэш.Получить().ПолучитьСтрокуТипаМетаОбъектов(ТипТаблицы);
|
||
Если СтрокаКорневогоТипа <> Неопределено Тогда
|
||
СтрокаВида = ирКэш.Получить().ТаблицаИменЭлементовКоллекций.Найти(СтрокаКорневогоТипа.Множественное, "ИмяКоллекции");
|
||
Если СтрокаВида <> Неопределено Тогда
|
||
ИмяОбщегоТипа = ТипТаблицы + "." + СтрокаВида.ИмяЭлементаКоллекции;
|
||
СтрокиИменПолей = ирКэш.Получить().ТаблицаКонтекстов.НайтиСтроки(Новый Структура("ТипКонтекста, ЯзыкПрограммы", ИмяОбщегоТипа, 1));
|
||
Для Каждого СтрокаСлова Из СтрокиИменПолей Цикл
|
||
Если Ложь
|
||
Или СтрокаСлова.ТипСлова = "Таблица"
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПроверяемыеПоля.Добавить(СтрокаСлова.Слово);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Текст = "";
|
||
|
||
// Находим максимум общих реквизитов, определенных в метаданных
|
||
ОбщиеМетаПоля = Новый Массив;
|
||
ЭтоПервыйПроход = Истина;
|
||
Для Каждого ПолноеИмяМетаданных Из МассивПолныхИменМД Цикл
|
||
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМетаданных);
|
||
|
||
КоллекцияПолей = Новый Массив();
|
||
КомпоновщикТаблицы = ирКэш.ПолучитьКомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМетаданных);
|
||
Для Каждого ДоступноеПоле Из КомпоновщикТаблицы.Настройки.ДоступныеПоляВыбора.Элементы Цикл
|
||
Если ДоступноеПоле.Папка Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ИмяПоля = "" + ДоступноеПоле.Поле;
|
||
Если Ложь
|
||
Или ПроверяемыеПоля.Найти(ИмяПоля) <> Неопределено
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КоллекцияПолей.Добавить(ИмяПоля);
|
||
КонецЦикла;
|
||
|
||
Если ЭтоПервыйПроход Тогда
|
||
Для Каждого ИмяПоля Из КоллекцияПолей Цикл
|
||
ОбщиеМетаПоля.Добавить(ИмяПоля);
|
||
КонецЦикла;
|
||
Иначе
|
||
НачальноеКоличество = ОбщиеМетаПоля.Количество();
|
||
Для СчетчикОбщиеМетаПоля = 1 По НачальноеКоличество Цикл
|
||
ИмяПоля = ОбщиеМетаПоля[НачальноеКоличество - СчетчикОбщиеМетаПоля];
|
||
Если КоллекцияПолей.Найти(ИмяПоля) = Неопределено Тогда
|
||
ОбщиеМетаПоля.Удалить(НачальноеКоличество - СчетчикОбщиеМетаПоля);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если ОбщиеМетаПоля.Количество() = 0 Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ЭтоПервыйПроход = Ложь;
|
||
КонецЦикла;
|
||
ТекстОбщихМетаПолей = "";
|
||
Для Каждого ИмяПоля Из ОбщиеМетаПоля Цикл
|
||
Если ЛиТаблицыИзменения Тогда
|
||
ИмяПоля = "Ссылка." + ИмяПоля;
|
||
КонецЕсли;
|
||
ТекстОбщихМетаПолей = ТекстОбщихМетаПолей + ", Т." + ИмяПоля;
|
||
КонецЦикла;
|
||
|
||
#Если Клиент Тогда
|
||
Индикатор = ЛксПолучитьИндикаторПроцесса(МассивПолныхИменМД.Количество(), "Генерация текста запроса");
|
||
#КонецЕсли
|
||
Для Каждого ПолноеИмяМетаданных Из МассивПолныхИменМД Цикл
|
||
#Если Клиент Тогда
|
||
ЛксОбработатьИндикатор(Индикатор);
|
||
#КонецЕсли
|
||
ИмяТаблицы = ПолноеИмяМетаданных;
|
||
Если ЛиТаблицыИзменения Тогда
|
||
ЕстьТаблицаИзменений = ЕстьТаблицаИзмененийОбъектаМетаданных(ПолноеИмяМетаданных);
|
||
Если ЕстьТаблицаИзменений Тогда
|
||
ИмяТаблицы = ИмяТаблицы + ".Изменения";
|
||
Иначе
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Иначе
|
||
ТекстНеобязательныхПолей = "";
|
||
КомпоновщикТаблицы = ирКэш.ПолучитьКомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМетаданных);
|
||
ПоляТаблицы = КомпоновщикТаблицы.Настройки.ДоступныеПоляВыбора.Элементы;
|
||
Для Каждого ПроверяемоеПоле Из ПроверяемыеПоля Цикл
|
||
Если ПоляТаблицы.Найти(ПроверяемоеПоле) = Неопределено Тогда
|
||
ТекстНеобязательныхПолей = ТекстНеобязательныхПолей + ", " + ЛитералЗаменыОтсутствующихПолей + " КАК " + ПроверяемоеПоле;
|
||
Иначе
|
||
ТекстНеобязательныхПолей = ТекстНеобязательныхПолей + ", Т." + ПроверяемоеПоле;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Если Текст <> "" Тогда
|
||
Текст = Текст + "
|
||
|ОБЪЕДИНИТЬ ВСЕ
|
||
|";
|
||
КонецЕсли;
|
||
Текст = Текст + "ВЫБРАТЬ """ + ПолноеИмяМетаданных + """ КАК _ПолноеИмяТаблицы" + ТекстНеобязательныхПолей + ТекстОбщихМетаПолей + " ИЗ " + ИмяТаблицы + " КАК Т";
|
||
КонецЦикла;
|
||
Возврат Текст;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЕстьТаблицаИзмененийОбъектаМетаданных(ПолноеИмяИлиОбъектМетаданных) Экспорт
|
||
|
||
ЕстьТаблицаИзменений = Ложь;
|
||
Если ТипЗнч(ПолноеИмяИлиОбъектМетаданных) = Тип("Строка") Тогда
|
||
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяИлиОбъектМетаданных);
|
||
Иначе
|
||
ОбъектМетаданных = ПолноеИмяИлиОбъектМетаданных;
|
||
КонецЕсли;
|
||
Для Каждого МетаПланОбмена Из Метаданные.ПланыОбмена Цикл
|
||
Если МетаПланОбмена.Состав.Содержит(ОбъектМетаданных) Тогда
|
||
ЕстьТаблицаИзменений = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат ЕстьТаблицаИзменений;
|
||
|
||
КонецФункции
|
||
|
||
Функция СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект) Экспорт
|
||
|
||
Структура = Новый Структура;
|
||
Попытка
|
||
ОбменДанными = Объект.ОбменДанными;
|
||
Исключение
|
||
КонецПопытки;
|
||
Если ОбменДанными <> Неопределено Тогда
|
||
Узлы = Новый Массив;
|
||
Для Каждого Получатель Из ОбменДанными.Получатели Цикл
|
||
Узлы.Добавить(Получатель);
|
||
КонецЦикла;
|
||
Получатели = Новый Структура;
|
||
Получатели.Вставить("Автозаполнение", ОбменДанными.Получатели.Автозаполнение);
|
||
Получатели.Вставить("Узлы", Узлы);
|
||
СтруктураОбменаДанными = Новый Структура;
|
||
СтруктураОбменаДанными.Вставить("Загрузка", ОбменДанными.Загрузка);
|
||
СтруктураОбменаДанными.Вставить("Отправитель", ОбменДанными.Отправитель);
|
||
СтруктураОбменаДанными.Вставить("Получатели", Получатели);
|
||
Структура.Вставить("ОбменДанными", СтруктураОбменаДанными);
|
||
КонецЕсли;
|
||
Структура.Вставить("ДополнительныеСвойства", Объект.ДополнительныеСвойства);
|
||
Возврат Структура;
|
||
|
||
КонецФункции // СериализоватьПараметрыОбменаДанными()
|
||
|
||
Процедура ВосстановитьДополнительныеСвойстваОбъектаЛкс(Объект, СтруктураДополнительныхСвойств) Экспорт
|
||
|
||
Если СтруктураДополнительныхСвойств.Свойство("ОбменДанными") Тогда
|
||
ОбменДанными = Объект.ОбменДанными;
|
||
СтруктураОбменаДанными = СтруктураДополнительныхСвойств.ОбменДанными;
|
||
ЗаполнитьЗначенияСвойств(ОбменДанными, СтруктураОбменаДанными);
|
||
ЗаполнитьЗначенияСвойств(ОбменДанными.Получатели, ОбменДанными.Получатели);
|
||
ОбменДанными.Получатели.Очистить();
|
||
Для Каждого Получатель Из СтруктураОбменаДанными.Получатели.Узлы Цикл
|
||
ОбменДанными.Получатели.Добавить(Получатель);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
ЛксСкопироватьУниверсальнуюКоллекцию(СтруктураДополнительныхСвойств.ДополнительныеСвойства, Объект.ДополнительныеСвойства);
|
||
|
||
КонецПроцедуры // ВосстановитьПараметрыОбменаДаннымиЛкс()
|
||
|
||
Процедура ЗаписатьОбъектЛкс(Объект, НаСервере = Ложь, РежимЗаписи = Неопределено) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
ДополнительныеСвойства = СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект);
|
||
ХМЛ = СохранитьОбъектВВидеСтрокиXMLЛкс(Объект);
|
||
ирСервер.ЗаписатьОбъектЛкс(ХМЛ, ДополнительныеСвойства, РежимЗаписи);
|
||
Иначе
|
||
Если РежимЗаписи = Неопределено Тогда
|
||
Объект.Записать();
|
||
Иначе
|
||
Объект.Записать(РежимЗаписи);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УдалитьОбъектЛкс(Объект, НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
ДополнительныеСвойства = СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект);
|
||
ХМЛ = СохранитьОбъектВВидеСтрокиXMLЛкс(Объект);
|
||
ирСервер.УдалитьОбъектЛкс(ХМЛ, ДополнительныеСвойства);
|
||
Иначе
|
||
Объект.Удалить();
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УстановитьПометкуУдаленияОбъектаЛкс(Объект, НаСервере = Ложь, ЗначениеПометки = Истина) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
ДополнительныеСвойства = СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект);
|
||
ХМЛ = СохранитьОбъектВВидеСтрокиXMLЛкс(Объект);
|
||
ирСервер.УстановитьПометкуУдаленияОбъектаЛкс(ХМЛ, ДополнительныеСвойства, ЗначениеПометки);
|
||
Иначе
|
||
//Если РежимЗаписи = Неопределено Тогда
|
||
// Объект.УстановитьПометкуУдаления(ЗначениеПометки);
|
||
//Иначе
|
||
Объект.УстановитьПометкуУдаления(ЗначениеПометки);
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Источник - http://infostart.ru/public/125988/
|
||
Функция ВыбратьПоГруппировкамЛкс(Выборка, Группировки, СИерархией = Ложь) Экспорт
|
||
|
||
МетаВыборка = Новый Соответствие;
|
||
|
||
врОбходРезультата = ОбходРезультатаЗапроса.ПоГруппировкам;
|
||
Если СИерархией Тогда
|
||
врОбходРезультата = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
|
||
КонецЕсли;
|
||
МетаВыборка.Вставить("ОбходРезультата", врОбходРезультата);
|
||
|
||
МассивГруппировок = Новый Массив;
|
||
врСтрГруппировки = Группировки;
|
||
Пока Истина Цикл
|
||
Поз = Найти( врСтрГруппировки, "," );
|
||
Если Поз = 0 Тогда
|
||
МассивГруппировок.Добавить(СокрЛП(врСтрГруппировки));
|
||
Прервать;
|
||
КонецЕсли;
|
||
МассивГруппировок.Добавить( СокрЛП( Лев(врСтрГруппировки,Поз-1) ) );
|
||
врСтрГруппировки = Сред( врСтрГруппировки, Поз+1 );
|
||
КонецЦикла;
|
||
|
||
МетаВыборка.Вставить("Группировки", МассивГруппировок);
|
||
|
||
врВыборка = Выборка;
|
||
Для пц=0 По МассивГруппировок.Количество()-2 Цикл
|
||
врВыборкаУровня = врВыборка.Выбрать(врОбходРезультата, МассивГруппировок[пц]);
|
||
МетаВыборка.Вставить("_Выборка"+Строка(пц), врВыборкаУровня);
|
||
Если не врВыборкаУровня.Следующий() Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
врВыборка = врВыборкаУровня;
|
||
КонецЦикла;
|
||
врВыборкаУровня = врВыборка.Выбрать(врОбходРезультата, МассивГруппировок[пц]);
|
||
МетаВыборка.Вставить("Выборка", врВыборкаУровня);
|
||
МетаВыборка.Вставить("_Выборка"+Строка(пц), врВыборкаУровня);
|
||
|
||
Возврат МетаВыборка;
|
||
|
||
КонецФункции // ВыбратьПоГруппировкамЛкс
|
||
|
||
// Источник - http://infostart.ru/public/125988/
|
||
Функция СледующийПоГруппировкамЛкс(МетаВыборка, Уровень = Неопределено) Экспорт
|
||
|
||
Если Уровень = Неопределено Тогда
|
||
Уровень = МетаВыборка["Группировки"].Количество()-1;
|
||
КонецЕсли;
|
||
|
||
Если Уровень < 0 Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
врВыборка = МетаВыборка["_Выборка"+Строка(Уровень)];
|
||
|
||
Если врВыборка.Следующий() Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
|
||
Если СледующийПоГруппировкамЛкс(МетаВыборка, Уровень-1) Тогда
|
||
МассивГруппировок = МетаВыборка["Группировки"];
|
||
врВыборкаРодитель = МетаВыборка["_Выборка"+Строка(Уровень-1)];
|
||
врВыборка = врВыборкаРодитель.Выбрать(МетаВыборка["ОбходРезультата"],МассивГруппировок[Уровень]);
|
||
МетаВыборка["_Выборка"+Строка(Уровень)] = врВыборка;
|
||
Если Уровень = МассивГруппировок.Количество()-1 Тогда
|
||
МетаВыборка["Выборка"] = врВыборка;
|
||
КонецЕсли;
|
||
Возврат СледующийПоГруппировкамЛкс(МетаВыборка, Уровень);
|
||
Иначе
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
КонецФункции // зфСледующийПоГруппировкам
|
||
|
||
// ИспользоватьОбщийКаталогНастроек - использовать значение ключа ConfLocation из файла conf.cfg
|
||
Функция ПолучитьКаталогНастроекПриложения1СЛкс(ИспользоватьОбщийКаталогНастроек = Истина, СоздатьЕслиОтсутствует = Ложь, НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Результат = ирСервер.ПолучитьКаталогНастроекПриложения1СЛкс(ИспользоватьОбщийКаталогНастроек, СоздатьЕслиОтсутствует);
|
||
Иначе
|
||
КаталогКонфигурацииПриложения = КаталогПрограммы() + "conf";
|
||
Если ИспользоватьОбщийКаталогНастроек Тогда
|
||
ФайлУказатель = Новый Файл(КаталогКонфигурацииПриложения + "\conf.cfg");
|
||
Если ФайлУказатель.Существует() Тогда
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(ФайлУказатель.ПолноеИмя);
|
||
Текст = ТекстовыйДокумент.ПолучитьТекст();
|
||
НовыйКаталогКонфигурацииПриложения = ЛксПолучитьСтрокуМеждуМаркерами(Текст, "ConfLocation=", Символы.ПС);
|
||
НовыйКаталог = Новый Файл(НовыйКаталогКонфигурацииПриложения);
|
||
Если НовыйКаталог.Существует() Тогда
|
||
КаталогКонфигурацииПриложения = НовыйКаталогКонфигурацииПриложения;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если СоздатьЕслиОтсутствует Тогда
|
||
Файл = Новый Файл(КаталогКонфигурацииПриложения);
|
||
Если Не Файл.Существует() Тогда
|
||
СоздатьКаталог(КаталогКонфигурацииПриложения);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Результат = КаталогКонфигурацииПриложения;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИмяФайлаАктивнойНастройкиТехноЖурналаЛкс(НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Результат = ирСервер.ПолучитьИмяФайлаАктивнойНастройкиТехноЖурналаЛкс();
|
||
Иначе
|
||
КаталогКонфигурацииПриложения = ПолучитьКаталогНастроекПриложения1СЛкс(Ложь);
|
||
Результат = КаталогКонфигурацииПриложения + "\logcfg.xml";
|
||
Файл = Новый Файл(Результат);
|
||
Если Файл.Существует() Тогда
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
КаталогКонфигурацииПриложения = ПолучитьКаталогНастроекПриложения1СЛкс(Истина);
|
||
Результат = КаталогКонфигурацииПриложения + "\logcfg.xml";
|
||
Файл = Новый Файл(Результат);
|
||
Если Файл.Существует() Тогда
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
Результат = Неопределено;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьКаталогТехножурналаЛкс(НаСервере = Ложь) Экспорт
|
||
|
||
ИмяФайлаНастроекЖурнала = ирНеглобальный.ПолучитьИмяФайлаАктивнойНастройкиТехноЖурналаЛкс(НаСервере);
|
||
Если ЗначениеЗаполнено(ИмяФайлаНастроекЖурнала) Тогда
|
||
ТекстХМЛ = ПрочитатьТекстИзФайлаЛкс(ИмяФайлаНастроекЖурнала, , НаСервере);
|
||
ЧтениеХМЛ = Новый ЧтениеXML;
|
||
ЧтениеХМЛ.УстановитьСтроку(ТекстХМЛ);
|
||
ПостроительДом = Новый ПостроительDOM();
|
||
Попытка
|
||
ДокументДОМ = ПостроительДом.Прочитать(ЧтениеХМЛ);
|
||
Исключение
|
||
Сообщить("Ошибка чтения настройки техножурнала: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
|
||
КонецПопытки;
|
||
Если ДокументДОМ <> Неопределено Тогда
|
||
Узлы = ДокументДом.ПолучитьЭлементыПоИмени("log");
|
||
Если Узлы.Количество() > 0 Тогда
|
||
Атрибут = Узлы.Элемент(0).Атрибуты.ПолучитьИменованныйЭлемент("location");
|
||
Если Атрибут <> Неопределено Тогда
|
||
Результат = Атрибут.ТекстовоеСодержимое;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиТехножурналВключенЛкс(НаСервере = Ложь, ВыводитьСообщения = Ложь) Экспорт
|
||
|
||
//ИмяФайлаАктивнойНастройки = ирНеглобальный.ПолучитьИмяФайлаАктивнойНастройкиТехноЖурналаЛкс(НаСервере);
|
||
//ТехножурналВключен = ЗначениеЗаполнено(ИмяФайлаАктивнойНастройки);
|
||
КаталогЖурнала = ПолучитьКаталогТехножурналаЛкс(НаСервере);
|
||
Если ЗначениеЗаполнено(КаталогЖурнала) Тогда
|
||
Если Не ЛиКаталогТехножурналаСодержитБлокирующиеФайлыЛкс(КаталогЖурнала, НаСервере, ВыводитьСообщения) Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ВыводитьСообщения Тогда
|
||
Если НаСервере Тогда
|
||
Сообщить("Техножурнал на сервере не включен", СтатусСообщения.Внимание);
|
||
Иначе
|
||
Сообщить("Техножурнал на клиенте не включен", СтатусСообщения.Внимание);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Ложь;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиКаталогТехножурналаСодержитБлокирующиеФайлыЛкс(КаталогЖурнала, НаСервере = Ложь, ВыводитьСообщения = Истина) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Результат = ирСервер.ЛиКаталогТехножурналаСодержитБлокирующиеФайлыЛкс(КаталогЖурнала);
|
||
Иначе
|
||
Результат = Ложь;
|
||
БлокирующиеФайлы = НайтиФайлы(КаталогЖурнала, "*.*");
|
||
Для Каждого БлокирующийФайл Из БлокирующиеФайлы Цикл
|
||
Если Не БлокирующийФайл.ЭтоКаталог() Тогда
|
||
Если ВыводитьСообщения Тогда
|
||
ТекстСообщения = "В корне каталога """ + КаталогЖурнала + """ техножурнала ";
|
||
Если НаСервере Тогда
|
||
ТекстСообщения = ТекстСообщения + "сервера";
|
||
Иначе
|
||
ТекстСообщения = ТекстСообщения + "клиента";
|
||
КонецЕсли;
|
||
Сообщить(ТекстСообщения + " обнаружены блокирующие файлы. Для работы журнала их необходимо удалить.",
|
||
СтатусСообщения.Внимание);
|
||
КонецЕсли;
|
||
Результат = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиКлиентЗапущенНаКомпьютереСервераЛкс() Экспорт
|
||
|
||
Результат = НРег(ирСервер.ПолучитьИмяКомпьютераЛкс()) = НРег(ИмяКомпьютера());
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЗаписатьТекстВФайлЛкс(ПолноеИмяФайла, Текст, Кодировка = Неопределено, НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
ирСервер.ЗаписатьТекстВФайлЛкс(ПолноеИмяФайла, Текст, Кодировка);
|
||
Иначе
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.УстановитьТекст(Текст);
|
||
ТекстовыйДокумент.Записать(ПолноеИмяФайла, Кодировка);
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПрочитатьТекстИзФайлаЛкс(ПолноеИмяФайла, Кодировка = Неопределено, НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Результат = ирСервер.ПрочитатьТекстИзФайлаЛкс(ПолноеИмяФайла, Кодировка);
|
||
Иначе
|
||
ТекстовыйДокумент = Новый ТекстовыйДокумент;
|
||
ТекстовыйДокумент.Прочитать(ПолноеИмяФайла, Кодировка);
|
||
Результат = ТекстовыйДокумент.ПолучитьТекст();
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиИменаФайловЛкс(Путь, Маска = Неопределено, ИскатьВПодкаталогах = Истина, НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Результат = ирСервер.НайтиИменаФайловЛкс(Путь, Маска, ИскатьВПодкаталогах);
|
||
Иначе
|
||
Файлы = НайтиФайлы(Путь, Маска, ИскатьВПодкаталогах);
|
||
Результат = Новый Массив;
|
||
Для Каждого Файл Из Файлы Цикл
|
||
Результат.Добавить(Файл.ПолноеИмя);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// ВерсияПлатформы - Строка(0,П)
|
||
//
|
||
Функция ПолучитьКаталогПустойИнфобазыЛкс(Знач ВерсияПлатформы = "") Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(ВерсияПлатформы) Тогда
|
||
ВерсияПлатформы = ирКэш.Получить().ИДВерсииПлатформы;
|
||
КонецЕсли;
|
||
ShellApplication = Новый COMobject("Shell.Application");
|
||
КаталогПустойИнфобазы = ShellApplication.NameSpace(28).Self.Path;
|
||
КаталогПустойИнфобазы = КаталогПустойИнфобазы + "\1C\1Cv" + ВерсияПлатформы + "\EmptyDB";
|
||
Результат = КаталогПустойИнфобазы;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// СоздаватьБазуВСлучаеОтсутствия - Булево
|
||
//
|
||
Функция ПолучитьСтрокуСоединенияПустойИнфобазыЛкс(ВерсияПлатформы = "", Знач СоздаватьБазуВСлучаеОтсутствия = Истина) Экспорт
|
||
|
||
КаталогПустойИнфобазы = ПолучитьКаталогПустойИнфобазыЛкс(ВерсияПлатформы);
|
||
Если СоздаватьБазуВСлучаеОтсутствия Тогда
|
||
ФайлПустойИнфобазы = Новый Файл(КаталогПустойИнфобазы + "\1CV8.1CD");
|
||
Если Не ФайлПустойИнфобазы.Существует() Тогда
|
||
СтрокаПараметров = "CREATEINFOBASE File=" + КаталогПустойИнфобазы + ";";
|
||
//СтрокаПараметров = СтрокаПараметров + " /AddInList ууууу";
|
||
ИмяФайлаЛога = ПолучитьИмяВременногоФайла();
|
||
СтрокаПараметров = СтрокаПараметров + " /out" + ИмяФайлаЛога;
|
||
СтрокаЗапуска = """" + КаталогПрограммы() + "1cv8.exe"" " + СтрокаПараметров;
|
||
ирКэш.Получить().ЗапуститьСкрытоеПриложениеИДождатьсяЗавершения(СтрокаЗапуска); //ВыполнитьСкрытуюКомандуОС
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтрокаСоединения = "File=""" + КаталогПустойИнфобазы + """;";
|
||
Результат = СтрокаСоединения;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Создает COM объект клиента 1C и подключает его к базе по указанной строке соединения.
|
||
// Параметры:
|
||
// СтрокаСоединения - Строка
|
||
// ИмяПользователя - Строка
|
||
// ПарольПользователя - Строка
|
||
// ТипКомОбъекта - Строка, *"Application" - "Application" или "ComConnector"
|
||
// Видимость - Булево - для Application
|
||
// ОбработатьИсключениеПодключения - Булево, *Ложь - при Истина исключение обрабатывается внутри метода и возвращется его описание в качестве результата
|
||
// ИмяСервераПроцессов - Строка - имя сервера, на котором создавать COM объект
|
||
//
|
||
// Возвращаемое значение:
|
||
// COMОбъект - клиента 1C, Строка - описание исключения
|
||
//
|
||
Функция СоздатьСеансИнфобазы1С8Лкс(Знач СтрокаСоединения = "", Знач ИмяПользователя = "", Знач ПарольПользователя = "",
|
||
Знач ТипКомОбъекта = "Application", Знач Видимость = Ложь, Знач ОбработатьИсключениеПодключения = Ложь,
|
||
ОписаниеОшибки = "", ИмяСервераПроцессов = "") Экспорт
|
||
|
||
ДопСтрокаСоединения = "Usr=""" + ИмяПользователя + """;" + "Pwd=""" + ПарольПользователя + """;";
|
||
Соединение = Новый COMОбъект("v" + ирКэш.Получить().ИДВерсииПлатформы + "." + ТипКомОбъекта, ИмяСервераПроцессов);
|
||
|
||
Если Не ЗначениеЗаполнено(СтрокаСоединения) Тогда
|
||
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
|
||
КонецЕсли;
|
||
ПолнаяСтрокаСоединения = СтрокаСоединения + ДопСтрокаСоединения;
|
||
Попытка
|
||
РезультатСоединения = Соединение.Connect(ПолнаяСтрокаСоединения);
|
||
Исключение
|
||
Если ОбработатьИсключениеПодключения Тогда
|
||
ОписаниеОшибки = ОписаниеОшибки();
|
||
Возврат ОписаниеОшибки;
|
||
Иначе
|
||
ВызватьИсключение;
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
Если ТипКомОбъекта = "Application" Тогда
|
||
Соединение.Visible = Видимость;
|
||
Результат = Соединение;
|
||
ИначеЕсли ТипКомОбъекта = "ComConnector" Тогда
|
||
Результат = РезультатСоединения;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура СчитатьПорциюДинамическойВыборкиВТаблицуЛкс(Выборка, ТаблицаПриемник, Знач РазмерПорции = 999) Экспорт
|
||
|
||
#Если _ Тогда
|
||
Пустышка = Новый запрос;
|
||
Выборка = Пустышка.Выполнить();
|
||
#КонецЕсли
|
||
КоличествоРезультата = Выборка.Количество();
|
||
Несчитано = КоличествоРезультата - ТаблицаПриемник.Количество();
|
||
Если Ложь
|
||
Или РазмерПорции > Несчитано
|
||
Или РазмерПорции = 0
|
||
Тогда
|
||
РазмерПорции = Несчитано;
|
||
КонецЕсли;
|
||
Если Несчитано = РазмерПорции Тогда
|
||
ПредставлениеПроцесса = "Загрузка выборки";
|
||
Иначе
|
||
ПредставлениеПроцесса = "Загрузка порции выборки";
|
||
КонецЕсли;
|
||
#Если Клиент Тогда
|
||
Индикатор = ЛксПолучитьИндикаторПроцесса(РазмерПорции, ПредставлениеПроцесса);
|
||
#КонецЕсли
|
||
КолонкиВложенныхТаблиц = Новый Массив();
|
||
Для Каждого Колонка Из Выборка.Владелец().Колонки Цикл
|
||
Если Колонка.ТипЗначения.СодержитТип(Тип("РезультатЗапроса")) Тогда
|
||
КолонкиВложенныхТаблиц.Добавить(Колонка.Имя);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
ЕстьКолонкиВложенныхТаблиц = КолонкиВложенныхТаблиц.Количество() > 0;
|
||
Пока Выборка.Следующий() Цикл
|
||
#Если Клиент Тогда
|
||
ЛксОбработатьИндикатор(Индикатор);
|
||
#КонецЕсли
|
||
НоваяСтрока = ТаблицаПриемник.Добавить();
|
||
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
|
||
Если ЕстьКолонкиВложенныхТаблиц Тогда
|
||
Для Каждого КолонкаВложеннойТаблицы Из КолонкиВложенныхТаблиц Цикл
|
||
НоваяСтрока[КолонкаВложеннойТаблицы] = Выборка[КолонкаВложеннойТаблицы].Выгрузить();
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Если РазмерПорции > 0 Тогда
|
||
РазмерПорции = РазмерПорции - 1;
|
||
Если РазмерПорции = 0 Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры // СчитатьПорциюРезультата()
|
||
|
||
// Параметры:
|
||
// XML -
|
||
// Тип -
|
||
// ИспользоватьXDTO -
|
||
// СообщатьОбОшибках -
|
||
//
|
||
Функция ВосстановитьОбъектИзСтрокиXMLЛкс(Знач XML = "", Знач Тип = "", Знач ИспользоватьXDTO = Истина, Знач СообщатьОбОшибках = Истина) Экспорт
|
||
|
||
Если ЗначениеЗаполнено(XML) Тогда
|
||
ЧтениеXML = Новый ЧтениеXML;
|
||
ЧтениеXML.УстановитьСтроку(XML);
|
||
Попытка
|
||
Если ИспользоватьXDTO Тогда
|
||
Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
|
||
Иначе
|
||
Результат = ПрочитатьXML(ЧтениеXML);
|
||
КонецЕсли;
|
||
Исключение
|
||
Если СообщатьОбОшибках Тогда
|
||
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Если Результат = Неопределено Тогда
|
||
Результат = Новый (Тип);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ВосстановитьНастройкуКомпоновкиИзСтрокиXMLЛкс(Знач XML = "", Знач СообщатьОбОшибках = Истина) Экспорт
|
||
|
||
Результат = ирНеглобальный.ВосстановитьОбъектИзСтрокиXMLЛкс(XML, Тип("НастройкиКомпоновкиДанных"), , СообщатьОбОшибках);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// Объект -
|
||
// ИспользоватьXDTO -
|
||
//
|
||
Функция СохранитьОбъектВВидеСтрокиXMLЛкс(Знач Объект, Знач ИспользоватьXDTO = Истина) Экспорт
|
||
|
||
Поток = Новый ЗаписьXML;
|
||
Поток.УстановитьСтроку();
|
||
Если ИспользоватьXDTO Тогда
|
||
СериализаторXDTO.ЗаписатьXML(Поток, Объект);
|
||
Иначе
|
||
ЗаписатьXML(Поток, Объект);
|
||
КонецЕсли;
|
||
Результат = Поток.Закрыть();
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЗаписатьОбъектДляОтладкиЛкс(Объект) Экспорт
|
||
|
||
#Если Не Клиент Тогда
|
||
Если ТранзакцияАктивна() Тогда
|
||
СтрокаХМЛ = СохранитьОбъектВВидеСтрокиXMLЛкс(Объект);
|
||
Параметры = Новый Массив();
|
||
Параметры.Добавить(СтрокаХМЛ);
|
||
ФоновоеЗадание = ФоновыеЗадания.Выполнить("ирНеглобальный.ЗаписатьОбъектДляОтладкиЛкс", Параметры);
|
||
Иначе
|
||
#КонецЕсли
|
||
Если ТипЗнч(Объект) = Тип("Строка") Тогда
|
||
Объект = ВосстановитьОбъектИзСтрокиXMLЛкс(Объект);
|
||
КонецЕсли;
|
||
Объект.Записать();
|
||
#Если Не Клиент Тогда
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
|
||
КонецФункции
|
||
|
||
// ТаблицаПараметров - ТаблицаЗначений
|
||
Функция НайтиДобавитьПараметрСсылкуВТаблицуЛкс(ТаблицаПараметров, ИмяКолонкиИмени = "Имя", ИмяКолонкиЗначения = "Значение", ЗначениеПараметра,
|
||
ИмяПараметра = Неопределено) Экспорт
|
||
|
||
Строки = ТаблицаПараметров.НайтиСтроки(Новый Структура(ИмяКолонкиИмени, ЗначениеПараметра));
|
||
Если Строки.Количество() > 0 Тогда
|
||
Результат = Строки[0];
|
||
Иначе
|
||
ОбъектМД = ЗначениеПараметра.Метаданные();
|
||
//Префикс = НРег(Лев(ОбъектМД.Имя, 1));
|
||
Префикс = "";
|
||
Если ИмяПараметра = Неопределено Тогда
|
||
ИмяПараметра = "" + ЗначениеПараметра;
|
||
КонецЕсли;
|
||
Если Не ЗначениеЗаполнено(ИмяПараметра) Тогда
|
||
ИмяПараметра = ОбъектМД.Имя + "Пустая";
|
||
КонецЕсли;
|
||
ИмяПараметра = Префикс + ирКэш.Получить().ПолучитьИдентификаторИзПредставления(ИмяПараметра);
|
||
СтруктураСвойствПараметра = Новый Структура;
|
||
СтруктураСвойствПараметра.Вставить(ИмяКолонкиИмени, ИмяПараметра);
|
||
|
||
Счетчик = 0;
|
||
Пока ТаблицаПараметров.НайтиСтроки(СтруктураСвойствПараметра).Количество() > 0 Цикл
|
||
Счетчик = Счетчик + 1;
|
||
СтруктураСвойствПараметра[ИмяКолонкиИмени] = ИмяПараметра + Счетчик;
|
||
КонецЦикла;
|
||
|
||
СтруктураСвойствПараметра.Вставить("ЭтоВыражение", Ложь);
|
||
СтруктураСвойствПараметра.Вставить(ИмяКолонкиЗначения, ЗначениеПараметра);
|
||
СтрокаНовогоПараметра = ТаблицаПараметров.Добавить();
|
||
ЗаполнитьЗначенияСвойств(СтрокаНовогоПараметра, СтруктураСвойствПараметра);
|
||
Результат = СтрокаНовогоПараметра;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ДобавитьПараметрЗначение()
|
||
|
||
Функция ПолучитьНаборЗаписейПоКлючуЛкс(ПолноеИмяРегистраИлиНаборЗаписей, СтруктураКлюча, ДобавитьИЗаполнитьСтрокуНабора = Ложь) Экспорт
|
||
|
||
Если ТипЗнч(ПолноеИмяРегистраИлиНаборЗаписей) = Тип("Строка") Тогда
|
||
НаборЗаписей = Новый (СтрЗаменить(ПолноеИмяРегистраИлиНаборЗаписей, ".", "НаборЗаписей."));
|
||
Иначе
|
||
НаборЗаписей = ПолноеИмяРегистраИлиНаборЗаписей;
|
||
КонецЕсли;
|
||
Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл
|
||
ЭлементОтбора.Использование = Истина;
|
||
ЭлементОтбора.Значение = СтруктураКлюча[ЭлементОтбора.ПутьКДанным];
|
||
КонецЦикла;
|
||
Если ДобавитьИЗаполнитьСтрокуНабора Тогда
|
||
ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), СтруктураКлюча);
|
||
КонецЕсли;
|
||
Возврат НаборЗаписей;
|
||
|
||
КонецФункции
|
||
|
||
// Получает копию таблицы значений с минимальными типами колонок для содержания всех данных.
|
||
// Параметры:
|
||
// ТаблицаДанных - ТаблицаЗначений
|
||
// СужатьТолькоПроизвольныеКолонки - Булево - обрабатывать только колонки с пустым (произвольным) типом
|
||
//
|
||
Функция ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс(Знач ТаблицаДанных, СужатьТолькоПроизвольныеКолонки = Ложь) Экспорт
|
||
|
||
ОставляемыеКолонки = "";
|
||
СужаемыеКолонки = Новый Массив();
|
||
Для Каждого КолонкаДанных Из ТаблицаДанных.Колонки Цикл
|
||
Если Истина
|
||
И СужатьТолькоПроизвольныеКолонки
|
||
И КолонкаДанных.ТипЗначения.Типы().Количество() > 0
|
||
Тогда
|
||
ОставляемыеКолонки = ОставляемыеКолонки + "," + КолонкаДанных.Имя;
|
||
Иначе
|
||
СужаемыеКолонки.Добавить(КолонкаДанных);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если ОставляемыеКолонки <> "" Тогда
|
||
ТипизированнаяТаблица = ТаблицаДанных.Скопировать(, ОставляемыеКолонки);
|
||
Иначе
|
||
ТипизированнаяТаблица = Новый ТаблицаЗначений;
|
||
КонецЕсли;
|
||
//Состояние("Оптимизация типов колонок");
|
||
МетаданныеТаблицыИзменены = Ложь;
|
||
Для Каждого КолонкаДанных Из СужаемыеКолонки Цикл
|
||
Типы = Новый Массив;
|
||
ТаблицаКолонки = ТаблицаДанных.Скопировать(, КолонкаДанных.Имя);
|
||
ТаблицаКолонки.Свернуть(КолонкаДанных.Имя);
|
||
//Индикатор = УФ(сПолучитьИндикаторПроцесса, ТаблицаКолонки.Количество(), "Оптимизация типов колонки """ + КолонкаДанных.Имя + """");
|
||
Для Каждого СтрокаДанных Из ТаблицаКолонки Цикл
|
||
//ЛксОбработатьИндикатор(Индикатор);
|
||
ТипЗначения = ТипЗнч(СтрокаДанных[КолонкаДанных.Имя]);
|
||
Если Типы.Найти(ТипЗначения) = Неопределено Тогда
|
||
Типы.Добавить(ТипЗначения);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если Типы.Количество() <> КолонкаДанных.ТипЗначения.Типы().Количество() Тогда
|
||
МетаданныеТаблицыИзменены = Истина;
|
||
КонецЕсли;
|
||
ТипизированнаяТаблица.Колонки.Добавить(КолонкаДанных.Имя, Новый ОписаниеТипов(Типы), КолонкаДанных.Заголовок);
|
||
КонецЦикла;
|
||
|
||
Если МетаданныеТаблицыИзменены Тогда
|
||
//Состояние("Загрузка таблицы данных");
|
||
ЛксЗагрузитьВТаблицуЗначений(ТаблицаДанных, ТипизированнаяТаблица);
|
||
//Состояние("");
|
||
Иначе
|
||
ТипизированнаяТаблица = ТаблицаДанных.Скопировать();
|
||
КонецЕсли;
|
||
Результат = ТипизированнаяТаблица;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// ************************
|
||
// WMI
|
||
|
||
Функция ПолучитьСтруктуруИзЗначенияWMIЛкс(ЗначениеWMI) Экспорт
|
||
|
||
Результат = Новый Структура;
|
||
Для каждого СвойствоWMI из ЗначениеWMI Цикл
|
||
Если ТипЗнч(СвойствоWMI.Value) = Тип("COMSafeArray") Тогда
|
||
ЗначениеСвойства = СвойствоWMI.Value.Выгрузить();// возможно массив надо будет переделать
|
||
Иначе
|
||
ЗначениеСвойства = СвойствоWMI.Value;
|
||
//ИмяТипа = ирНеглобальный.ПолучитьИмяТипаИзКвалификаторовWMIЛкс(СвойствоWMI);
|
||
//Если ирНеглобальный.СтрокиРавныЛкс(ИмяТипа, "Дата") Тогда
|
||
Если СвойствоWMI.CIMTYPE = 101 Тогда //datetime
|
||
ЗначениеСвойства = ирНеглобальный.СтрокаДатыWMIВДатуЛкс(ЗначениеСвойства);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Результат.Вставить(СвойствоWMI.Name, ЗначениеСвойства);
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИмяТипаИзКвалификаторовWMIЛкс(Свойство) Экспорт
|
||
|
||
ИмяТипа = "";
|
||
Попытка
|
||
Квалификаторы = Свойство.Qualifiers_;
|
||
Исключение
|
||
// Нет у системных свойств
|
||
Квалификаторы = Новый Массив();
|
||
КонецПопытки;
|
||
Для Каждого Квалификатор Из Квалификаторы Цикл
|
||
Если ирНеглобальный.СтрокиРавныЛкс("CIMTYPE", Квалификатор.Name) Тогда
|
||
ИмяТипа = Нрег(Квалификатор.Value);
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если Ложь
|
||
Или Найти(ИмяТипа, "int") > 0
|
||
Тогда
|
||
ИмяТипа = "Число";
|
||
ИначеЕсли Ложь
|
||
Или Найти(ИмяТипа, "date") > 0
|
||
Или Найти(ИмяТипа, "time") > 0
|
||
Тогда
|
||
ИмяТипа = "Дата";
|
||
ИначеЕсли Ложь
|
||
Или Найти(ИмяТипа, "sting") > 0
|
||
Или Найти(ИмяТипа, "char") > 0
|
||
Тогда
|
||
ИмяТипа = "Строка";
|
||
ИначеЕсли ТипЗнч(ИмяТипа) = Тип("COMОбъект") Тогда
|
||
ИмяТипа = "COMОбъект.{WbemScripting.SwbemLocator}." + ИмяТипа;
|
||
КонецЕсли;
|
||
|
||
Возврат ИмяТипа;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьОписаниеЭлементаWMIЛкс(ЭлементКоллекции, ИмяСвойства = "Description") Экспорт
|
||
|
||
ОписаниеЭлемента = "";
|
||
Квалификаторы = ЭлементКоллекции.qualifiers_;
|
||
Попытка
|
||
КвалификаторОписание = Квалификаторы.item(ИмяСвойства);
|
||
Исключение
|
||
КвалификаторОписание = Неопределено;
|
||
КонецПопытки;
|
||
Если КвалификаторОписание <> Неопределено Тогда
|
||
ОписаниеЭлемента = КвалификаторОписание.Value;
|
||
КонецЕсли;
|
||
Возврат ОписаниеЭлемента;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьДокументациюСвойстваWMIЛкс(ИмяКласса, ИмяСвойства, СлужбаWMI = Неопределено) Экспорт
|
||
|
||
Если СлужбаWMI = Неопределено Тогда
|
||
СлужбаWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс();
|
||
КонецЕсли;
|
||
wbemFlagUseAmendedQualifiers = 131072; //&H20000
|
||
ОписанияСвойств = СлужбаWMI.Get(ИмяКласса, wbemFlagUseAmendedQualifiers).Properties_;
|
||
Попытка
|
||
ОписаниеСвойства = ОписанияСвойств.item(ИмяСвойства);
|
||
Исключение
|
||
Возврат "";
|
||
КонецПопытки;
|
||
ТекстОписания = ПолучитьОписаниеЭлементаWMIЛкс(ОписаниеСвойства);
|
||
ТипЗначений = ПолучитьОписаниеЭлементаWMIЛкс(ОписаниеСвойства, "CIMTYPE");
|
||
Если ТипЗначений <> Неопределено Тогда
|
||
ТекстОписания = ТекстОписания + "
|
||
|Type: " + ТипЗначений;
|
||
КонецЕсли;
|
||
ЕдиницаИзмерения = ПолучитьОписаниеЭлементаWMIЛкс(ОписаниеСвойства, "Units");
|
||
Если ЗначениеЗаполнено(ЕдиницаИзмерения) Тогда
|
||
ТекстОписания = ТекстОписания + "
|
||
|Unit: " + ЕдиницаИзмерения;
|
||
КонецЕсли;
|
||
Возврат ТекстОписания;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьДокументациюМетодаWMIЛкс(ИмяКласса, ИмяМетода, СлужбаWMI = Неопределено) Экспорт
|
||
|
||
Если СлужбаWMI = Неопределено Тогда
|
||
СлужбаWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс();
|
||
КонецЕсли;
|
||
wbemFlagUseAmendedQualifiers = 131072; //&H20000
|
||
ОписанияМетодов = СлужбаWMI.Get(ИмяКласса, wbemFlagUseAmendedQualifiers).Methods_;
|
||
Попытка
|
||
ОписаниеМетода = ОписанияМетодов.item(ИмяМетода);
|
||
Исключение
|
||
Возврат "";
|
||
КонецПопытки;
|
||
ТекстОписания = ПолучитьОписаниеЭлементаWMIЛкс(ОписаниеМетода);
|
||
ТипЗначений = ПолучитьОписаниеЭлементаWMIЛкс(ОписаниеМетода, "CIMTYPE");
|
||
Если ТипЗначений <> Неопределено Тогда
|
||
ТекстОписания = ТекстОписания + "
|
||
|Type: " + ТипЗначений;
|
||
КонецЕсли;
|
||
ЕдиницаИзмерения = ПолучитьОписаниеЭлементаWMIЛкс(ОписаниеМетода, "Units");
|
||
Если ЗначениеЗаполнено(ЕдиницаИзмерения) Тогда
|
||
ТекстОписания = ТекстОписания + "
|
||
|Unit: " + ЕдиницаИзмерения;
|
||
КонецЕсли;
|
||
Возврат ТекстОписания;
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// СтрокаДаты - Строка(0,П)
|
||
//
|
||
Функция СтрокаДатыWMIВДатуЛкс(Знач СтрокаДаты = "") Экспорт
|
||
|
||
Если Не ЗначениеЗаполнено(СтрокаДаты) Тогда
|
||
Возврат Дата(1,1,1);
|
||
Иначе
|
||
Строка = Лев(СтрокаДаты, 4) + Сред(СтрокаДаты, 5, 2) + Сред(СтрокаДаты, 7, 2)
|
||
+ Сред (СтрокаДаты, 9, 2) + Сред(СтрокаДаты, 11, 2) + Сред(СтрокаДаты, 13, 2);
|
||
Результат = Дата(Строка) + Вычислить("0." + Сред(СтрокаДаты, 16, 6));
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// WMI
|
||
// *************************
|
||
|
||
// ************************
|
||
// ADO
|
||
|
||
Функция ПолучитьКолонкиRecordsetADOЛкс(РезультатТаблица, РезультатRecordset, Типизировать1С = Неопределено) Экспорт
|
||
|
||
Если РезультатТаблица = Неопределено Тогда
|
||
РезультатТаблица = Новый ТаблицаЗначений;
|
||
КонецЕсли;
|
||
мПлатформа = ирКэш.Получить();
|
||
FieldКолонка = Новый Соответствие;
|
||
Для каждого Field Из РезультатRecordset.Fields Цикл
|
||
Если ПустаяСтрока(Field.Name) Тогда
|
||
ИмяКолонки = ":?";
|
||
Для о=1 По СтрДлина(Field.Name)-1 Цикл
|
||
ИмяКолонки = ИмяКолонки + "?";
|
||
КонецЦикла;
|
||
Иначе
|
||
ИмяКолонки = Field.Name;
|
||
КонецЕсли;
|
||
Если Не ЛксЛиИмяПеременной(ИмяКолонки) Тогда
|
||
ИмяКолонки = мПлатформа.ПолучитьИдентификаторИзПредставления(ИмяКолонки);
|
||
КонецЕсли;
|
||
// контроль полей - двойников по именам
|
||
НомерДвойника=0;
|
||
Пока РезультатТаблица.Колонки.Найти(ИмяКолонки + Формат(НомерДвойника,"ЧГ=0")) <> Неопределено Цикл
|
||
НомерДвойника = НомерДвойника + 1;
|
||
КонецЦикла;
|
||
ИмяКолонки = ИмяКолонки + Формат(НомерДвойника, "ЧГ=0");
|
||
Если Типизировать1С = Истина Тогда
|
||
Тип1С = ирНеглобальный.FieldADO_ПолучитьТип1C(Field);
|
||
Иначе
|
||
Тип1С = Неопределено;
|
||
КонецЕсли;
|
||
//Если Тип1С=Неопределено Тогда
|
||
// Колонка = РезультатТаблица.Колонки.Добавить(ИмяКолонки,,"["+Name+"]");
|
||
//Иначе
|
||
Колонка = РезультатТаблица.Колонки.Добавить(ИмяКолонки,Тип1С);
|
||
//КонецЕсли;
|
||
FieldКолонка.Вставить(Field, Колонка);
|
||
КонецЦикла;
|
||
Возврат FieldКолонка;
|
||
|
||
КонецФункции
|
||
|
||
// *** УСТАНОВКА ПАРАМЕТРОВ ЗАПРОСА ADO ***
|
||
|
||
// подбирает описание типа 1С, соответствующее типу ADO
|
||
Функция ПреобразоватьТипADO_Тип1С(Type,Size,Precision0,NumericScale0) Экспорт
|
||
Тип1С = Неопределено;
|
||
Если Precision0 > 0 И NumericScale0 >= 0 Тогда
|
||
Если Precision0 < NumericScale0 Тогда
|
||
// кривой вариант настроек типа ADO (может иногда возвращаться провайдерами данных)
|
||
Precision = Precision0 + NumericScale0;
|
||
Иначе
|
||
Precision = Precision0;
|
||
КонецЕсли;
|
||
UseМаксЧисло = (Precision > 32);
|
||
Иначе
|
||
// совсем кривой вариант
|
||
UseМаксЧисло = Истина;
|
||
КонецЕсли;
|
||
NumericScale = ?(NumericScale0 < 0, 0, NumericScale0);
|
||
NumericScaleM = ?(NumericScale > 10, 10, NumericScale);
|
||
Если Type = intTypeADO("adEmpty") Тогда
|
||
ИначеЕсли Type = intTypeADO("adSmallInt")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Любой));
|
||
ИначеЕсли Type = intTypeADO("adInteger") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Любой));
|
||
ИначеЕсли Type = intTypeADO("adSingle") Тогда
|
||
Если UseМаксЧисло Тогда
|
||
// взвешанно-максимальный числовой тип
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(32, NumericScaleM, ДопустимыйЗнак.Любой));
|
||
Иначе
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(Precision, NumericScale, ДопустимыйЗнак.Любой));
|
||
КонецЕсли;
|
||
ИначеЕсли Type = intTypeADO("adDouble") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Precision+NumericScale, NumericScale, ДопустимыйЗнак.Любой));
|
||
Если UseМаксЧисло Тогда
|
||
// взвешанно-максимальный числовой тип
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(32, NumericScaleM, ДопустимыйЗнак.Любой));
|
||
Иначе
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(Precision, NumericScale, ДопустимыйЗнак.Любой));
|
||
КонецЕсли;
|
||
ИначеЕсли Type = intTypeADO("adCurrency")Тогда
|
||
Если UseМаксЧисло Тогда
|
||
// взвешанно-максимальный числовой тип
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(32, NumericScaleM, ДопустимыйЗнак.Любой));
|
||
Иначе
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(Precision, NumericScale, ДопустимыйЗнак.Любой));
|
||
КонецЕсли;
|
||
ИначеЕсли Type = intTypeADO("adDate") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Дата", , Новый КвалификаторыДаты(ЧастиДаты.Дата));
|
||
ИначеЕсли Type = intTypeADO("adBSTR") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(Size, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adIDispatch")Тогда
|
||
ИначеЕсли Type = intTypeADO("adError") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Precision, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adBoolean") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Булево");
|
||
ИначеЕсли Type = intTypeADO("adVariant") Тогда
|
||
ИначеЕсли Type = intTypeADO("adIUnknown")Тогда
|
||
ИначеЕсли Type = intTypeADO("adDecimal") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Precision, NumericScale, ДопустимыйЗнак.Любой));
|
||
ИначеЕсли Type = intTypeADO("adTinyInt") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(3, 0, ДопустимыйЗнак.Любой));
|
||
ИначеЕсли Type = intTypeADO("adUnsignedTinyInt")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(3, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adUnsignedSmallInt")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adUnsignedInt")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adBigInt") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(20, 0, ДопустимыйЗнак.Любой));
|
||
ИначеЕсли Type = intTypeADO("adUnsignedBigInt")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(20, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adFileTime")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Precision, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adGUID") Тогда
|
||
ИначеЕсли Type = intTypeADO("adBinary") Тогда
|
||
ИначеЕсли Type = intTypeADO("adChar") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(Size, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adWChar") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(Size, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adNumeric") Тогда
|
||
Если UseМаксЧисло Тогда
|
||
// взвешанно-максимальный числовой тип
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(32, NumericScaleM, ДопустимыйЗнак.Любой));
|
||
Иначе
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(Precision, NumericScale, ДопустимыйЗнак.Любой));
|
||
КонецЕсли;
|
||
ИначеЕсли Type = intTypeADO("adUserDefined")Тогда
|
||
ИначеЕсли Type = intTypeADO("adDBDate") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Дата", , Новый КвалификаторыДаты(ЧастиДаты.Дата));
|
||
ИначеЕсли Type = intTypeADO("adDBTime") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Дата", , Новый КвалификаторыДаты(ЧастиДаты.Время));
|
||
ИначеЕсли Type = intTypeADO("adDBTimeStamp")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Дата", , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));
|
||
ИначеЕсли Type = intTypeADO("adChapter") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(Precision, 0, ДопустимыйЗнак.Неотрицательный));
|
||
ИначеЕсли Type = intTypeADO("adPropVariant")Тогда
|
||
ИначеЕсли Type = intTypeADO("adVarNumeric")Тогда
|
||
Если UseМаксЧисло Тогда
|
||
// взвешанно-максимальный числовой тип
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(32, NumericScaleM, ДопустимыйЗнак.Любой));
|
||
Иначе
|
||
Тип1С = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(Precision, NumericScale, ДопустимыйЗнак.Любой));
|
||
КонецЕсли;
|
||
ИначеЕсли Type = intTypeADO("adVarChar") Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(Size, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adLongVarChar")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adVarWChar")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(Size, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adLongVarWChar")Тогда
|
||
Тип1С = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная));
|
||
ИначеЕсли Type = intTypeADO("adVarBinary")Тогда
|
||
ИначеЕсли Type = intTypeADO("adLongVarBinary")Тогда
|
||
ИначеЕсли Type = intTypeADO("AdArray") Тогда
|
||
Иначе // Тип1С = Неопределено;
|
||
КонецЕсли;
|
||
Возврат Тип1С;
|
||
КонецФункции // ПреобразоватьТипADO_Тип1С()
|
||
|
||
// возвращает описание типа 1С, соответствующее типу объекта ADODB.Field
|
||
// значение Неопределено соответствует значению произвольного типа 1С
|
||
Функция FieldADO_ПолучитьТип1C(FieldADO) Экспорт
|
||
Попытка
|
||
Type = FieldADO.Type;
|
||
DefinedSize = FieldADO.DefinedSize;
|
||
Precision = FieldADO.Precision;
|
||
NumericScale = FieldADO.NumericScale;
|
||
Исключение
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
Возврат ПреобразоватьТипADO_Тип1С(Type,DefinedSize,Precision,NumericScale);
|
||
КонецФункции
|
||
|
||
// возвращает описание типа 1С, соответствующее типу объекта ADODB.Parameter
|
||
// значение Неопределено соответствует значению произвольного типа 1С
|
||
Функция ParameterADO_ПолучитьТип1C(ParameterADO) Экспорт
|
||
Попытка
|
||
Type = ParameterADO.Type;
|
||
Size = ParameterADO.Size;
|
||
Precision = ParameterADO.Precision;
|
||
NumericScale = ParameterADO.NumericScale;
|
||
Исключение
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
Возврат ПреобразоватьТипADO_Тип1С(Type,Size,Precision,NumericScale);
|
||
КонецФункции
|
||
|
||
// возвращает структуру с полями объекта ADODB.Field
|
||
Функция FieldADO(стрName,стрType,чисDefinedSize,чисPrecision,чисNumericScale,Value=Неопределено) Экспорт
|
||
ПолеADO = Новый Структура("Name,Type,DefinedSize,Precision,NumericScale,Value");
|
||
ТипЧисло = Тип("Число");
|
||
Если стрName <> Неопределено Тогда
|
||
ПолеADO.Вставить("Name",СокрЛП(стрName));
|
||
КонецЕсли;
|
||
Если стрType <> Неопределено Тогда
|
||
Если ТипЗнч(стрType) = ТипЧисло Тогда
|
||
// дополнительный контроль числа на допустимое значение
|
||
ПолеADO.Вставить("Type",intTypeADO(strTypeADO(стрType)));
|
||
Иначе
|
||
ПолеADO.Вставить("Type",intTypeADO(стрType));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если чисDefinedSize <> Неопределено Тогда
|
||
Если ТипЗнч(чисDefinedSize)=ТипЧисло Тогда
|
||
ПолеADO.Вставить("DefinedSize",Цел(чисDefinedSize));
|
||
Иначе
|
||
ПолеADO.Вставить("DefinedSize",0);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если чисPrecision <> Неопределено Тогда
|
||
Если ТипЗнч(чисPrecision)=ТипЧисло Тогда
|
||
ПолеADO.Вставить("Precision",Цел(чисPrecision));
|
||
Иначе
|
||
ПолеADO.Вставить("Precision",0);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если чисNumericScale <> Неопределено Тогда
|
||
Если ТипЗнч(чисNumericScale)=ТипЧисло Тогда
|
||
ПолеADO.Вставить("NumericScale",Цел(чисNumericScale));
|
||
Иначе
|
||
ПолеADO.Вставить("NumericScale",0);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Value <> Неопределено Тогда
|
||
ПолеADO.Вставить("Value",Value);
|
||
КонецЕсли;
|
||
Возврат ПолеADO;
|
||
КонецФункции
|
||
|
||
// возвращает структуру с полями объекта ADODB.Parameter
|
||
Функция ParameterADO(стрName,стрDirection,стрType,чисSize,чисNumericScale,чисPrecision,чисAttributes=0,Value=Неопределено) Экспорт
|
||
ПараметрADO = Новый Структура("Name,Direction,Type,Size,NumericScale,Precision,Attributes,Value");
|
||
ТипЧисло = Тип("Число");
|
||
Если стрName <> Неопределено Тогда
|
||
ПараметрADO.Вставить("Name",СокрЛП(стрName));
|
||
КонецЕсли;
|
||
Если чисAttributes <> Неопределено Тогда
|
||
Если ТипЗнч(чисAttributes)=ТипЧисло И чисAttributes > 0 Тогда
|
||
ПараметрADO.Вставить("Attributes",Цел(чисAttributes));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если стрDirection <> Неопределено Тогда
|
||
Если ТипЗнч(стрDirection) = ТипЧисло Тогда
|
||
// дополнительный контроль числа на допустимое значение
|
||
ПараметрADO.Вставить("Direction",intDirectionParADO(strDirectionParADO(стрDirection)));
|
||
Иначе
|
||
ПараметрADO.Вставить("Direction",intDirectionParADO(стрDirection));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если стрType <> Неопределено Тогда
|
||
Если ТипЗнч(стрType) = ТипЧисло Тогда
|
||
// дополнительный контроль числа на допустимое значение
|
||
ПараметрADO.Вставить("Type",intTypeADO(strTypeADO(стрType)));
|
||
Иначе
|
||
ПараметрADO.Вставить("Type",intTypeADO(стрType));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если чисSize <> Неопределено Тогда
|
||
Если ТипЗнч(чисSize)=ТипЧисло Тогда
|
||
ПараметрADO.Вставить("Size",Цел(чисSize));
|
||
Иначе
|
||
ПараметрADO.Вставить("Size",0);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если чисNumericScale <> Неопределено Тогда
|
||
Если ТипЗнч(чисNumericScale)=ТипЧисло Тогда
|
||
ПараметрADO.Вставить("NumericScale",Цел(чисNumericScale));
|
||
Иначе
|
||
ПараметрADO.Вставить("NumericScale",0);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если чисPrecision <> Неопределено Тогда
|
||
Если ТипЗнч(чисPrecision)=ТипЧисло Тогда
|
||
ПараметрADO.Вставить("Precision",Цел(чисPrecision));
|
||
Иначе
|
||
ПараметрADO.Вставить("Precision",0);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Value <> Неопределено Тогда
|
||
ПараметрADO.Вставить("Value",Value);
|
||
КонецЕсли;
|
||
Возврат ПараметрADO;
|
||
КонецФункции
|
||
|
||
Функция DigitDECtoHEX(ЦыфраD)
|
||
Если ЦыфраD=0 Тогда
|
||
Возврат "0";
|
||
ИначеЕсли ЦыфраD>=1 И ЦыфраD<=9 Тогда
|
||
Возврат ""+ЦыфраD;
|
||
ИначеЕсли ЦыфраD=10 Тогда
|
||
Возврат "A";
|
||
ИначеЕсли ЦыфраD=11 Тогда
|
||
Возврат "B";
|
||
ИначеЕсли ЦыфраD=12 Тогда
|
||
Возврат "C";
|
||
ИначеЕсли ЦыфраD=13 Тогда
|
||
Возврат "D";
|
||
ИначеЕсли ЦыфраD=14 Тогда
|
||
Возврат "E";
|
||
ИначеЕсли ЦыфраD=15 Тогда
|
||
Возврат "F";
|
||
Иначе
|
||
Возврат "?";
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
Функция DigitHEXtoDEC(ЦыфраH)
|
||
Если ЦыфраH="0" ИЛИ ЦыфраH="1" ИЛИ ЦыфраH="2" ИЛИ ЦыфраH="3" ИЛИ ЦыфраH="4" ИЛИ ЦыфраH="5" ИЛИ ЦыфраH="6" ИЛИ ЦыфраH="7" ИЛИ ЦыфраH="8" ИЛИ ЦыфраH="9" Тогда
|
||
Возврат Цел(ЦыфраH);
|
||
ИначеЕсли ЦыфраH="a" ИЛИ ЦыфраH="A" Тогда
|
||
Возврат 10;
|
||
ИначеЕсли ЦыфраH="b" ИЛИ ЦыфраH="B" Тогда
|
||
Возврат 11;
|
||
ИначеЕсли ЦыфраH="c" ИЛИ ЦыфраH="C" Тогда
|
||
Возврат 12;
|
||
ИначеЕсли ЦыфраH="d" ИЛИ ЦыфраH="D" Тогда
|
||
Возврат 13;
|
||
ИначеЕсли ЦыфраH="e" ИЛИ ЦыфраH="E" Тогда
|
||
Возврат 14;
|
||
ИначеЕсли ЦыфраH="f" ИЛИ ЦыфраH="F" Тогда
|
||
Возврат 15;
|
||
Иначе
|
||
Возврат -1;
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
Функция СтрокаHEXtoINT(Знач СтрокаH) Экспорт
|
||
ПрефиксH = Лев(СтрокаH,2);
|
||
Если ПрефиксH="0x"
|
||
ИЛИ ПрефиксH="0X"
|
||
ИЛИ ПрефиксH="0х"
|
||
ИЛИ ПрефиксH="0Х" Тогда
|
||
СтрокаH=Сред(СтрокаH,3);
|
||
КонецЕсли;
|
||
Если ПустаяСтрока(СтрокаH) Тогда
|
||
Возврат 0;
|
||
КонецЕсли;
|
||
ДлинаH=СтрДлина(СтрокаH);
|
||
ЧислоD=0;
|
||
Для о = 1 По ДлинаH Цикл
|
||
ЦыфраH = Сред(СтрокаH,о,1);
|
||
ЦифраD = DigitHEXtoDEC(ЦыфраH);
|
||
Если ЦифраD<0 Тогда
|
||
Возврат -1; // нарушение формата 16-тиричного числа
|
||
КонецЕсли;
|
||
ЧислоD = 16*ЧислоD + ЦифраD;
|
||
КонецЦикла;
|
||
Возврат ЧислоD;
|
||
КонецФункции
|
||
|
||
// преобразует 16-тиричную строку в COMSafeArray
|
||
Функция СтрокаHEXtoCOMSafeArray(Знач СтрокаH) Экспорт
|
||
ПрефиксH = Лев(СтрокаH,2);
|
||
Если ПрефиксH="0x"
|
||
ИЛИ ПрефиксH="0X"
|
||
ИЛИ ПрефиксH="0х"
|
||
ИЛИ ПрефиксH="0Х" Тогда
|
||
СтрокаH=Сред(СтрокаH,3);
|
||
КонецЕсли;
|
||
Байты =СтрДлина(СтрокаH);
|
||
Байты = 2*Окр(Байты/2,0,1);
|
||
ArrayДанные = Новый Массив;
|
||
Поза=1;
|
||
Для о=1 По Байты Цикл
|
||
ДваБайт = Сред(СтрокаH,Поза,2);
|
||
ЗначInt = СтрокаHEXtoINT(ДваБайт);
|
||
Если ЗначInt<0 Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ArrayДанные.Добавить(ЗначInt);
|
||
Поза=Поза+2;
|
||
КонецЦикла;
|
||
Array = Новый COMSafeArray(ArrayДанные,"VT_UI1",Байты/2);
|
||
Возврат Array;
|
||
КонецФункции
|
||
|
||
// преобразует объект УникальныйИдентификатор в COMSafeArray
|
||
Функция GUIDToCOMSafeArray(GUID) Экспорт
|
||
ГУИД = СтрЗаменить(GUID,"-",Символы.ПС);
|
||
Если СтрЧислоСтрок(ГУИД)<>5 Тогда
|
||
// нарушена каноническая структура строки ГУИД: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)
|
||
Возврат Неопределено; // вдруг ...
|
||
КонецЕсли;
|
||
|
||
// Соответсвие байтов в поле BINARY(16) с частями ГУИД: 4,5,3,2,1 - проверено для 1с-8.1.14
|
||
СтрокаH = СтрПолучитьСтроку(ГУИД,4) + СтрПолучитьСтроку(ГУИД,5)+ СтрПолучитьСтроку(ГУИД,3)+ СтрПолучитьСтроку(ГУИД,2)+ СтрПолучитьСтроку(ГУИД,1);
|
||
//Сообщить("ГУИД = "+ГУИД);
|
||
//Сообщить("СтрокаH = "+СтрокаH);
|
||
|
||
Возврат СтрокаHEXtoCOMSafeArray(СтрокаH);
|
||
КонецФункции
|
||
|
||
// преобразует значение уникального идентификатора ссылки в COMSafeArray
|
||
Функция СсылкаToCOMSafeArray(Ссылка) Экспорт
|
||
Попытка
|
||
ГУИД = СокрЛП(Ссылка.УникальныйИдентификатор());
|
||
Исключение
|
||
// переданное значение не ссылка
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
|
||
Возврат GUIDToCOMSafeArray(ГУИД);
|
||
КонецФункции
|
||
|
||
// преобразоваение значения COMSafeArray, содержащие 2-байтовые целые в шестнадцатиричную строку
|
||
Функция BinaryCOMSafeArrayToHEX(Array) Экспорт
|
||
|
||
СтрHEX="";
|
||
Если ТипЗнч(Array)<>Тип("COMSafeArray") Тогда
|
||
Возврат "?COMSafeArray?";
|
||
КонецЕсли;
|
||
|
||
Массив=Array.Выгрузить();
|
||
Для каждого Слово Из Массив Цикл
|
||
Если ТипЗнч(Слово)=Тип("Число") Тогда
|
||
Слово=Цел(Слово);
|
||
Если (Слово<0)ИЛИ(Слово>255) Тогда
|
||
СтрHEX=СтрHEX+"??";
|
||
Иначе
|
||
Байт1=Слово%16;
|
||
Байт2=Цел(Слово/16);
|
||
СтрHEX=СтрHEX+DigitDECtoHEX(Байт2)+DigitDECtoHEX(Байт1);
|
||
КонецЕсли;
|
||
Иначе
|
||
СтрHEX=СтрHEX+"??";
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Возврат "0x"+СтрHEX;
|
||
КонецФункции
|
||
|
||
// возвращает свойства параметра ADO из переданной структуры
|
||
// с автоматическим подбором значений свойств по значению 1С (если свойство неопределено)
|
||
Процедура ParameterADOСвойства(стТипADO,Значение1С,ЗначениеADO,Direction,Type,Precision,NumericScale,Size,Attributes,ADOUtils=Неопределено)
|
||
Перем ТипЗначения1С;
|
||
|
||
Если ТипЗнч(стТипADO)=Тип("Структура") Тогда
|
||
стТипADO.Свойство("Direction",Direction);
|
||
стТипADO.Свойство("Type",Type);
|
||
стТипADO.Свойство("Precision",Precision);
|
||
стТипADO.Свойство("NumericScale",NumericScale);
|
||
стТипADO.Свойство("Size",Size);
|
||
стТипADO.Свойство("Attributes",Attributes);
|
||
стТипADO.Свойство("ТипЗначения1С",ТипЗначения1С);
|
||
КонецЕсли;
|
||
|
||
Если Истина
|
||
И ТипЗнч(ТипЗначения1С) = Тип("ОписаниеТипов")
|
||
И ТипЗначения1С.Типы().Количество() > 0
|
||
И НЕ ТипЗначения1С.СодержитТип(ТипЗнч(Значение1С))
|
||
Тогда
|
||
// приведем значение 1С к указанному типу (актуально для значений Null, возвращаемых запросами 1С)
|
||
Значение1С = ТипЗначения1С.ПривестиЗначение(Значение1С);
|
||
КонецЕсли;
|
||
|
||
Если Direction=Неопределено Тогда
|
||
Direction=1; // 1 - входящий(Default) ... или 0 - неизвестно ???
|
||
КонецЕсли;
|
||
|
||
Тип1С=ТипЗнч(Значение1С);
|
||
Попытка
|
||
Ссылка = Значение1С.Ссылка;
|
||
Исключение
|
||
Ссылка = Неопределено;
|
||
Попытка
|
||
// перечисления стоят особняком среди "ссылочных" типов
|
||
МетаДата = Значение1С.Метаданные();
|
||
Если Метаданные.Перечисления.Содержит(МетаДата) Тогда
|
||
Ссылка = Значение1С;
|
||
КонецЕсли;
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
|
||
Если Type=Неопределено Тогда
|
||
// попытаемся подобрать по типу 1С
|
||
Если Тип1С=Тип("Число") Тогда
|
||
//Type = 4; // adSingle
|
||
//Type = 5; // adDouble
|
||
//Type = 14; // adDecimal
|
||
//Type = 131; // adNumeric
|
||
//Type = 139; // adVarNumeric
|
||
Если Цел(Значение1С)=Значение1С Тогда
|
||
Если ?(Значение1С<0,-1,1)*Значение1С <= 2147483647 Тогда // 2^32-1
|
||
Type = intTypeADO("adInteger"); // 3
|
||
Иначе
|
||
Type = intTypeADO("adBigInt"); // 20
|
||
КонецЕсли;
|
||
Иначе
|
||
Type = 14; // adDecimal
|
||
КонецЕсли;
|
||
ИначеЕсли Тип1С=Тип("Строка") Тогда
|
||
//Type = 129; // adChar
|
||
//Type = 130; // adWChar
|
||
//Type = 200; // adVarChar
|
||
//Type = 201; // adLongVarChar
|
||
//Type = 202; // adVarWChar
|
||
//Type = 203; // adLongVarWChar
|
||
Если СтрДлина(Значение1С)<=4000 Тогда
|
||
Type = intTypeADO("adVarChar"); // 200
|
||
Иначе
|
||
Type = intTypeADO("adLongVarChar"); // 201
|
||
КонецЕсли;
|
||
ИначеЕсли Тип1С=Тип("Дата") Тогда
|
||
//Type = 134; // adDBTime
|
||
Если НачалоДня(Значение1С)=Значение1С Тогда
|
||
Type = intTypeADO("adDBDate"); // 133
|
||
Иначе
|
||
Type = intTypeADO("adDBTimeStamp"); // 135
|
||
КонецЕсли;
|
||
ИначеЕсли Тип1С=Тип("Булево") Тогда
|
||
Type = intTypeADO("adBoolean"); // 11
|
||
ИначеЕсли Тип1С=Тип("УникальныйИдентификатор") Тогда
|
||
Type = intTypeADO("adBinary"); // 128
|
||
Size = 16;
|
||
Иначе
|
||
Если Ссылка <> Неопределено Тогда
|
||
// ссылочный тип - преобразуем в COMSafeArray
|
||
Type = intTypeADO("adBinary"); // 128
|
||
Size = 16;
|
||
Иначе
|
||
Type = intTypeADO("adEmpty"); // 0? (Default)
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
// ADOUtils.V8DateToDBDate( Дата ) // с учетом YearOffset
|
||
// ADOUtils.BooleanParameter( Значение ) // COMSafeArray(1)
|
||
// ADOUtils.TypeParameter( Значение ) // COMSafeArray(1) *_TYPE
|
||
// ADOUtils.TableNumberParameter( Значение ) // COMSafeArray(4) *_RTRef
|
||
// ADOUtils.DataVersionParameter( Значение ) // COMSafeArray(8) _Version
|
||
// ADOUtils.RRefParameter( Значение ) // COMSafeArray(16) *IDRRef
|
||
|
||
Если Ложь
|
||
Или Type = intTypeADO("adBinary") // 128
|
||
Или Type = intTypeADO("adVarBinary")
|
||
Тогда // 204
|
||
//Если ADOUtils = Неопределено Тогда
|
||
// ADOUtils = ПолучитьADOUtils();
|
||
// Если ADOUtils = Неопределено Тогда
|
||
// ADOUtils = Null; // для избежания повторных инициализаций
|
||
// КонецЕсли;
|
||
//КонецЕсли;
|
||
Если Ссылка <> Неопределено Тогда
|
||
// ссылочный тип - преобразуем в COMSafeArray(16)
|
||
ЗначениеADO = СсылкаToCOMSafeArray(Ссылка);
|
||
//Если ADOUtils = Неопределено ИЛИ ADOUtils = Null Тогда
|
||
// ЗначениеADO = СсылкаToCOMSafeArray(Ссылка);
|
||
//Иначе
|
||
// ЗначениеADO = ADOUtils.RRefParameter(Ссылка);
|
||
//КонецЕсли;
|
||
ИначеЕсли Тип1С=Тип("УникальныйИдентификатор") Тогда
|
||
// ГУИД - преобразуем в COMSafeArray(16)
|
||
ЗначениеADO = GUIDToCOMSafeArray(Значение1С);
|
||
ИначеЕсли Тип1С=Тип("Булево") Тогда
|
||
// Булево - преобразуем в COMSafeArray(1)
|
||
ЗначениеADO = СтрокаHEXtoCOMSafeArray(?(Значение1С,"0x01","0x00"));
|
||
//Если ADOUtils = Неопределено ИЛИ ADOUtils = Null Тогда
|
||
// ЗначениеADO = СтрокаHEXtoCOMSafeArray(?(Значение1С,"0x01","0x00"));
|
||
//Иначе
|
||
// ЗначениеADO = ADOUtils.BooleanParameter(Значение1С);
|
||
//КонецЕсли;
|
||
Иначе
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если Precision=Неопределено Тогда
|
||
Если Ложь
|
||
Или Type = intTypeADO("adDecimal") // 14
|
||
ИЛИ Type = intTypeADO("adNumeric") // 131
|
||
ИЛИ Type = intTypeADO("adVarNumeric") // 139
|
||
Тогда
|
||
Precision = СтрДлина(СтрЗаменить(Строка(Значение1С)," ",""));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если NumericScale=Неопределено Тогда
|
||
Если Ложь
|
||
Или Type = intTypeADO("adDecimal") // 14
|
||
ИЛИ Type = intTypeADO("adNumeric") // 131
|
||
ИЛИ Type = intTypeADO("adVarNumeric") // 139
|
||
Тогда
|
||
NumericScale = СтрДлина(Строка(Значение1С-Цел(Значение1С)));
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если Size=Неопределено Тогда
|
||
Если Ложь
|
||
Или Type = intTypeADO("adChar") // 129
|
||
ИЛИ Type = intTypeADO("adWChar") // 130
|
||
ИЛИ Type = intTypeADO("adVarChar") // 200
|
||
//ИЛИ Type = intTypeADO("adLongVarChar") // 201
|
||
ИЛИ Type = intTypeADO("adVarWChar") // 202
|
||
//ИЛИ Type = intTypeADO("adLongVarWChar") // 203
|
||
Тогда
|
||
Size = СтрДлина(Значение1С);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
// создает массив объектов ADODB.Parameter по списку параметров ADO и по списку типов ADO
|
||
Функция ParametersArrayПолучить(стПараметры,стПарТипADO, ADOUtils = Неопределено) Экспорт
|
||
ParametersArray = Новый Массив;
|
||
|
||
ТипаМассив = Тип("Массив");
|
||
ТипаСоответствие = Тип("Соответствие");
|
||
|
||
cтПараметрыТип = ТипЗнч(стПараметры);
|
||
cтПарТипADOТип = ТипЗнч(стПарТипADO);
|
||
|
||
Если стПараметры = Неопределено Тогда
|
||
Возврат ParametersArray;
|
||
ИначеЕсли cтПараметрыТип = ТипаМассив ИЛИ cтПараметрыТип = ТипаСоответствие Тогда
|
||
Если стПарТипADO <> Неопределено И cтПарТипADOТип <> cтПараметрыТип Тогда
|
||
ВызватьИсключение(
|
||
"Тип значения списка типов параметров ADO ('"+cтПарТипADOТип+"') не равен
|
||
|типу значения списка параметров запроса ('"+cтПараметрыТип+"') !");
|
||
КонецЕсли;
|
||
Иначе
|
||
ВызватьИсключение(
|
||
"Не предусмотренный тип значения списка параметров запроса ('"+cтПараметрыТип+"') !");
|
||
КонецЕсли;
|
||
|
||
ОбъектЗапрос = Новый COMОбъект("ADODB.Command");
|
||
|
||
Индекс = 0;
|
||
Для каждого Параметр Из стПараметры Цикл
|
||
Если cтПараметрыТип = ТипаМассив Тогда
|
||
ПараметрИмя = Неопределено;
|
||
Значение1С = Параметр;
|
||
ИначеЕсли cтПараметрыТип = ТипаСоответствие Тогда
|
||
ПараметрИмя = СокрЛП(Параметр.Ключ);
|
||
Значение1С = Параметр.Значение;
|
||
Иначе
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Индекс = Индекс + 1;
|
||
стТипADO=Неопределено;
|
||
Если cтПарТипADOТип=ТипаМассив Тогда
|
||
Если Индекс<=стПарТипADO.Количество()-1 Тогда
|
||
стТипADO = стПарТипADO.Получить(Индекс);
|
||
КонецЕсли;
|
||
ИначеЕсли cтПарТипADOТип = ТипаСоответствие Тогда
|
||
стТипADO = стПарТипADO.Получить(Параметр.Ключ);
|
||
КонецЕсли;
|
||
|
||
ЗначениеADO = Неопределено;
|
||
Attributes = Неопределено;
|
||
Direction = Неопределено;
|
||
Type = Неопределено;
|
||
Precision = Неопределено;
|
||
NumericScale = Неопределено;
|
||
Size = Неопределено; // прочитаем свойства параметра ADO по полученной структуре типа и значению 1С
|
||
ParameterADOСвойства(стТипADO,Значение1С,ЗначениеADO,Direction,Type,Precision,NumericScale,Size,Attributes,ADOUtils);
|
||
|
||
// создадим параметр ADO и заполним его свойства
|
||
Parameter = ОбъектЗапрос.CreateParameter();
|
||
Если НЕ ПустаяСтрока(Type) Тогда
|
||
Parameter.Type=Type;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Direction) Тогда
|
||
Parameter.Direction=Direction;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Size) Тогда
|
||
Parameter.Size=Size;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Attributes) Тогда
|
||
Parameter.Attributes=Attributes;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(ПараметрИмя) Тогда
|
||
Parameter.Name = ПараметрИмя;
|
||
КонецЕсли;
|
||
Если ЗначениеADO = Неопределено Тогда
|
||
Parameter.Value=Значение1С; // преобразование не явное
|
||
Иначе
|
||
Parameter.Value=ЗначениеADO;
|
||
КонецЕсли;
|
||
|
||
// добавим в массив
|
||
ParametersArray.Добавить(Parameter);
|
||
КонецЦикла;
|
||
|
||
Возврат ParametersArray;
|
||
КонецФункции // ParametersArrayПолучить()
|
||
|
||
// формирует массив или соответствие со значениями параметров запроса из строки таблицы значений
|
||
Функция стПараметры_Получить_ТЗ(тзПараметры,СтрокаПараметров,NamedParameters,Знач ParametersPrefix) Экспорт
|
||
Если NamedParameters=Истина Тогда
|
||
ParametersPrefix=СокрЛП(ParametersPrefix);
|
||
стПараметры=Новый Соответствие;
|
||
Для каждого Колонка Из тзПараметры.Колонки Цикл
|
||
стПараметры.Вставить(ParametersPrefix+Колонка.Имя,СтрокаПараметров.Получить(тзПараметры.Колонки.Индекс(Колонка)));
|
||
КонецЦикла;
|
||
Иначе
|
||
стПараметры=Новый Массив;
|
||
Для каждого Колонка Из тзПараметры.Колонки Цикл
|
||
стПараметры.Добавить(СтрокаПараметров.Получить(тзПараметры.Колонки.Индекс(Колонка)));
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат стПараметры;
|
||
КонецФункции // стПараметры_Получить_ТЗ()
|
||
|
||
// добавляет и устанавливает объект ADODB.Parameter в коллекцию параметров
|
||
// если не заданы свойства параметра ADO, делается попытка их подбора по типу значения 1С
|
||
Функция ADODBCommand_УстановитьПараметрПо1С(ОбъектЗапрос,Инициализация,Индекс,Name,стТипADO,Значение1С,ADOUtils,ЕррорИнфо) Экспорт
|
||
ЗначениеADO=Неопределено;
|
||
Attributes=Неопределено;
|
||
Direction=Неопределено;
|
||
Type=Неопределено;
|
||
Precision=Неопределено;
|
||
NumericScale=Неопределено;
|
||
Size=Неопределено; // прочитаем свойства параметра ADO из переданной структуры по значению 1С
|
||
ParameterADOСвойства(стТипADO,Значение1С,ЗначениеADO,Direction,Type,Precision,NumericScale,Size,Attributes,ADOUtils);
|
||
|
||
ЕррорИнфо="";
|
||
Попытка
|
||
Если ОбъектЗапрос.Prepared = Ложь ИЛИ Инициализация <> Ложь Тогда
|
||
// инициализация параметров запроса
|
||
Добавить = Ложь;
|
||
Если Name = Неопределено Тогда
|
||
// по переданному индексу параметра
|
||
Parameter = ОбъектЗапрос.CreateParameter();
|
||
Добавить = Истина; // создаем без имени
|
||
Иначе
|
||
// по переданному имени параметра
|
||
Попытка
|
||
// если уже есть параметр с именем - используем его
|
||
Parameter = ОбъектЗапрос.Parameters.Item(Name);
|
||
Исключение
|
||
Parameter = Неопределено;
|
||
КонецПопытки;
|
||
Если Parameter = Неопределено Тогда
|
||
// если нет - создаем с указанным именем
|
||
Parameter = ОбъектЗапрос.CreateParameter();
|
||
Parameter.Name = Name;
|
||
Добавить = Истина;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Type) Тогда
|
||
Parameter.Type=Type;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Direction) Тогда
|
||
Parameter.Direction=Direction;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Size) Тогда
|
||
Parameter.Size=Size;
|
||
КонецЕсли;
|
||
Если НЕ ПустаяСтрока(Attributes) И Attributes <> 0 Тогда
|
||
Parameter.Attributes=Attributes;
|
||
КонецЕсли;
|
||
Если Добавить = Истина Тогда
|
||
ОбъектЗапрос.Parameters.Append(Parameter);
|
||
КонецЕсли;
|
||
Иначе
|
||
// установка параметра предварительно подготовленного параметризованного запроса
|
||
Если Name = Неопределено Тогда
|
||
// по переданному индексу параметра
|
||
Parameter = ОбъектЗапрос.Parameters.Item(Индекс);
|
||
Иначе
|
||
// по переданному имени параметра
|
||
Parameter = ОбъектЗапрос.Parameters.Item(Name);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ЗначениеADO = Неопределено Тогда
|
||
Parameter.Value=Значение1С; // преобразование не явное
|
||
Иначе
|
||
Parameter.Value=ЗначениеADO;
|
||
КонецЕсли;
|
||
Исключение
|
||
ЕррорИнфо=ОписаниеОшибки();
|
||
Возврат Ложь;
|
||
КонецПопытки;
|
||
|
||
Возврат Истина;
|
||
КонецФункции
|
||
|
||
// ^^^ УСТАНОВКА ПАРАМЕТРОВ ЗАПРОСА ADO ^^^
|
||
|
||
// *** ПЕРЕЧИСЛЕНИЯ ADO ***
|
||
|
||
// возвращает строковое представление типа параметра ADO(свойства Direction) по его числовому значению
|
||
Функция strDirectionParADO(intTypeADO) Экспорт
|
||
intType = Цел(intTypeADO);
|
||
Если intType = 0 Тогда Возврат "adParamUnknown"; // Direction unknown
|
||
ИначеЕсли intType = 1 Тогда Возврат "adParamInput"; // Input parameter (Default)
|
||
ИначеЕсли intType = 2 Тогда Возврат "adParamOutput"; // Output parameter
|
||
ИначеЕсли intType = 3 Тогда Возврат "adParamInputOutput"; // Input and output parameter
|
||
ИначеЕсли intType = 4 Тогда Возврат "adParamReturnValue"; // Return value
|
||
Иначе Возврат "adParamInput"; // как 1
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значения типа параметра ADO(свойства Direction) по его числовому представлению
|
||
Функция intDirectionParADO(strTypeADO) Экспорт
|
||
strType = НРег(strTypeADO);
|
||
Если strType = Нрег("adParamUnknown") Тогда Возврат 0; // Direction unknown
|
||
ИначеЕсли strType = Нрег("adParamInput") Тогда Возврат 1; // Input parameter (Default)
|
||
ИначеЕсли strType = Нрег("adParamOutput") Тогда Возврат 2; // Output parameter
|
||
ИначеЕсли strType = Нрег("adParamInputOutput") Тогда Возврат 3; // Input and output parameter
|
||
ИначеЕсли strType = Нрег("adParamReturnValue") Тогда Возврат 4; // Return value
|
||
Иначе Возврат 1; // adParamInput
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление типа значения ADO по его числовому значению
|
||
Функция strTypeADO(intTypeADO) Экспорт
|
||
intType = Цел(intTypeADO);
|
||
Если intType = 0 Тогда Возврат "adEmpty"; // no value
|
||
ИначеЕсли intType = 2 Тогда Возврат "adSmallInt"; // 2-byte signed integer
|
||
ИначеЕсли intType = 3 Тогда Возврат "adInteger"; // 4-byte signed integer
|
||
ИначеЕсли intType = 4 Тогда Возврат "adSingle"; // single-precision floating-point value
|
||
ИначеЕсли intType = 5 Тогда Возврат "adDouble"; // double-precision floating-point value
|
||
ИначеЕсли intType = 6 Тогда Возврат "adCurrency"; // currency value
|
||
ИначеЕсли intType = 7 Тогда Возврат "adDate"; // number of days since December 30, 1899 + the fraction of a day
|
||
ИначеЕсли intType = 8 Тогда Возврат "adBSTR"; // null-terminated character string
|
||
ИначеЕсли intType = 9 Тогда Возврат "adIDispatch"; // pointer to an IDispatch interface on a COM object(currently not supported by ADO)
|
||
ИначеЕсли intType = 10 Тогда Возврат "adError"; // 32-bit error code
|
||
ИначеЕсли intType = 11 Тогда Возврат "adBoolean"; // boolean value
|
||
ИначеЕсли intType = 12 Тогда Возврат "adVariant"; // automation Variant(currently not supported by ADO)
|
||
ИначеЕсли intType = 13 Тогда Возврат "adIUnknown"; // pointer to an IUnknown interface on a COM object(currently not supported by ADO)
|
||
ИначеЕсли intType = 14 Тогда Возврат "adDecimal"; // exact numeric value with a fixed precision and scale
|
||
ИначеЕсли intType = 16 Тогда Возврат "adTinyInt"; // 1-byte signed integer
|
||
ИначеЕсли intType = 17 Тогда Возврат "adUnsignedTinyInt"; // 1-byte unsigned integer
|
||
ИначеЕсли intType = 18 Тогда Возврат "adUnsignedSmallInt"; // 2-byte unsigned integer
|
||
ИначеЕсли intType = 19 Тогда Возврат "adUnsignedInt"; // 4-byte unsigned integer
|
||
ИначеЕсли intType = 20 Тогда Возврат "adBigInt"; // 8-byte signed integer
|
||
ИначеЕсли intType = 21 Тогда Возврат "adUnsignedBigInt"; // 8-byte unsigned integer
|
||
|
||
ИначеЕсли intType = 64 Тогда Возврат "adFileTime"; // number of 100-nanosecond intervals since January 1,1601
|
||
ИначеЕсли intType = 72 Тогда Возврат "adGUID"; // globally unique identifier (GUID)
|
||
|
||
ИначеЕсли intType = 128 Тогда Возврат "adBinary"; // binary value
|
||
ИначеЕсли intType = 129 Тогда Возврат "adChar"; // string value
|
||
ИначеЕсли intType = 130 Тогда Возврат "adWChar"; // null-terminated Unicode character string
|
||
ИначеЕсли intType = 131 Тогда Возврат "adNumeric"; // exact numeric value with a fixed precision and scale
|
||
ИначеЕсли intType = 132 Тогда Возврат "adUserDefined"; // user-defined variable
|
||
ИначеЕсли intType = 133 Тогда Возврат "adDBDate"; // date value (yyyymmdd)
|
||
ИначеЕсли intType = 134 Тогда Возврат "adDBTime"; // time value (hhmmss)
|
||
ИначеЕсли intType = 135 Тогда Возврат "adDBTimeStamp"; // date/time stamp (yyyymmddhhmmss plus a fraction in billionths)
|
||
ИначеЕсли intType = 136 Тогда Возврат "adChapter"; // 4-byte chapter value that identifies rows in a child rowset
|
||
ИначеЕсли intType = 138 Тогда Возврат "adPropVariant"; // automation PROPVARIANT
|
||
ИначеЕсли intType = 139 Тогда Возврат "adVarNumeric"; // numeric value(Parameter object only)
|
||
|
||
ИначеЕсли intType = 200 Тогда Возврат "adVarChar"; // string value (Parameter object only)
|
||
ИначеЕсли intType = 201 Тогда Возврат "adLongVarChar"; // long string value
|
||
ИначеЕсли intType = 202 Тогда Возврат "adVarWChar"; // null-terminated Unicode character string
|
||
ИначеЕсли intType = 203 Тогда Возврат "adLongVarWChar"; // long null-terminated Unicode string value
|
||
ИначеЕсли intType = 204 Тогда Возврат "adVarBinary"; // binary value (Parameter object only)
|
||
ИначеЕсли intType = 205 Тогда Возврат "adLongVarBinary"; // long binary value
|
||
ИначеЕсли intType = 8192 Тогда Возврат "AdArray"; // 0x2000, flag value combined with another data type constant, indicates an array of that other data type
|
||
Иначе Возврат "adEmpty"; // как 0
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение типа значения ADO по его строковому представлению
|
||
Функция intTypeADO(strTypeADO) Экспорт
|
||
strType = НРег(strTypeADO);
|
||
Если strType = НРег("adEmpty") Тогда Возврат 0; // no value
|
||
ИначеЕсли strType = НРег("adSmallInt") Тогда Возврат 2; // 2-byte signed integer
|
||
ИначеЕсли strType = НРег("adInteger") Тогда Возврат 3; // 4-byte signed integer
|
||
ИначеЕсли strType = НРег("adSingle") Тогда Возврат 4; // single-precision floating-point value
|
||
ИначеЕсли strType = НРег("adDouble") Тогда Возврат 5; // double-precision floating-point value
|
||
ИначеЕсли strType = НРег("adCurrency") Тогда Возврат 6; // currency value
|
||
ИначеЕсли strType = НРег("adDate") Тогда Возврат 7; // number of days since December 30, 1899 + the fraction of a day
|
||
ИначеЕсли strType = НРег("adBSTR") Тогда Возврат 8; // null-terminated character string
|
||
ИначеЕсли strType = НРег("adIDispatch") Тогда Возврат 9; // pointer to an IDispatch interface on a COM object(currently not supported by ADO)
|
||
ИначеЕсли strType = НРег("adError") Тогда Возврат 10; // 32-bit error code
|
||
ИначеЕсли strType = НРег("adBoolean") Тогда Возврат 11; // boolean value
|
||
ИначеЕсли strType = НРег("adVariant") Тогда Возврат 12; // automation Variant(currently not supported by ADO)
|
||
ИначеЕсли strType = НРег("adIUnknown") Тогда Возврат 13; // pointer to an IUnknown interface on a COM object(currently not supported by ADO)
|
||
ИначеЕсли strType = НРег("adDecimal") Тогда Возврат 14; // exact numeric value with a fixed precision and scale
|
||
ИначеЕсли strType = НРег("adTinyInt") Тогда Возврат 16; // 1-byte signed integer
|
||
ИначеЕсли strType = НРег("adUnsignedTinyInt") Тогда Возврат 17; // 1-byte unsigned integer
|
||
ИначеЕсли strType = НРег("adUnsignedSmallInt") Тогда Возврат 18;// 2-byte unsigned integer
|
||
ИначеЕсли strType = НРег("adUnsignedInt") Тогда Возврат 19; // 4-byte unsigned integer
|
||
ИначеЕсли strType = НРег("adBigInt") Тогда Возврат 20; // 8-byte signed integer
|
||
ИначеЕсли strType = НРег("adUnsignedBigInt") Тогда Возврат 21; // 8-byte unsigned integer
|
||
|
||
ИначеЕсли strType = НРег("adFileTime") Тогда Возврат 64; // number of 100-nanosecond intervals since January 1,1601
|
||
ИначеЕсли strType = НРег("adGUID") Тогда Возврат 72; // globally unique identifier (GUID)
|
||
|
||
ИначеЕсли strType = НРег("adBinary") Тогда Возврат 128; // binary value
|
||
ИначеЕсли strType = НРег("adChar") Тогда Возврат 129; // string value
|
||
ИначеЕсли strType = НРег("adWChar") Тогда Возврат 130; // null-terminated Unicode character string
|
||
ИначеЕсли strType = НРег("adNumeric") Тогда Возврат 131; // exact numeric value with a fixed precision and scale
|
||
ИначеЕсли strType = НРег("adUserDefined") Тогда Возврат 132; // user-defined variable
|
||
ИначеЕсли strType = НРег("adDBDate") Тогда Возврат 133; // date value (yyyymmdd)
|
||
ИначеЕсли strType = НРег("adDBTime") Тогда Возврат 134; // time value (hhmmss)
|
||
ИначеЕсли strType = НРег("adDBTimeStamp") Тогда Возврат 135; // date/time stamp (yyyymmddhhmmss plus a fraction in billionths)
|
||
ИначеЕсли strType = НРег("adChapter") Тогда Возврат 136; // 4-byte chapter value that identifies rows in a child rowset
|
||
ИначеЕсли strType = НРег("adPropVariant") Тогда Возврат 138; // automation PROPVARIANT
|
||
ИначеЕсли strType = НРег("adVarNumeric") Тогда Возврат 139; // numeric value(Parameter object only)
|
||
|
||
ИначеЕсли strType = НРег("adVarChar") Тогда Возврат 200; // string value (Parameter object only)
|
||
ИначеЕсли strType = НРег("adLongVarChar") Тогда Возврат 201; // long string value
|
||
ИначеЕсли strType = НРег("adVarWChar") Тогда Возврат 202; // null-terminated Unicode character string
|
||
ИначеЕсли strType = НРег("adLongVarWChar") Тогда Возврат 203; // long null-terminated Unicode string value
|
||
ИначеЕсли strType = НРег("adVarBinary") Тогда Возврат 204; // binary value (Parameter object only)
|
||
ИначеЕсли strType = НРег("adLongVarBinary") Тогда Возврат 205; // long binary value
|
||
ИначеЕсли strType = НРег("AdArray") Тогда Возврат 8192; // 0x2000, flag value combined with another data type constant, indicates an array of that other data type
|
||
Иначе Возврат 0; // adEmpty
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение типа курсора по его строковому представлению
|
||
Функция strCursorType(intValue) Экспорт
|
||
Если ТипЗнч(intValue) = Тип("Число") Тогда
|
||
intV = Цел(intValue);
|
||
Иначе
|
||
intV = 0;
|
||
КонецЕсли;
|
||
Если intV = -1 Тогда Возврат "adOpenUnspecified"; // Does not specify the type of cursor
|
||
ИначеЕсли intV = 0 Тогда Возврат "adOpenForwardOnly"; // Default. Uses a forward-only cursor. Like a static cursor, except... (Default)
|
||
ИначеЕсли intV = 1 Тогда Возврат "adOpenKeyset"; // Uses a keyset cursor. Like a dynamic cursor, except...
|
||
ИначеЕсли intV = 2 Тогда Возврат "adOpenDynamic"; // Uses a dynamic cursor
|
||
ИначеЕсли intV = 3 Тогда Возврат "adOpenStatic"; // Uses a static cursor
|
||
Иначе Возврат "adOpenForwardOnly"; // как 0
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление типа курсора по его числовому значению
|
||
Функция intCursorType(strValue) Экспорт
|
||
strV = Нрег(strValue);
|
||
Если strV = Нрег("adOpenUnspecified") Тогда Возврат -1; // Does not specify the type of cursor
|
||
ИначеЕсли strV = Нрег("adOpenForwardOnly") Тогда Возврат 0; // Default. Uses a forward-only cursor. Like a static cursor, except... (Default
|
||
ИначеЕсли strV = Нрег("adOpenKeyset") Тогда Возврат 1; // Uses a keyset cursor. Like a dynamic cursor, except...
|
||
ИначеЕсли strV = Нрег("adOpenDynamic") Тогда Возврат 2; // Uses a dynamic cursor
|
||
ИначеЕсли strV = Нрег("adOpenStatic") Тогда Возврат 3; // Uses a static cursor
|
||
Иначе Возврат 0; // adOpenForwardOnly
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение местоположения курсора по его строковому представлению
|
||
Функция strCursorLocation(intValue) Экспорт
|
||
Если ТипЗнч(intValue) = Тип("Число") Тогда
|
||
intV = Цел(intValue);
|
||
Иначе
|
||
intV = 0;
|
||
КонецЕсли;
|
||
Если intV = 1 Тогда Возврат "adUseNone"; // Does not use cursor services
|
||
ИначеЕсли intV = 2 Тогда Возврат "adUseServer"; // Uses a server-side cursor (Default)
|
||
ИначеЕсли intV = 3 Тогда Возврат "adParamOutput"; // Uses a client-side cursor supplied by a local cursor library
|
||
Иначе Возврат "adUseServer"; // как 2
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление местоположения курсора по его числовому значению
|
||
Функция intCursorLocation(strValue) Экспорт
|
||
strV = Нрег(strValue);
|
||
Если strV = Нрег("adUseNone") Тогда Возврат 1; // Does not use cursor services
|
||
ИначеЕсли strV = Нрег("adUseServer") Тогда Возврат 2; // Uses a server-side cursor (Default)
|
||
ИначеЕсли strV = Нрег("adParamOutput") Тогда Возврат 3; // Uses a client-side cursor supplied by a local cursor library
|
||
Иначе Возврат 2; // adUseServer
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение типа блокировки данных по его строковому представлению
|
||
Функция strLockType(intValue) Экспорт
|
||
Если ТипЗнч(intValue) = Тип("Число") Тогда
|
||
intV = Цел(intValue);
|
||
Иначе
|
||
intV = 0;
|
||
КонецЕсли;
|
||
Если intV = -1 Тогда Возврат "adLockUnspecified"; // Unspecified type of lock. Clones inherits lock type from the original Recordset
|
||
ИначеЕсли intV = 1 Тогда Возврат "adLockReadOnly"; // Read-only records
|
||
ИначеЕсли intV = 2 Тогда Возврат "adLockPessimistic"; // Pessimistic locking, record by record. The provider lock records immediately after editing
|
||
ИначеЕсли intV = 3 Тогда Возврат "adLockOptimistic"; // Optimistic locking, record by record. The provider lock records only when calling update
|
||
ИначеЕсли intV = 4 Тогда Возврат "adLockBatchOptimistic"; // Optimistic batch updates. Required for batch update mode
|
||
Иначе Возврат "adLockUnspecified"; // как -1
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление типа блокировки данных по его числовому значению
|
||
Функция intLockType(strValue) Экспорт
|
||
strV = Нрег(strValue);
|
||
Если strV = Нрег("adLockUnspecified") Тогда Возврат -1; // Unspecified type of lock
|
||
ИначеЕсли strV = Нрег("adLockReadOnly") Тогда Возврат 1; // Read-only records
|
||
ИначеЕсли strV = Нрег("adLockPessimistic") Тогда Возврат 2; // Pessimistic locking, record by record. The provider lock records immediately after editing
|
||
ИначеЕсли strV = Нрег("adLockOptimistic") Тогда Возврат 3; // Optimistic locking, record by record. The provider lock records only when calling update
|
||
ИначеЕсли strV = Нрег("adLockBatchOptimistic") Тогда Возврат 4; // Optimistic batch updates. Required for batch update mode
|
||
Иначе Возврат -1; // adLockUnspecified
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение опции MarshalOptions по его строковому представлению
|
||
Функция strMarshalOptions(intValue) Экспорт
|
||
Если ТипЗнч(intValue) = Тип("Число") Тогда
|
||
intV = Цел(intValue);
|
||
Иначе
|
||
intV = 0;
|
||
КонецЕсли;
|
||
Если intV = 0 Тогда Возврат "adMarshalAll"; // Returns all rows (Default)
|
||
ИначеЕсли intV = 1 Тогда Возврат "adMarshalModifiedOnly"; // Returns only modified rows
|
||
Иначе Возврат "adMarshalAll"; // как 0
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление опции MarshalOptions по его числовому значению
|
||
Функция intMarshalOptions(strValue) Экспорт
|
||
strV = Нрег(strValue);
|
||
Если strV = Нрег("adMarshalAll") Тогда Возврат 0; // Returns all rows (Default)
|
||
ИначеЕсли strV = Нрег("adMarshalModifiedOnly") Тогда Возврат 1; // Returns only modified rows
|
||
Иначе Возврат 0; // adMarshalAll
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление типа команды ADO по его числовому значению
|
||
Функция strCommandTypeADO(intTypeADO) Экспорт
|
||
Если ТипЗнч(intTypeADO) = Тип("Число") Тогда
|
||
intType = Цел(intTypeADO);
|
||
Иначе
|
||
intType = 0;
|
||
КонецЕсли;
|
||
Если intType = -1 Тогда Возврат "adCmdUnspecified"; // Unspecified type of command
|
||
ИначеЕсли intType = 1 Тогда Возврат "adCmdText"; // строка оператора T-SQL
|
||
ИначеЕсли intType = 2 Тогда Возврат "adCmdTable"; // имя таблицы для выборки строк
|
||
ИначеЕсли intType = 4 Тогда Возврат "adCmdStoredProc"; // имя хранимой процедуры
|
||
ИначеЕсли intType = 8 Тогда Возврат "adCmdUnknown"; // неизвестно, проверять провайдером (Default)
|
||
ИначеЕсли intType = 256 Тогда Возврат "adCmdFile"; // имя файла of a persistently stored Recordset (with Recordset.Open or Requery only)
|
||
ИначеЕсли intType = 512 Тогда Возврат "adCmdTableDirect"; // имя таблицы whose columns are all returned (with Recordset.Open or Requery only)
|
||
Иначе Возврат "adCmdUnknown"; // как 8
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение типа команды ADO по его строковому представлению
|
||
Функция intCommandTypeADO(strTypeADO) Экспорт
|
||
strType = Нрег(strTypeADO);
|
||
Если strType = Нрег("adCmdUnspecified") Тогда Возврат -1; // Unspecified type of command
|
||
ИначеЕсли strType = Нрег("adCmdText") Тогда Возврат 1; // строка оператора T-SQL
|
||
ИначеЕсли strType = Нрег("adCmdTable") Тогда Возврат 2; // имя таблицы для выборки строк
|
||
ИначеЕсли strType = Нрег("adCmdStoredProc") Тогда Возврат 4; // имя хранимой процедуры
|
||
ИначеЕсли strType = Нрег("adCmdUnknown") Тогда Возврат 8; // неизвестно, проверять провайдером (Default)
|
||
ИначеЕсли strType = Нрег("adCmdFile") Тогда Возврат 256; // имя файла of a persistently stored Recordset (with Recordset.Open or Requery only)
|
||
ИначеЕсли strType = Нрег("adCmdTableDirect") Тогда Возврат 512; // имя таблицы whose columns are all returned (with Recordset.Open or Requery only)
|
||
Иначе Возврат 8; // adCmdUnknown
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление типа команды ADO по его числовому значению
|
||
Функция strExecuteOption(intValue) Экспорт
|
||
Если ТипЗнч(intValue) = Тип("Число") Тогда
|
||
intV = Цел(intValue);
|
||
Иначе
|
||
intV = 0;
|
||
КонецЕсли;
|
||
Если intV = -1 Тогда Возврат "adOptionUnspecified"; // Unspecified command
|
||
ИначеЕсли intV = 16 Тогда Возврат "adAsyncExecute"; // The command should execute asynchronously
|
||
ИначеЕсли intV = 32 Тогда Возврат "adAsyncFetch"; // The remaining rows after specified in the CacheSize should be retrieved asynchronously
|
||
ИначеЕсли intV = 64 Тогда Возврат "adAsyncFetchNonBlocking"; // The main thread never blocks while retrieving.
|
||
ИначеЕсли intV = 128 Тогда Возврат "adExecuteNoRecords"; // Discard, not return retrieved rows (with Command or Connection.Execute only)
|
||
ИначеЕсли intV = 256 Тогда Возврат "adExecuteStream"; // The results of a command execution is a stream (with Connection.Execute only)
|
||
ИначеЕсли intV = 512 Тогда Возврат "adExecuteRecord"; // Return a single row as a Record object
|
||
Иначе Возврат "adOptionUnspecified"; // как -1
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение типа команды ADO по его строковому представлению
|
||
Функция intExecuteOption(strValue) Экспорт
|
||
strV = Нрег(strValue);
|
||
Если strV = Нрег("adOptionUnspecified") Тогда Возврат -1; // Unspecified command
|
||
ИначеЕсли strV = Нрег("adAsyncExecute") Тогда Возврат 16; // The command should execute asynchronously
|
||
ИначеЕсли strV = Нрег("adAsyncFetch") Тогда Возврат 32; // The remaining rows after specified in the CacheSize should be retrieved asynchronously
|
||
ИначеЕсли strV = Нрег("adAsyncFetchNonBlocking") Тогда Возврат 64; // The main thread never blocks while retrieving
|
||
ИначеЕсли strV = Нрег("adExecuteNoRecords") Тогда Возврат 128; // Discard, not return retrieved rows (with Command or Connection.Execute only)
|
||
ИначеЕсли strV = Нрег("adExecuteStream") Тогда Возврат 256; // The results of a command execution is a stream (with Connection.Execute only)
|
||
ИначеЕсли strV = Нрег("adExecuteRecord") Тогда Возврат 512; // Return a single row as a Record object
|
||
Иначе Возврат -1; // adOptionUnspecified
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает строковое представление опции аттрибутов параметра ADO по числовому значению опции
|
||
Функция strParameterADOAttributes(intValue) Экспорт
|
||
Если ТипЗнч(intValue) = Тип("Число") Тогда
|
||
intV = Цел(intValue);
|
||
Иначе
|
||
intV = 0;
|
||
КонецЕсли;
|
||
Если intV = 16 Тогда Возврат "adParamSigned"; // The parameter will accept signed values.
|
||
ИначеЕсли intV = 64 Тогда Возврат "adParamNullAble"; // The parameter will accept null values.
|
||
ИначеЕсли intV = 128 Тогда Возврат "adParamLong"; // The parameter will accept long binary data.
|
||
Иначе Возврат "adParamSigned"; // как 16
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// возвращает числовое значение оцции аттрибутов параметра ADO по строковому представлению опции
|
||
Функция intParameterADOAttributes(strValue) Экспорт
|
||
strV = Нрег(strValue);
|
||
Если strV = Нрег("adParamSigned") Тогда Возврат 16; // The parameter will accept signed values.
|
||
ИначеЕсли strV = Нрег("adParamNullAble") Тогда Возврат 64; // The parameter will accept null values.
|
||
ИначеЕсли strV = Нрег("adParamLong") Тогда Возврат 128; // The parameter will accept long binary data.
|
||
Иначе Возврат 16; // adParamSigned
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
// ^^^ ПЕРЕЧИСЛЕНИЯ ADO ^^^
|
||
|
||
// ADO
|
||
// ************************
|
||
|
||
// В платформе все корневые элементы древовидных структур содержат в свойстве Родитель Неопределено.
|
||
// Поэтому возникает неудобство при работе с этим свойством, заключающееся в необходимости часто проверять его значение на Неопределено.
|
||
// Параметры:
|
||
// СтрокаДерева - СтрокаДереваЗначений, <Элемент любого иерархического объекта, имеющий родителя>
|
||
// Дерево - <Иерархический объект, которому принадлежит элемент> - для дерева значений не нужно передавать
|
||
//
|
||
Функция ПолучитьРодителяСтрокиДереваЛкс(СтрокаДерева, Дерево = Неопределено) Экспорт
|
||
|
||
Родитель = СтрокаДерева.Родитель;
|
||
Если Родитель = Неопределено Тогда
|
||
Если Дерево = Неопределено Тогда
|
||
Родитель = СтрокаДерева.Владелец();
|
||
Иначе
|
||
Родитель = Дерево;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Родитель;
|
||
|
||
КонецФункции
|
||
|
||
#КонецЕсли
|
||
|
||
#Если Не ТонкийКлиент И Не ВебКлиент И Клиент Тогда
|
||
|
||
Функция ПолучитьКоординатыСтрокиДереваЛкс(СтрокаДерева, ИмяКлючевойКолонки = "") Экспорт
|
||
|
||
Координаты = Новый Массив();
|
||
Родитель = СтрокаДерева;
|
||
Пока Родитель <> Неопределено Цикл
|
||
Если ЗначениеЗаполнено(ИмяКлючевойКолонки) Тогда
|
||
Координата = Родитель[ИмяКлючевойКолонки];
|
||
Иначе
|
||
Координата = ирНеглобальный.ПолучитьРодителяСтрокиДереваЛкс(Родитель).Строки.Индекс(Родитель);
|
||
КонецЕсли;
|
||
Координаты.Вставить(0, Координата);
|
||
Родитель = Родитель.Родитель;
|
||
КонецЦикла;
|
||
Возврат Координаты;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьСтрокуДереваПоКоординатамЛкс(Дерево, Координаты, ИмяКлючевойКолонки = "") Экспорт
|
||
|
||
СтрокаДерева = Дерево;
|
||
Для Каждого Координата Из Координаты Цикл
|
||
Если ЗначениеЗаполнено(ИмяКлючевойКолонки) Тогда
|
||
СтрокаДерева = СтрокаДерева.Строки.Найти(Координата, ИмяКлючевойКолонки);
|
||
Иначе
|
||
СтрокаДерева = СтрокаДерева.Строки[Координата];
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат СтрокаДерева;
|
||
|
||
КонецФункции
|
||
|
||
Процедура УстановитьТекстПоляСохраняяПозициюЛкс(ПолеТекстовогоДокумента, НовыйТекст) Экспорт
|
||
|
||
НачальнаяКолонка = 0; НачальнаяСтрока = 0; КонечнаяКолонка = 0; КонечнаяСтрока = 0;
|
||
ПолеТекстовогоДокумента.ПолучитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
|
||
ПолеТекстовогоДокумента.УстановитьТекст(НовыйТекст);
|
||
ПолеТекстовогоДокумента.УстановитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПреобразоватьЗначениеИзSDBLЛкс(ЗначениеSDBL) Экспорт
|
||
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(ЗначениеSDBL, ":");
|
||
ПолноеИмяМД = ПолучитьМетаданныеПоНомеруСсылочнойТаблицыЛкс(Фрагменты[0]);
|
||
Если Не ЗначениеЗаполнено(ПолноеИмяМД) Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
СтруктураБД = ирКэш.ПолучитьСтруктуруХраненияБДЛкс(Ложь);
|
||
|
||
// Этот способ не работал для перечислений
|
||
//УникальныйИдентификатор = Новый УникальныйИдентификатор(ЛксПолучитьГУИДПрямойИзИнверсного(Фрагменты[1]));
|
||
//Массив = Новый Массив();
|
||
//Если ЗначениеЗаполнено(УникальныйИдентификатор) Тогда
|
||
// Массив.Добавить(УникальныйИдентификатор);
|
||
//КонецЕсли;
|
||
//Значение = Новый (Тип(СтрЗаменить(ПолноеИмяМД, ".", "Ссылка.")), Массив);
|
||
//
|
||
ПустаяСсылка = Новый (Тип(СтрЗаменить(ПолноеИмяМД, ".", "Ссылка.")));
|
||
ПустаяСсылкаВнутр = ЗначениеВСтрокуВнутр(ПустаяСсылка);
|
||
ФрагментыПустойСсылки = ЛксПолучитьМассивИзСтрокиСРазделителем(ПустаяСсылкаВнутр, ":");
|
||
СсылкаВнутр = ФрагментыПустойСсылки[0] + ":" + Фрагменты[1] + "}";
|
||
Попытка
|
||
Значение = ЗначениеИзСтрокиВнутр(СсылкаВнутр);
|
||
Исключение
|
||
// Например, если Фрагменты[1] содержит неверное число символов
|
||
Значение = Неопределено;
|
||
КонецПопытки;
|
||
Возврат Значение;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьМетаданныеПоНомеруСсылочнойТаблицыЛкс(СтрокаНомерТаблицы) Экспорт
|
||
|
||
СтруктураХраненияБазыДанных = ирКэш.ПолучитьСтруктуруХраненияБДЛкс();
|
||
#Если _ Тогда
|
||
СтруктураХраненияБазыДанных = Новый ТаблицаЗначений;
|
||
#КонецЕсли
|
||
СловарьШаблоновМетаданных = ирКэш.ПолучитьСловарьШаблоновМетаданных();
|
||
Для Каждого СтрокаШаблона Из СловарьШаблоновМетаданных.НайтиСтроки(Новый Структура("Значение", 1)) Цикл
|
||
ИмяКандидат = СтрЗаменить(СтрокаШаблона.Ключ, "1", СтрокаНомерТаблицы);
|
||
СтрокаСтруктуры = СтруктураХраненияБазыДанных.Найти(ИмяКандидат, "КраткоеИмяТаблицыХранения");
|
||
Если СтрокаСтруктуры <> Неопределено Тогда
|
||
Возврат СтрокаСтруктуры.Метаданные;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИндексКартинкиСловаПодсказкиЛкс(ДанныеСтроки) Экспорт
|
||
|
||
Попытка
|
||
ТипЗначения = ДанныеСтроки.ТипЗначения;
|
||
Исключение
|
||
ТипЗначения = Неопределено;
|
||
КонецПопытки;
|
||
ИндексКартинки = -1;
|
||
Если Ложь
|
||
Или ДанныеСтроки.ТипСлова = "Ключевое слово"
|
||
Или ДанныеСтроки.ТипСлова = "Конструкция"
|
||
Тогда
|
||
ИндексКартинки = 13;
|
||
ИначеЕсли ТипЗначения = "Имя типа" Тогда
|
||
ИндексКартинки = 12;
|
||
ИначеЕсли ДанныеСтроки.ТипСлова = "Метод" Тогда
|
||
Попытка
|
||
Пустышка = ДанныеСтроки.Успех;
|
||
ЕстьУспех = Истина;
|
||
Исключение
|
||
ЕстьУспех = Ложь;
|
||
КонецПопытки;
|
||
Если Ложь
|
||
Или (Истина
|
||
И ЕстьУспех
|
||
И (Ложь
|
||
Или ДанныеСтроки.ТаблицаСтруктурТипов = Неопределено
|
||
Или ДанныеСтроки.ТаблицаСтруктурТипов.Количество() = 0
|
||
Или ДанныеСтроки.ТаблицаСтруктурТипов[0].ИмяОбщегоТипа = ""))
|
||
Или (Истина
|
||
И Не ЕстьУспех
|
||
И ДанныеСтроки.ТипЗначения = "")
|
||
Тогда
|
||
Если ДанныеСтроки.Определение = "Предопределенный" Тогда
|
||
ИндексКартинки = 0;
|
||
ИначеЕсли ДанныеСтроки.Определение = "Метаданные" Тогда
|
||
ИндексКартинки = 6;
|
||
//ИначеЕсли ДанныеСтроки.Определение = "Локальный" Тогда
|
||
// ИндексКартинки = 9;
|
||
Иначе
|
||
ИндексКартинки = 3;
|
||
КонецЕсли;
|
||
Иначе
|
||
Если ДанныеСтроки.Определение = "Предопределенный" Тогда
|
||
ИндексКартинки = 1;
|
||
ИначеЕсли ДанныеСтроки.Определение = "Метаданные" Тогда
|
||
ИндексКартинки = 7;
|
||
//ИначеЕсли ДанныеСтроки.Определение = "Локальный" Тогда
|
||
// ИндексКартинки = 10;
|
||
Иначе
|
||
ИндексКартинки = 4;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИначеЕсли ДанныеСтроки.ТипСлова = "Свойство" Тогда
|
||
Если ДанныеСтроки.Определение = "Предопределенный" Тогда
|
||
ИндексКартинки = 2;
|
||
ИначеЕсли ДанныеСтроки.Определение = "Метаданные" Тогда
|
||
ИндексКартинки = 8;
|
||
//ИначеЕсли ДанныеСтроки.Определение = "Локальный" Тогда
|
||
// ИндексКартинки = 11;
|
||
Иначе
|
||
ИндексКартинки = 5;
|
||
КонецЕсли;
|
||
ИначеЕсли ДанныеСтроки.ТипСлова = "Таблица" Тогда
|
||
ИндексКартинки = 14;
|
||
ИначеЕсли ДанныеСтроки.ТипСлова = "Поле" Тогда
|
||
Если ДанныеСтроки.Определение = "Предопределенный" Тогда
|
||
ИндексКартинки = 15;
|
||
Иначе
|
||
ИндексКартинки = 16;
|
||
КонецЕсли;
|
||
ИначеЕсли ДанныеСтроки.ТипСлова = "Группа" Тогда
|
||
ИндексКартинки = 18;
|
||
КонецЕсли;
|
||
Возврат ИндексКартинки;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ОтладитьОбъектДляОтладки(Ссылка) Экспорт
|
||
|
||
#Если _ Тогда
|
||
Ссылка = Справочники.ирОбъектыДляОтладки.ПустаяСсылка();
|
||
#КонецЕсли
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст = "
|
||
|ВЫБРАТЬ
|
||
| ирОбъектыДляОтладки.XML
|
||
|ИЗ
|
||
| Справочник.ирОбъектыДляОтладки КАК ирОбъектыДляОтладки
|
||
|ГДЕ
|
||
| ирОбъектыДляОтладки.Ссылка = &Ссылка
|
||
|";
|
||
Запрос.УстановитьПараметр("Ссылка", Ссылка);
|
||
СтрокаРезультата = Запрос.Выполнить().Выгрузить()[0];
|
||
|
||
ЧтениеXML = Новый ЧтениеXML;
|
||
ЧтениеXML.УстановитьСтроку(СтрокаРезультата.XML);
|
||
Попытка
|
||
СтруктураПараметров = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
|
||
Исключение
|
||
ОписаниеОшибки = ОписаниеОшибки();
|
||
Сообщить("Некорректный объект для отладки: " + ОписаниеОшибки, СтатусСообщения.Внимание);
|
||
Возврат;
|
||
КонецПопытки;
|
||
Объект = СтруктураПараметров.Объект;
|
||
ТипОперации = СтруктураПараметров.ТипОперации;
|
||
Если ТипОперации = "Отладить" Тогда
|
||
Если ТипЗнч(Объект) = Тип("Структура") Тогда
|
||
СтруктураЗапроса = Объект;
|
||
Объект = Новый Запрос;
|
||
Если Истина
|
||
//И СтруктураЗапроса.Свойство("ВременныеТаблицы")
|
||
И СтруктураЗапроса.ВременныеТаблицы <> Неопределено
|
||
Тогда
|
||
Объект.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
|
||
#Если Клиент Тогда
|
||
ЛксСостояние("Подготовка временных таблиц");
|
||
#КонецЕсли
|
||
ТекстЗапросаПодготовки = "";
|
||
Для Каждого КлючИЗначение Из СтруктураЗапроса.ВременныеТаблицы Цикл
|
||
Если ТекстЗапросаПодготовки <> "" Тогда
|
||
ТекстЗапросаПодготовки = ТекстЗапросаПодготовки + ";";
|
||
КонецЕсли;
|
||
ТекстЗапросаПодготовки = ТекстЗапросаПодготовки + "ВЫБРАТЬ Т.* ПОМЕСТИТЬ " + КлючИЗначение.Ключ + " ИЗ &" + КлючИЗначение.Ключ + " КАК Т";
|
||
КонецЦикла;
|
||
Если ЗначениеЗаполнено(ТекстЗапросаПодготовки) Тогда
|
||
Объект.Текст = ТекстЗапросаПодготовки;
|
||
ЛксСкопироватьУниверсальнуюКоллекцию(СтруктураЗапроса.ВременныеТаблицы, Объект.Параметры);
|
||
Объект.Выполнить();
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Объект.Параметры.Очистить();
|
||
Объект.Текст = СтруктураЗапроса.Текст;
|
||
|
||
// Антибаг платформы 8.2.18. Некорректная серилизация моментов времени http://partners.v8.1c.ru/forum/thread.jsp?id=1159525#1159525
|
||
//ЛксСкопироватьУниверсальнуюКоллекцию(СтруктураЗапроса.Параметры, Объект.Параметры);
|
||
Для Каждого КлючИЗначение Из СтруктураЗапроса.Параметры Цикл
|
||
Объект.Параметры.Вставить(КлючИЗначение.Ключ, ЗначениеИзСтрокиВнутр(КлючИЗначение.Значение));
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Отладить(Объект, , СтруктураПараметров.НастройкаКомпоновки, СтруктураПараметров.ВнешниеНаборыДанных);
|
||
ИначеЕсли ТипОперации = "Исследовать" Тогда
|
||
Исследовать(Объект, , СтруктураПараметров.КакКоллекцию);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПанельИнструментовОПодсистеме() Экспорт
|
||
ЛксОткрытьСправкуПоПодсистеме(Обработки.ирДинамическийСписок.Создать());
|
||
КонецПроцедуры
|
||
|
||
// ОформляемыеКолонки - имена колонок, разделенные запятыми
|
||
Процедура ОтобразитьПустыеЗначенияВЯчейкахТабличногоПоля(ОформлениеСтроки, Знач ОформляемыеКолонки = "") Экспорт
|
||
|
||
ОформляемыеКолонки = Новый Структура(ОформляемыеКолонки);
|
||
НеФильтровтатьКолонки = (ОформляемыеКолонки.Количество() = 0);
|
||
Для Каждого Ячейка Из ОформлениеСтроки.Ячейки Цикл
|
||
Если Ложь
|
||
Или НеФильтровтатьКолонки
|
||
Или ОформляемыеКолонки.Свойство(Ячейка.Имя)
|
||
Тогда
|
||
ЗначениеЯчейки = Ячейка.Значение;
|
||
Если Не ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
|
||
Ячейка.УстановитьТекст(ирКэш.Получить().мПолучитьПредставлениеПустогоЗначения(ЗначениеЯчейки));
|
||
Ячейка.ЦветФона = WebЦвета.Роса;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры // ОтобразитьПустыеЗначенияВЯчейкахТабличногоПоля()
|
||
|
||
Процедура ПолеВвода_ОкончаниеВводаТекстаЛкс(Элемент, Текст, Значение, СтандартнаяОбработка, РасширенноеЗначение = Null,
|
||
ЛиТипСтрокаСлужебный = Ложь) Экспорт
|
||
|
||
Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
|
||
Типы = Элемент.ТипЗначения.Типы();
|
||
Если Типы.Количество() > 1 Тогда
|
||
ПредставлениеЗначения = ЛксПолучитьСтрокуМеждуМаркерами(Элемент.Значение, "(", ")");
|
||
ЗначениеСсылки = ирНеглобальный.ПреобразоватьЗначениеИзSDBLЛкс(ПредставлениеЗначения);
|
||
Если Истина
|
||
И ЗначениеСсылки <> Неопределено
|
||
И Элемент.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСсылки))
|
||
Тогда
|
||
Ответ = КодВозвратаДиалога.Да;
|
||
Если Не ЛиТипСтрокаСлужебный Тогда
|
||
Ответ = Вопрос("Хотите вставить строку как ссылку?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет);
|
||
КонецЕсли;
|
||
Если Ответ = КодВозвратаДиалога.Да Тогда
|
||
Значение = ЗначениеСсылки;
|
||
СтандартнаяОбработка = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И ЛиТипСтрокаСлужебный
|
||
И СтандартнаяОбработка
|
||
И ЗначениеЗаполнено(Элемент.Значение)
|
||
Тогда
|
||
Значение = "";
|
||
СтандартнаяОбработка = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Менеджер = ЛксПолучитьМенеджер(Элемент.Значение);
|
||
Если Менеджер <> Неопределено Тогда
|
||
УникальныйИдентификатор = ирКэш.Получить().ПолучитьУникальныйИдентификаторИзСтроки(Текст);
|
||
Если УникальныйИдентификатор <> Неопределено Тогда
|
||
СтандартнаяОбработка = Ложь;
|
||
Значение = Менеджер.ПолучитьСсылку(УникальныйИдентификатор);
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Ложь
|
||
Или (Истина
|
||
И РасширенноеЗначение <> Null
|
||
И ТипЗнч(РасширенноеЗначение) <> ТипЗнч(Элемент.Значение))
|
||
Или Элемент.ОграничениеТипа.ПривестиЗначение(Элемент.Значение) <> Элемент.Значение
|
||
Тогда
|
||
// Откат
|
||
СтандартнаяОбработка = Ложь;
|
||
Значение = Новый СписокЗначений;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Результат - Булево - Истина если значение было изменено
|
||
Функция ОткрытьФормуПроизвольногоЗначенияЛкс(РасширенноеЗначение, РедактированиеРазрешено = Истина, СтандартнаяОбработка = Истина,
|
||
ЗаголовокФормы = "") Экспорт
|
||
|
||
Результат = Ложь;
|
||
ТипРасширенногоЗначения = ТипЗнч(РасширенноеЗначение);
|
||
ХмлТип = XMLТипЗнч(РасширенноеЗначение);
|
||
Если Ложь
|
||
Или ТипРасширенногоЗначения = Тип("ТаблицаЗначений")
|
||
Или ТипРасширенногоЗначения = Тип("ДеревоЗначений")
|
||
Или ТипРасширенногоЗначения = Тип("МоментВремени")
|
||
Или ТипРасширенногоЗначения = Тип("ТабличныйДокумент")
|
||
Или ТипРасширенногоЗначения = Тип("Массив")
|
||
Или ТипРасширенногоЗначения = Тип("Граница")
|
||
Или ТипРасширенногоЗначения = Тип("Строка")
|
||
Или ТипРасширенногоЗначения = Тип("УникальныйИдентификатор")
|
||
Или ТипРасширенногоЗначения = Тип("Тип")
|
||
Или ТипРасширенногоЗначения = Тип("ОписаниеТипов")
|
||
Или ТипРасширенногоЗначения = Тип("СписокЗначений")
|
||
Тогда
|
||
СтандартнаяОбработка = Ложь;
|
||
Если Ложь
|
||
Или ТипРасширенногоЗначения = Тип("ТаблицаЗначений")
|
||
Или ТипРасширенногоЗначения = Тип("ДеревоЗначений")
|
||
Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.ТаблицаЗначений", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("МоментВремени") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.МоментВремени", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("ТабличныйДокумент") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.ТабличныйДокумент", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("Граница") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.Граница", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("Массив") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.Массив", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("УникальныйИдентификатор") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.УникальныйИдентификатор", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("СписокЗначений") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.СписокЗначений", , , РасширенноеЗначение);
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("Строка") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.Текст", , , Новый УникальныйИдентификатор());
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("Тип") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.ВыборРедактируемыхТипов", , , Новый УникальныйИдентификатор());
|
||
ФормаРедактирования.МножественныйВыбор = Ложь;
|
||
ИначеЕсли ТипРасширенногоЗначения = Тип("ОписаниеТипов") Тогда
|
||
ФормаРедактирования = ПолучитьФорму("Обработка.ирПлатформа.Форма.ВыборРедактируемыхТипов", , , РасширенноеЗначение);
|
||
ФормаРедактирования.МножественныйВыбор = Истина;
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ЗаголовокФормы) Тогда
|
||
ФормаРедактирования.Заголовок = ЗаголовокФормы;
|
||
КонецЕсли;
|
||
Если ФормаРедактирования.Открыта() Тогда
|
||
ФормаРедактирования.Активизировать();
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
ФормаРедактирования.ТолькоПросмотр = Не РедактированиеРазрешено;
|
||
Если РедактированиеРазрешено Тогда
|
||
ФормаРедактирования.НачальноеЗначениеВыбора = ЛксПолучитьКопиюОбъекта(РасширенноеЗначение); // Опасно
|
||
Иначе
|
||
ФормаРедактирования.НачальноеЗначениеВыбора = РасширенноеЗначение;
|
||
КонецЕсли;
|
||
Если РедактированиеРазрешено Тогда
|
||
РезультатВыбора = ФормаРедактирования.ОткрытьМодально();
|
||
Если РезультатВыбора <> Неопределено Тогда
|
||
РасширенноеЗначение = РезультатВыбора;
|
||
Результат = Истина;
|
||
КонецЕсли;
|
||
Иначе
|
||
ФормаРедактирования.Открыть();
|
||
КонецЕсли;
|
||
ИначеЕсли Ложь
|
||
Или ТипРасширенногоЗначения = Тип("Число")
|
||
Или ТипРасширенногоЗначения = Тип("Строка")
|
||
Или ТипРасширенногоЗначения = Тип("Дата")
|
||
Или ТипРасширенногоЗначения = Тип("Булево")
|
||
Или ТипРасширенногоЗначения = Тип("Неопределено")
|
||
Или ТипРасширенногоЗначения = Тип("Null")
|
||
Или ТипРасширенногоЗначения = Тип("ПолеКомпоновкиДанных")
|
||
Или ТипРасширенногоЗначения = Тип("СтандартнаяДатаНачала")
|
||
Или ТипРасширенногоЗначения = Тип("СтандартныйПериод")
|
||
Или ТипРасширенногоЗначения = Тип("ВидДвиженияНакопления")
|
||
Или ТипРасширенногоЗначения = Тип("ВидДвиженияБухгалтерии")
|
||
Или ТипРасширенногоЗначения = Тип("ВидСчета")
|
||
Или (Истина
|
||
И ХмлТип <> Неопределено
|
||
И Найти(ХмлТип.ИмяТипа, "Ref.") > 0)
|
||
|
||
Тогда
|
||
Если ХмлТип <> Неопределено Тогда
|
||
Если Найти(ХмлТип.ИмяТипа, "Ref.") > 0 Тогда
|
||
Если Истина
|
||
И ЗначениеЗаполнено(РасширенноеЗначение)
|
||
И Найти(ХмлТип.ИмяТипа, "BusinessProcessRoutePointRef.") = 0
|
||
И Найти(ХмлТип.ИмяТипа, "EnumRef.") = 0
|
||
И РасширенноеЗначение.ПолучитьОбъект() = Неопределено
|
||
Тогда
|
||
//ирНеглобальный.ОткрытьСсылкуЯчейкиВРедактореОбъектаБДЛкс(ТабличноеПоле);
|
||
Обработки.ирРедакторОбъектаБД.Создать().РедактироватьОбъектСсылки(РасширенноеЗначение);
|
||
СтандартнаяОбработка = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или Не СтандартнаяОбработка
|
||
Или Не РедактированиеРазрешено
|
||
Тогда
|
||
Если ХмлТип <> Неопределено Тогда
|
||
Если Найти(ХмлТип.ИмяТипа, "Ref.") > 0 Тогда
|
||
Если Истина
|
||
И ЗначениеЗаполнено(РасширенноеЗначение)
|
||
И (Ложь
|
||
Или Найти(ХмлТип.ИмяТипа, "BusinessProcessRoutePointRef.") = 1
|
||
Или Найти(ХмлТип.ИмяТипа, "EnumRef.") = 1
|
||
Или РасширенноеЗначение.ПолучитьОбъект() <> Неопределено)
|
||
Тогда
|
||
ОткрытьЗначение(РасширенноеЗначение);
|
||
КонецЕсли;
|
||
СтандартнаяОбработка = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если СтандартнаяОбработка Тогда
|
||
ОткрытьЗначение(РасширенноеЗначение);
|
||
СтандартнаяОбработка = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Иначе
|
||
//Если Истина
|
||
// И ТипЗначения1 <> Неопределено
|
||
// И ТипЗначения1.ПривестиЗначение(РасширенноеЗначение) <> РасширенноеЗначение
|
||
//Тогда
|
||
Исследовать(РасширенноеЗначение);
|
||
СтандартнаяОбработка = Ложь;
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Результат - Булево - Истина если значение было изменено
|
||
Функция ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ТабличноеПоле, СтандартнаяОбработка = Ложь, РасширенноеЗначение = Null,
|
||
РедактированиеРазрешено = Ложь) Экспорт
|
||
|
||
Колонка = ТабличноеПоле.ТекущаяКолонка;
|
||
ВыбраннаяСтрока = ТабличноеПоле.ТекущаяСтрока;
|
||
Если РасширенноеЗначение = Null Тогда
|
||
РасширенноеЗначение = ТабличноеПоле.ТекущаяСтрока[Колонка.Данные];
|
||
КонецЕсли;
|
||
ОформлениеСтроки = ТабличноеПоле.ОформлениеСтроки(ВыбраннаяСтрока);
|
||
Ячейка = ОформлениеСтроки.Ячейки[Колонка.Имя];
|
||
Если Колонка.ЭлементУправления <> Неопределено Тогда
|
||
ТипЗначения1 = Колонка.ЭлементУправления.ТипЗначения;
|
||
КонецЕсли;
|
||
РедактированиеРазрешено = Истина
|
||
И РедактированиеРазрешено
|
||
И Не ТабличноеПоле.ТолькоПросмотр
|
||
И Не Колонка.ТолькоПросмотр
|
||
И Колонка.ЭлементУправления <> Неопределено
|
||
И Не Колонка.ЭлементУправления.ТолькоПросмотр
|
||
И Не Ячейка.ТолькоПросмотр;
|
||
Результат = ОткрытьФормуПроизвольногоЗначенияЛкс(РасширенноеЗначение, РедактированиеРазрешено, СтандартнаяОбработка);
|
||
Если Результат Тогда
|
||
ВыбраннаяСтрока[Колонка.Данные] = РасширенноеЗначение;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции // ОткрытьЗначениеЯчейки()
|
||
|
||
// Результат - Булево - Истина если значение было изменено
|
||
Функция ПолеВводаРасширенногоЗначения_НачалоВыбораЛкс(ТабличноеПоле, СтандартнаяОбработка, РасширенноеЗначение = Null, ИспользоватьОграничениеТипа = Ложь) Экспорт
|
||
|
||
Колонка = ТабличноеПоле.ТекущаяКолонка;
|
||
Если РасширенноеЗначение = Null Тогда
|
||
РасширенноеЗначение = ТабличноеПоле.ТекущаяСтрока[Колонка.Данные];
|
||
КонецЕсли;
|
||
ЗначениеИзменено = Ложь;
|
||
Если РасширенноеЗначение = Неопределено Тогда
|
||
СтандартнаяОбработка = Ложь;
|
||
ОграничениеТипа = Неопределено;
|
||
Если ИспользоватьОграничениеТипа Тогда
|
||
ОграничениеТипа = Колонка.ЭлементУправления.ОграничениеТипа;
|
||
Если ОграничениеТипа.Типы().Количество() = 0 Тогда
|
||
ОграничениеТипа = Колонка.ЭлементУправления.ТипЗначения;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
НовыйТип = ирНеглобальный.ВыбратьРедактируемыйТипЛкс(ОграничениеТипа);
|
||
Если НовыйТип <> Неопределено Тогда
|
||
МассивТипов = ЛксБыстрыйМассив(НовыйТип);
|
||
НовоеОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
|
||
НовоеЗначение = НовоеОписаниеТипов.ПривестиЗначение(Неопределено);
|
||
РасширенноеЗначение = НовоеЗначение;
|
||
ТабличноеПоле.ТекущаяСтрока[Колонка.Данные] = РасширенноеЗначение;
|
||
ЗначениеИзменено = Истина;
|
||
КонецЕсли;
|
||
Иначе
|
||
ЗначениеИзменено = ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ТабличноеПоле, СтандартнаяОбработка, РасширенноеЗначение, Истина);
|
||
//Если ЗначениеИзменено Тогда
|
||
Если Не СтандартнаяОбработка Тогда
|
||
ТабличноеПоле.ТекущаяСтрока[Колонка.Данные] = РасширенноеЗначение;//
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ЗначениеИзменено;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьФормуЛкс(ИмяФормы, Параметры = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено) Экспорт
|
||
|
||
Результат = ПолучитьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// ИменаКолонокСПиктограммамиТипов - Массив, Строка
|
||
Процедура ТабличноеПолеПриВыводеСтрокиЛкс(Элемент, ОформлениеСтроки, ДанныеСтроки, ЛиОтбражатьПустые = Ложь, Знач ИменаКолонокСПиктограммамиТипов = "") Экспорт
|
||
|
||
ирПлатформа = ирКэш.Получить();
|
||
Если ТипЗнч(ИменаКолонокСПиктограммамиТипов) = Тип("Строка") Тогда
|
||
ИменаКолонокСПиктограммамиТипов = ЛксПолучитьМассивИзСтрокиСРазделителем(ИменаКолонокСПиктограммамиТипов, ",", Истина);
|
||
КонецЕсли;
|
||
Для Каждого Колонка Из Элемент.Колонки Цикл
|
||
Ячейка = ОформлениеСтроки.Ячейки[Колонка.Имя];
|
||
ЗначениеЯчейки = Ячейка.Значение;
|
||
Если Формат(ЗначениеЯчейки, Колонка.Формат) = Ячейка.Текст Тогда // Здесь могут быть обращения к БД
|
||
ПредставлениеЗначения = "";
|
||
Если ТипЗнч(ЗначениеЯчейки) <> Тип("Строка") Тогда
|
||
ПредставлениеЗначения = ЛксПолучитьРасширенноеПредставлениеЗначения(ЗначениеЯчейки, Колонка);
|
||
КонецЕсли;
|
||
Если ЛиОтбражатьПустые Тогда
|
||
Если Не ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
|
||
ПредставлениеЗначения = ирПлатформа.мПолучитьПредставлениеПустогоЗначения(ЗначениеЯчейки);
|
||
Ячейка.ЦветФона = WebЦвета.Роса;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ПредставлениеЗначения <> "" Тогда
|
||
Ячейка.УстановитьТекст(ПредставлениеЗначения);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если ИменаКолонокСПиктограммамиТипов.Найти(Колонка.Имя) <> Неопределено Тогда
|
||
Если ТипЗнч(ЗначениеЯчейки) <> Тип("ПолеКомпоновкиДанных") Тогда
|
||
ТипЗначения = ТипЗнч(ЗначениеЯчейки);
|
||
Если Истина
|
||
И ТипЗначения = Тип("Булево")
|
||
И Ячейка.ОтображатьФлажок
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КартинкаТипа = ПолучитьПиктограммуТипаЛкс(ТипЗначения);
|
||
Если КартинкаТипа <> Неопределено Тогда
|
||
Ячейка.УстановитьКартинку(КартинкаТипа);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры // ТабличноеПолеСВложеннымиКоллекциямиПриВыводеСтроки()
|
||
|
||
Процедура ПрименитьИзмененияИЗакрытьФормуЛкс(ЭтаФорма, ЗначениеВыбора = Неопределено) Экспорт
|
||
|
||
ЭтаФорма.Модифицированность = Ложь;
|
||
Если Ложь
|
||
Или ЭтаФорма.ВладелецФормы <> Неопределено
|
||
Или Не ЭтаФорма.Открыта()
|
||
Тогда
|
||
ЭтаФорма.ОповеститьОВыборе(ЗначениеВыбора);
|
||
КонецЕсли;
|
||
Если ЭтаФорма.Открыта() Тогда
|
||
ЭтаФорма.Закрыть(ЗначениеВыбора);
|
||
КонецЕсли;
|
||
//Если ЭтаФорма.Открыта() Тогда
|
||
// ЭтаФорма.Закрыть(ЗначениеВыбора);
|
||
//Иначе//Если ЭтаФорма.МодальныйРежим Тогда
|
||
// ЭтаФорма.ОповеститьОВыборе(ЗначениеВыбора);
|
||
//КонецЕсли;
|
||
|
||
КонецПроцедуры // ПрименитьИзмененияИЗакрытьФорму()
|
||
|
||
Функция НайтиВозможныеСтрокиОписанияСловаВСинтаксПомощникеЛкс(Знач Слово, ЯзыкПрограммы = 0, ПоискСУчетомТипаСлова = Истина) Экспорт
|
||
|
||
ирКэш.Получить().ИнициализацияОписанияМетодовИСвойств();
|
||
МассивВозможныхТиповСлова = Новый Массив;
|
||
МассивВозможныхТиповСлова.Добавить("Конструктор");
|
||
Слово = НРег(Слово);
|
||
Если Ложь
|
||
Или Не ПоискСУчетомТипаСлова
|
||
Или Прав(Слово, 1) = "("
|
||
Тогда
|
||
Если Прав(Слово, 1) = "(" Тогда
|
||
Слово = ЛксПолучитьСтрокуБезКонца(Слово, 1);
|
||
КонецЕсли;
|
||
МассивВозможныхТиповСлова.Добавить("Метод");
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или Не ПоискСУчетомТипаСлова
|
||
Или Прав(Слово, 1) <> "("
|
||
Тогда
|
||
МассивВозможныхТиповСлова.Добавить("Свойство");
|
||
МассивВозможныхТиповСлова.Добавить("Конструкция");
|
||
МассивВозможныхТиповСлова.Добавить("Событие");
|
||
МассивВозможныхТиповСлова.Добавить("Таблица");
|
||
КонецЕсли;
|
||
ТаблицаСтруктурВозможныхТиповКонтекста = ирКэш.Получить().ПолучитьНовуюТаблицуСтруктурТипа();
|
||
Для Каждого ВозможныйТипСлова Из МассивВозможныхТиповСлова Цикл
|
||
Если ВозможныйТипСлова = "Конструктор" Тогда
|
||
КлючПоиска = Новый Структура("ТипКонтекста, ТипСлова, ЯзыкПрограммы, ТипЯзыка", Слово, ВозможныйТипСлова, ЯзыкПрограммы, "");
|
||
Иначе
|
||
КлючПоиска = Новый Структура("НСлово, ТипСлова, ЯзыкПрограммы, ТипЯзыка", Слово, ВозможныйТипСлова, ЯзыкПрограммы, "");
|
||
КонецЕсли;
|
||
НайденныеСтроки = ирКэш.Получить().ТаблицаКонтекстов.НайтиСтроки(КлючПоиска);
|
||
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
|
||
ЗаполнитьЗначенияСвойств(ТаблицаСтруктурВозможныхТиповКонтекста.Добавить(), Новый Структура("СтрокаОписания", НайденнаяСтрока));
|
||
КонецЦикла;
|
||
НайденныеСтроки = ирКэш.Получить().ТаблицаШаблоновКонтекстов.НайтиСтроки(КлючПоиска);
|
||
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
|
||
ЗаполнитьЗначенияСвойств(ТаблицаСтруктурВозможныхТиповКонтекста.Добавить(), Новый Структура("СтрокаОписания", НайденнаяСтрока));
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КлючПоиска = Новый Структура("НСлово, ЯзыкПрограммы", Слово, ЯзыкПрограммы);
|
||
НайденныеСтроки = ирКэш.Получить().ТаблицаОбщихТипов.НайтиСтроки(КлючПоиска);
|
||
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
|
||
ЗаполнитьЗначенияСвойств(ТаблицаСтруктурВозможныхТиповКонтекста.Добавить(), Новый Структура("СтрокаОписания", НайденнаяСтрока));
|
||
КонецЦикла;
|
||
Возврат ТаблицаСтруктурВозможныхТиповКонтекста;
|
||
|
||
КонецФункции // НайтиВозможныеСтрокиОписанияСлова()
|
||
|
||
// Открывает форму синтакс-помощника и загружает в нее нужную страницу, подсвечивая заданную строку.
|
||
//
|
||
// Параметры:
|
||
// ВнутреннийПутьКОписанию – Строка – внутренний путь к странице синтакс-помощника;
|
||
// СтрокаДляПодсветки – Строка – которую нужно подсветить в тексте страницы.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Форма.
|
||
//
|
||
Функция ОткрытьСтраницуСинтаксПомощникаЛкс(ВнутреннийПутьКОписанию, СтрокаДляПодсветки = "", ВладелецФормы = Неопределено, КлючУникальности = Неопределено) Экспорт
|
||
|
||
Если ВнутреннийПутьКОписанию = "" Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ФормаСправка = ПолучитьФорму("Обработка.ирСинтаксПомощник.Форма", , , КлючУникальности);
|
||
ФормаСправка.ВладелецФормы = ВладелецФормы;
|
||
ФормаСправка.ОткрытьАдрес(ВнутреннийПутьКОписанию, СтрокаДляПодсветки);
|
||
ФормаСправка.ВладелецФормы = Неопределено;
|
||
Возврат ФормаСправка;
|
||
|
||
КонецФункции // ОткрытьСтраницуСинтаксПомощникаЛкс()
|
||
|
||
// Обходит строки табличного поля и имитирует редактирование и выбор пользователем заданного значения.
|
||
//
|
||
// Параметры:
|
||
// ТабличноеПоле - ТабличноеПоле;
|
||
// ЗначениеОбработки - Произвольные - значение, которое будем записывать в ячейки;
|
||
// *ФормаИнициатор - Форма, *Неопределено - форма, от имени которой будет записывать;
|
||
// *ТипИсточника – Строка, *Неопределено – "ТаблицаЗначений", "ТабличнаяЧасть";
|
||
// *Колонка – КолонкаТабличногоПоля, *Неопределено – колонка в которой обходим ячейки, по умолчанию текущая;
|
||
// *ТолькоВыделенныеСтроки - Булево, *Истина - обходить только выделенные строки.
|
||
//
|
||
Процедура УстановитьЗначениеВКолонкеТабличногоПоляТЧИлиТЗЛкс(ТабличноеПоле, ЗначениеОбработки,
|
||
ФормаИнициатор = Неопределено, Знач ТипИсточника = Неопределено, Знач Колонка = Неопределено,
|
||
Знач ТолькоВыделенныеСтроки = Истина, Знач ИнтерактивноеУстановка = Истина) Экспорт
|
||
|
||
Если Колонка = Неопределено Тогда
|
||
Колонка = ТабличноеПоле.ТекущаяКолонка;
|
||
Иначе
|
||
ТабличноеПоле.ТекущаяКолонка = Колонка;
|
||
КонецЕсли;
|
||
ЗначениеТабличногоПоля = ТабличноеПоле.Значение;
|
||
Если ТипИсточника = "" Тогда
|
||
ТипЗначенияТабличногоПоля = ТипЗнч(ЗначениеТабличногоПоля);
|
||
Если ТипЗначенияТабличногоПоля = Тип("ТаблицаЗначений") Тогда
|
||
ТипИсточника = "ТаблицаЗначений";
|
||
ИначеЕсли ТипЗначенияТабличногоПоля = Тип("ДеревоЗначений") Тогда
|
||
ТипИсточника = "ДеревоЗначений";
|
||
Иначе
|
||
СтруктураТипа = ирКэш.Получить().ПолучитьСтруктуруТипаИзКонкретногоТипа(ТипЗначенияТабличногоПоля);
|
||
Если Найти(СтруктураТипа.ИмяОбщегоТипа, "<Имя табличной части>") > 0 Тогда
|
||
ТипИсточника = "ТабличнаяЧасть";
|
||
ИначеЕсли Найти(СтруктураТипа.ИмяОбщегоТипа, "НаборЗаписей.") > 0 Тогда
|
||
ТипИсточника = "НаборЗаписей";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ЕстьОтборСтрок = Ложь
|
||
Или ТипИсточника = "ТабличнаяЧасть"
|
||
Или ТипИсточника = "НаборЗаписей";
|
||
Если ТолькоВыделенныеСтроки Тогда
|
||
Если Истина
|
||
И ТабличноеПоле.ВыделенныеСтроки.Количество() = 1
|
||
И ТипИсточника <> "ДеревоЗначений"
|
||
Тогда
|
||
ТекстОтбора = "";
|
||
Если ЕстьОтборСтрок Тогда
|
||
ТекстОтбора = " удовлетворяющие отбору";
|
||
КонецЕсли;
|
||
Ответ = Вопрос("Выделена только одна строка. Хотите обработать все" + ТекстОтбора + " строки?",
|
||
РежимДиалогаВопрос.ДаНет);
|
||
Если Ответ = КодВозвратаДиалога.Да Тогда
|
||
ТолькоВыделенныеСтроки = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КлючиСтрокДляОбработки = Новый Массив;
|
||
Если ТолькоВыделенныеСтроки Тогда
|
||
Для Каждого ВыделеннаяСтрока Из ТабличноеПоле.ВыделенныеСтроки Цикл
|
||
КлючиСтрокДляОбработки.Добавить(ВыделеннаяСтрока);
|
||
КонецЦикла;
|
||
Иначе
|
||
Если ЕстьОтборСтрок Тогда
|
||
Построитель = Новый ПостроительЗапроса;
|
||
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЗначениеТабличногоПоля);
|
||
Построитель.ВыбранныеПоля.Очистить();
|
||
Построитель.ВыбранныеПоля.Добавить("НомерСтроки");
|
||
ЛксСкопироватьОтбор(Построитель.Отбор, ТабличноеПоле.ОтборСтрок, Истина);
|
||
ТаблицаРезультата = Построитель.Результат.Выгрузить();
|
||
Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
|
||
КлючиСтрокДляОбработки.Добавить(СтрокаРезультата.НомерСтроки - 1);
|
||
КонецЦикла;
|
||
ИначеЕсли ТипИсточника = "ТаблицаЗначений" Тогда
|
||
Для Каждого СтрокаТаблицы Из ТабличноеПоле.Значение Цикл
|
||
КлючиСтрокДляОбработки.Добавить(СтрокаТаблицы);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Индикатор = ЛксПолучитьИндикаторПроцесса(КлючиСтрокДляОбработки.Количество(), "Групповая установка значения");
|
||
// Нужно встать на редактируемую колонку, чтобы сработал режим редактирования
|
||
Для Каждого КлючСтроки Из КлючиСтрокДляОбработки Цикл
|
||
ЛксОбработатьИндикатор(Индикатор);
|
||
Если ТипЗнч(КлючСтроки) = Тип("Число") Тогда
|
||
ТекущаяСтрока = ТабличноеПоле.Значение[КлючСтроки];
|
||
Иначе
|
||
ТекущаяСтрока = КлючСтроки;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ЗначениеОбработки) = Тип("Структура") Тогда
|
||
ЗаполнитьЗначенияСвойств(ЗначениеОбработки.Параметры, ТекущаяСтрока);
|
||
НовоеЗначение = ирНеглобальный.ВычислитьВыражение(ЗначениеОбработки.Формула, ЗначениеОбработки.Параметры);
|
||
Иначе
|
||
НовоеЗначение = ЗначениеОбработки;
|
||
КонецЕсли;
|
||
Если ИнтерактивноеУстановка Тогда
|
||
ТабличноеПоле.ТекущаяСтрока = ТекущаяСтрока;
|
||
//ТабличноеПоле.ИзменитьСтроку();
|
||
ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(ТабличноеПоле, Колонка, НовоеЗначение, ФормаИнициатор);
|
||
ТабличноеПоле.ЗакончитьРедактированиеСтроки(Ложь);
|
||
Иначе
|
||
ТекущаяСтрока[Колонка.Имя] = НовоеЗначение;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры // ИнтерактивноУстановитьЗначениеВКолонкеТабличногоПоляТЧИлиТЗ()
|
||
|
||
Процедура ОформитьФонТекущейСтрокиЛкс(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
|
||
|
||
Если Элемент.ТекущаяСтрока = ДанныеСтроки Тогда
|
||
ОформлениеСтроки.ЦветФона = WebЦвета.СветлоНебесноГолубой;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПроверитьЗапуститьОтладчик(Знач ВремяОжиданияЗапуска = 5) Экспорт
|
||
|
||
ИдентификаторПроцессаОтладчика = Неопределено;
|
||
Платформа = ирКэш.Получить();
|
||
ПортОтладки = Платформа.ПолучитьПортДляПодключенияОтладчика(ИдентификаторПроцессаОтладчика);
|
||
Если ИдентификаторПроцессаОтладчика = Неопределено Тогда
|
||
//Если Не УФ(сПроверитьДоступностьКонфигуратора) Тогда
|
||
// Сообщить("Конфигуратор уже открыт, но отладка не подключена. Выполните подключение отладчика вручную");
|
||
// Перейти ~Конец;
|
||
//КонецЕсли;
|
||
// Антибаг 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1003164#1003164
|
||
Если Платформа.ВерсияПлатформы = 802015 Тогда
|
||
Предупреждение("Из-за ошибки платформы 8.2.15 запуск и подключение отладчика необходимо выполнять вручную", 20);
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Если ПортОтладки = Неопределено Тогда
|
||
Предупреждение("Включите разрешение отладки в главном меню ""Сервис/Параметры/Системные"" и повторите операцию снова");
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ПараметрыЗапуска = "CONFIG /DEBUG /DEBUGTARGET""tcp://127.0.0.1:" + ПортОтладки + """";
|
||
ЗапуститьСистему(ПараметрыЗапуска);
|
||
Платформа.Sleep(ВремяОжиданияЗапуска);
|
||
|
||
Если ИдентификаторПроцессаОтладчика = Неопределено Тогда
|
||
ИдентификаторПроцессаОтладчика = 0;
|
||
КонецЕсли;
|
||
|
||
Пока Истина Цикл
|
||
Платформа.ПолучитьПортДляПодключенияОтладчика(ИдентификаторПроцессаОтладчика);
|
||
Если ИдентификаторПроцессаОтладчика = Неопределено Тогда
|
||
Ответ = Вопрос("Отладчик еще не подключился. Повторить снова?", РежимДиалогаВопрос.ОКОтмена);
|
||
Если Ответ = КодВозвратаДиалога.ОК Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Прервать;
|
||
КонецЦикла;
|
||
Иначе
|
||
Платформа.АктивизироватьОкноПроцесса1С8(Число(ИдентификаторПроцессаОтладчика));
|
||
КонецЕсли;
|
||
Если ИдентификаторПроцессаОтладчика <> Неопределено Тогда
|
||
Результат = Число(ИдентификаторПроцессаОтладчика);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ОткрытьСсылкуЯчейкиВРедактореОбъектаБДЛкс(ТабличноеПоле, ИмяКолонки = "") Экспорт
|
||
|
||
Если ТабличноеПоле.ТекущаяСтрока = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
Если Не ЗначениеЗаполнено(ИмяКолонки) Тогда
|
||
Если ТабличноеПоле.ТекущаяКолонка = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
ИмяКолонки = ТабличноеПоле.ТекущаяКолонка.Данные;
|
||
КонецЕсли;
|
||
ЗначениеЯчейки = ТабличноеПоле.ТекущаяСтрока[ИмяКолонки];
|
||
XMLТип = XMLТипЗнч(ЗначениеЯчейки);
|
||
Если XMLТип = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
Если Найти(XMLТип.ИмяТипа, "Ref.") = 0 Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
Обработки.ирРедакторОбъектаБД.Создать().РедактироватьОбъектСсылки(ЗначениеЯчейки);
|
||
|
||
КонецПроцедуры
|
||
|
||
// ВариантПросмотра - Строка - "Компактный", "ЯзыкЗапросов", "ВстроенныйЯзык", ...
|
||
Функция ПолучитьФормуТекстаЛкс(Текст, Знач Заголовок = "", ВариантПросмотра = "Компактный", ТолькоПросмотр = Ложь, КлючУникальности = Неопределено) Экспорт
|
||
|
||
Если КлючУникальности = Неопределено Тогда
|
||
КлючУникальности = Новый УникальныйИдентификатор();
|
||
КонецЕсли;
|
||
ФормаПросмотра = ирКэш.Получить().ПолучитьФорму("Текст", , КлючУникальности);
|
||
ФормаПросмотра.НачальноеЗначениеВыбора = Текст;
|
||
ФормаПросмотра.РекомендуемыйВариант = ВариантПросмотра;
|
||
ФормаПросмотра.ТолькоПросмотр = ТолькоПросмотр;
|
||
Если Не ЗначениеЗаполнено(Заголовок) Тогда
|
||
//Заголовок = ФормаПросмотра.Заголовок;
|
||
Заголовок = ""; // Чтобы при повторном открытии не оставался старый текст
|
||
КонецЕсли;
|
||
Если ТолькоПросмотр Тогда
|
||
Заголовок = Заголовок + " - " + СтрДлина(Текст) + " символов";
|
||
КонецЕсли;
|
||
ФормаПросмотра.Заголовок = Заголовок;
|
||
Возврат ФормаПросмотра;
|
||
|
||
КонецФункции
|
||
|
||
Функция ОткрытьТекстЛкс(Текст, Знач Заголовок = "", ВариантПросмотра = "Компактный", ТолькоПросмотр = Ложь, КлючУникальности = Неопределено) Экспорт
|
||
|
||
ФормаПросмотра = ПолучитьФормуТекстаЛкс(Текст, Заголовок, ВариантПросмотра, ТолькоПросмотр, КлючУникальности);
|
||
ФормаПросмотра.Открыть();
|
||
Возврат ФормаПросмотра;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ПолеВводаТекста_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка) Экспорт
|
||
|
||
Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
|
||
СтандартнаяОбработка = Ложь;
|
||
ФормаРедактора = ирКэш.Получить().ПолучитьФорму("Текст", Элемент, Новый УникальныйИдентификатор);
|
||
ФормаРедактора.РежимВыбора = Истина;
|
||
ФормаРедактора.НачальноеЗначениеВыбора = Элемент.Значение;
|
||
ФормаРедактора.Открыть();
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьПутьКДаннымТекущейКолонкиТабличногоПоляЛкс(Знач ТабличноеПоле) Экспорт
|
||
|
||
Если Истина
|
||
И ТабличноеПоле.ТекущаяКолонка <> Неопределено
|
||
И ТабличноеПоле.ТекущиеДанные <> Неопределено
|
||
Тогда
|
||
ДанныеКолонки = ТабличноеПоле.ТекущаяКолонка.Данные;
|
||
Если Не ЗначениеЗаполнено(ДанныеКолонки) Тогда
|
||
ДанныеКолонки = ТабличноеПоле.ТекущаяКолонка.ДанныеФлажка;
|
||
Если Не ЗначениеЗаполнено(ДанныеКолонки) Тогда
|
||
Если Ложь
|
||
Или ТипЗнч(ТабличноеПоле.Значение) = Тип("ТаблицаЗначений")
|
||
Или ТипЗнч(ТабличноеПоле.Значение) = Тип("ДеревоЗначений")
|
||
Тогда
|
||
ДанныеКолонки = ТабличноеПоле.ТекущаяКолонка.ДанныеКартинки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ДанныеКолонки;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ТабличноеПоле_ОтборБезЗначенияВТекущейКолонке_КнопкаЛкс(Знач ТабличноеПоле) Экспорт
|
||
|
||
ДанныеКолонки = ПолучитьПутьКДаннымТекущейКолонкиТабличногоПоляЛкс(ТабличноеПоле);
|
||
Если Не ЗначениеЗаполнено(ДанныеКолонки) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
Попытка
|
||
Отбор = ТабличноеПоле.Значение.Отбор;
|
||
Исключение
|
||
Отбор = ТабличноеПоле.ОтборСтрок;
|
||
КонецПопытки;
|
||
//:Отбор = Новый ("Отбор");
|
||
ЭлементОтбора = Отбор[ДанныеКолонки];
|
||
ЗначениеЯчейки = ТабличноеПоле.ТекущиеДанные[ДанныеКолонки];
|
||
Если ЭлементОтбора.Использование Тогда
|
||
Если ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно Тогда
|
||
Если Ложь
|
||
Или ТипЗнч(ЗначениеЯчейки) <> Тип("Булево")
|
||
Или ЭлементОтбора.ТипЗначения.Типы().Количество() > 1
|
||
Тогда
|
||
СписокЗначений = Новый СписокЗначений;
|
||
СписокЗначений.Добавить(ЭлементОтбора.Значение);
|
||
СписокЗначений.Добавить(ЗначениеЯчейки);
|
||
ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСписке;
|
||
ЭлементОтбора.Значение = СписокЗначений;
|
||
КонецЕсли;
|
||
ИначеЕсли ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСписке Тогда
|
||
СписокЗначений = ЭлементОтбора.Значение;
|
||
СписокЗначений.Добавить(ЗначениеЯчейки);
|
||
// Для обновления отбора
|
||
ЭлементОтбора.Использование = Ложь;
|
||
ЭлементОтбора.Использование = Истина;
|
||
ИначеЕсли ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке Тогда
|
||
СписокЗначений = ЭлементОтбора.Значение;
|
||
СписокЗначений.Удалить(СписокЗначений.НайтиПоЗначению(ЗначениеЯчейки));
|
||
// Для обновления отбора
|
||
ЭлементОтбора.Использование = Ложь;
|
||
ЭлементОтбора.Использование = Истина;
|
||
Иначе
|
||
ЭлементОтбора.Использование = Ложь;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если Не ЭлементОтбора.Использование Тогда
|
||
ЭлементОтбора.Использование = Истина;
|
||
Если Истина
|
||
И ЭлементОтбора.ТипЗначения.СодержитТип(Тип("Строка"))
|
||
И ЭлементОтбора.ТипЗначения.КвалификаторыСтроки.Длина = 0
|
||
Тогда
|
||
Если Не ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
|
||
// Особенность платформы
|
||
ЭлементОтбора.ВидСравнения = ВидСравнения.Содержит;
|
||
Иначе
|
||
ЭлементОтбора.ВидСравнения = ВидСравнения.НеСодержит;
|
||
КонецЕсли;
|
||
Иначе
|
||
ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно;
|
||
КонецЕсли;
|
||
ЭлементОтбора.Значение = ЗначениеЯчейки;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ЗагрузитьЗначениеИзФайлаЛкс(Расширение = "", ОписаниеФормата = "", Сжатие = Истина) Экспорт
|
||
|
||
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
|
||
ВыборФайла.Фильтр = ирНеглобальный.ПолучитьСтрокуФильтраДляВыбораФайлаЛкс(Расширение, ОписаниеФормата);
|
||
ВыборФайла.Расширение = Расширение;
|
||
Если Не ВыборФайла.Выбрать() Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла;
|
||
Если Сжатие Тогда
|
||
ВременныйКаталог = ПолучитьИмяВременногоФайла();
|
||
СоздатьКаталог(ВременныйКаталог);
|
||
ЗипЧтение = Новый ЧтениеZipФайла(ПолноеИмяФайла);
|
||
ЗипЧтение.ИзвлечьВсе(ВременныйКаталог);
|
||
ПолноеИмяФайла = ВременныйКаталог + "\" + ЗипЧтение.Элементы[0].Имя;
|
||
КонецЕсли;
|
||
|
||
ЧтениеХМЛ = Новый ЧтениеXML;
|
||
ЧтениеХМЛ.ОткрытьФайл(ПолноеИмяФайла);
|
||
Попытка
|
||
//Результат = ЗначениеИзФайла(ВыборФайла.ПолноеИмяФайла);
|
||
Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеХМЛ);
|
||
Исключение
|
||
Сообщить(ОписаниеОшибки());
|
||
Результат = Неопределено;
|
||
КонецПопытки;
|
||
ЧтениеХМЛ.Закрыть();
|
||
Если Сжатие Тогда
|
||
УдалитьФайлы(ВременныйКаталог, "*");
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция СохранитьЗначениеВФайлЛкс(Значение, Расширение = "", ОписаниеФормата = "", Сжатие = Истина, УровеньСжатия = Неопределено) Экспорт
|
||
|
||
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
|
||
ВыборФайла.Фильтр = ирНеглобальный.ПолучитьСтрокуФильтраДляВыбораФайлаЛкс(Расширение, ОписаниеФормата);
|
||
ВыборФайла.Расширение = Расширение;
|
||
Если Не ВыборФайла.Выбрать() Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ЗаписьХМЛ = Новый ЗаписьXML;
|
||
ЗаписьХМЛ.ОткрытьФайл(ВыборФайла.ПолноеИмяФайла);
|
||
Попытка
|
||
//ЗначениеВФайл(ВыборФайла.ПолноеИмяФайла, Значение);
|
||
СериализаторXDTO.ЗаписатьXML(ЗаписьХМЛ, Значение);
|
||
Результат = Истина;
|
||
Исключение
|
||
Сообщить(ОписаниеОшибки());
|
||
Результат = Ложь;
|
||
КонецПопытки;
|
||
ЗаписьХМЛ.Закрыть();
|
||
|
||
Если Сжатие Тогда
|
||
ВременныйКаталог = ПолучитьИмяВременногоФайла();
|
||
СоздатьКаталог(ВременныйКаталог);
|
||
Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла);
|
||
ИмяВременногоФайла = ВременныйКаталог + "\" + Файл.Имя;
|
||
ПереместитьФайл(Файл.ПолноеИмя, ИмяВременногоФайла);
|
||
ЗаписьЗип = Новый ЗаписьZipФайла(ВыборФайла.ПолноеИмяФайла,,,, УровеньСжатия);
|
||
ЗаписьЗип.Добавить(ИмяВременногоФайла);
|
||
ЗаписьЗип.Записать();
|
||
УдалитьФайлы(ВременныйКаталог, "*");
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ВыбратьРедактируемыйТипЛкс(ОграничениеТипа = Неопределено, ТолькоПросмотр = Ложь, НачальноеЗначениеВыбора = Неопределено) Экспорт
|
||
|
||
Если ОграничениеТипа = Неопределено Тогда
|
||
ОграничениеТипа = Новый ОписаниеТипов;
|
||
КонецЕсли;
|
||
ФормаРедактора = ирКэш.Получить().ПолучитьФорму("ВыборРедактируемыхТипов");
|
||
ФормаРедактора.ОграничениеТипа = ОграничениеТипа;
|
||
ФормаРедактора.НачальноеЗначениеВыбора = НачальноеЗначениеВыбора;
|
||
ФормаРедактора.МножественныйВыбор = Ложь;
|
||
ФормаРедактора.ТолькоПросмотр = ТолькоПросмотр;
|
||
РезультатВыбора = ФормаРедактора.ОткрытьМодально();
|
||
Возврат РезультатВыбора;
|
||
|
||
КонецФункции // РедактироватьДопустимыеТипы()
|
||
|
||
Функция РедактироватьОписаниеТиповЛкс(ОграничениеТипаИлиПолеВвода, ТолькоПросмотр = Ложь) Экспорт
|
||
|
||
Если ТипЗнч(ОграничениеТипаИлиПолеВвода) = Тип("ОписаниеТипов") Тогда
|
||
ВладелецФормы = Неопределено;
|
||
ОграничениеТипа = ОграничениеТипаИлиПолеВвода;
|
||
Иначе
|
||
ВладелецФормы = ОграничениеТипаИлиПолеВвода;
|
||
ОграничениеТипа = ОграничениеТипаИлиПолеВвода.Значение;
|
||
КонецЕсли;
|
||
ФормаРедактора = ирКэш.Получить().ПолучитьФорму("ВыборРедактируемыхТипов", ВладелецФормы);
|
||
//ФормаРедактора.ОграничениеТипа = ОграничениеТипа;
|
||
ФормаРедактора.НачальноеЗначениеВыбора = ОграничениеТипа;
|
||
ФормаРедактора.МножественныйВыбор = Истина;
|
||
ФормаРедактора.ТолькоПросмотр = ТолькоПросмотр;
|
||
РезультатВыбора = ФормаРедактора.ОткрытьМодально();
|
||
Возврат РезультатВыбора;
|
||
|
||
КонецФункции // РедактироватьДопустимыеТипы()
|
||
|
||
Функция ОткрытьПодборСВыборомТипаЛкс(ВладелецФормы, ОписаниеТипов = Неопределено, НачальноеЗначениеВыбора = Неопределено) Экспорт
|
||
|
||
Если ТипЗнч(ОписаниеТипов) = Тип("Строка") Тогда
|
||
ДоступныеОбъекты = ЛксПолучитьМассивИзСтрокиСРазделителем(ОписаниеТипов, ",", Истина);
|
||
ИначеЕсли ОписаниеТипов <> Неопределено Тогда
|
||
ДоступныеОбъекты = Новый Массив();
|
||
Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
|
||
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
|
||
Если ОбъектМетаданных <> Неопределено Тогда
|
||
ДоступныеОбъекты.Добавить(ОбъектМетаданных.ПолноеИмя());
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или ДоступныеОбъекты = Неопределено
|
||
Или ДоступныеОбъекты.Количество() = 0
|
||
Или ДоступныеОбъекты.Количество() > 1
|
||
Тогда
|
||
Форма = ирКэш.Получить().ПолучитьФорму("ВыборОбъектаМетаданных", ВладелецФормы, ВладелецФормы);
|
||
Форма.НачальноеЗначениеВыбора = Новый Структура("ДоступныеОбъекты, ОтображатьСсылочныеОбъекты", ДоступныеОбъекты, Истина);
|
||
Результат = Форма.ОткрытьМодально();
|
||
Если Результат = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ПолноеИмяМД = Результат.ПолноеИмяОбъекта;
|
||
Иначе
|
||
ПолноеИмяМД = ДоступныеОбъекты[0];
|
||
КонецЕсли;
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмяМД);
|
||
Если МассивФрагментов.Количество() > 2 Тогда
|
||
Сообщить("Подбор строк таблицы " + ПолноеИмяМД + " не предусмотрен");
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ПараметрыФормы = Новый Структура("МножественныйВыбор, РежимВыбора, ТекущаяСтрока", Истина, Истина, НачальноеЗначениеВыбора);
|
||
Попытка
|
||
ФормаВыбора = ПолучитьФорму(ПолноеИмяМД + ".ФормаВыбора", ПараметрыФормы, ВладелецФормы);
|
||
Исключение
|
||
ФормаВыбора = ПолучитьФорму(ПолноеИмяМД + ".ФормаСписка", ПараметрыФормы, ВладелецФормы);
|
||
КонецПопытки;
|
||
ФормаВыбора.ЗакрыватьПриВыборе = Ложь;
|
||
Если ТипЗнч(ФормаВыбора) = Тип("Форма") Тогда
|
||
ФормаВыбора.МножественныйВыбор = Истина;
|
||
ФормаВыбора.РежимВыбора = Истина;
|
||
ФормаВыбора.НачальноеЗначениеВыбора = НачальноеЗначениеВыбора;
|
||
КонецЕсли;
|
||
ФормаВыбора.Открыть();
|
||
Возврат ФормаВыбора;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьФормуВыбораОбъектаМетаданныхЛкс(ВладелецФормы, КлючУникальности, НачальноеЗначениеВыбора, МножественныйВыбор = Ложь,
|
||
ОтображатьСсылочныеОбъекты = Истина, ОтображатьВыборочныеТаблицы = Истина, ОтображатьРегистры = Ложь, ОтображатьПоследовательности = Истина,
|
||
ОтображатьКонстанты = Ложь, ОтображатьТабличныеЧасти = Ложь, ОтображатьТаблицыИзменений = Ложь) Экспорт
|
||
|
||
Форма = ирКэш.Получить().ПолучитьФорму("ВыборОбъектаМетаданных", ВладелецФормы, КлючУникальности);
|
||
лСтруктураПараметров = Новый Структура;
|
||
лСтруктураПараметров.Вставить("НачальноеЗначениеВыбора", НачальноеЗначениеВыбора);
|
||
лСтруктураПараметров.Вставить("ОтображатьКонстанты", ОтображатьКонстанты);
|
||
лСтруктураПараметров.Вставить("ОтображатьВыборочныеТаблицы", ОтображатьВыборочныеТаблицы);
|
||
лСтруктураПараметров.Вставить("ОтображатьТаблицыИзменений", ОтображатьТаблицыИзменений);
|
||
лСтруктураПараметров.Вставить("ОтображатьТабличныеЧасти", ОтображатьТабличныеЧасти);
|
||
лСтруктураПараметров.Вставить("ОтображатьРегистры", ОтображатьРегистры);
|
||
лСтруктураПараметров.Вставить("ОтображатьПоследовательности", ОтображатьПоследовательности);
|
||
лСтруктураПараметров.Вставить("ОтображатьСсылочныеОбъекты", ОтображатьСсылочныеОбъекты);
|
||
лСтруктураПараметров.Вставить("МножественныйВыбор", МножественныйВыбор);
|
||
Форма.НачальноеЗначениеВыбора = лСтруктураПараметров;
|
||
Возврат Форма;
|
||
|
||
КонецФункции
|
||
|
||
// Результат - Неопределено, "*", Число
|
||
Функция ПолучитьКоличествоЭлементовКоллекцииЛкс(Значение) Экспорт
|
||
|
||
Если Не ЭтоКоллекцияЛкс(Значение) Тогда
|
||
КоличествоЭлементов = Неопределено;
|
||
Иначе
|
||
КоличествоЭлементов = "*";
|
||
Если ТипЗнч(Значение) = Тип("COMSafeArray") Тогда
|
||
КоличествоЭлементов = Значение.GetLength();
|
||
ИначеЕсли ТипЗнч(Значение) = Тип("COMОбъект") Тогда
|
||
Попытка
|
||
КоличествоЭлементов = Значение.Count;
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Если КоличествоЭлементов = "*" Тогда
|
||
Попытка
|
||
КоличествоЭлементов = Значение.Количество();
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Возврат КоличествоЭлементов;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЭтоКоллекцияЛкс(Значение) Экспорт
|
||
|
||
// Антибаг платформы 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1017316#1017316
|
||
Если Значение = ПараметрыСеанса Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
Для Каждого _Элемент Из Значение Цикл
|
||
Прервать;
|
||
КонецЦикла;
|
||
ЭтоКоллекция = Истина;
|
||
Исключение
|
||
ЭтоКоллекция = Ложь;
|
||
КонецПопытки;
|
||
Возврат ЭтоКоллекция;
|
||
|
||
КонецФункции
|
||
|
||
|
||
// ИсторияФайлов - СписокЗначений
|
||
// Кнопки - КнопкиКоманднойПанели
|
||
Процедура ОбновитьПодменюИсторииФайловЛкс(ИсторияФайлов, Кнопки, ИмяДействия = "ОткрытьФайлИзИстории") Экспорт
|
||
|
||
Кнопки.Очистить();
|
||
ДлинаПредставления = 100;
|
||
ДействиеКнопки = Новый Действие(ИмяДействия);
|
||
Для Каждого СтрокаФайла Из ИсторияФайлов Цикл
|
||
Файл = Новый Файл(СтрокаФайла.Значение);
|
||
ДлинаПути = ДлинаПредставления - СтрДлина(Файл.Имя);
|
||
Представление = Лев(Файл.Имя, ДлинаПредставления);
|
||
Если ДлинаПути > 0 Тогда
|
||
Если ДлинаПути < СтрДлина(Файл.Путь) + 3 Тогда
|
||
Представление = Лев(Файл.Путь, ДлинаПути) + "...\" + Представление;
|
||
Иначе
|
||
Представление = Файл.Путь + Представление;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КнопкаФайла = Кнопки.Добавить("_" + Формат(ИсторияФайлов.Индекс(СтрокаФайла), "ЧГ=;ЧН="), ТипКнопкиКоманднойПанели.Действие, Представление, ДействиеКнопки);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ДобавитьВИсториюЭлементЛкс(СписокИстории, ЗначениеЭлемента, РазмерИстории = 20) Экспорт
|
||
|
||
ЭлементИстории = СписокИстории.НайтиПоЗначению(ЗначениеЭлемента);
|
||
Если ЭлементИстории <> Неопределено Тогда
|
||
СписокИстории.Удалить(ЭлементИстории);
|
||
КонецЕсли;
|
||
СписокИстории.Вставить(0, ЗначениеЭлемента);
|
||
Пока СписокИстории.Количество() > РазмерИстории Цикл
|
||
СписокИстории.Удалить(РазмерИстории);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПоместитьТекстВБуферОбменаОСЛкс(Текст) Экспорт
|
||
|
||
// http://partners.v8.1c.ru/forum/thread.jsp?id=1075241#1075241
|
||
Документ = ирКэш.Получить().СлужебноеПолеHtmlДокумента.Документ; // Так падает после нескольких вызовов
|
||
//Документ = Новый COMОбъект("HTMLFILE");
|
||
Окно = Документ.parentWindow;
|
||
Окно.ClipboardData.SetData("Text", Текст);
|
||
|
||
Конецпроцедуры
|
||
|
||
Функция ПолучитьТекстИзБуфераОбменаОСЛкс() Экспорт
|
||
|
||
// http://partners.v8.1c.ru/forum/thread.jsp?id=1075241#1075241
|
||
Документ = ирКэш.Получить().СлужебноеПолеHtmlДокумента.Документ; // Так падает после нескольких вызовов
|
||
//Документ = Новый COMОбъект("HTMLFILE");
|
||
Окно = Документ.parentWindow;
|
||
Результат = Окно.ClipboardData.GetData("Text");
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ОткрытьФормуСпискаСОтбором(ПолноеИмяМД, Отбор) Экспорт
|
||
|
||
ПараметрыФормы = Новый Структура("Отбор", Отбор);
|
||
ФормаСписка = ПолучитьФорму(ПолноеИмяМД + ".ФормаСписка", ПараметрыФормы);
|
||
Если ТипЗнч(ФормаСписка) = Тип("Форма") Тогда
|
||
Для Каждого КлючИЗначение Из Отбор Цикл
|
||
ЭлементОтбора = ФормаСписка.Отбор[КлючИЗначение.Ключ];
|
||
ЭлементОтбора.Использование = Истина;
|
||
ЭлементОтбора.Значение = КлючИЗначение.Значение;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
ФормаСписка.Открыть();
|
||
Возврат ФормаСписка;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(ПолеВвода, КлючИстории, ЗапоминатьПоследние = 20, НеЗапоминатьПустыеТипизированные = Истина) Экспорт
|
||
|
||
Если Ложь
|
||
Или (Истина
|
||
И Не НеЗапоминатьПустыеТипизированные
|
||
И ПолеВвода.Значение <> ПолеВвода.ТипЗначения.ПривестиЗначение(Неопределено))
|
||
Или ЗначениеЗаполнено(ПолеВвода.Значение)
|
||
Тогда
|
||
КлючНастройки = КлючИстории + "." + ПолеВвода.Имя + ".ПоследниеЗначения";
|
||
ПоследниеЗначения = ВосстановитьЗначение(КлючНастройки);
|
||
Если ТипЗнч(ПоследниеЗначения) <> Тип("Массив") Тогда
|
||
ПоследниеЗначения = Новый Массив;
|
||
КонецЕсли;
|
||
Индекс = ПоследниеЗначения.Найти(ПолеВвода.Значение);
|
||
Если Индекс <> Неопределено Тогда
|
||
ПоследниеЗначения.Удалить(Индекс);
|
||
КонецЕсли;
|
||
ПоследниеЗначения.Вставить(0, ПолеВвода.Значение);
|
||
Для Счетчик = ЗапоминатьПоследние По ПоследниеЗначения.ВГраница() Цикл
|
||
ПоследниеЗначения.Удалить(ЗапоминатьПоследние);
|
||
КонецЦикла;
|
||
СохранитьЗначение(КлючНастройки, ПоследниеЗначения);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПолеВводаСИсториейВыбора_НачалоВыбораИзСпискаЛкс(ПолеВвода, КлючИстории) Экспорт
|
||
|
||
// Запоминать последние
|
||
КлючНастройки = КлючИстории + "." + ПолеВвода.Имя + ".ПоследниеЗначения";
|
||
ПоследниеЗначения = ВосстановитьЗначение(КлючНастройки);
|
||
Если ТипЗнч(ПоследниеЗначения) = Тип("Массив") Тогда
|
||
ПолеВвода.СписокВыбора.Очистить();
|
||
Для Каждого Значение Из ПоследниеЗначения Цикл
|
||
НовыйЭлемент = ПолеВвода.СписокВыбора.Добавить(Значение);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ПолеФайловогоКаталога_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка) Экспорт
|
||
|
||
СтандартнаяОбработка = Ложь;
|
||
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
|
||
ВыборФайла.Каталог = Элемент.Значение;
|
||
Если Не ВыборФайла.Выбрать() Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
ЛксИнтерактивноЗаписатьВЭлементУправления(Элемент, ВыборФайла.Каталог);
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ОткрытьСсылкуВСпискеЛкс(Ссылка) Экспорт
|
||
|
||
ПолноеИмяМД = Ссылка.Метаданные().ПолноеИмя();
|
||
СтруктураПараметры = Новый Структура;
|
||
СтруктураПараметры.Вставить("ТекущаяСтрока", Ссылка);
|
||
ФормаСписка = ПолучитьФорму(ПолноеИмяМД + ".ФормаСписка", СтруктураПараметры, , Новый УникальныйИдентификатор);
|
||
ФормаСписка.Открыть();
|
||
Возврат ФормаСписка;
|
||
|
||
КонецФункции
|
||
|
||
// ИменаКолонок - Строка - имена колонок через запятую
|
||
Процедура ТабличноеПоле_ОтобразитьФлажкиЛкс(ОформлениеСтроки, Знач ИменаКолонок) Экспорт
|
||
|
||
Если ТипЗнч(ИменаКолонок) = Тип("Строка") Тогда
|
||
ИменаКолонок = ЛксПолучитьМассивИзСтрокиСРазделителем(ИменаКолонок, ",", Истина);
|
||
КонецЕсли;
|
||
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
|
||
Ячейка = ОформлениеСтроки.Ячейки[ИмяКолонки];
|
||
//Если Ячейка.ТолькоПросмотр Тогда
|
||
// Продолжить;
|
||
//КонецЕсли;
|
||
Если ТипЗнч(Ячейка.Значение) = Тип("Булево") Тогда
|
||
Ячейка.УстановитьФлажок(Ячейка.Значение);
|
||
Ячейка.УстановитьТекст("");
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ТабличноеПоле__ПриИзмененииФлажкаИис(Элемент, Знач Колонка) Экспорт
|
||
|
||
Если ТипЗнч(Колонка.ЭлементУправления) = Тип("ПолеВвода") Тогда
|
||
Если Истина
|
||
И Колонка.Данные = ""
|
||
И Колонка.ДанныеФлажка = ""
|
||
Тогда
|
||
ОформлениеСтроки = Элемент.ОформлениеСтроки(Элемент.ТекущаяСтрока);
|
||
Колонка.ЭлементУправления.Значение = Не ОформлениеСтроки.Ячейки[Колонка.Имя].Значение;
|
||
//ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Элемент, Колонка, Не ОформлениеСтроки.Ячейки[Колонка.Имя].Значение);
|
||
//глВызватьСобытиеПоОбъектуСистемы(ЭтаФорма.мСвойстваФормы, оПолеВвода, сПриИзменении, ЭтаФорма, Колонка.ЭлементУправления);
|
||
Иначе
|
||
//МетаданныеТипа = глПолучитьМетаданныеТипа(ТипЗнч(Элемент.Значение), "ТипСписка", Истина);
|
||
//РедактированиеВДиалоге = Ложь;
|
||
//Если Истина
|
||
// И МетаданныеТипа <> Неопределено
|
||
// И МетаданныеТипа.КлассМетаданных.Предок = оСсылочный
|
||
//Тогда
|
||
// Попытка
|
||
// ВыбранныйСпособРедактирования = Элемент.СпособРедактирования;
|
||
// Исключение
|
||
// КонецПопытки;
|
||
// РедактированиеВДиалоге = ВыбранныйСпособРедактирования <> СпособРедактированияСписка.ВСписке;
|
||
//КонецЕсли;
|
||
//РазрешитьИзменение = Истина;
|
||
//Если РедактированиеВДиалоге Тогда
|
||
//Иначе
|
||
//Элемент.ЗакончитьРедактированиеСтроки(Ложь);
|
||
Элемент.ИзменитьСтроку();
|
||
ЗначениеЯчейки = Колонка.ЭлементУправления.Значение;
|
||
Если ТипЗнч(ЗначениеЯчейки) = Тип("Булево") Тогда
|
||
ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Элемент, Колонка, Не ЗначениеЯчейки, , , Ложь);
|
||
//Элемент.ТекущаяКолонка = Колонка;
|
||
КонецЕсли;
|
||
Элемент.ЗакончитьРедактированиеСтроки(Ложь);
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьПиктограммуТипаЛкс(Тип) Экспорт
|
||
|
||
ИмяОбщегоТипа = Неопределено;
|
||
КлючПоиска = Новый Структура("ИД", ПолучитьИдентификаторТипаЛкс(Тип));
|
||
НайденныеСтроки = ирКэш.Получить().ТаблицаОбщихТипов.НайтиСтроки(КлючПоиска);
|
||
Если НайденныеСтроки.Количество() > 0 Тогда
|
||
ИмяОбщегоТипа = НайденныеСтроки[0].Слово;
|
||
Иначе
|
||
//СтруктураТипа = ирКэш.Получить().ПолучитьСтруктуруТипаИзКонкретногоТипа(Тип);
|
||
//ИмяОбщегоТипа = СтруктураТипа.ИмяОбщегоТипа;
|
||
ОбъектМД = Метаданные.НайтиПоТипу(Тип);
|
||
Если ОбъектМД <> Неопределено Тогда
|
||
ТекущееИмяТипа = ОбъектМД.ПолноеИмя();
|
||
ИмяОбщегоТипа = ЛксПолучитьПервыйФрагмент(ТекущееИмяТипа);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Картинка = Неопределено;
|
||
Если ИмяОбщегоТипа <> Неопределено Тогда
|
||
ИмяКартинки = "ир" + ЛксПолучитьПервыйФрагмент(ИмяОбщегоТипа);
|
||
Попытка
|
||
Пустышка = БиблиотекаКартинок[ИмяКартинки];
|
||
Исключение
|
||
ИмяКартинки = ИмяОбщегоТипа;
|
||
Попытка
|
||
Пустышка = БиблиотекаКартинок[ИмяКартинки];
|
||
Исключение
|
||
ИмяКартинки = Неопределено;
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
Если ИмяКартинки <> Неопределено Тогда
|
||
Картинка = БиблиотекаКартинок[ИмяКартинки];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат Картинка;
|
||
|
||
КонецФункции
|
||
|
||
// ИменаКолонок - Строка - имена колонок через запятую
|
||
Процедура ТабличноеПоле_ОтобразитьПиктограммыТиповЛкс(ОформлениеСтроки, ИменаКолонок) Экспорт
|
||
|
||
Если ТипЗнч(ИменаКолонок) = Тип("Строка") Тогда
|
||
ИменаКолонок = ЛксПолучитьМассивИзСтрокиСРазделителем(ИменаКолонок, ",", Истина);
|
||
КонецЕсли;
|
||
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
|
||
Ячейка = ОформлениеСтроки.Ячейки.Найти(ИмяКолонки);
|
||
//:Ячейка=Новый("ОформлениеЯчейки")
|
||
Если Ячейка <> Неопределено Тогда
|
||
ДанныеКартинки = Ячейка.Значение;
|
||
Если ТипЗнч(ДанныеКартинки) = Тип("ПолеКомпоновкиДанных") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
СсылкаКартинка = Неопределено;
|
||
ТипЗначения = ТипЗнч(ДанныеКартинки);
|
||
Если Истина
|
||
И ТипЗначения = Тип("Булево")
|
||
И Ячейка.ОтображатьФлажок
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КартинкаТипа = ПолучитьПиктограммуТипаЛкс(ТипЗначения);
|
||
Если КартинкаТипа <> Неопределено Тогда
|
||
Ячейка.УстановитьКартинку(КартинкаТипа);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ТабличноеПоле_СколькоСтрокЛкс(ТабличноеПоле) Экспорт
|
||
|
||
ЗначениеЭУ = ТабличноеПоле.Значение;
|
||
//ТипЗначенияТабличногоПоля = ТипЗнч(ИсточникДействий.Значение);
|
||
//ИмяОбщегоТипа = ПолучитьИмяОбщегоТипаИзКонкретногоТипа, ТипЗначенияТабличногоПоля);
|
||
Попытка
|
||
Количество = ЗначениеЭУ.Количество();
|
||
Попытка
|
||
Отбор = ТабличноеПоле.ОтборСтрок;
|
||
Исключение
|
||
КонецПопытки;
|
||
Исключение
|
||
Попытка
|
||
//Коллекция компоновки
|
||
Количество = ЗначениеЭУ.Элементы.Количество();
|
||
//Суффикс = "*";
|
||
Исключение
|
||
Попытка
|
||
//Или ИмяОбщегоТипа = "ДеревоЗначений"
|
||
Количество = ЗначениеЭУ.Строки.Количество();
|
||
Суффикс = "*";
|
||
Исключение
|
||
// ДинамическийСписок
|
||
ОбъектМД = Метаданные.НайтиПоТипу(ТабличноеПоле.ТипЗначения.Типы()[0]);
|
||
Если ОбъектМД = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
КорневойТип = ЛксПолучитьКорневойТипКонфигурации(ОбъектМД);
|
||
ТекстЗапроса = " ИЗ " + ОбъектМД.ПолноеИмя();
|
||
Если КорневойТип = "РегистрБухгалтерии" Тогда
|
||
ТекстЗапроса = ТекстЗапроса + ".ДвиженияССубконто";
|
||
КонецЕсли;
|
||
ПостроительПростой = Новый ПостроительЗапроса("ВЫБРАТЬ * " + ТекстЗапроса);
|
||
ПостроительПростой.ЗаполнитьНастройки();
|
||
ТекстОтбор = "";
|
||
Для Каждого ДоступноеПоле Из ПостроительПростой.ДоступныеПоля Цикл
|
||
Если Не ДоступноеПоле.Отбор Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ТекстОтбор <> "" Тогда
|
||
ТекстОтбор = ТекстОтбор + ", ";
|
||
КонецЕсли;
|
||
ТекстОтбор = ТекстОтбор + "Т." + ДоступноеПоле.ПутьКДанным;
|
||
КонецЦикла;
|
||
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ КОЛИЧЕСТВО(*) " + ТекстЗапроса + " КАК Т {ГДЕ " + ТекстОтбор + "}";
|
||
ПостроительЗапроса = Новый ПостроительЗапроса(ТекстЗапроса);
|
||
ПостроительЗапроса.ЗаполнитьНастройки();
|
||
|
||
ЛксСкопироватьОтбор(ПостроительЗапроса.Отбор, ТабличноеПоле.Значение.Отбор, Истина, Истина);
|
||
Отбор = ТабличноеПоле.Значение.Отбор;
|
||
Количество = ПостроительЗапроса.Результат.Выгрузить()[0][0];
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
|
||
Текст = "Количество строк ";
|
||
Если Отбор <> Неопределено Тогда
|
||
Текст = Текст + "с отбором """ + Отбор + """ ";
|
||
КонецЕсли;
|
||
Сообщить(Текст + "- " + Формат(Количество, "ЧН=") + "(" + Формат(Количество, "ЧН=; ЧГ=") + ")" + Суффикс);
|
||
Результат = Количество;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Получает картинку для корневого типа конфигурации.
|
||
//
|
||
// Параметры:
|
||
// пКорневойТип – Строка – корневой тип конфигурации.
|
||
//
|
||
// Возвращаемое значение:
|
||
// – Картинка – корневого типа конфигурации.
|
||
//
|
||
Функция ПолучитьКартинкуКорневогоТипаЛкс(пКорневойТип) Экспорт
|
||
|
||
Попытка
|
||
Возврат БиблиотекаКартинок["ир" + пКорневойТип];
|
||
Исключение
|
||
Попытка
|
||
Возврат БиблиотекаКартинок[пКорневойТип];
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецПопытки;
|
||
Возврат Новый Картинка();
|
||
|
||
КонецФункции // ПолучитьКартинкуКорневогоТипа()
|
||
|
||
Функция ОткрытьТекущуюСтрокуТабличногоПоляТаблицыБДВРедактореОбъектаБДЛкс(ТабличноеПоле, ПолноеИмяМД = Неопределено, ДоступныеПоляВыбора = Неопределено) Экспорт
|
||
|
||
Если ПолноеИмяМД = Неопределено Тогда
|
||
ПолноеИмяМД = Метаданные.НайтиПоТипу(ТипЗнч(ТабличноеПоле.Значение)).ПолноеИмя();
|
||
КонецЕсли;
|
||
ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМД);
|
||
ПолноеИмяТаблицы = ирНеглобальный.ПолучитьИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД);
|
||
ТипТаблицы = ирНеглобальный.ПолучитьТипТаблицыБДЛкс(ПолноеИмяМД);
|
||
СтруктураКлюча = ирНеглобальный.ПолучитьСтруктуруКлючаТаблицыБДЛкс(ПолноеИмяМД);
|
||
КорневойТип = ЛксПолучитьПервыйФрагмент(ПолноеИмяМД);
|
||
ТекущаяСтрока = ТабличноеПоле.ТекущаяСтрока;
|
||
Если ТекущаяСтрока = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ТекущаяКолонка = ТабличноеПоле.ТекущаяКолонка;
|
||
Если Истина
|
||
И ТекущаяКолонка <> Неопределено
|
||
И (Ложь
|
||
Или ДоступныеПоляВыбора = Неопределено
|
||
Или ДоступныеПоляВыбора.НайтиПоле(Новый ПолеКомпоновкиДанных(ТекущаяКолонка.Данные)) <> Неопределено)
|
||
Тогда
|
||
ИмяКолонки = ТекущаяКолонка.Данные;
|
||
Иначе
|
||
ИмяКолонки = "";
|
||
КонецЕсли;
|
||
Если СтруктураКлюча.Свойство("НомерСтроки") Тогда
|
||
СтруктураКлючаСтроки = Новый Структура("НомерСтроки");
|
||
ИначеЕсли СтруктураКлюча.Свойство("Период") Тогда
|
||
СтруктураКлючаСтроки = Новый Структура("Период");
|
||
Иначе
|
||
СтруктураКлючаСтроки = Неопределено;
|
||
КонецЕсли;
|
||
Если СтруктураКлючаСтроки <> Неопределено Тогда
|
||
ЗаполнитьЗначенияСвойств(СтруктураКлючаСтроки, ТекущаяСтрока);
|
||
КонецЕсли;
|
||
Если ЛксЛиКорневойТипСсылки(ТипТаблицы) Тогда
|
||
Ссылка = ТекущаяСтрока.Ссылка;
|
||
ИначеЕсли ЛксЛиТипВложеннойТаблицыБД(ТипТаблицы) Тогда
|
||
Ссылка = ТекущаяСтрока.Ссылка;
|
||
ИначеЕсли Истина
|
||
И (Ложь
|
||
Или ЛксЛиКорневойТипРегистраБД(ТипТаблицы)
|
||
Или ЛксЛиКорневойТипПоследовательности(ТипТаблицы))
|
||
И (Ложь
|
||
Или ТипТаблицы <> "РегистрСведений"
|
||
Или ОбъектМД.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый)
|
||
Тогда
|
||
Ссылка = ТекущаяСтрока.Регистратор;
|
||
Иначе
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ФормаРедактора = ирНеглобальный.ПолучитьФормуЛкс("Обработка.ирРедакторОбъектаБД.Форма", , , Ссылка);
|
||
ФормаРедактора.Открыть();
|
||
//ФормаРедактора.ПоказатьЯчейкуДанныхОбъекта(ПолноеИмяТаблицы, ИмяКолонки, СтруктураКлючаСтроки);
|
||
ФормаРедактора.ПоказатьЯчейкуДанныхОбъекта(ПолноеИмяМД, ИмяКолонки, СтруктураКлючаСтроки);
|
||
Возврат ФормаРедактора;
|
||
|
||
КонецФункции
|
||
|
||
Функция КонтрольРазмераВыборкиПользователемЛкс(ЗапросИлиПостроитель, МаксимальноеЧислоСтрок = 500000) Экспорт
|
||
|
||
КоличествоСтрокРезультата = ирКэш.Получить().ПолучитьГрубоКоличествоСтрокВРезультатеЗапроса(ЗапросИлиПостроитель);
|
||
Если Истина
|
||
И ТипЗнч(КоличествоСтрокРезультата) = Тип("Число")
|
||
И КоличествоСтрокРезультата > МаксимальноеЧислоСтрок
|
||
Тогда
|
||
Кнопки = Новый СписокЗначений;
|
||
Кнопки.Добавить("Все", "Все");
|
||
Кнопки.Добавить("Часть", "Первые " + Формат(МаксимальноеЧислоСтрок, "ЧГ="));
|
||
Ответ = Вопрос("Загружаемая таблица содержит " + КоличествоСтрокРезультата + " строк. Сколько строк загружать?", Кнопки, , "Часть");
|
||
//Если Ответ <> КодВозвратаДиалога.ОК Тогда
|
||
// Возврат;
|
||
//КонецЕсли;
|
||
Если Ответ = "Все" Тогда
|
||
МаксимальноеЧислоСтрок = 0;
|
||
КонецЕсли;
|
||
Иначе
|
||
МаксимальноеЧислоСтрок = 0;
|
||
КонецЕсли;
|
||
Возврат МаксимальноеЧислоСтрок;
|
||
|
||
КонецФункции
|
||
|
||
Функция ВычислитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоМетаданных, ИмяКлючевойКолонки = "ПолноеИмяОбъекта", ИмяКолонкиКоличества = "КоличествоСтрок",
|
||
ЛиТаблицыИзменений = Ложь, СтруктураОтбора = Неопределено, ТолькоРазрешенные = Истина) Экспорт
|
||
|
||
#Если _ Тогда
|
||
ДеревоМетаданных = Новый ДеревоЗначений
|
||
#КонецЕсли
|
||
МассивКлючей = Новый Массив;
|
||
Для Каждого СтрокаДерева1 Из ДеревоМетаданных.Строки Цикл
|
||
Для Каждого СтрокаДерева2 Из СтрокаДерева1.Строки Цикл
|
||
Если ЛксПолучитьПервыйФрагмент(СтрокаДерева2[ИмяКлючевойКолонки]) = "ВнешнийИсточникДанных" Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
МассивКлючей.Добавить(СтрокаДерева2[ИмяКлючевойКолонки]);
|
||
Для Каждого СтрокаДерева3 Из СтрокаДерева2.Строки Цикл
|
||
МассивКлючей.Добавить(СтрокаДерева3[ИмяКлючевойКолонки]);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
ТекстПакета = "";
|
||
ТекстЗапроса = "";
|
||
СчетчикТаблиц = 0;
|
||
Для Каждого КлючМД Из МассивКлючей Цикл
|
||
ИмяТаблицы = ирНеглобальный.ПолучитьИмяТаблицыИзМетаданныхЛкс(КлючМД, ЛиТаблицыИзменений, ТолькоРазрешенные);
|
||
Если ИмяТаблицы = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ТекстЗапроса <> "" Тогда
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
|ОБЪЕДИНИТЬ ВСЕ";
|
||
КонецЕсли;
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
|ВЫБРАТЬ
|
||
| """ + КлючМД + """ КАК " + ИмяКлючевойКолонки + ",
|
||
| Количество(*) КАК " + ИмяКолонкиКоличества + ",";
|
||
Если ЛиТаблицыИзменений Тогда
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
| СУММА(ВЫБОР КОГДА Т.НомерСообщения ЕСТЬ NULL ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК КоличествоНевыгруженных,
|
||
| СУММА(ВЫБОР КОГДА Т.НомерСообщения ЕСТЬ NULL ТОГДА 0 ИНАЧЕ 1 КОНЕЦ) КАК КоличествоВыгруженных,";
|
||
КонецЕсли;
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
| 1
|
||
|ИЗ " + ИмяТаблицы + " КАК Т
|
||
|ГДЕ 1 = 1";
|
||
Если СтруктураОтбора <> Неопределено Тогда
|
||
Для Каждого КлючИЗначение Из СтруктураОтбора Цикл
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
| И Т." + КлючИЗначение.Ключ + " = &" + КлючИЗначение.Ключ;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
СчетчикТаблиц = СчетчикТаблиц + 1;
|
||
Если СчетчикТаблиц = 255 Тогда
|
||
Если ТекстПакета <> "" Тогда
|
||
ТекстПакета = ТекстПакета + "
|
||
|;";
|
||
КонецЕсли;
|
||
ТекстПакета = ТекстПакета + ТекстЗапроса;
|
||
ТекстЗапроса = "";
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если ТекстПакета <> "" Тогда
|
||
ТекстПакета = ТекстПакета + "
|
||
|;";
|
||
КонецЕсли;
|
||
ТекстПакета = ТекстПакета + ТекстЗапроса;
|
||
Если ЗначениеЗаполнено(ТекстПакета) Тогда
|
||
Запрос = Новый Запрос;
|
||
Если СтруктураОтбора <> Неопределено Тогда
|
||
ЛксСкопироватьУниверсальнуюКоллекцию(СтруктураОтбора, Запрос.Параметры);
|
||
КонецЕсли;
|
||
Запрос.Текст = ТекстПакета;
|
||
РезультатПакета = Запрос.ВыполнитьПакет();
|
||
Иначе
|
||
РезультатПакета = Новый ТаблицаЗначений;
|
||
// Возможно здесь еще и колонки добавить придется
|
||
КонецЕсли;
|
||
Возврат РезультатПакета;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ЗаполнитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоМетаданных, РезультатПакета, ИмяКлючевойКолонки = "ПолноеИмяОбъекта", ИмяКолонкиКоличества = "КоличествоСтрок") Экспорт
|
||
|
||
#Если _ Тогда
|
||
ДеревоМетаданных = Новый ДеревоЗначений
|
||
#КонецЕсли
|
||
Для Каждого РезультатЗапроса Из РезультатПакета Цикл
|
||
ТаблицаРезультата = РезультатЗапроса.Выгрузить();
|
||
Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
|
||
СтрокаДерева = ДеревоМетаданных.Строки.Найти(СтрокаРезультата[ИмяКлючевойКолонки], ИмяКлючевойКолонки, Истина);
|
||
Если СтрокаДерева <> Неопределено Тогда
|
||
СтароеКоличество = СтрокаДерева[ИмяКолонкиКоличества];
|
||
Если ТипЗнч(СтароеКоличество) <> Тип("Число") Тогда
|
||
СтароеКоличество = 0;
|
||
КонецЕсли;
|
||
ЗаполнитьЗначенияСвойств(СтрокаДерева, СтрокаРезультата);
|
||
Если СтрокаДерева.Уровень() > 1 Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Родитель = СтрокаДерева.Родитель;
|
||
Пока Родитель <> Неопределено Цикл
|
||
КоличествоРодителя = Родитель[ИмяКолонкиКоличества];
|
||
Если ТипЗнч(КоличествоРодителя) <> Тип("Число") Тогда
|
||
КоличествоРодителя = 0;
|
||
КонецЕсли;
|
||
Родитель[ИмяКолонкиКоличества] = КоличествоРодителя - СтароеКоличество + СтрокаДерева[ИмяКолонкиКоличества];
|
||
Родитель = Родитель.Родитель;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОбновитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоМетаданных, ИмяКлючевойКолонки = "ПолноеИмяОбъекта", ИмяКолонкиКоличества = "КоличествоСтрок",
|
||
ЛиТаблицыИзменений = Ложь, СтруктураОтбора = Неопределено) Экспорт
|
||
|
||
#Если _ Тогда
|
||
ДеревоМетаданных = Новый ДеревоЗначений
|
||
#КонецЕсли
|
||
РезультатПакета = ВычислитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоМетаданных, ИмяКлючевойКолонки, ИмяКолонкиКоличества, ЛиТаблицыИзменений, СтруктураОтбора);
|
||
ЗаполнитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоМетаданных, РезультатПакета, ИмяКлючевойКолонки, ИмяКолонкиКоличества);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УстановитьЗначениеКолонкиДереваЛкс(ДеревоЗначений, ИмяКолонки = "Пометка", НовоеЗначение = Истина) Экспорт
|
||
|
||
ВсеСтроки = ирНеглобальный.ПолучитьВсеСтрокиДереваЗначенийЛкс(ДеревоЗначений);
|
||
Для Каждого СтрокаДерева Из ВсеСтроки Цикл
|
||
СтрокаДерева.Пометка = НовоеЗначение;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьМетаданныеНаборовЗаписейПоРегистраторуЛкс(мдОбъекта) Экспорт
|
||
|
||
ОбъектыМД = Новый Массив();
|
||
Для Каждого МетаРегистр из мдОбъекта.Движения Цикл
|
||
ОбъектыМД.Добавить(МетаРегистр);
|
||
КонецЦикла;
|
||
Для Каждого МетаПоследовательность Из Метаданные.Последовательности Цикл
|
||
Если МетаПоследовательность.Документы.Содержит(мдОбъекта) Тогда
|
||
ОбъектыМД.Добавить(МетаПоследовательность);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат ОбъектыМД;
|
||
|
||
КонецФункции
|
||
|
||
// НовыйРежим - Булево - Имя/Синоним
|
||
Процедура ТабличноеПоле_ОбновитьКолонкиИмяСинонимЛкс(ТабличноеПоле, НовыйРежим, ИмяКолонкиИмя = "Имя", ИмяКолонкиСиноним = "Представление") Экспорт
|
||
|
||
КолонкиТП = ТабличноеПоле.Колонки;
|
||
КолонкаИмя = КолонкиТП[ИмяКолонкиИмя];
|
||
КолонкаСиноним = КолонкиТП[ИмяКолонкиСиноним];
|
||
КолонкаИмя.Видимость = НовыйРежим;
|
||
КолонкаСиноним.Видимость = Не НовыйРежим;
|
||
Если ТипЗнч(ТабличноеПоле.Значение) = Тип("ДеревоЗначений") Тогда
|
||
КолонкаИмя.ОтображатьИерархию = НовыйРежим;
|
||
КолонкаСиноним.ОтображатьИерархию = Не НовыйРежим;
|
||
КонецЕсли;
|
||
ИндексКолонкиИмя = КолонкиТП.Индекс(КолонкаИмя);
|
||
ИндексКолонкиСиноним = КолонкиТП.Индекс(КолонкаСиноним);
|
||
Если НовыйРежим = (ИндексКолонкиИмя > ИндексКолонкиСиноним) Тогда
|
||
КолонкиТП.Сдвинуть(КолонкаИмя, ИндексКолонкиСиноним - ИндексКолонкиИмя);
|
||
КонецЕсли;
|
||
Если НовыйРежим Тогда
|
||
ТабличноеПоле.ТекущаяКолонка = ТабличноеПоле.Колонки.Имя;
|
||
Иначе
|
||
ТабличноеПоле.ТекущаяКолонка = ТабличноеПоле.Колонки.Представление;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ТабличноеПоле_ОформитьЯчейкиИмяСинонимЛкс(ТабличноеПоле, ОформлениеСтроки,
|
||
ИмяКолонкиИмя = "Имя", ИмяКолонкиСиноним = "Представление", ИмяКолонкиИндексКартинки = "ИндексКартинки", ДанныеФлажка = "") Экспорт
|
||
|
||
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
|
||
Если ТабличноеПоле.Колонки[ИмяКолонкиИмя].Видимость Тогда
|
||
ВедущаяКолонка = ТабличноеПоле.Колонки[ИмяКолонкиИмя];
|
||
ВедущийИндекс = ТабличноеПоле.Колонки.Индекс(ВедущаяКолонка);
|
||
КонецЕсли;
|
||
Если ТабличноеПоле.Колонки[ИмяКолонкиСиноним].Видимость Тогда
|
||
Если Ложь
|
||
Или ВедущаяКолонка = Неопределено
|
||
Или ТабличноеПоле.Колонки.Индекс(ТабличноеПоле.Колонки[ИмяКолонкиСиноним]) < ВедущийИндекс
|
||
Тогда
|
||
ВедущаяКолонка = ТабличноеПоле.Колонки[ИмяКолонкиСиноним];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если ВедущаяКолонка <> Неопределено Тогда
|
||
Ячейка = ОформлениеСтроки.Ячейки[ВедущаяКолонка.Имя];
|
||
ИндексКартинки = ДанныеСтроки[ИмяКолонкиИндексКартинки];
|
||
Если ИндексКартинки >= 0 Тогда
|
||
Ячейка.ОтображатьКартинку = Истина;
|
||
Ячейка.ИндексКартинки = ИндексКартинки;
|
||
КонецЕсли;
|
||
Если ДанныеФлажка <> "" Тогда
|
||
Ячейка.ОтображатьФлажок = Истина;
|
||
Ячейка.Флажок = ДанныеСтроки[ДанныеФлажка];
|
||
КонецЕсли;
|
||
КоличествоДочерних = ДанныеСтроки.Строки.Количество();
|
||
Если КоличествоДочерних > 0 Тогда
|
||
Ячейка.УстановитьТекст(Ячейка.Текст + " (" + КоличествоДочерних + ")");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ОпределитьВедущуюСтроковуюКолонкуТабличногоПоляЛкс(ТабличноеПолеДерева) Экспорт
|
||
|
||
Если Истина
|
||
И ТабличноеПолеДерева.ТекущаяКолонка <> Неопределено
|
||
И ЗначениеЗаполнено(ТабличноеПолеДерева.ТекущаяКолонка.Данные)
|
||
И ТабличноеПолеДерева.Значение.Колонки[ТабличноеПолеДерева.ТекущаяКолонка.Данные].ТипЗначения.СодержитТип(Тип("Строка"))
|
||
Тогда
|
||
ТекущаяКолонкаТП = ТабличноеПолеДерева.ТекущаяКолонка;
|
||
Иначе
|
||
Для Каждого КолонкаТП Из ТабличноеПолеДерева.Колонки Цикл
|
||
Если Не КолонкаТП.Видимость Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
КолонкаДерева = ТабличноеПолеДерева.Значение.Колонки[КолонкаТП.Данные];
|
||
Если КолонкаДерева.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
|
||
ТекущаяКолонкаТП = КолонкаТП;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат ТекущаяКолонкаТП;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиСтрокуТабличногоПоляДереваЗначенийСоСложнымФильтромЛкс(ТабличноеПолеДерева, ПолеВводаФильтра, Подстроки = "") Экспорт
|
||
|
||
ТекущаяКолонкаТП = ОпределитьВедущуюСтроковуюКолонкуТабличногоПоляЛкс(ТабличноеПолеДерева);
|
||
Если ТекущаяКолонкаТП = Неопределено Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ИмяТекущейКолонки = ТекущаяКолонкаТП.Данные;
|
||
Если Не ЗначениеЗаполнено(ИмяТекущейКолонки) Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
ВсеСтроки = ирНеглобальный.ПолучитьВсеСтрокиДереваЗначенийЛкс(ТабличноеПолеДерева.Значение);
|
||
ТекущаяСтрока = ТабличноеПолеДерева.ТекущаяСтрока;
|
||
Если Подстроки = "" Тогда
|
||
Подстроки = ПолеВводаФильтра.Значение;
|
||
КонецЕсли;
|
||
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(НРег(Подстроки), " ", Истина);
|
||
ИндексСтроки = 0;
|
||
Если ТекущаяСтрока <> Неопределено Тогда
|
||
Если ирНеглобальный.ЛиСтрокаСодержитВсеПодстрокиЛкс(ТекущаяСтрока[ИмяТекущейКолонки], Фрагменты) Тогда
|
||
ИндексСтроки = ВсеСтроки.Найти(ТекущаяСтрока) + 1;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Успех = Ложь;
|
||
Для ИндексСтроки = ИндексСтроки По ВсеСтроки.Количество() - 1 Цикл
|
||
ТекущаяСтрока = ВсеСтроки[ИндексСтроки];
|
||
Если ирНеглобальный.ЛиСтрокаСодержитВсеПодстрокиЛкс(ТекущаяСтрока[ИмяТекущейКолонки], Фрагменты) Тогда
|
||
ТабличноеПолеДерева.ТекущаяСтрока = ТекущаяСтрока;
|
||
ТабличноеПолеДерева.ТекущаяКолонка = ТекущаяКолонкаТП;
|
||
Успех = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если Успех Тогда
|
||
ПолеВводаФильтра.ЦветФонаПоля = Новый Цвет();
|
||
Иначе
|
||
ТекущаяСтрока = Неопределено;
|
||
ПолеВводаФильтра.ЦветФонаПоля = ЦветаСтиля.ирЦветФонаОшибки;
|
||
КонецЕсли;
|
||
Возврат ТекущаяСтрока;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ТабличноеПолеДеревоЗначений_РазвернутьВсеСтрокиЛкс(ТабличноеПоле, ЧислоПервыхИгнорируемыхСтрок = 0) Экспорт
|
||
|
||
Счетчик = 0;
|
||
Для Каждого Строка Из ТабличноеПоле.Значение.Строки Цикл
|
||
Счетчик = Счетчик + 1;
|
||
Если Счетчик > ЧислоПервыхИгнорируемыхСтрок Тогда
|
||
ТабличноеПоле.Развернуть(Строка, Истина);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ТабличноеПолеДеревоЗначений_АвтоРазвернутьВсеСтрокиЛкс(ТабличноеПоле, МаксимальноеЧислоСтрок = 30, ТекущаяСтрокаУстановлена = Ложь) Экспорт
|
||
|
||
ВсеСтроки = ПолучитьВсеСтрокиДереваЗначенийЛкс(ТабличноеПоле.Значение);
|
||
ЧислоДинамическихСтрок = ВсеСтроки.Количество();
|
||
Если ЧислоДинамическихСтрок > 0 Тогда
|
||
Если ЧислоДинамическихСтрок <= МаксимальноеЧислоСтрок Тогда
|
||
ТабличноеПолеДеревоЗначений_РазвернутьВсеСтрокиЛкс(ТабличноеПоле);
|
||
Если Не ТекущаяСтрокаУстановлена Тогда
|
||
ТабличноеПоле.ТекущаяСтрока = ТабличноеПоле.Значение.Строки[0].Строки[0];
|
||
КонецЕсли;
|
||
Иначе
|
||
Если Не ТекущаяСтрокаУстановлена Тогда
|
||
ТабличноеПоле.ТекущаяСтрока = ТабличноеПоле.Значение.Строки[0];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ДобавитьСсылкуВИзбранноеЛкс(Ссылка, ДобавлятьВИзбранноеРаботыПользователя = Истина, ДобавлятьВИзрабнноеИнтерфейснойПанели = Истина) Экспорт
|
||
|
||
Если ДобавлятьВИзбранноеРаботыПользователя Тогда
|
||
Избранное = ХранилищеСистемныхНастроек.Загрузить("Общее/ИзбранноеРаботыПользователя");
|
||
Если Избранное = Неопределено Тогда
|
||
Избранное = Новый ИзбранноеРаботыПользователя;
|
||
КонецЕсли;
|
||
ЭлементИзбранного = Новый ЭлементИзбранногоРаботыПользователя;
|
||
ЭлементИзбранного.НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Ссылка);
|
||
Избранное.Добавить(ЭлементИзбранного);
|
||
ХранилищеСистемныхНастроек.Сохранить("Общее/ИзбранноеРаботыПользователя", "", Избранное);
|
||
КонецЕсли;
|
||
Если ДобавлятьВИзрабнноеИнтерфейснойПанели Тогда
|
||
ФормаИнтерфейснойПанели = Обработки.ирИнтерфейснаяПанель.ПолучитьФорму();
|
||
СтруктураЭлемента = Новый Структура();
|
||
СтруктураЭлемента.Вставить("Вид", Ссылка.Метаданные().ПолноеИмя());
|
||
СтруктураЭлемента.Вставить("Представление", "" + Ссылка);
|
||
СтруктураЭлемента.Вставить("Имя", "" + Ссылка.УникальныйИдентификатор());
|
||
ФормаИнтерфейснойПанели.ДобавитьСтрокуВСтатическуюВетку(СтруктураЭлемента, "Избранное");
|
||
Если ФормаИнтерфейснойПанели.Открыта() Тогда
|
||
ФормаИнтерфейснойПанели.ЗаполнитьСтатическиеВеткиДереваИнтерфейса(ФормаИнтерфейснойПанели);
|
||
Иначе
|
||
ФормаИнтерфейснойПанели.СохранитьНастройки(ФормаИнтерфейснойПанели);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецФункции
|
||
|
||
//
|
||
Функция ТрансформироватьОтборВОтборКомпоновкиЛкс(Знач ОтборКомпоновкиДанных, Знач ЭлементыОтбора, Знач СоответствиеИмен = Неопределено,
|
||
Знач ПроверятьДоступностьПолей = Истина, Знач ДоступныеПоляОтбора = Неопределено, ПропускатьВыключенные = Ложь) Экспорт
|
||
|
||
Если СоответствиеИмен = Неопределено Тогда
|
||
СоответствиеИмен = Новый ТаблицаЗначений();
|
||
СоответствиеИмен.Колонки.Добавить("Источник");
|
||
//СоответствиеИмен.Колонки.Добавить("Приемник");
|
||
КонецЕсли;
|
||
Если ДоступныеПоляОтбора = Неопределено Тогда
|
||
ДоступныеПоляОтбора = ОтборКомпоновкиДанных.ДоступныеПоляОтбора;
|
||
КонецЕсли;
|
||
ИндексГраницы = ЭлементыОтбора.Количество() - 1;
|
||
ИзмененныеЭлементыОтбора = Новый Массив;
|
||
Платформа = ирКэш.Получить();
|
||
Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл
|
||
Если Истина
|
||
И ПропускатьВыключенные
|
||
И Не ЭлементОтбора.Использование
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
|
||
ПриемникОтбора = ОтборКомпоновкиДанных.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
|
||
ЗаполнитьЗначенияСвойств(ПриемникОтбора, ЭлементОтбора);
|
||
ТрансформироватьОтборВОтборКомпоновкиЛкс(ПриемникОтбора, ЭлементОтбора.Элементы, СоответствиеИмен, , ДоступныеПоляОтбора);
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
|
||
Если ТипЗнч(ЭлементОтбора.ЛевоеЗначение) <> Тип("ПолеКомпоновкиДанных") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
//ПутьКДаннымЛевый = Неопределено;
|
||
//Если ТипЗнч(ЭлементОтбора.ЛевоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда
|
||
ПутьКДаннымЛевый = "" + ЭлементОтбора.ЛевоеЗначение;
|
||
//Иначе
|
||
// ЛевоеЗначение = ЭлементОтбора.ЛевоеЗначение;
|
||
//КонецЕсли;
|
||
ПутьКДаннымПравый = Неопределено;
|
||
Если ТипЗнч(ЭлементОтбора.ПравоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда
|
||
ПутьКДаннымПравый = "" + ЭлементОтбора.ПравоеЗначение;
|
||
Иначе
|
||
ПравоеЗначение = ЭлементОтбора.ПравоеЗначение;
|
||
КонецЕсли;
|
||
лВидСравнения = ЭлементОтбора.ВидСравнения;
|
||
Иначе
|
||
СтрокаВидаСравнения = Платформа.СоответствиеВидовСравнения.Найти(ЭлементОтбора.ВидСравнения, "Построитель");
|
||
Если СтрокаВидаСравнения = Неопределено Тогда
|
||
// %%%% Здесь можно добавить интеллекта
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПутьКДаннымЛевый = ЭлементОтбора.ПутьКДанным;
|
||
ПутьКДаннымПравый = Неопределено;
|
||
лВидСравнения = СтрокаВидаСравнения.Компоновка;
|
||
ПравоеЗначение = ЭлементОтбора.Значение;
|
||
КонецЕсли;
|
||
|
||
//Если ПутьКДаннымЛевый <> Неопределено Тогда
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПутьКДаннымЛевый);
|
||
СтрокаИсточника = СоответствиеИмен.Найти(НРег(МассивФрагментов[0]), "Источник");
|
||
Если СтрокаИсточника <> Неопределено Тогда
|
||
МассивФрагментов[0] = СтрокаИсточника.Приемник;
|
||
КонецЕсли;
|
||
ПутьКДанным = ЛксПолучитьСтрокуСРазделителемИзМассива(МассивФрагментов, ".");
|
||
ПолеКомпоновки = Новый ПолеКомпоновкиДанных(ПутьКДанным);
|
||
ПолеОтбора = Неопределено;
|
||
Для Каждого лЭлементОтбора Из ОтборКомпоновкиДанных.Элементы Цикл
|
||
Если Истина
|
||
И ТипЗнч(лЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных")
|
||
И лЭлементОтбора.ЛевоеЗначение = ПолеКомпоновки
|
||
И ИзмененныеЭлементыОтбора.Найти(лЭлементОтбора) = Неопределено
|
||
Тогда
|
||
ПолеОтбора = лЭлементОтбора;
|
||
ИзмененныеЭлементыОтбора.Добавить(ПолеОтбора);
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если ПолеОтбора = Неопределено Тогда
|
||
ДоступноеПоле = ДоступныеПоляОтбора.НайтиПоле(ПолеКомпоновки);
|
||
Если Истина
|
||
И ПроверятьДоступностьПолей
|
||
И ДоступноеПоле = Неопределено
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПолеОтбора = ОтборКомпоновкиДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
|
||
ПолеОтбора.ЛевоеЗначение = ПолеКомпоновки;
|
||
КонецЕсли;
|
||
//Иначе
|
||
// ПолеОтбора.ПравоеЗначение = ЛевоеЗначение;
|
||
//КонецЕсли;
|
||
Если ПутьКДаннымПравый <> Неопределено Тогда
|
||
МассивФрагментов = ЛксПолучитьМассивИзСтрокиСРазделителем(ПутьКДаннымПравый);
|
||
СтрокаИсточника = СоответствиеИмен.Найти(НРег(МассивФрагментов[0]), "Источник");
|
||
Если СтрокаИсточника <> Неопределено Тогда
|
||
МассивФрагментов[0] = СтрокаИсточника.Приемник;
|
||
КонецЕсли;
|
||
ПутьКДанным = ЛксПолучитьСтрокуСРазделителемИзМассива(МассивФрагментов, ".");
|
||
ПолеКомпоновки = Новый ПолеКомпоновкиДанных(ПутьКДанным);
|
||
ПолеОтбора.ПравоеЗначение = ПолеКомпоновки;
|
||
Иначе
|
||
ПолеОтбора.ПравоеЗначение = ПравоеЗначение;
|
||
КонецЕсли;
|
||
ПолеОтбора.ВидСравнения = лВидСравнения;
|
||
ПолеОтбора.Использование = ЭлементОтбора.Использование;
|
||
КонецЦикла;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ОткрытьОбъектыИзВыделенныхЯчеекВПодбореИОбработкеОбъектов(ТабличноеПоле) Экспорт
|
||
|
||
Если ирКэш.Получить().Это2iS Тогда
|
||
ДУ("УФ(П1, П2)", "ОткрытьКоллекциюВКонсолиОбработкиДанных", ТабличноеПоле.Значение);
|
||
Иначе
|
||
ВыделенныеСтроки = ТабличноеПоле.ВыделенныеСтроки;
|
||
Если ВыделенныеСтроки.Количество() = 0 Тогда
|
||
Возврат ;
|
||
КонецЕсли;
|
||
ИмяКолонки = ТабличноеПоле.ТекущаяКолонка.Данные;
|
||
МассивСсылок = Новый Массив;
|
||
Для Каждого Строка Из ВыделенныеСтроки Цикл
|
||
ЗначениеСтроки = Строка[ИмяКолонки];
|
||
ТипЗначения = ТипЗнч(ЗначениеСтроки);
|
||
Если Метаданные.НайтиПоТипу(ТипЗначения) = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
МассивСсылок.Добавить(ЗначениеСтроки);
|
||
КонецЦикла;
|
||
ОткрытьМассивОбъектовВПодбореИОбработкеОбъектовЛкс(МассивСсылок);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры // ОткрытьОбъектыИзВыделенныхЯчеекВПодбореИОбработкеОбъектов()
|
||
|
||
Функция ОткрытьПодборИОбработкуОбъектовИзТабличногоПоляДинамическогоСпискаЛкс(ТабличноеПоле) Экспорт
|
||
|
||
ОбъектМД = Метаданные.НайтиПоТипу(ТипЗнч(ТабличноеПоле.Значение));
|
||
Если ОбъектМД <> Неопределено Тогда
|
||
Ответ = Вопрос("Обработать только выделенные строки (Да) иначе будет использован текущий отбор (Нет)?", РежимДиалогаВопрос.ДаНет);
|
||
Иначе
|
||
Ответ = КодВозвратаДиалога.Да;
|
||
КонецЕсли;
|
||
Если Ответ = КодВозвратаДиалога.Да Тогда
|
||
ПараметрКоманды = Новый Массив();
|
||
Для Каждого Строка Из ТабличноеПоле.ВыделенныеСтроки Цикл
|
||
ПараметрКоманды.Добавить(Строка);
|
||
КонецЦикла;
|
||
Форма = ирНеглобальный.ОткрытьМассивОбъектовВПодбореИОбработкеОбъектовЛкс(ПараметрКоманды);
|
||
Иначе
|
||
Форма = Обработки.ирПодборИОбработкаОбъектов.ПолучитьФорму(,, ОбъектМД.ПолноеИмя());
|
||
Форма.Открыть();
|
||
Форма.УстановитьОбластьПоиска();
|
||
Форма.СтрокаПоиска = "";
|
||
//ЛксСкопироватьОтбор(Форма.ПостроительОтчета.Отбор, ИсточникДействий.Значение.Отбор, Истина, Истина);
|
||
Форма.Компоновщик.Настройки.Отбор.Элементы.Очистить();
|
||
ирНеглобальный.ТрансформироватьОтборВОтборКомпоновкиЛкс(Форма.Компоновщик.Настройки.Отбор, ТабличноеПоле.Значение.Отбор,,,, Истина);
|
||
КонецЕсли;
|
||
Возврат Форма;
|
||
|
||
КонецФункции
|
||
|
||
Функция ОткрытьМассивОбъектовВПодбореИОбработкеОбъектовЛкс(МассивСсылок) Экспорт
|
||
|
||
Если МассивСсылок.Количество() = 0 Тогда
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
Форма = Обработки.ирПодборИОбработкаОбъектов.ПолучитьФорму();
|
||
Форма.Открыть();
|
||
Форма.ЗагрузитьОбъектыДляОбработки(МассивСсылок);
|
||
Возврат Форма;
|
||
|
||
КонецФункции // ОткрытьМассивОбъектовВПодбореИОбработкеОбъектовЛкс()
|
||
|
||
Функция ПолучитьСтруктуруВосстановленияКонсолиЛкс(ИмяИлиОбъектКонсоли) Экспорт
|
||
|
||
Если ТипЗнч(ИмяИлиОбъектКонсоли) = Тип("Строка") Тогда
|
||
ИмяКонсоли = ИмяИлиОбъектКонсоли;
|
||
Иначе
|
||
ИмяКонсоли = ИмяИлиОбъектКонсоли.Метаданные().Имя;
|
||
КонецЕсли;
|
||
Структура = Новый Структура();
|
||
Структура.Вставить("БлокировкаВосстановления", Неопределено);
|
||
ПрефиксИмениФайлаВосстановления = ИмяКонсоли + "_" + ИмяПользователя() + "_";
|
||
Структура.Вставить("ПрефиксИмениФайлаВосстановления", ПрефиксИмениФайлаВосстановления);
|
||
ИмяФайлаВосстановления = ирКэш.Получить().КаталогФайловогоКэша + "\" + ПрефиксИмениФайлаВосстановления
|
||
+ Формат(НомерСеансаИнформационнойБазы(), "ЧЦ=8; ЧВН=; ЧГ=") + ".tmp";
|
||
Структура.Вставить("ФайлВосстановления", Новый Файл(ИмяФайлаВосстановления));
|
||
Возврат Структура;
|
||
|
||
КонецФункции
|
||
|
||
Функция СохранитьФайлВКонсолиСВосстановлениемЛкс(ДиалогВыбораФайла, Знач ИмяСохраняемогоФайла, ИмяОткрытогоФайла = "", ДанныеДляФайла,
|
||
СтруктураВосстановления, ЗапрашиватьИмяФайла = Ложь) Экспорт
|
||
|
||
#Если _ Тогда
|
||
ДиалогВыбораФайла = Новый ДиалогВыбораФайла();
|
||
#КонецЕсли
|
||
ФайлВосстановления = СтруктураВосстановления.ФайлВосстановления;
|
||
ПрефиксИмениФайлаВосстановления = СтруктураВосстановления.ПрефиксИмениФайлаВосстановления;
|
||
БлокировкаВосстановления = СтруктураВосстановления.БлокировкаВосстановления;
|
||
СохранитьФайл = Истина;
|
||
Если НРег(ИмяСохраняемогоФайла) <> НРег(ФайлВосстановления.ПолноеИмя) Тогда
|
||
ФайлВыбран = Истина;
|
||
лФайл = Новый Файл(ИмяОткрытогоФайла);
|
||
ДиалогВыбораФайла.ПолноеИмяФайла = ИмяСохраняемогоФайла;
|
||
Если Ложь
|
||
Или ПустаяСтрока(ИмяСохраняемогоФайла)
|
||
Или ЗапрашиватьИмяФайла
|
||
Или Найти(Нрег(лФайл.Имя), НРег(ПрефиксИмениФайлаВосстановления)) = 1
|
||
Тогда
|
||
Пока Истина Цикл
|
||
Если ДиалогВыбораФайла.Выбрать() Тогда
|
||
лФайл = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
|
||
Если Найти(Нрег(лФайл.Имя), НРег(ПрефиксИмениФайлаВосстановления)) = 1 Тогда
|
||
КодОтвета = Вопрос("Это имя файла зарезервировано. Хотите выбрать другое?", РежимДиалогаВопрос.ОКОтмена);
|
||
Если КодОтвета = КодВозвратаДиалога.ОК Тогда
|
||
Продолжить;
|
||
Иначе
|
||
ФайлВыбран = Ложь;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ИмяСохраняемогоФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
|
||
ФайлВыбран = Истина;
|
||
Прервать;
|
||
Иначе
|
||
ФайлВыбран = Ложь;
|
||
СохранитьФайл = Ложь;
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Иначе
|
||
ФайлВыбран = Ложь;
|
||
КонецЕсли;
|
||
Если СохранитьФайл Тогда
|
||
Если Истина
|
||
И НРег(ИмяСохраняемогоФайла) = НРег(ФайлВосстановления.ПолноеИмя)
|
||
И БлокировкаВосстановления <> Неопределено
|
||
Тогда
|
||
БлокировкаВосстановления = Неопределено;
|
||
КонецЕсли;
|
||
ЗначениеВФайл(ИмяСохраняемогоФайла, ДанныеДляФайла);
|
||
Если НРег(ИмяСохраняемогоФайла) = НРег(ФайлВосстановления.ПолноеИмя) Тогда
|
||
БлокировкаВосстановления = Новый ЗаписьТекста(ИмяСохраняемогоФайла,,,Истина);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ФайлВыбран;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПроверитьВыбратьФайлВосстановленияКонсолиЛкс(СтруктураВосстановления) Экспорт
|
||
|
||
ПрефиксИмениФайлаВосстановления = СтруктураВосстановления.ПрефиксИмениФайлаВосстановления;
|
||
СписокВосстановления = Новый СписокЗначений;
|
||
ФайлыВосстановления = НайтиФайлы(ирКэш.Получить().КаталогФайловогоКэша, ПрефиксИмениФайлаВосстановления + "*.tmp");
|
||
Для Каждого ФайлВосстановления Из ФайлыВосстановления Цикл
|
||
#Если _ Тогда
|
||
ФайлВосстановления = Новый Файл();
|
||
#КонецЕсли
|
||
Попытка
|
||
ФайлВосстановления.УстановитьВремяИзменения(ФайлВосстановления.ПолучитьВремяИзменения());
|
||
//Пустышка = Новый ЗаписьТекста(ФайлВосстановления.ПолноеИмя, , , Истина);
|
||
Исключение
|
||
// Файла заблокирован и значит сессия продолжается.
|
||
Продолжить;
|
||
КонецПопытки;
|
||
СписокВосстановления.Добавить(ФайлВосстановления.ПолноеИмя, "" + ФайлВосстановления.ПолучитьВремяИзменения() + " - "
|
||
+ ФайлВосстановления.ИмяБезРасширения);
|
||
КонецЦикла;
|
||
ИмяФайлаВосстановления = "";
|
||
Если СписокВосстановления.Количество() > 0 Тогда
|
||
СписокВосстановления.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);
|
||
СписокВосстановления.Добавить("<Удалить все файлы восстановления>");
|
||
ВыбранныйЭлемент = СписокВосстановления.ВыбратьЭлемент("Вы можете открыть файл восстановления прерванной сессии");
|
||
Если ВыбранныйЭлемент <> Неопределено Тогда
|
||
Если ВыбранныйЭлемент.Значение = "<Удалить все файлы восстановления>" Тогда
|
||
Для Каждого ЭлементСписка Из СписокВосстановления Цикл
|
||
Если ВыбранныйЭлемент = ЭлементСписка Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
УдалитьФайлы(ЭлементСписка.Значение);
|
||
КонецЦикла;
|
||
Иначе
|
||
ИмяФайлаВосстановления = ВыбранныйЭлемент.Значение;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат ИмяФайлаВосстановления;
|
||
|
||
КонецФункции
|
||
|
||
Процедура УдалитьФайлВосстановленияКонсолиСБлокировкойЛкс(СтруктураВосстановления) Экспорт
|
||
|
||
СтруктураВосстановления.БлокировкаВосстановления = Неопределено;
|
||
Попытка
|
||
УдалитьФайлы(СтруктураВосстановления.ФайлВосстановления.ПолноеИмя);
|
||
Исключение
|
||
КонецПопытки;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьРежимЗаписиНаСервереПоУмолчаниюЛкс() Экспорт
|
||
|
||
Результат = Истина
|
||
И ирКэш.ЛиНемобильныйРежимЛкс()
|
||
И Метаданные.ОсновнойРежимЗапуска = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// ТабличноеПоле определяется как источник действий командной панели.
|
||
// Параметру ВыборкаРезультата внутри присваивается значение!
|
||
Процедура ЗагрузитьДинамическуюВыборкуВТабличноеПолеПервуюПорциюЛкс(ЭтаФорма, РезультатЗапроса, ВыборкаРезультата, КоманднаяПанель,
|
||
ИмяОбработчикаОбновления = "ОбновитьРазмерДинамическойТаблицы", БезопасныйПорогКоличестваСтрок = 100000) Экспорт
|
||
|
||
#Если _ Тогда
|
||
лЗапрос = Новый Запрос;
|
||
РезультатЗапроса = лЗапрос.Выполнить();
|
||
#КонецЕсли
|
||
ВыборкаРезультата = РезультатЗапроса.Выбрать();
|
||
ТабличноеПоле = КоманднаяПанель.ИсточникДействий;
|
||
Если Ложь
|
||
Или БезопасныйПорогКоличестваСтрок = 0
|
||
Или ВыборкаРезультата.Количество() < БезопасныйПорогКоличестваСтрок
|
||
Тогда
|
||
КоманднаяПанель.Кнопки.ЗагрузитьПолностью.Доступность = Ложь;
|
||
ТабличноеПоле.Значение = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой);
|
||
Попытка
|
||
Выполнить("ЭтаФорма." + ИмяОбработчикаОбновления + "()");
|
||
Исключение
|
||
ВызватьИсключение ОписаниеОшибки();
|
||
КонецПопытки;
|
||
Иначе
|
||
ТабличноеПоле.Значение = Новый ТаблицаЗначений;
|
||
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
|
||
ТипЗначения = Колонка.ТипЗначения;
|
||
Если ТипЗначения.СодержитТип(Тип("РезультатЗапроса")) Тогда
|
||
ТипЗначения = Новый ОписаниеТипов("ТаблицаЗначений");
|
||
КонецЕсли;
|
||
ТабличноеПоле.Значение.Колонки.Добавить(Колонка.Имя, ТипЗначения, Колонка.Имя, Колонка.Ширина);
|
||
КонецЦикла;
|
||
ЭтаФорма.ПодключитьОбработчикОжидания(ИмяОбработчикаОбновления, 0.1, Истина);
|
||
ирНеглобальный.СчитатьПорциюДинамическойВыборкиВТаблицуЛкс(ВыборкаРезультата, ТабличноеПоле.Значение);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// ТабличноеПоле определяется как источник действий командной панели.
|
||
Процедура ЗагрузитьДинамическуюВыборкуВТабличноеПолеПолностьюЛкс(ЭтаФорма, мВыборкаРезультата, КоманднаяПанель,
|
||
ИмяОбработчикаОбновления = "ОбновитьРазмерДинамическойТаблицы") Экспорт
|
||
|
||
ЭтаФорма.ПодключитьОбработчикОжидания(ИмяОбработчикаОбновления, 0.1, Истина);
|
||
ТабличноеПоле = КоманднаяПанель.ИсточникДействий;
|
||
ирНеглобальный.СчитатьПорциюДинамическойВыборкиВТаблицуЛкс(мВыборкаРезультата, ТабличноеПоле.Значение, 0);
|
||
|
||
КонецПроцедуры
|
||
|
||
// Параметру КоличествоРезультата внутри присваивается значение!
|
||
Процедура ПослеЗагрузкиДинамическойВыборкиВТабличноеПолеЛкс(ЭтаФорма, мВыборкаРезультата, КоманднаяПанель, ПолеСтрокиКоличестваРезультата) Экспорт
|
||
|
||
ТабличноеПоле = КоманднаяПанель.ИсточникДействий;
|
||
Если ТипЗнч(мВыборкаРезультата) = Тип("COMОбъект") Тогда
|
||
КоличествоРезультата = 0;
|
||
Попытка
|
||
КоличествоРезультата = мВыборкаРезультата.Count;
|
||
Исключение
|
||
Если мВыборкаРезультата.State <> 0 Тогда
|
||
КоличествоРезультата = мВыборкаРезультата.RecordCount;
|
||
КонецЕсли;
|
||
КонецПопытки;
|
||
ИначеЕсли ТипЗнч(мВыборкаРезультата) = Тип("ВыборкаИзРезультатаЗапроса") Тогда
|
||
КоличествоРезультата = мВыборкаРезультата.Количество();
|
||
Иначе
|
||
КоличествоРезультата = ТабличноеПоле.Значение.Количество();
|
||
КонецЕсли;
|
||
ОбновитьЧислоЗагруженныхЭлементовВыборкиЛкс(ТабличноеПоле, КоманднаяПанель, ПолеСтрокиКоличестваРезультата, ТабличноеПоле.Значение.Количество(),
|
||
КоличествоРезультата);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОбновитьЧислоЗагруженныхЭлементовВыборкиЛкс(ТабличноеПоле, КоманднаяПанель, ПолеСтрокиКоличестваРезультата, КоличествоЗагружено, КоличествоРезультата) Экспорт
|
||
|
||
ВсеСчитано = КоличествоЗагружено = КоличествоРезультата;
|
||
Если ВсеСчитано Тогда
|
||
СтрокаКоличествоРезультата = "" + КоличествоЗагружено;
|
||
ПолеСтрокиКоличестваРезультата.ЦветФона = Новый Цвет();
|
||
Иначе
|
||
СтрокаКоличествоРезультата = "" + КоличествоЗагружено + "/" + КоличествоРезультата;
|
||
ПолеСтрокиКоличестваРезультата.ЦветФона = ЦветаСтиля.ирЦветФонаВычисляемогоЗначения;
|
||
КонецЕсли;
|
||
ПолеСтрокиКоличестваРезультата.Значение = СтрокаКоличествоРезультата;
|
||
КоманднаяПанель.Кнопки.ЗагрузитьПолностью.Доступность = Не ВсеСчитано;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция СоздатьСсылочныйОбъектПоМетаданнымЛкс(ОбъектМД, ЭтоГруппаДляНового = Ложь, ИдентификаторСсылки = Неопределено) Экспорт
|
||
|
||
Если ИдентификаторСсылки = Неопределено Тогда
|
||
ИдентификаторСсылки = Новый УникальныйИдентификатор();
|
||
КонецЕсли;
|
||
Объект = Новый (СтрЗаменить(ОбъектМД.ПолноеИмя(), ".", "Объект."));
|
||
// Антибаг платформы 8.2.14 http://partners.v8.1c.ru/forum/thread.jsp?id=967697#967697
|
||
//Объект = СериализаторXDTO.ЗаписатьXDTO(Объект);
|
||
//Объект.Ref = ИдентификаторСсылки;
|
||
//Объект.IsFolder = ЭтоГруппаДляНового;
|
||
//Объект = СериализаторXDTO.ПрочитатьXDTO(Объект);
|
||
//
|
||
// Этот метод опасный, т.к. может привести к нежелательным изменениям в объекте!
|
||
ЗаписьХмл = Новый ЗаписьXML;
|
||
ЗаписьХмл.УстановитьСтроку();
|
||
ЗаписатьXML(ЗаписьХмл, Объект);
|
||
СтрокаХмл = ЗаписьХмл.Закрыть();
|
||
ИмяЭлементаСсылки = "Ref";
|
||
СтрокаХмл = СтрЗаменить(СтрокаХмл, "<" + ИмяЭлементаСсылки + ">" + XMLСтрока(Объект.Ссылка) + "</" + ИмяЭлементаСсылки + ">",
|
||
"<" + ИмяЭлементаСсылки + ">" + XMLСтрока(ИдентификаторСсылки) + "</" + ИмяЭлементаСсылки + ">");
|
||
ИмяЭлементаЭтоГруппа = "IsFolder";
|
||
Если Найти(СтрокаХмл, "<" + ИмяЭлементаЭтоГруппа + ">") > 0 Тогда
|
||
СтрокаХмл = СтрЗаменить(СтрокаХмл, "<" + ИмяЭлементаЭтоГруппа + ">" + XMLСтрока(Объект.IsFolder) + "</" + ИмяЭлементаЭтоГруппа + ">",
|
||
"<" + ИмяЭлементаЭтоГруппа + ">" + XMLСтрока(ЭтоГруппаДляНового) + "</" + ИмяЭлементаЭтоГруппа + ">");
|
||
КонецЕсли;
|
||
ЧтениеХмл = Новый ЧтениеXML;
|
||
ЧтениеХмл.УстановитьСтроку(СтрокаХмл);
|
||
Объект = ПрочитатьXML(ЧтениеХмл);
|
||
|
||
Возврат Объект;
|
||
|
||
КонецФункции
|
||
|
||
// Формирует макет компоновки и извлекает из него запрос
|
||
// Параметры:
|
||
// Схема - СхемаКомпоновкиДанных
|
||
// НастройкаКомпоновкиДанных - НастройкиКомпоновкиДанных
|
||
// ДобавлятьУпорядочивание - Булево
|
||
// ПрефиксИменПараметров - Строка, *"" - используется для переименования параметров, полезно при смешивании нескольких запросов из компоновки в один
|
||
// выхСхемаКолонок - Структура, *Неопределено - если не равно Неопределено, то возвращается структура,
|
||
// где ключи - имена колонок, а значения - полные имена полей
|
||
//
|
||
// Результат - Запрос
|
||
//
|
||
Функция ПолучитьЗапросИзКомпоновкиЛкс(Знач Схема, Знач НастройкаКомпоновкиДанных, Знач ДобавлятьУпорядочивание = Ложь, ПрефиксИменПараметров = "",
|
||
ДобавитьВыбранноеПоле = "", выхСхемаКолонок = Неопределено) Экспорт
|
||
|
||
#Если _ Тогда
|
||
НастройкаКомпоновкиДанных = Новый НастройкиКомпоновкиДанных
|
||
#КонецЕсли
|
||
Если НастройкаКомпоновкиДанных.Структура.Количество() = 0 Тогда
|
||
НайтиДобавитьЭлементСтруктурыГруппировкаКомпоновкиЛкс(НастройкаКомпоновкиДанных.Структура);
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(ДобавитьВыбранноеПоле) Тогда
|
||
ирНеглобальный.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновкиДанных.Выбор, ДобавитьВыбранноеПоле);
|
||
КонецЕсли;
|
||
СтрокаПорядка = ЛксПолучитьСтрокуПорядкаКомпоновки(НастройкаКомпоновкиДанных.Порядок);
|
||
НастройкаКомпоновкиДанных.Порядок.Элементы.Очистить();
|
||
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
|
||
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, НастройкаКомпоновкиДанных, ,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
|
||
Запрос = Новый Запрос;
|
||
Если МакетКомпоновки.НаборыДанных.Количество() > 2 Тогда
|
||
Сообщить("В макете компоновки обнаружено более одного запроса");
|
||
КонецЕсли;
|
||
ТекстЗапроса = МакетКомпоновки.НаборыДанных[0].Запрос;
|
||
Если ДобавлятьУпорядочивание Тогда
|
||
Если ЗначениеЗаполнено(СтрокаПорядка) Тогда
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
|//Секция_Упорядочить. Этот комментарий используется в коде
|
||
|УПОРЯДОЧИТЬ ПО
|
||
| " + СтрокаПорядка;
|
||
КонецЕсли;
|
||
//Если Автоупорядочивание Тогда
|
||
ТекстЗапроса = ТекстЗапроса + "
|
||
|//Секция_Упорядочить. Этот комментарий используется в коде
|
||
|АВТОУПОРЯДОЧИВАНИЕ";
|
||
//КонецЕсли;
|
||
КонецЕсли;
|
||
Если ПрефиксИменПараметров <> "" Тогда
|
||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&", "&" + ПрефиксИменПараметров);
|
||
КонецЕсли;
|
||
Запрос.Текст = ТекстЗапроса;
|
||
Для Каждого ЗначениеПараметра Из МакетКомпоновки.ЗначенияПараметров Цикл
|
||
Запрос.Параметры.Вставить(ПрефиксИменПараметров + ЗначениеПараметра.Имя, ЗначениеПараметра.Значение);
|
||
КонецЦикла;
|
||
Если выхСхемаКолонок <> Неопределено Тогда
|
||
//выхСхемаКолонок = ПолучитьСхемуКолонокМакетаКомпоновкиДанныхЛкс(МакетКомпоновки);
|
||
//
|
||
Для Каждого ПолеНабора Из МакетКомпоновки.НаборыДанных[0].Поля Цикл
|
||
выхСхемаКолонок.Вставить(ПолеНабора.Имя, ПолеНабора.ПутьКДанным);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Возврат Запрос;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьТекстОтбораЗапросаКомпоновкиЛкс(ЗапросСОтбором, ПсевдонимТаблицы = "Т") Экспорт
|
||
|
||
ТекстОтбораДублей = ЛксПолучитьПоследнийФрагмент(ЗапросСОтбором.Текст, "КАК " + ПсевдонимТаблицы + "
|
||
|ГДЕ", Ложь);
|
||
Если Не ЗначениеЗаполнено(ТекстОтбораДублей) Тогда
|
||
ТекстОтбораДублей = " ИСТИНА ";
|
||
КонецЕсли;
|
||
Возврат ТекстОтбораДублей;
|
||
|
||
КонецФункции
|
||
|
||
// Осуществляет вывод результата компоновки в коллекцию значений. По умолчанию в качестве коллекции используется новая таблица значений.
|
||
// Параметры:
|
||
// СхемаКомпоновки - СхемаКомпоновкиДанных
|
||
// НастройкаКомпоновки - НастройкиКомпоновкиДанных
|
||
// КоллекцияЗначений - ДеревоЗначений, Массив, СписокЗначений, ТаблицаЗначений - Если не указана, создается ТаблицаЗначений
|
||
// ВнешниеНаборыДанных - Структура
|
||
// ТолькоСоздатьКолонки - Булево
|
||
// СхемаКолонок - Структура - Если Неопределено, то не возвращается
|
||
// МаксимальноеЧислоСтрокРезультата - Число(15,2) - Для предотвращения получения слишком большого результата. Если порог превышен, то результат = Неопределено.
|
||
// ОтключитьОбщиеИтоги - Булево
|
||
// РежимОтладки - Булево
|
||
//
|
||
Функция СкомпоноватьВКоллекциюЗначенийПоСхемеЛкс(Знач СхемаКомпоновки, Знач НастройкаКомпоновки, КоллекцияЗначений = Неопределено, Знач ВнешниеНаборыДанных,
|
||
Знач ТолькоСоздатьКолонки = Ложь, СхемаКолонок = Неопределено, Знач МаксимальноеЧислоСтрокРезультата = 0, Знач ОтключитьОбщиеИтоги = Истина, Знач РежимОтладки = Ложь) Экспорт
|
||
|
||
Если НастройкаКомпоновки.Структура.Количество() = 0 Тогда
|
||
//ЭлементСтруктуры = НастройкаКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
|
||
//ЭлементСтруктуры.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
|
||
НайтиДобавитьЭлементСтруктурыГруппировкаКомпоновкиЛкс(НастройкаКомпоновки.Структура);
|
||
КонецЕсли;
|
||
Если ОтключитьОбщиеИтоги Тогда
|
||
НастройкаКомпоновки.ПараметрыВывода.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВертикальноеРасположениеОбщихИтогов"),
|
||
РасположениеИтоговКомпоновкиДанных.Нет);
|
||
КонецЕсли;
|
||
Если Ложь
|
||
Или КоллекцияЗначений = Неопределено
|
||
Или ТипЗнч(КоллекцияЗначений) = Тип("СписокЗначений")
|
||
Или ТипЗнч(КоллекцияЗначений) = Тип("Массив")
|
||
Тогда
|
||
КоллекцияРезультата = Новый ТаблицаЗначений;
|
||
Иначе
|
||
КоллекцияРезультата = КоллекцияЗначений;
|
||
КонецЕсли;
|
||
Если РежимОтладки Тогда
|
||
Отладить(СхемаКомпоновки, Ложь, НастройкаКомпоновки, ВнешниеНаборыДанных);
|
||
//Возврат Неопределено;
|
||
КонецЕсли;
|
||
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
|
||
Попытка
|
||
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкаКомпоновки, , ,
|
||
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
|
||
Исключение
|
||
//ИнформацияОбОшибке = ИнформацияОбОшибке();
|
||
//Если глКэш.ЭтоВидимоеПриложение Тогда
|
||
// ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке);
|
||
//Иначе
|
||
// ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
|
||
//КонецЕсли;
|
||
ВызватьИсключение;
|
||
Возврат Неопределено;
|
||
КонецПопытки;
|
||
//Исследовать(МакетКомпоновки, Ложь);
|
||
//Отладить(МакетКомпоновки, Ложь);
|
||
//Возврат Неопределено;
|
||
|
||
Если МаксимальноеЧислоСтрокРезультата > 0 Тогда
|
||
// Здесь тратится дополнительное ощутимое время на предварительный запрос.
|
||
ирПлатформа = ирКэш.Получить();
|
||
ГрубоеКоличествоСтрокРезультата = ирПлатформа.ПолучитьГрубоКоличествоСтрокВРезультатеКомпоновки(МакетКомпоновки);
|
||
Если ГрубоеКоличествоСтрокРезультата > МаксимальноеЧислоСтрокРезультата Тогда
|
||
Сообщить("Настройки компоновки приводят к слишком большой выборке данных. Попробуйте задать более сильные ограничения.");
|
||
Возврат Неопределено;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
//Антибаг платформы 1.14. Удаляем дубли ячеек по именам колонок в макете.
|
||
//Исследовать(МакетКомпоновки, Ложь);
|
||
ОписанияМакетовОбластей = МакетКомпоновки.Макеты;
|
||
Если ОписанияМакетовОбластей.Количество() > 0 Тогда
|
||
ЯчейкиЗаголовка = ОписанияМакетовОбластей[0].Макет.Ячейки;
|
||
КоличествоЯчеек = ЯчейкиЗаголовка.Количество();
|
||
СтруктураКолонок = Новый Структура;
|
||
ИндексЯчейки = 0;
|
||
Пока ИндексЯчейки < КоличествоЯчеек Цикл
|
||
ЯчейкаКолонки = ЯчейкиЗаголовка[ИндексЯчейки];
|
||
ИмяКолонки = ЯчейкаКолонки.Имя;
|
||
//ИмяКолонки = ирПлатформа.ПолучитьИдентификаторИзПредставления(ЯчейкаКолонки.Имя); // От этого варианта отказались из-за мобильности
|
||
ИмяКолонки = СтрЗаменить(ИмяКолонки, ".", "_");
|
||
ИмяКолонки = СтрЗаменить(ИмяКолонки, "]", "");
|
||
ИмяКолонки = СтрЗаменить(ИмяКолонки, "[", "");
|
||
ИмяКолонки = СтрЗаменить(ИмяКолонки, " ", "_");
|
||
ЯчейкаКолонки.Имя = ИмяКолонки;
|
||
Если СтруктураКолонок.Свойство(ИмяКолонки) Тогда
|
||
Для ИндексМакета = 1 По ОписанияМакетовОбластей.Количество() - 1 Цикл
|
||
МакетСтроки = ОписанияМакетовОбластей[ИндексМакета];
|
||
МакетСтроки.Макет.Ячейки.Удалить(ИндексЯчейки);
|
||
КонецЦикла;
|
||
ЯчейкиЗаголовка.Удалить(ИндексЯчейки);
|
||
КоличествоЯчеек = КоличествоЯчеек - 1;
|
||
Иначе
|
||
ИндексЯчейки = ИндексЯчейки + 1;
|
||
СтруктураКолонок.Вставить(ИмяКолонки);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
Если СхемаКолонок <> Неопределено Тогда
|
||
// Схема колонок строится негарантировано, т.к. платформа не предоставляет нужных данных
|
||
СхемаКолонок.Очистить();
|
||
Если ЯчейкиЗаголовка <> Неопределено Тогда
|
||
КоличествоЯчеекЗаголовка = ЯчейкиЗаголовка.Количество();
|
||
Для Индекс = 0 По КоличествоЯчеекЗаголовка - 1 Цикл
|
||
Для Каждого ОписаниеМакетаОбласти Из ОписанияМакетовОбластей Цикл
|
||
// Здесь подсказка криво работает из-за кривого синтакс-помощника 8.2.13.205
|
||
// http://partners.v8.1c.ru/forum/thread.jsp?id=898023#898023
|
||
ЯчейкаМакетаОбласти = ОписаниеМакетаОбласти.Макет.Ячейки[Индекс];
|
||
Если ТипЗнч(ЯчейкаМакетаОбласти) <> Тип("ЯчейкаМакетаКоллекцииЗначенийОбластиКомпоновкиДанных") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПараметрЯчейки = ЯчейкаМакетаОбласти.Значение;
|
||
Если ПараметрЯчейки = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Выражение = ОписаниеМакетаОбласти.Параметры["" + ПараметрЯчейки].Выражение;
|
||
ПозицияТочки = Найти(Выражение, ".");
|
||
Если Ложь
|
||
Или ПозицияТочки = 0
|
||
Или Найти(Выражение, " ") > 0
|
||
Или Найти(Выражение, "(") > 0
|
||
Тогда
|
||
//ИмяПоля = "";
|
||
Продолжить;
|
||
Иначе
|
||
ИмяПоля = Сред(Выражение, ПозицияТочки + 1);
|
||
КонецЕсли;
|
||
СхемаКолонок.Вставить(ЯчейкиЗаголовка[Индекс].Имя, ИмяПоля);
|
||
Прервать;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если ТолькоСоздатьКолонки Тогда
|
||
КоллекцияЗначений.Колонки.Очистить();
|
||
ЯчейкиЗаголовка = МакетКомпоновки.Макеты[0].Макет.Ячейки;
|
||
Для Каждого Ячейка Из ЯчейкиЗаголовка Цикл
|
||
//КолонкаКоллекции = КоллекцияЗначений.Колонки.Найти(Ячейка.Имя);
|
||
//Если КолонкаКоллекции = Неопределено Тогда
|
||
КоллекцияЗначений.Колонки.Добавить(Ячейка.Имя, Ячейка.ТипЗначения, Ячейка.Заголовок,);
|
||
//КонецЕсли;
|
||
КонецЦикла;
|
||
Иначе
|
||
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
|
||
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, , Истина);
|
||
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
|
||
ПроцессорВывода.УстановитьОбъект(КоллекцияРезультата);
|
||
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
|
||
КонецЕсли;
|
||
//Исследовать(КоллекцияРезультата);
|
||
Если ТипЗнч(КоллекцияЗначений) = Тип("СписокЗначений") Тогда
|
||
Есть0 = КоллекцияРезультата.Колонки.Количество() > 0;
|
||
Есть1 = КоллекцияРезультата.Колонки.Количество() > 1;
|
||
Для Каждого СтрокаРезультата Из КоллекцияРезультата Цикл
|
||
НовыйЭлемент = КоллекцияЗначений.Добавить();
|
||
Если Есть0 Тогда
|
||
НовыйЭлемент.Значение = СтрокаРезультата[0];
|
||
КонецЕсли;
|
||
Если Есть1 Тогда
|
||
НовыйЭлемент.Представление = СтрокаРезультата[1];
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
ИначеЕсли ТипЗнч(КоллекцияЗначений) = Тип("Массив") Тогда
|
||
Если КоллекцияРезультата.Колонки.Количество() > 0 Тогда
|
||
Для Каждого СтрокаРезультата Из КоллекцияРезультата Цикл
|
||
КоллекцияЗначений.Добавить(СтрокаРезультата[0]);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
Иначе
|
||
КоллекцияЗначений = КоллекцияРезультата;
|
||
КонецЕсли;
|
||
Результат = КоллекцияЗначений;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиПоказатьСтрокуВПолеТекстовогоДокументаЛкс(Форма, ПолеТекстовогоДокумента, СтрокаПоиска) Экспорт
|
||
|
||
Позиция = Найти(Нрег(ПолеТекстовогоДокумента.ПолучитьТекст()), Нрег(СтрокаПоиска));
|
||
Если Позиция > 0 Тогда
|
||
ПолеТекстовогоДокумента.УстановитьГраницыВыделения(Позиция, Позиция + СтрДлина(СтрокаПоиска));
|
||
Форма.ТекущийЭлемент = ПолеТекстовогоДокумента;
|
||
Результат = Истина;
|
||
Иначе
|
||
Если СтрДлина(ПолеТекстовогоДокумента.ВыделенныйТекст) > 0 Тогда
|
||
ПолеТекстовогоДокумента.УстановитьГраницыВыделения(1, 1);
|
||
КонецЕсли;
|
||
Результат = Ложь;
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Параметры:
|
||
// Элемент - ПолеТабличногоДокумента
|
||
//
|
||
Функция ПолеТабличногоДокумента_ПолучитьПредставлениеСуммыВыделенныхЯчеекЛкс(Знач Элемент) Экспорт
|
||
|
||
Сумма = 0;
|
||
СчетчикЯчеекСуммы = 0;
|
||
СчетчикЯчеекОбщий = 0;
|
||
ВыделенныеОбласти = Элемент.ВыделенныеОбласти;
|
||
ЕстьИгнорированныеОбласти = Ложь;
|
||
НачальноеКоличество = ВыделенныеОбласти.Количество();
|
||
Для СчетчикВыделенныеОбласти = 1 По НачальноеКоличество Цикл
|
||
Область = ВыделенныеОбласти[НачальноеКоличество - СчетчикВыделенныеОбласти];
|
||
Если ТипЗнч(Область) = Тип("РисунокТабличногоДокумента") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПлощадьОбласти = (Область.Право - Область.Лево + 1) * (Область.Низ - Область.Верх + 1);
|
||
СчетчикЯчеекОбщий = СчетчикЯчеекОбщий + ПлощадьОбласти;
|
||
Если ПлощадьОбласти < 10000 Тогда
|
||
Для НомерКолонки = Область.Лево по Область.Право Цикл
|
||
Для НомерСтроки = Область.Верх по Область.Низ Цикл
|
||
ОбластьЯчейки = Элемент.Область(НомерСтроки, НомерКолонки);
|
||
Если ОбластьЯчейки.Лево <> НомерКолонки Или ОбластьЯчейки.Верх <> НомерСтроки Тогда
|
||
// Данная ячейка принадлежит объединенным ячейкам и не является начальной ячейкой
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Попытка
|
||
Число = Число(ОбластьЯчейки.Текст);
|
||
Исключение
|
||
Продолжить;
|
||
КонецПопытки;
|
||
Сумма = Сумма + Число;
|
||
СчетчикЯчеекСуммы = СчетчикЯчеекСуммы + 1;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
Иначе
|
||
ЕстьИгнорированныеОбласти = Истина;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
СчетчикЯчеекСуммы = "" + СчетчикЯчеекСуммы;
|
||
Сумма = "" + Сумма;
|
||
Если ЕстьИгнорированныеОбласти Тогда
|
||
СчетчикЯчеекСуммы = СчетчикЯчеекСуммы + "+?";
|
||
Сумма = Сумма + "+?";
|
||
КонецЕсли;
|
||
Текст = "" + СчетчикЯчеекСуммы + " из " + СчетчикЯчеекОбщий + " яч. = " + Сумма + "";
|
||
Возврат Текст;
|
||
|
||
КонецФункции
|
||
|
||
// Таблица - ТаблицаЗначений, ТабличнаяЧасть, РезультатЗапроса
|
||
Функция ВывестиТаблицуВТабличныйДокументЛкс(Таблица, Знач ТабличныйДокумент = Неопределено, ДанныеРасшифровки = Неопределено, ИтогиЧисловыхПолей = Истина,
|
||
АвтофиксацияШапки = Истина) Экспорт
|
||
|
||
ВнешниеНаборыДанных = Новый Структура("Основной", Таблица);
|
||
СхемаКомпоновки = ЛксСоздатьСхемуПоТаблицамЗначений(ВнешниеНаборыДанных, , , ИтогиЧисловыхПолей);
|
||
НастройкаКомпоновки = Новый НастройкиКомпоновкиДанных;
|
||
Для Каждого Колонка Из Таблица.Колонки Цикл
|
||
ирНеглобальный.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, Колонка.Имя);
|
||
КонецЦикла;
|
||
ТабличныйДокумент = СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновки, НастройкаКомпоновки, ТабличныйДокумент, ВнешниеНаборыДанных,
|
||
ДанныеРасшифровки, АвтофиксацияШапки);
|
||
Возврат ТабличныйДокумент;
|
||
|
||
КонецФункции
|
||
|
||
Функция СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновки, НастройкаКомпоновки, Знач ТабличныйДокумент = Неопределено, ВнешниеНаборыДанных = Неопределено,
|
||
ДанныеРасшифровки = Неопределено, АвтофиксацияШапки = Истина) Экспорт
|
||
|
||
#Если _ Тогда
|
||
НастройкаКомпоновки = Новый НастройкиКомпоновкиДанных;
|
||
#КонецЕсли
|
||
Если НастройкаКомпоновки.Структура.Количество() = 0 Тогда
|
||
ирНеглобальный.НайтиДобавитьЭлементСтруктурыГруппировкаКомпоновкиЛкс(НастройкаКомпоновки.Структура);
|
||
КонецЕсли;
|
||
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
|
||
Если ДанныеРасшифровки = Неопределено Тогда
|
||
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
|
||
КонецЕсли;
|
||
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкаКомпоновки, ДанныеРасшифровки);
|
||
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
|
||
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
|
||
Если ТабличныйДокумент = Неопределено Тогда
|
||
ТабличныйДокумент = Новый ТабличныйДокумент;
|
||
КонецЕсли;
|
||
ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ТабличныйДокумент, ПроцессорКомпоновки, ДанныеРасшифровки.Элементы,,, АвтофиксацияШапки);
|
||
Возврат ТабличныйДокумент;
|
||
|
||
КонецФункции
|
||
|
||
// мВнешниеНаборыДанных - Структура, Неопределено - не очищается
|
||
Функция ДополнитьСтруктуруВнешихНаборовДанныхПустышкамиЛкс(лСхемаКомпоновкиДанных, мВнешниеНаборыДанных = Неопределено) Экспорт
|
||
|
||
Если мВнешниеНаборыДанных = Неопределено Тогда
|
||
мВнешниеНаборыДанных = Новый Структура();
|
||
КонецЕсли;
|
||
// Создадим пустышки внешних наборов данных, если они не переданы
|
||
ОбъектТаблица = 0;
|
||
Для Каждого НаборДанных Из лСхемаКомпоновкиДанных.НаборыДанных Цикл
|
||
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъектСхемыКомпоновкиДанных") Тогда
|
||
Если НаборДанных.ИмяОбъекта = "" Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Если Не мВнешниеНаборыДанных.Свойство(НаборДанных.ИмяОбъекта, ОбъектТаблица) Тогда
|
||
ОбъектТаблица = Новый ТаблицаЗначений;
|
||
КонецЕсли;
|
||
Попытка
|
||
КолонкиОбъектаТаблицы = ОбъектТаблица.Колонки;
|
||
Исключение
|
||
// Тогда это табличная часть, но возможно и тут будет исключение
|
||
КолонкиОбъектаТаблицы = ОбъектТаблица.ВыгрузитьКолонки().Колонки;
|
||
КонецПопытки;
|
||
Если КолонкиОбъектаТаблицы.Количество() > 0 Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Для Каждого Поле Из НаборДанных.Поля Цикл
|
||
Если ТипЗнч(Поле) = Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
|
||
Если КолонкиОбъектаТаблицы.Найти(Поле.Поле) = Неопределено Тогда
|
||
КолонкиОбъектаТаблицы.Добавить(Поле.Поле, Поле.ТипЗначения);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
мВнешниеНаборыДанных.Вставить(НаборДанных.ИмяОбъекта, ОбъектТаблица);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Возврат мВнешниеНаборыДанных;
|
||
|
||
КонецФункции
|
||
|
||
Функция ВыбратьТипСсылкиВПолеВводаЛкс(Элемент, СтандартнаяОбработка) Экспорт
|
||
|
||
Форма = ирКэш.Получить().ПолучитьФорму("ВыборОбъектаМетаданных", Элемент, Элемент);
|
||
лСтруктураПараметров = Новый Структура;
|
||
лСтруктураПараметров.Вставить("ОтображатьСсылочныеОбъекты", Истина);
|
||
Форма.НачальноеЗначениеВыбора = лСтруктураПараметров;
|
||
ЗначениеВыбора = Форма.ОткрытьМодально();
|
||
Если ТипЗнч(ЗначениеВыбора) = Тип("Структура") Тогда
|
||
лПолноеИмяОбъекта = Неопределено;
|
||
Если ЗначениеВыбора.Свойство("ПолноеИмяОбъекта", лПолноеИмяОбъекта) Тогда
|
||
ИмяТипаСсылки = ирНеглобальный.ПолучитьИмяТипаИзМетаданныхЛкс(лПолноеИмяОбъекта);
|
||
ОписаниеТипов = Новый ОписаниеТипов(ИмяТипаСсылки);
|
||
НовоеЗначение = ОписаниеТипов.ПривестиЗначение(Неопределено);
|
||
ЛксИнтерактивноЗаписатьВЭлементУправления(Элемент, НовоеЗначение);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
СтандартнаяОбработка = Ложь;
|
||
Возврат Неопределено;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиПустаяПодгруппаRegExpЛкс(Подгруппа) Экспорт
|
||
|
||
Результат = Ложь
|
||
Или Подгруппа = Неопределено
|
||
Или Подгруппа = "";
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Для "Ссылка.Организация" вернет "Организация", для "Основание.Контрагент" вернет "ОснованиеКонтрагент"
|
||
// Параметры:
|
||
// ИмяПоля - Строка
|
||
Функция ПолучитьИмяКолонкиРезультатаПоИмениПоляЛкс(Знач ИмяПоля) Экспорт
|
||
|
||
Начало = "Ссылка.";
|
||
ДлинаНачала = СтрДлина(Начало);
|
||
Если СтрокиРавныЛкс(Лев(ИмяПоля, ДлинаНачала), Начало) Тогда
|
||
ИмяПоля = Сред(ИмяПоля, ДлинаНачала + 1);
|
||
КонецЕсли;
|
||
ИмяПоля = СтрЗаменить(ИмяПоля, ".", "");
|
||
Возврат ИмяПоля;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ДобавитьМногострочнуюСтрокуВТекстЛкс(СобираемыйТекст, Выражение, Смещение, СНовойСтроки = Ложь) Экспорт
|
||
|
||
Если СНовойСтроки Тогда
|
||
СобираемыйТекст = СобираемыйТекст + Символы.ПС + Смещение;
|
||
КонецЕсли;
|
||
СобираемыйТекст = СобираемыйТекст + СтрПолучитьСтроку(Выражение, 1);
|
||
Для Счетчик = 2 По СтрЧислоСтрок(Выражение) Цикл
|
||
СобираемыйТекст = СобираемыйТекст + Символы.ПС + Смещение + СтрПолучитьСтроку(Выражение, Счетчик);
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьАвтоУникальноеИмяВКоллекцииСтрокЛкс(ТаблицаЗначений, БазовоеИмяИлиСтрока, ИмяКлючевойКолонки = "Имя", ИмяДолжноБытьИдентификатором = Истина,
|
||
ЗаменаПустойСтроки = "_", ДопустимаяДлинаИдентификатора = 50) Экспорт
|
||
|
||
ТекущийИндекс = 0;
|
||
Если Ложь
|
||
Или ТипЗнч(БазовоеИмяИлиСтрока) = Тип("СтрокаТаблицыЗначений")
|
||
Или ТипЗнч(БазовоеИмяИлиСтрока) = Тип("СтрокаДереваЗначений")
|
||
Тогда
|
||
ИсключаемаяСтрока = БазовоеИмяИлиСтрока;
|
||
БазовоеИмя = БазовоеИмяИлиСтрока[ИмяКлючевойКолонки];
|
||
//ТекущийИндекс = 1;
|
||
Иначе
|
||
БазовоеИмя = БазовоеИмяИлиСтрока;
|
||
КонецЕсли;
|
||
Если ИмяДолжноБытьИдентификатором Тогда
|
||
БазовоеИмя = ирКэш.Получить().ПолучитьИдентификаторИзПредставления(БазовоеИмя, ЗаменаПустойСтроки);
|
||
БазовоеИмя = Лев(БазовоеИмя, ДопустимаяДлинаИдентификатора);
|
||
Иначе
|
||
Если ПустаяСтрока(БазовоеИмя) Тогда
|
||
БазовоеИмя = ЗаменаПустойСтроки;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Пока Истина Цикл
|
||
ТекущийПсевдоним = БазовоеИмя + Формат(ТекущийИндекс, "ЧГ=");
|
||
СтрокиОдноименных = ТаблицаЗначений.НайтиСтроки(Новый Структура(ИмяКлючевойКолонки, ТекущийПсевдоним));
|
||
Если Ложь
|
||
Или СтрокиОдноименных.Количество() = 0
|
||
Или (Истина
|
||
И СтрокиОдноименных.Количество() = 1
|
||
И ИсключаемаяСтрока <> Неопределено
|
||
И ирНеглобальный.СтрокиРавныЛкс(ТекущийПсевдоним, ИсключаемаяСтрока[ИмяКлючевойКолонки])
|
||
)
|
||
Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
ТекущийИндекс = ТекущийИндекс + 1;
|
||
КонецЦикла;
|
||
Возврат ТекущийПсевдоним;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьИндексКартинкиТипаЛкс(ОписаниеТипов) Экспорт
|
||
|
||
Если ОписаниеТипов = Неопределено Тогда
|
||
Возврат 14;
|
||
КонецЕсли;
|
||
Типы = ОписаниеТипов.Типы();
|
||
Если Типы.Количество() = 1 Тогда
|
||
КорневойТип = ЛксПолучитьКорневойТипКонфигурации(Типы[0]);
|
||
Если Типы[0] = Тип("Число") Тогда
|
||
ИндексКартинки = 0;
|
||
ИначеЕсли Типы[0] = Тип("Строка") Тогда
|
||
ИндексКартинки = 1;
|
||
ИначеЕсли Типы[0] = Тип("Дата") Тогда
|
||
ИндексКартинки = 2;
|
||
ИначеЕсли Типы[0] = Тип("Булево") Тогда
|
||
ИндексКартинки = 3;
|
||
ИначеЕсли КорневойТип = "Справочник" Тогда
|
||
ИндексКартинки = 7;
|
||
ИначеЕсли КорневойТип = "Документ" Тогда
|
||
ИндексКартинки = 8;
|
||
ИначеЕсли КорневойТип = "Перечисление" Тогда
|
||
ИндексКартинки = 9;
|
||
ИначеЕсли КорневойТип = "ПланВидовХарактеристик" Тогда
|
||
ИндексКартинки = 10;
|
||
ИначеЕсли КорневойТип = "ПланСчетов" Тогда
|
||
ИндексКартинки = 11;
|
||
ИначеЕсли КорневойТип = "ПланВидовРасчета" Тогда
|
||
ИндексКартинки = 12;
|
||
ИначеЕсли КорневойТип = "БизнесПроцесс" Тогда
|
||
ИндексКартинки = 13;
|
||
ИначеЕсли КорневойТип = "ТочкаМаршрута" Тогда
|
||
ИндексКартинки = 14;
|
||
ИначеЕсли КорневойТип = "Задача" Тогда
|
||
ИндексКартинки = 15;
|
||
Иначе
|
||
ИндексКартинки = 16;
|
||
КонецЕсли;
|
||
Иначе
|
||
ИндексКартинки = 16;
|
||
КонецЕсли;
|
||
|
||
Возврат ИндексКартинки;
|
||
|
||
КонецФункции
|
||
|
||
// Получает строку для установки порядка компоновки.
|
||
//
|
||
// Параметры:
|
||
// ПорядокКомпоновки – ПорядокКомпоновкиДанных.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Строка - для установки порядка.
|
||
//
|
||
Функция ПолучитьВыражениеПорядкаКомпоновкиНаЯзыкеЛкс(ПорядокКомпоновки, ИсключаемоеПоле = "", СимволЗаменыТочки = Неопределено, ДиалектSQL = "1C") Экспорт
|
||
|
||
Строка = "";
|
||
Если СтрокиРавныЛкс(ДиалектSQL, "1С") Тогда
|
||
СтрокаВозр = "Возр";
|
||
СтрокаУбыв = "Убыв";
|
||
Иначе
|
||
СтрокаВозр = "Asc";
|
||
СтрокаУбыв = "Desc";
|
||
КонецЕсли;
|
||
Для Каждого ЭлементПорядка Из ПорядокКомпоновки.Элементы Цикл
|
||
Если Ложь
|
||
Или Не ЭлементПорядка.Использование
|
||
Или ТипЗнч(ЭлементПорядка) = Тип("АвтоЭлементПорядкаКомпоновкиДанных")
|
||
Или ИсключаемоеПоле = "" + ЭлементПорядка.Поле
|
||
Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ИмяПоля = "" + ЭлементПорядка.Поле;
|
||
Если СимволЗаменыТочки <> Неопределено Тогда
|
||
ИмяПоля = СтрЗаменить(ИмяПоля, ".", СимволЗаменыТочки);
|
||
КонецЕсли;
|
||
Строка = Строка + ", " + ИмяПоля + " ";
|
||
Если ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда
|
||
Строка = Строка + СтрокаВозр;
|
||
Иначе
|
||
Строка = Строка + СтрокаУбыв;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Сред(Строка, 3);
|
||
|
||
КонецФункции // ЛксПолучитьСтрокуПорядкаКомпоновки()
|
||
|
||
Функция ПолучитьПреставлениеСочетанияКлавишЛкс(СочетаниеКлавиш) Экспорт
|
||
|
||
Представление = "";
|
||
Если СочетаниеКлавиш.Alt Тогда
|
||
Представление = Представление + "Alt+";
|
||
ИначеЕсли СочетаниеКлавиш.Ctrl Тогда
|
||
Представление = Представление + "Ctrl+";
|
||
ИначеЕсли СочетаниеКлавиш.Shift Тогда
|
||
Представление = Представление + "Shift+";
|
||
КонецЕсли;
|
||
Представление = Представление + СочетаниеКлавиш.Клавиша;
|
||
Возврат Представление;
|
||
|
||
КонецФункции
|
||
|
||
|
||
////////////////////////////////
|
||
// ФОРМЫ
|
||
|
||
Функция ПолучитьДопСвойстваФормыЛкс(ЭтаФорма)
|
||
|
||
СвойстваФормы = ЭтаФорма.Панель.Страницы[0].Значение;
|
||
Если СвойстваФормы = Неопределено Тогда
|
||
СвойстваФормы = Новый Структура();
|
||
ЭтаФорма.Панель.Страницы[0].Значение = СвойстваФормы;
|
||
КонецЕсли;
|
||
Возврат СвойстваФормы;
|
||
|
||
КонецФункции
|
||
|
||
Процедура ВстроитьКнопкиСтруктурыКоманднойПанелиЛкс(ЭтаФорма) Экспорт
|
||
|
||
мСвойстваФормы = ПолучитьДопСвойстваФормыЛкс(ЭтаФорма);
|
||
КнопкиВсехДействийКомандныхПанелей = Новый Соответствие;
|
||
ИмяКнопки = "СтруктураКоманднойПанели";
|
||
Для Каждого ЭлементФормы Из ЭтаФорма.ЭлементыФормы Цикл
|
||
КоманднаяПанель = Неопределено;
|
||
Если ТипЗнч(ЭлементФормы) = Тип("КоманднаяПанель") Тогда
|
||
КоманднаяПанель = ЭлементФормы;
|
||
Иначе
|
||
Попытка
|
||
//КоманднаяПанель = ЭлементФормы.КонтекстноеМеню; // В контекстных меню функция будет маловостребована, т.к. они имеют обычно более простую структуру и там сразу виден текст всех кнопок
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
Если Истина
|
||
И КоманднаяПанель <> Неопределено
|
||
И КоманднаяПанель.Кнопки.Найти(ИмяКнопки) = Неопределено
|
||
Тогда
|
||
КоличествоКнопок = 0;
|
||
Для Каждого Кнопка Из КоманднаяПанель.Кнопки Цикл
|
||
Если Кнопка.ТипКнопки <> ТипКнопкиКоманднойПанели.Разделитель Тогда
|
||
КоличествоКнопок = КоличествоКнопок + 1;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если КоличествоКнопок > 2 Тогда
|
||
КнопкаСтруктураКоманднойПанели = КоманднаяПанель.Кнопки.Вставить(0);
|
||
КнопкаСтруктураКоманднойПанели.Имя = ИмяКнопки;
|
||
КнопкаСтруктураКоманднойПанели.ТипКнопки = ТипКнопкиКоманднойПанели.Действие;
|
||
КнопкаСтруктураКоманднойПанели.Картинка = БиблиотекаКартинок.ирКоманднаяПанель;
|
||
КнопкаСтруктураКоманднойПанели.Отображение = ОтображениеКнопкиКоманднойПанели.Авто;
|
||
КнопкаСтруктураКоманднойПанели.Текст = "Структура командной панели";
|
||
КнопкаСтруктураКоманднойПанели.Подсказка = "Открыть структуру командной панели";
|
||
КнопкаСтруктураКоманднойПанели.Действие = Новый Действие("СтруктураКоманднойПанелиНажатие");
|
||
КнопкиВсехДействийКомандныхПанелей.Вставить(КнопкаСтруктураКоманднойПанели, КоманднаяПанель);
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
мСвойстваФормы.Вставить("КнопкиВсехДействийКомандныхПанелей", КнопкиВсехДействийКомандныхПанелей);
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура ОткрытьСтруктуруКоманднойПанелиЛкс(ЭтаФорма, Знач Кнопка = Неопределено) Экспорт
|
||
|
||
мСвойстваФормы = ПолучитьДопСвойстваФормыЛкс(ЭтаФорма);
|
||
КоманднаяПанель = мСвойстваФормы.КнопкиВсехДействийКомандныхПанелей[Кнопка];
|
||
Если Кнопка <> Неопределено Тогда
|
||
Если КоманднаяПанель.Кнопки.Индекс(Кнопка) = -1 Тогда
|
||
// Для контекстных меню
|
||
КоманднаяПанель = КоманднаяПанель.Кнопки[0];
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
ФормаСтруктуры = ирНеглобальный.ПолучитьФормуЛкс("Обработка.ирПлатформа.Форма.СтруктураКоманднойПанели");
|
||
ФормаСтруктуры.КоманднаяПанель = КоманднаяПанель;
|
||
ФормаСтруктуры.ОткрытьМодально();
|
||
|
||
КонецПроцедуры
|
||
|
||
#КонецЕсли
|
||
|
||
Процедура ОбновитьКопиюСвойстваВНижнемРегистреЛкс(Объект, ИмяСвойства = "Имя") Экспорт
|
||
|
||
Объект["Н" + ИмяСвойства] = НРег(Объект[ИмяСвойства]);
|
||
|
||
КонецПроцедуры
|
||
|
||
Функция ПолучитьСхемуКолонокМакетаКомпоновкиДанныхЛкс(МакетКомпоновки) Экспорт
|
||
|
||
#Если _ Тогда
|
||
МакетКомпоновки = Новый МакетКомпоновкиДанных;
|
||
#КонецЕсли
|
||
СхемаКолонок = Новый Структура;
|
||
|
||
// Схема колонок строится негарантировано, т.к. платформа не предоставляет нужных данных
|
||
ОписанияМакетовОбластей = МакетКомпоновки.Макеты;
|
||
Если ОписанияМакетовОбластей.Количество() > 0 Тогда
|
||
ЯчейкиЗаголовка = ОписанияМакетовОбластей[0].Макет.Ячейки;
|
||
Если ЯчейкиЗаголовка <> Неопределено Тогда
|
||
КоличествоЯчеекЗаголовка = ЯчейкиЗаголовка.Количество();
|
||
Для Индекс = 0 По КоличествоЯчеекЗаголовка - 1 Цикл
|
||
Для Каждого ОписаниеМакетаОбласти Из ОписанияМакетовОбластей Цикл
|
||
// Здесь подсказка криво работает из-за кривого синтакс-помощника 8.2.13.205
|
||
// http://partners.v8.1c.ru/forum/thread.jsp?id=898023#898023
|
||
ЯчейкаМакетаОбласти = ОписаниеМакетаОбласти.Макет.Ячейки[Индекс];
|
||
Если ТипЗнч(ЯчейкаМакетаОбласти) <> Тип("ЯчейкаМакетаКоллекцииЗначенийОбластиКомпоновкиДанных") Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ПараметрЯчейки = ЯчейкаМакетаОбласти.Значение;
|
||
Если ПараметрЯчейки = Неопределено Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
Выражение = ОписаниеМакетаОбласти.Параметры["" + ПараметрЯчейки].Выражение;
|
||
ПозицияТочки = Найти(Выражение, ".");
|
||
Если Ложь
|
||
Или ПозицияТочки = 0
|
||
Или Найти(Выражение, " ") > 0
|
||
Или Найти(Выражение, "(") > 0
|
||
Тогда
|
||
//ИмяПоля = "";
|
||
Продолжить;
|
||
Иначе
|
||
ИмяПоля = Сред(Выражение, ПозицияТочки + 1);
|
||
КонецЕсли;
|
||
СхемаКолонок.Вставить(ЯчейкиЗаголовка[Индекс].Имя, ИмяПоля);
|
||
Прервать;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Возврат СхемаКолонок;
|
||
|
||
КонецФункции
|
||
|
||
Функция ПолучитьТекущуюДатуЛкс(НаСервере = Ложь) Экспорт
|
||
|
||
Если НаСервере Тогда
|
||
Результат = ирСервер.ПолучитьТекущуюДатуЛкс();
|
||
Иначе
|
||
Результат = ТекущаяДата();
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция СтрокиРавныЛкс(Знач Строка1, Знач Строка2, СУчетомРегистра = Ложь, БезПравыхНепечатныхСимволов = Ложь) Экспорт
|
||
|
||
Если Не СУчетомРегистра Тогда
|
||
Строка1 = НРег(Строка1);
|
||
Строка2 = НРег(Строка2);
|
||
КонецЕсли;
|
||
Если БезПравыхНепечатныхСимволов Тогда
|
||
Строка1 = СокрП(Строка1);
|
||
Строка2 = СокрП(Строка2);
|
||
КонецЕсли;
|
||
Результат = Строка1 = Строка2;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Поиск числа в строке
|
||
//
|
||
// Параметры:
|
||
// ИсходнаяСтрока - Строка, строка в которой ищется число
|
||
// ПозицияЧисла - Число, позиция начала числа
|
||
// КоличествоСимволов - Число, количество символов числа
|
||
//
|
||
// Возвращаемое значение:
|
||
// Булево - Истина, число найдено
|
||
//
|
||
Функция НайтиЧислоВСтрокеЛкс(ИсходнаяСтрока, ПозицияЧисла, КоличествоСимволов) Экспорт
|
||
|
||
ПозицияЧисла = 0;
|
||
КоличествоСимволов = 0;
|
||
ДлинаСтроки = СтрДлина(ИсходнаяСтрока);
|
||
Для Сч = 1 По ДлинаСтроки Цикл
|
||
ТекущийСимвол = КодСимвола(Сред(ИсходнаяСтрока, Сч, 1));
|
||
Если 48 <= ТекущийСимвол И ТекущийСимвол <= 57 Тогда
|
||
Если ПозицияЧисла = 0 Тогда
|
||
ПозицияЧисла = Сч;
|
||
КоличествоСимволов = 1;
|
||
Иначе
|
||
КоличествоСимволов = КоличествоСимволов + 1;
|
||
КонецЕсли;
|
||
Иначе
|
||
Если ПозицияЧисла <> 0 Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат ПозицияЧисла > 0;
|
||
|
||
КонецФункции // НайтиЧислоВСтроке()
|
||
|
||
Процедура ОчиститьКаталогЖурналаЛкс(КаталогЖурнала, НаСервере = Ложь, ВыводитьПредупрежденияИСообщения = Истина) Экспорт
|
||
|
||
#Если Клиент Тогда
|
||
Если ВыводитьПредупрежденияИСообщения Тогда
|
||
Ответ = КодВозвратаДиалога.ОК;
|
||
Если НаСервере Тогда
|
||
ОбщийРазмер = ирСервер.ВычислитьРазмерКаталогаЛкс(КаталогЖурнала);
|
||
Иначе
|
||
ОбщийРазмер = ВычислитьРазмерКаталогаЛкс(КаталогЖурнала);
|
||
КонецЕсли;
|
||
Если ОбщийРазмер > 0 Тогда
|
||
Ответ = Вопрос("Действительно удалить рекурсивно все файлы (" + Формат(Цел(ОбщийРазмер/1000000), "ЧН=") + "МБ) в каталоге журнала?", РежимДиалогаВопрос.ОКОтмена);
|
||
КонецЕсли;
|
||
Если Ответ <> КодВозвратаДиалога.ОК Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
Если НаСервере Тогда
|
||
ирСервер.ОчиститьКаталогЖурналаЛкс(КаталогЖурнала, ВыводитьПредупрежденияИСообщения);
|
||
Возврат;
|
||
КонецЕсли;
|
||
#КонецЕсли
|
||
ФайлыЖурнала = НайтиФайлы(КаталогЖурнала, "*.*", Истина);
|
||
Если ФайлыЖурнала.Количество() > 0 Тогда
|
||
СчетчикНеудаленных = 0;
|
||
Для Каждого ФайлЖурнала Из ФайлыЖурнала Цикл
|
||
Попытка
|
||
УдалитьФайлы(ФайлЖурнала.ПолноеИмя);
|
||
Исключение
|
||
СчетчикНеудаленных = СчетчикНеудаленных + 1;
|
||
КонецПопытки;
|
||
КонецЦикла;
|
||
Если ВыводитьПредупрежденияИСообщения Тогда
|
||
Если СчетчикНеудаленных > 0 Тогда
|
||
Сообщить("" + СчетчикНеудаленных + " файлов техножурнала удалить не удалось");
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры // ОчиститьКаталогЖурналаЛкс()
|
||
|
||
Функция ВычислитьРазмерКаталогаЛкс(Каталог, ВключаяПодкаталоги = Истина) Экспорт
|
||
|
||
Файлы = НайтиФайлы(Каталог, "*.*", ВключаяПодкаталоги);
|
||
ОбщийРазмер = 0;
|
||
Для Каждого Файл Из Файлы Цикл
|
||
Если Файл.ЭтоКаталог() Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ОбщийРазмер = ОбщийРазмер + Файл.Размер();
|
||
КонецЦикла;
|
||
Возврат ОбщийРазмер;
|
||
|
||
КонецФункции
|
||
|
||
Процедура УстановитьПометкиРодителейЛкс(Знач ТекСтрока, Знач ИмяДанныхФлажка = "Пометка") Экспорт
|
||
|
||
Родитель = ТекСтрока.Родитель;
|
||
Если Родитель = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ТекСостояние = Родитель[ИмяДанныхФлажка];
|
||
НайденыВключенные = Ложь;
|
||
НайденыВыключенные = Ложь;
|
||
Для каждого Строка из Родитель.Строки Цикл
|
||
ЗначениеФлажка = Строка[ИмяДанныхФлажка];
|
||
Если ЗначениеФлажка = 0 Тогда
|
||
НайденыВыключенные = Истина;
|
||
ИначеЕсли ЗначениеФлажка = 1 Тогда
|
||
НайденыВключенные = Истина;
|
||
ИначеЕсли ЗначениеФлажка = 2 Тогда
|
||
НайденыВключенные = Истина;
|
||
НайденыВыключенные = Истина;
|
||
Прервать;
|
||
КонецЕсли;
|
||
Если НайденыВключенные И НайденыВыключенные Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если НайденыВключенные И НайденыВыключенные Тогда
|
||
Включить = 2;
|
||
ИначеЕсли НайденыВключенные И (Не НайденыВыключенные) Тогда
|
||
Включить = 1;
|
||
ИначеЕсли (Не НайденыВключенные) И НайденыВыключенные Тогда
|
||
Включить = 0;
|
||
ИначеЕсли (Не НайденыВключенные) И (Не НайденыВыключенные) Тогда
|
||
Включить = 2;
|
||
КонецЕсли;
|
||
Если Включить = ТекСостояние Тогда
|
||
Возврат;
|
||
Иначе
|
||
Родитель[ИмяДанныхФлажка] = Включить;
|
||
УстановитьПометкиРодителейЛкс(Родитель, ИмяДанныхФлажка);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
Процедура УстановитьПометкиПодчиненныхЛкс(Знач ТекСтрока, Знач ИмяДанныхФлажка = "Пометка") Экспорт
|
||
|
||
ТекСостояние = ТекСтрока[ИмяДанныхФлажка];
|
||
Подчиненные = ТекСтрока.Строки;
|
||
|
||
Если ТекСостояние = 2 Тогда
|
||
ТекСтрока[ИмяДанныхФлажка] = 0;
|
||
КонецЕсли;
|
||
Если Подчиненные.Количество() > 0 Тогда
|
||
Для каждого Строка из Подчиненные Цикл
|
||
Строка[ИмяДанныхФлажка] = ТекСостояние;
|
||
УстановитьПометкиПодчиненныхЛкс(Строка, ИмяДанныхФлажка);
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Разбирает строку на две части: до подстроки разделителя и после
|
||
//
|
||
// Параметры:
|
||
// Стр - разбираемая строка
|
||
// Разделитель - подстрока-разделитель
|
||
// Режим - 0 - разделитель в возвращаемые подстроки не включается
|
||
// 1 - разделитель включается в левую подстроку
|
||
// 2 - разделитель включается в правую подстроку
|
||
//
|
||
// Возвращаемое значение:
|
||
// Правая часть строки - до символа-разделителя
|
||
//
|
||
Функция ОтделитьРазделителемЛкс(Стр, Знач Разделитель = ".", Режим = 0) Экспорт
|
||
|
||
ПраваяЧасть = "";
|
||
ПозРазделителя = Найти(Стр, Разделитель);
|
||
ДлинаРазделителя = СтрДлина(Разделитель);
|
||
Если ПозРазделителя > 0 Тогда
|
||
ПраваяЧасть = Сред(Стр, ПозРазделителя + ?(Режим=2, 0, ДлинаРазделителя));
|
||
Стр = СокрЛП(Лев(Стр, ПозРазделителя - ?(Режим=1, -ДлинаРазделителя+1, 1)));
|
||
КонецЕсли;
|
||
|
||
Возврат(ПраваяЧасть);
|
||
|
||
КонецФункции // вОтделитьРазделителем()
|
||
|
||
// Проверяет попадание даты внутрь интервала всключая границы
|
||
Функция ЛиДатаВИнтервалеСГраницамиЛкс(ПроверяемаяДата, НачалоПериода, КонецПериода) Экспорт
|
||
|
||
ЛиДатаВНеИнтервале = Ложь
|
||
Или (Истина
|
||
И ЗначениеЗаполнено(НачалоПериода)
|
||
И ПроверяемаяДата < НачалоПериода)
|
||
Или (Истина
|
||
И ЗначениеЗаполнено(КонецПериода)
|
||
И ПроверяемаяДата > КонецПериода);
|
||
Возврат Не ЛиДатаВНеИнтервале;
|
||
|
||
КонецФункции
|
||
|
||
// Проверяет попадание даты внутрь интервала исключая границы
|
||
Функция ЛиДатаВИнтервалеБезГраницЛкс(ПроверяемаяДата, НачалоПериода, КонецПериода) Экспорт
|
||
|
||
ПустаяДата = Дата("00010101");
|
||
ЛиДатаВНеИнтервале = Ложь
|
||
Или (Истина
|
||
И НачалоПериода <> ПустаяДата
|
||
И ПроверяемаяДата <= НачалоПериода)
|
||
Или (Истина
|
||
И КонецПериода <> ПустаяДата
|
||
И ПроверяемаяДата >= КонецПериода);
|
||
Возврат Не ЛиДатаВНеИнтервале;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЛиКаталогДоступенЛкс(Каталог, ВыводитьСообщения = Истина) Экспорт
|
||
|
||
ПроверочныйФайл = Новый Файл(Каталог);
|
||
Попытка
|
||
ЭтоКаталог = ПроверочныйФайл.ЭтоКаталог();
|
||
Исключение
|
||
Если ВыводитьСообщения Тогда
|
||
Сообщить("Указанный путь """ + Каталог + """ не доступен: " + ОписаниеОшибки());
|
||
КонецЕсли;
|
||
Возврат Ложь;
|
||
КонецПопытки;
|
||
Если Не ЭтоКаталог Тогда
|
||
Если ВыводитьСообщения Тогда
|
||
Сообщить("Указанный путь """ + Каталог + """ не является каталогом");
|
||
КонецЕсли;
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
Возврат Истина;
|
||
|
||
КонецФункции // ЛиКаталогДоступен()
|
||
|
||
Функция ПолучитьСтрокуФильтраДляВыбораФайлаЛкс(Расширение, ОписаниеФормата = "", РазрешитьВсеФайлы = Истина) Экспорт
|
||
|
||
Результат = "(*." + Расширение + ")|*." + Расширение;
|
||
Если ЗначениеЗаполнено(ОписаниеФормата) Тогда
|
||
Результат = ОписаниеФормата + " " + Результат;
|
||
КонецЕсли;
|
||
Если РазрешитьВсеФайлы Тогда
|
||
Результат = Результат + "|Все файлы (*.*)|*.*";
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
#Если Клиент Тогда
|
||
|
||
Процедура ОткрытьФайлСПредупреждениемЛкс(ИмяФайла, СтандартнаяОбработка = Неопределено) Экспорт
|
||
|
||
СтандартнаяОбработка = Ложь;
|
||
Ответ = Вопрос("Вы уверены, что хотите открыть """ + ИмяФайла + """?", РежимДиалогаВопрос.ОКОтмена);
|
||
Если Ответ = КодВозвратаДиалога.ОК Тогда
|
||
ЗапуститьПриложение(ИмяФайла);
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
#КонецЕсли |