xmlTSDGalery/CommonModules/ОбщегоНазначенияБПОКлиентСервер/Ext/Module.bsl
kykaevv 88098aa86f Initial commit: конфигурация ТСД с обменом УНФ.
Включает перемещение по ячейкам, стикеровку МП, синхронизацию справочников и обработку кодов маркировки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 12:50:57 +03:00

815 lines
45 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Область ПрограммныйИнтерфейс
// Функция возвращает разделитель GS1.
//
// Возвращаемое значение:
// Строка.
//
Функция РазделительGS1() Экспорт;
Возврат Символ(29); // Dec 29
КонецФункции
// Функция возвращает экранированный символ GS1.
//
// Возвращаемое значение:
// Строка.
//
Функция ЭкранированныйСимволGS1() Экспорт;
Возврат "\x1d"; // Используется для экранирования символа GS1.
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину.
// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
// рекомендуется использовать функцию платформы СтрРазделить.
//
// Параметры:
// Значение - Строка - текст с разделителями.
// Разделитель - Строка - разделитель строк текста, минимум 1 символ.
// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
// > для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
// включаются в результат;
// > если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
// при других разделителях результатом функции будет пустой массив.
// СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
//
// Возвращаемое значение:
// Массив из Строка
//
// Пример:
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",")
// - возвратит массив из 5 элементов, три из которых - пустые: "", "один", "", "два", "";
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина)
// - возвратит массив из двух элементов: "один", "два";
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один два ", " ")
// - возвратит массив из двух элементов: "один", "два";
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("")
// - возвратит пустой массив;
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь)
// - возвратит массив с одним элементом: ""(пустая строка);
// СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ")
// - возвратит массив с одним элементом: "" (пустая строка).
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено,
СокращатьНепечатаемыеСимволы = Ложь) Экспорт
Если СтрДлина(Разделитель) = 1
И ПропускатьПустыеСтроки = Неопределено
И СокращатьНепечатаемыеСимволы Тогда
Результат = СтрРазделить(Значение, Разделитель, Ложь);
Для Индекс = 0 По Результат.ВГраница() Цикл
Результат[Индекс] = СокрЛП(Результат[Индекс])
КонецЦикла;
Возврат Результат;
КонецЕсли;
Результат = Новый Массив;
// Для обеспечения обратной совместимости.
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Значение) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = СтрНайти(Значение, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Значение, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Подстрока));
Иначе
Результат.Добавить(Подстрока);
КонецЕсли;
КонецЕсли;
Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
Позиция = СтрНайти(Значение, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Значение));
Иначе
Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// Разбирает строку URI на составные части и возвращает в виде структуры.
// На основе RFC 3986.
//
// Параметры:
// СтрокаURI - Строка - ссылка на ресурс в формате:
// <схема>://<логин>:<пароль>@<хост>:<порт>/<путь>?<параметры>#<якорь>.
//
// Возвращаемое значение:
// Структура - составные части URI согласно формату:
// * Схема - Строка.
// * Логин - Строка.
// * Пароль - Строка.
// * ИмяСервера - Строка - часть <хост>:<порт> входного параметра.
// * Хост - Строка.
// * Порт - Неопределено, Число -
// * ПутьНаСервере - Строка - часть <путь>?<параметры>#<якорь> входного параметра.
//
Функция СтруктураURI(Знач СтрокаURI) Экспорт
СтрокаURI = СокрЛП(СтрокаURI);
// схема
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;
// Строка соединения и путь на сервере.
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;
// Информация пользователя и имя сервера.
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;
// логин и пароль
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;
// хост и порт
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(ПустаяСтрока(Порт), Неопределено, Число(Порт)));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
Возврат Результат;
КонецФункции
// Возвращает Истина, если клиентское приложение является мобильным клиентом.
//
// Возвращаемое значение:
// Булево - если нет клиентского приложения, возвращается Ложь.
//
Функция ЭтоМобильныйКлиент() Экспорт
#Если МобильныйКлиент Тогда
Возврат Истина;
#ИначеЕсли Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
ЭтоМобильныйКлиент = Ложь;
Если ЭтоМобильныйКлиент = Неопределено Тогда
Возврат Ложь; // Нет клиентского приложения.
КонецЕсли;
Возврат ЭтоМобильныйКлиент;
#Иначе
Возврат Ложь;
#КонецЕсли
КонецФункции
// Создает массив и помещает в него переданное значение.
//
// Параметры:
// Значение - Произвольный - любое значение.
//
// Возвращаемое значение:
// Массив из Произвольный - массив из одного элемента.
//
Функция ЗначениеВМассиве(Значение) Экспорт
Массив = Новый Массив;
Массив.Добавить(Значение);
Возврат Массив;
КонецФункции
// Base64 в штрихкод.
//
// Параметры:
// ШтрихкодВBase64 - Строка - Штрихкод в base64
//
// Возвращаемое значение:
// Строка - Base64 в штрихкод
Функция Base64ВШтрихкод(ШтрихкодВBase64) Экспорт
ДвоичныеДанные = Base64Значение(ШтрихкодВBase64);
Если ДвоичныеДанные = Неопределено Тогда
Штрихкод = ШтрихкодВBase64;
Иначе
Штрихкод = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
КонецЕсли;
Возврат Штрихкод;
КонецФункции
// Штрихкод в base64.
//
// Параметры:
// Штрихкод - Строка - Штрихкод
//
// Возвращаемое значение:
// Строка - Штрихкод в base64
Функция ШтрихкодВBase64(Штрихкод) Экспорт
Если Штрихкод = Неопределено Тогда
ДвоичныеДанныеСтроки = Неопределено;
Иначе
ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(Штрихкод);
ШтрихкодBase64 = Base64Строка(ДвоичныеДанныеСтроки);
ШтрихкодBase64 = СтрЗаменить(ШтрихкодBase64, Символы.ПС, "");
ШтрихкодBase64 = СтрЗаменить(ШтрихкодBase64, Символы.ВК, "");
КонецЕсли;
Возврат ШтрихкодBase64;
КонецФункции
// Функция возвращает разделитель RS.
//
// Возвращаемое значение:
// Строка.
//
Функция РазделительRS() Экспорт;
Возврат Символ(30); // Dec 30
КонецФункции
// Функция возвращает экранированный символ RS.
//
// Возвращаемое значение:
// Строка.
//
Функция ЭкранированныйСимволRS() Экспорт;
Возврат "\x1e"; // Используется для экранирования символа RS.
КонецФункции
// Функция возвращает разделитель EOT.
//
// Возвращаемое значение:
// Строка.
//
Функция РазделительEOT() Экспорт;
Возврат Символ(4); // Dec 4
КонецФункции
// Функция возвращает экранированный символ EOT.
//
// Возвращаемое значение:
// Строка.
//
Функция ЭкранированныйСимволEOT() Экспорт;
Возврат "\x4"; // Используется для экранирования символа EOT.
КонецФункции
// Преобразовать TimeStamp в дату
// Параметры:
// Timestamp - Строка, Число - значение содержащее временной штамп
//
// Возвращаемое значение:
// Дата
//
Функция TimestampВДату(Timestamp) Экспорт
Попытка
Возврат Дата("19700101")+(?(ТипЗнч(Timestamp) = Тип("Строка"), Число(Timestamp), Timestamp) / 1000);
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Преобразовать дату в TimeStamp
//
// Параметры:
// Дата - Дата - дата которую требуется преобразовать
//
// Возвращаемое значение:
// Строка
//
Функция ДатуВTimestamp(Дата = Неопределено) Экспорт
Возврат Формат(Число(?(ТипЗнч(Дата) = Тип("Дата"), Дата, ТекущаяДата()) - Дата("19700101")),"ЧН=0; ЧГ=0");
КонецФункции
Функция ПредставлениеРевизияИнтерфейса(РевизияИнтерфейса) Экспорт
Если РевизияИнтерфейса >= 5000 Тогда
Результат = "5." + Строка(РевизияИнтерфейса - 5000);
ИначеЕсли РевизияИнтерфейса >= 4000 Тогда
Результат = "4." + Строка(РевизияИнтерфейса - 4000);
ИначеЕсли РевизияИнтерфейса >= 3000 Тогда
Результат = "3." + Строка(РевизияИнтерфейса - 3000);
ИначеЕсли РевизияИнтерфейса >= 2000 Тогда
Результат = "2." + Строка(РевизияИнтерфейса - 2000);
ИначеЕсли РевизияИнтерфейса > 1000 Тогда
Результат = "1." + Строка(РевизияИнтерфейса - 1000);
Иначе
Результат = "";
КонецЕсли;
Возврат Результат;
КонецФункции
#Область Интернет
// Создает объект описания защищенного соединения OpenSSL.
// См. также описание объекта ЗащищенноеСоединениеOpenSSL в синтаксис-помощнике.
//
// Параметры:
// СертификатКлиента - СертификатКлиентаФайл
// - СертификатКлиентаWindows
// - Неопределено - клиентский сертификат OpenSSL.
// СертификатыУдостоверяющихЦентров - СертификатыУдостоверяющихЦентровФайл
// - СертификатыУдостоверяющихЦентровWindows
// - СертификатыУдостоверяющихЦентровLinux
// - СертификатыУдостоверяющихЦентровОС
// - Неопределено - сертификаты удостоверяющих центров OpenSSL.
//
// Возвращаемое значение:
// ЗащищенноеСоединениеOpenSSL
//
Функция НовоеЗащищенноеСоединение(Знач СертификатКлиента = Неопределено, Знач СертификатыУдостоверяющихЦентров = Неопределено) Экспорт
ЗащищенноеСоединение = Неопределено;
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Если ОбщегоНазначенияБПО.ИспользуетсяБСП() Тогда
// Вызов БСП
ОбщегоНазначенияМодуль = ОбщегоНазначенияБПО.ОбщийМодуль("ОбщегоНазначенияКлиентСервер");
ЗащищенноеСоединение = ОбщегоНазначенияМодуль.НовоеЗащищенноеСоединение(СертификатКлиента, СертификатыУдостоверяющихЦентров);
// Конец Вызов БСП
КонецЕсли;
#Иначе
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяБСП() Тогда
// Вызов БСП
ОбщегоНазначенияМодуль = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОбщегоНазначенияКлиентСервер");
ЗащищенноеСоединение = ОбщегоНазначенияМодуль.НовоеЗащищенноеСоединение(СертификатКлиента, СертификатыУдостоверяющихЦентров);
// Конец Вызов БСП
КонецЕсли;
#КонецЕсли
Если ЗащищенноеСоединение = Неопределено Тогда
#Если ВебКлиент Или МобильныйКлиент Тогда
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
#Иначе
Если СертификатыУдостоверяющихЦентров = Неопределено Тогда
ВерсииПлатформыДляИспользованияСертификатов = "8.3.22.2470; 8.3.23.2122; 8.3.24.1446";
СистемнаяИнформация = Новый СистемнаяИнформация;
ТекущийНомерВерсии = ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения);
ИспользоватьСертификатыУдостоверяющихЦентров = СравнитьВерсииБезНомераСборки(ТекущийНомерВерсии, "8.3.21") > 0;
Если ИспользоватьСертификатыУдостоверяющихЦентров Тогда
Если СравнитьВерсииБезНомераСборки(ТекущийНомерВерсии, "8.3.25") < 0 Тогда
Для Каждого НомерСборки Из СтрРазделить(ВерсииПлатформыДляИспользованияСертификатов, "; ", Ложь) Цикл
Если СтрНачинаетсяС(НомерСборки, ТекущийНомерВерсии + ".") Тогда
ИспользоватьСертификатыУдостоверяющихЦентров =
СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, НомерСборки) >= 0;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ИспользоватьСертификатыУдостоверяющихЦентров Тогда
СертификатыУдостоверяющихЦентров = Новый СертификатыУдостоверяющихЦентровОС();
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, СертификатыУдостоверяющихЦентров);
#КонецЕсли
КонецЕсли;
Возврат ЗащищенноеСоединение;
КонецФункции
#КонецОбласти
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
// Объект - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства;
// ИмяРеквизита - Строка - имя реквизита или свойства.
//
// Возвращаемое значение:
// Булево - Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
КлючУникальности = Новый УникальныйИдентификатор;
СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
КонецФункции
// Проверяет, содержит ли строка только цифры.
//
// Параметры:
// Значение - Строка - проверяемая строка.
// Устаревший - Булево - устаревший параметр, не используется.
// ПробелыЗапрещены - Булево - если Ложь, то в строке допустимо наличие пробелов.
//
// Возвращаемое значение:
// Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы.
//
// Пример:
// Результат = ТолькоЦифрыВСтроке("0123"); // Истина
// Результат = ТолькоЦифрыВСтроке("0123abc"); // Ложь
// Результат = ТолькоЦифрыВСтроке("01 2 3",, Ложь); // Истина
//
Функция ТолькоЦифрыВСтроке(Знач Значение, Знач Устаревший = Истина, Знач ПробелыЗапрещены = Истина) Экспорт
Если ТипЗнч(Значение) <> Тип("Строка") Тогда
Возврат Ложь;
КонецЕсли;
Если Не ПробелыЗапрещены Тогда
Значение = СтрЗаменить(Значение, " ", "");
КонецЕсли;
Если СтрДлина(Значение) = 0 Тогда
Возврат Истина;
КонецЕсли;
// Если содержит только цифры, то в результате замен должна быть получена пустая строка.
// Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы.
Возврат СтрДлина(
СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0;
КонецФункции
Функция СтрокаЗапускаБезопасная(СтрокаЗапуска) Экспорт
// Безопасными считаются такие строковые данные, которые не содержат в себе следующие символы: "$", "`", "|", "||" ";", "&", "&&".
ОпасныйВызов = СтрНайти(СтрокаЗапуска, "$")>0
Или СтрНайти(СтрокаЗапуска, "`")>0
Или СтрНайти(СтрокаЗапуска, "|")>0
Или СтрНайти(СтрокаЗапуска, "||")>0
Или СтрНайти(СтрокаЗапуска, ";")>0
Или СтрНайти(СтрокаЗапуска, "&")>0
Или СтрНайти(СтрокаЗапуска, "&&")>0;
Возврат Не ОпасныйВызов;
КонецФункции
Функция ДатаСеанса() Экспорт
Возврат ОбщегоНазначенияБПОСлужебныйВызовСервера.ДатаСеанса();
КонецФункции
// Преобразовать идентификатор в строку с пробелами
//
// Параметры:
// Идентификатор - Строка - идентификатор который требуется преобразовать
//
// Возвращаемое значение:
// Строка - идентификатор преобразованный в читаемый вид
Функция ПредставлениеИдентификатора(Идентификатор) Экспорт
РазмерСтроки = СтрДлина(Идентификатор);
Результат = "";
Для Номер=1 По РазмерСтроки Цикл
КодСимвола = КодСимвола(Идентификатор, Номер);
КодСледующегоСимвола = КодСимвола(Идентификатор, Номер + 1);
КлассСимвола = "";
Если КодСимвола >= КодСимвола("а") И КодСимвола <= КодСимвола("я") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодСимвола >= КодСимвола("a") И КодСимвола <= КодСимвола("z") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодСимвола >= КодСимвола("А") И КодСимвола <= КодСимвола("Я") Тогда
Если Номер = 1 Тогда
Результат = Результат + Символ(КодСимвола);
Иначе
КодПредыдущегоСимвола = КодСимвола(Идентификатор, Номер - 1);
Если КодПредыдущегоСимвола >= КодСимвола("0") И КодПредыдущегоСимвола <= КодСимвола("9") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодПредыдущегоСимвола >= КодСимвола("A") И КодПредыдущегоСимвола <= КодСимвола("Z") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодПредыдущегоСимвола >= КодСимвола("А") И КодПредыдущегоСимвола <= КодСимвола("Я") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодСледующегоСимвола >= КодСимвола("А") И КодСледующегоСимвола <= КодСимвола("Я") Тогда
Результат = Результат + " " + Символ(КодСимвола);
Иначе
Результат = Результат + " " + НРег(Символ(КодСимвола));
КонецЕсли;
КонецЕсли;
ИначеЕсли КодСимвола >= КодСимвола("A") И КодСимвола <= КодСимвола("Z") Тогда
Если Номер = 1 Тогда
Результат = Результат + Символ(КодСимвола);
Иначе
КодПредыдущегоСимвола = КодСимвола(Идентификатор, Номер - 1);
Если КодПредыдущегоСимвола >= КодСимвола("A") И КодПредыдущегоСимвола <= КодСимвола("Z") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодПредыдущегоСимвола = КодСимвола("_") Тогда
Результат = Результат + Символ(КодСимвола);
Иначе
Результат = Результат + " " + Символ(КодСимвола);
КонецЕсли;
КонецЕсли;
ИначеЕсли КодСимвола >= КодСимвола("0") И КодСимвола <= КодСимвола("9") Тогда
Если Номер = 1 Тогда
Результат = Результат + Символ(КодСимвола);
Иначе
КодПредыдущегоСимвола = КодСимвола(Идентификатор, Номер - 1);
Если КодПредыдущегоСимвола >= КодСимвола("0") И КодПредыдущегоСимвола <= КодСимвола("9") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодПредыдущегоСимвола >= КодСимвола("A") И КодПредыдущегоСимвола <= КодСимвола("Z") Тогда
Результат = Результат + Символ(КодСимвола);
ИначеЕсли КодПредыдущегоСимвола >= КодСимвола("А") И КодПредыдущегоСимвола <= КодСимвола("Я") Тогда
Результат = Результат + Символ(КодСимвола);
Иначе
Результат = Результат + " " + Символ(КодСимвола);
КонецЕсли;
КонецЕсли;
ИначеЕсли КодСимвола = КодСимвола("_") Тогда
Результат = Результат + Символ(КодСимвола);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Получает номер версии конфигурации без номера сборки.
//
// Параметры:
// Версия - Строка - версия конфигурации в формате РР.ПП.ЗЗ.СС,
// где СС - номер сборки, который будет удален.
//
// Возвращаемое значение:
// Строка - номер версии конфигурации без номера сборки в формате РР.ПП.ЗЗ.
//
Функция ВерсияКонфигурацииБезНомераСборки(Знач Версия) Экспорт
Массив = СтрРазделить(Версия, ".");
Если Массив.Количество() < 3 Тогда
Возврат Версия;
КонецЕсли;
Результат = "[Редакция].[Подредакция].[Релиз]";
Результат = СтрЗаменить(Результат, "[Редакция]", Массив[0]);
Результат = СтрЗаменить(Результат, "[Подредакция]", Массив[1]);
Результат = СтрЗаменить(Результат, "[Релиз]", Массив[2]);
Возврат Результат;
КонецФункции
// Сравнить две строки версий.
//
// Параметры:
// СтрокаВерсии1 - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.
// СтрокаВерсии2 - Строка - второй сравниваемый номер версии.
//
// Возвращаемое значение:
// Число - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//
Функция СравнитьВерсииБезНомераСборки(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт
Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0", СтрокаВерсии1);
Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0", СтрокаВерсии2);
Версия1 = СтрРазделить(Строка1, ".");
Если Версия1.Количество() <> 3 Тогда
ВызватьИсключение ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неправильный формат параметра %1: %2'"), "СтрокаВерсии1", СтрокаВерсии1);
КонецЕсли;
Версия2 = СтрРазделить(Строка2, ".");
Если Версия2.Количество() <> 3 Тогда
ВызватьИсключение ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неправильный формат параметра %1: %2'"), "СтрокаВерсии2", СтрокаВерсии2);
КонецЕсли;
Результат = 0;
Для Разряд = 0 По 2 Цикл
Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
Если Результат <> 0 Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Сравнить две строки версий.
//
// Параметры:
// СтрокаВерсии1 - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.СС.
// СтрокаВерсии2 - Строка - второй сравниваемый номер версии.
//
// Возвращаемое значение:
// Число - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//
Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт
Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0.0", СтрокаВерсии1);
Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0.0", СтрокаВерсии2);
Версия1 = СтрРазделить(Строка1, ".");
Если Версия1.Количество() <> 4 Тогда
ВызватьИсключение ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неправильный формат параметра %1: %2'"), "СтрокаВерсии1", СтрокаВерсии1);
КонецЕсли;
Версия2 = СтрРазделить(Строка2, ".");
Если Версия2.Количество() <> 4 Тогда
ВызватьИсключение ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неправильный формат параметра %1: %2'"), "СтрокаВерсии2", СтрокаВерсии2);
КонецЕсли;
Результат = 0;
Для Разряд = 0 По 3 Цикл
Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
Если Результат <> 0 Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Подставляет параметры в строку. Максимально возможное число параметров - 9.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы.
//
// Параметры:
// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>",
// например "%1 пошел в %2");
// Параметр1 - Строка - значение подставляемого параметра.
// Параметр2 - Строка
// Параметр3 - Строка
// Параметр4 - Строка
// Параметр5 - Строка
// Параметр6 - Строка
// Параметр7 - Строка
// Параметр8 - Строка
// Параметр9 - Строка
//
// Возвращаемое значение:
// Строка - текстовая строка с подставленными параметрами.
//
// Пример:
// СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел
// в Зоопарк".
//
Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки,
Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт
ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%")
Или СтрНайти(Параметр2, "%")
Или СтрНайти(Параметр3, "%")
Или СтрНайти(Параметр4, "%")
Или СтрНайти(Параметр5, "%")
Или СтрНайти(Параметр6, "%")
Или СтрНайти(Параметр7, "%")
Или СтрНайти(Параметр8, "%")
Или СтрНайти(Параметр9, "%");
Если ЕстьПараметрыСПроцентом Тогда
Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1,
Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9);
КонецЕсли;
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8);
ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9);
Возврат ШаблонСтроки;
КонецФункции
// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д.
Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки,
Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено)
Результат = "";
Позиция = СтрНайти(СтрокаПодстановки, "%");
Пока Позиция > 0 Цикл
Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1);
СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1);
ПодставляемыйПараметр = Неопределено;
Если СимволПослеПроцента = "1" Тогда
ПодставляемыйПараметр = Параметр1;
ИначеЕсли СимволПослеПроцента = "2" Тогда
ПодставляемыйПараметр = Параметр2;
ИначеЕсли СимволПослеПроцента = "3" Тогда
ПодставляемыйПараметр = Параметр3;
ИначеЕсли СимволПослеПроцента = "4" Тогда
ПодставляемыйПараметр = Параметр4;
ИначеЕсли СимволПослеПроцента = "5" Тогда
ПодставляемыйПараметр = Параметр5;
ИначеЕсли СимволПослеПроцента = "6" Тогда
ПодставляемыйПараметр = Параметр6;
ИначеЕсли СимволПослеПроцента = "7" Тогда
ПодставляемыйПараметр = Параметр7
ИначеЕсли СимволПослеПроцента = "8" Тогда
ПодставляемыйПараметр = Параметр8;
ИначеЕсли СимволПослеПроцента = "9" Тогда
ПодставляемыйПараметр = Параметр9;
КонецЕсли;
Если ПодставляемыйПараметр = Неопределено Тогда
Результат = Результат + "%";
СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1);
Иначе
Результат = Результат + ПодставляемыйПараметр;
СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2);
КонецЕсли;
Позиция = СтрНайти(СтрокаПодстановки, "%");
КонецЦикла;
Результат = Результат + СтрокаПодстановки;
Возврат Результат;
КонецФункции
Функция МассивыСовпадают(Массив1, Массив2) Экспорт
Если Массив1.Количество() <> Массив2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого Элемент Из Массив1 Цикл
Если Массив2.Найти(Элемент) = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
#КонецОбласти