Фирма 1С разработала Библиотеку подключаемого оборудования для мобильной платформы, однако нормального описания и примеров использования не предоставлено. В результате пришлось повозиться некоторое время, чтобы подключить Сканер штрих кодов к мобильному пр...
НаКлиенте
Процедура ОписьНаСтройку(Команда)
КомпоновщикНастроек = ПолучитьКомпоновщикНастроек();
Настройки = КомпоновщикНастроек.Настройки;
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, ДатаКонца, ТекущаяДата());
ПараметрыОткрытия = Нов...
Cкрипт "ИР Адаптер" для платного расширения TurboConf обеспечивает в конфигураторе 1С 8 доступ к функциям мощной подсистемы "Инструменты разработчика Tormozit" (ИР)
Вариант 1. Будет выведено сообщение "Закрыть форму?" и 2 кнопки "Да/Нет".
У формы нужно добавить реквизит, например "ЗакрытьФормуБезПодтверждения", содержащий в себе признак того, нужно выводить предупреждение или нет.
НаКлиенте
Процедура ПередЗакрытием(От...
Возвращает структуру реквизитов объекта или ссылки, включая стандартные реквизиты и реквизиты табличной части. Можно использовать, если необходимо, например, эмулировать вызов метода, использующего объект формы.
// Возвращает структуру реквизитов объекта или ссылки, включая стандартные реквизиты и реквизиты табличной части.
// Можно использовать, если необходимо, например, эмулировать вызов метода, использующего объект формы.
//
// Параметры:
// ВходящийОбъект - ЛюбаяСсылка или ЛюбойОбъект
//
// Возвращаемое значение:
// Структура
//
Функция КонвертироватьОбъектВСтруктуру(ВходящийОбъект)
СтруктураОбъекта = Новый Структура;
СтандартныеРеквизитыОбъекта = ВходящийОбъект.Метаданные().СтандартныеРеквизиты;
Для Каждого СтандартныйРеквизит Из СтандартныеРеквизитыОбъекта Цикл
СтруктураОбъекта.Вставить(СтандартныйРеквизит.Имя, ВходящийОбъект[СтандартныйРеквизит.Имя]);
КонецЦикла;
РеквизитыОбъекта = ВходящийОбъект.Метаданные().Реквизиты;
Для Каждого Реквизит Из РеквизитыОбъекта Цикл
СтруктураОбъекта.Вставить(Реквизит.Имя, ВходящийОбъект[Реквизит.Имя]);
КонецЦикла;
ТЧ = ВходящийОбъект.Метаданные().ТабличныеЧасти;
Для Каждого ТаблЧасть Из ТЧ Цикл
ТЗ = ВходящийОбъект[ТаблЧасть.Имя].Выгрузить();
Массив = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТЗ);
СтруктураОбъекта.Вставить(ТаблЧасть.Имя, Массив);
КонецЦикла;
Возврат СтруктураОбъекта;
КонецФункции
// Возвращает структуру реквизитов объекта или ссылки, включая стандартные реквизиты и реквизиты табличной части.
// Можно использовать, если необходимо, например, эмулировать вызов метода, использующего объект формы.
//
// Параметры:
// ВходящийОбъект - ЛюбаяСсылка или ЛюбойОбъект
//
// Возвращаемое значение:
// Структура
//
Функция КонвертироватьОбъектВСтруктуру(ВходящийОбъект)
СтруктураОбъекта = Новый Структура;
СтандартныеРеквизитыОбъекта = ВходящийОбъект.Метаданные().СтандартныеРеквизиты;
Для Каждого СтандартныйРеквизит Из СтандартныеРеквизитыОбъекта Цикл
СтруктураОбъекта.Вставить(СтандартныйРеквизит.Имя, ВходящийОбъект[СтандартныйРеквизит.Имя]);
КонецЦикла;
РеквизитыОбъекта = ВходящийОбъект.Метаданные().Реквизиты;
Для Каждого Реквизит Из РеквизитыОбъекта Цикл
СтруктураОбъекта.Вставить(Реквизит.Имя, ВходящийОбъект[Реквизит.Имя]);
КонецЦикла;
ТЧ = ВходящийОбъект.Метаданные().ТабличныеЧасти;
Для Каждого ТаблЧасть Из ТЧ Цикл
ТЗ = ВходящийОбъект[ТаблЧасть.Имя].Выгрузить();
Массив = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТЗ);
СтруктураОбъекта.Вставить(ТаблЧасть.Имя, Массив);
КонецЦикла;
Возврат СтруктураОбъекта;
КонецФункции
Отправка сформированного табличного документа в формате эксель для БП
Процедура СформироатьТабДок()
ТабДок = Новый ТабличныйДокумент;
ОблШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОблШапка);
ПотокВПамяти = Новый ПотокВПамяти();
ТабДок.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
Тема = "Тема от: "+Строка(Формат(ТекущаяДата()-86400, "ДФ=dd.MM.yyyy"));
ТекстПисьма = "";
ОтправитьEmail("Адрес отправки", , Тема, ТекстПисьма, ДвоичныеДанные, "Имя отправителя");
КонецПроцедуры
&НаСервере
Процедура ОтправитьEmail(АдресПочты, Копия = Неопределено, Тема, ТекстПисьма, Вложение = Неопределено, ИмяОтправителя)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПортIMAP = 993;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Профиль.Пользователь = "Пользователь";
Профиль.Пароль = "Пароль";
Профиль.ПользовательSMTP = "ПользовательSMTP";
Профиль.ПарольSMTP = "ПарольSMTP";
Сообщение.Отправитель.Адрес = "Адрес";
Сообщение.ИмяОтправителя = ИмяОтправителя;
Профиль.ИспользоватьSSLSMTP = Истина;
Сообщение.Получатели.Добавить(АдресПочты);
Сообщение.Тема = Тема;
Сообщение.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
Если Вложение <> Неопределено тогда
Тема = Тема+".xlsx";
Сообщение.Вложения.Добавить(Вложение,Тема);
КонецЕсли;
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура СформироатьТабДок()
ТабДок = Новый ТабличныйДокумент;
ОблШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОблШапка);
ПотокВПамяти = Новый ПотокВПамяти();
ТабДок.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
Тема = "Тема от: "+Строка(Формат(ТекущаяДата()-86400, "ДФ=dd.MM.yyyy"));
ТекстПисьма = "";
ОтправитьEmail("Адрес отправки", , Тема, ТекстПисьма, ДвоичныеДанные, "Имя отправителя");
КонецПроцедуры
&НаСервере
Процедура ОтправитьEmail(АдресПочты, Копия = Неопределено, Тема, ТекстПисьма, Вложение = Неопределено, ИмяОтправителя)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПортIMAP = 993;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Профиль.Пользователь = "Пользователь";
Профиль.Пароль = "Пароль";
Профиль.ПользовательSMTP = "ПользовательSMTP";
Профиль.ПарольSMTP = "ПарольSMTP";
Сообщение.Отправитель.Адрес = "Адрес";
Сообщение.ИмяОтправителя = ИмяОтправителя;
Профиль.ИспользоватьSSLSMTP = Истина;
Сообщение.Получатели.Добавить(АдресПочты);
Сообщение.Тема = Тема;
Сообщение.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
Если Вложение <> Неопределено тогда
Тема = Тема+".xlsx";
Сообщение.Вложения.Добавить(Вложение,Тема);
КонецЕсли;
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Возвращает сколько процентов число от числа
// Сколько процентов число от числа
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/151
//
// Параметры:
// Число - Число
// ОтЧисла - Число
// ОкруглятьДо - Число - Количество знаков округления, 0 - не требуется
//
// Возвращаемое значение:
// Число
//
// Пример:
// Процент = СколькоПроцентовЧислоОтЧисла(10, 100); // 10
// Процент = СколькоПроцентовЧислоОтЧисла(9, 69, 2); // 13.04
//
Функция СколькоПроцентовЧислоОтЧисла(
Знач Число, Знач ОтЧисла, Знач ОкруглятьДо = 0) Экспорт
Если ОтЧисла = 0 Тогда
Возврат 0;
КонецЕсли;
Результат = (Число / ОтЧисла) * 100;
Если ОкруглятьДо > 0 Тогда
Результат = Окр(Результат, ОкруглятьДо);
КонецЕсли;
Возврат Результат;
КонецФункции
// Сколько процентов число от числа
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/151
//
// Параметры:
// Число - Число
// ОтЧисла - Число
// ОкруглятьДо - Число - Количество знаков округления, 0 - не требуется
//
// Возвращаемое значение:
// Число
//
// Пример:
// Процент = СколькоПроцентовЧислоОтЧисла(10, 100); // 10
// Процент = СколькоПроцентовЧислоОтЧисла(9, 69, 2); // 13.04
//
Функция СколькоПроцентовЧислоОтЧисла(
Знач Число, Знач ОтЧисла, Знач ОкруглятьДо = 0) Экспорт
Если ОтЧисла = 0 Тогда
Возврат 0;
КонецЕсли;
Результат = (Число / ОтЧисла) * 100;
Если ОкруглятьДо > 0 Тогда
Результат = Окр(Результат, ОкруглятьДо);
КонецЕсли;
Возврат Результат;
КонецФункции
Возвращает копию массива с указанием числа элементов и начального индекса
В коде есть две реализации метода:
1. КопияМассиваНаполнением - Создает пустой массив и наполняет его циклом из оригинала
2. КопияМассиваУдалениемЛишних - Создает полную копию и удаления лишние элементы
А так же метод КопияМассива, который в зависимости от числа объектов массива сам выбирает один из методов
// Возвращает копию массива с указанием числа элементов и начального индекса
// Внутри есть определение метода копирования
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
// Массив - Массив из Произвольный
// НачальныйЭлемент - Число - Индекс начального элемента
// ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
// МетодКопирования - Число - 0 - определять автоматически, 1 - наполнение циклом, 2 - удаление лишних
//
// Возвращаемое значение:
// Массив из Произвольный
//
// Примеры:
// ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
// Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4" - Три элемента с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 1); //"2,3,4,5" - Все элементы с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2" - Первые 2 элемента
// Результат = КопияМассива(ИсходныйМассив); //"1,2,3,4,5" - Полная копия массива
//
Функция КопияМассива(Знач Массив, Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0, Знач МетодКопирования = 0) Экспорт
ВсегоЭлементов = Массив.Количество();
Если МетодКопирования = 0 Тогда
//Если массив меньше, то нет принципиально разницы в скорости
//TODO: Определить экспериментально идеальное значение
МинимальнаяДлинаМассиваДляПоискаМетода = 10;
Если ВсегоЭлементов > МинимальнаяДлинаМассиваДляПоискаМетода Тогда
Если ЧислоЭлементов = 0 Тогда
ЧислоЭлементов = ВсегоЭлементов - (НачальныйЭлемент + 1);
КонецЕсли;
Если ЧислоЭлементов = 0 Тогда
Возврат Новый Массив;
Иначе
ПроцентНужных = (ЧислоЭлементов / ВсегоЭлементов) * 100;
Если ПроцентНужных > 90 Тогда
МетодКопирования = 2; //Легче скопировать весь большой массив и удалить лишние элементы
Иначе
МетодКопирования = 1; //Легче взять нужные элементы из большого массива
КонецЕсли;
КонецЕсли;
Иначе
МетодКопирования = 1; //Устроит любой метод
КонецЕсли;
КонецЕсли;
Если МетодКопирования = 1 Тогда
КопияМассива = КопияМассиваНаполнением(Массив, НачальныйЭлемент, ЧислоЭлементов);
Иначе
КопияМассива = КопияМассиваУдалениемЛишних(Массив, НачальныйЭлемент, ЧислоЭлементов);
КонецЕсли;
Возврат КопияМассива;
КонецФункции
// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает полную копию и удаления лишние элементы
// Эффективен, когда нужно взять бОльшую часть большОго массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
// Массив - Массив из Произвольный
// НачальныйЭлемент - Число - Индекс начального элемента
// ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//
// Возвращаемое значение:
// Массив из Произвольный
//
// Примеры:
// ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
// Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4" - Три элемента с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 1); //"2,3,4,5" - Все элементы с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2" - Первые 2 элемента
// Результат = КопияМассива(ИсходныйМассив); //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваУдалениемЛишних(Знач Массив,
Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт
КопияМассива = Новый Массив(Новый ФиксированныйМассив(Массив));
Пока НачальныйЭлемент > 0 Цикл
КопияМассива.Удалить(0);
НачальныйЭлемент = НачальныйЭлемент - 1;
КонецЦикла;
Если ЧислоЭлементов > 0 Тогда
ЭлементовКУдалению = КопияМассива.Количество() - ЧислоЭлементов;
Пока ЭлементовКУдалению > 0 Цикл
КопияМассива.Удалить(КопияМассива.ВГраница());
ЭлементовКУдалению = ЭлементовКУдалению - 1;
КонецЦикла;
КонецЕсли;
Возврат КопияМассива;
КонецФункции
// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает пустой массив и наполняет его циклом из оригинала
// Эффективен, когда нужно взять несколько элементов из оригинального большого массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
// Массив - Массив из Произвольный
// НачальныйЭлемент - Число - Индекс начального элемента
// ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//
// Возвращаемое значение:
// Массив из Произвольный
//
// Примеры:
// ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
// Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4" - Три элемента с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 1); //"2,3,4,5" - Все элементы с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2" - Первые 2 элемента
// Результат = КопияМассива(ИсходныйМассив); //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваНаполнением(Знач Массив,
Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт
Если ЧислоЭлементов = 0 Тогда
ЧислоЭлементов = Массив.Количество() - НачальныйЭлемент;
КонецЕсли;
КопияМассива = Новый Массив(ЧислоЭлементов);
ИндексКопии = 0;
ИндексМассива = НачальныйЭлемент;
Пока ИндексКопии < ЧислоЭлементов Цикл
КопияМассива[ИндексКопии] = Массив[ИндексМассива];
ИндексМассива = ИндексМассива + 1;
ИндексКопии = ИндексКопии + 1;
КонецЦикла;
Возврат КопияМассива;
КонецФункции
// Возвращает копию массива с указанием числа элементов и начального индекса
// Внутри есть определение метода копирования
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
// Массив - Массив из Произвольный
// НачальныйЭлемент - Число - Индекс начального элемента
// ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
// МетодКопирования - Число - 0 - определять автоматически, 1 - наполнение циклом, 2 - удаление лишних
//
// Возвращаемое значение:
// Массив из Произвольный
//
// Примеры:
// ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
// Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4" - Три элемента с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 1); //"2,3,4,5" - Все элементы с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2" - Первые 2 элемента
// Результат = КопияМассива(ИсходныйМассив); //"1,2,3,4,5" - Полная копия массива
//
Функция КопияМассива(Знач Массив, Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0, Знач МетодКопирования = 0) Экспорт
ВсегоЭлементов = Массив.Количество();
Если МетодКопирования = 0 Тогда
//Если массив меньше, то нет принципиально разницы в скорости
//TODO: Определить экспериментально идеальное значение
МинимальнаяДлинаМассиваДляПоискаМетода = 10;
Если ВсегоЭлементов > МинимальнаяДлинаМассиваДляПоискаМетода Тогда
Если ЧислоЭлементов = 0 Тогда
ЧислоЭлементов = ВсегоЭлементов - (НачальныйЭлемент + 1);
КонецЕсли;
Если ЧислоЭлементов = 0 Тогда
Возврат Новый Массив;
Иначе
ПроцентНужных = (ЧислоЭлементов / ВсегоЭлементов) * 100;
Если ПроцентНужных > 90 Тогда
МетодКопирования = 2; //Легче скопировать весь большой массив и удалить лишние элементы
Иначе
МетодКопирования = 1; //Легче взять нужные элементы из большого массива
КонецЕсли;
КонецЕсли;
Иначе
МетодКопирования = 1; //Устроит любой метод
КонецЕсли;
КонецЕсли;
Если МетодКопирования = 1 Тогда
КопияМассива = КопияМассиваНаполнением(Массив, НачальныйЭлемент, ЧислоЭлементов);
Иначе
КопияМассива = КопияМассиваУдалениемЛишних(Массив, НачальныйЭлемент, ЧислоЭлементов);
КонецЕсли;
Возврат КопияМассива;
КонецФункции
// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает полную копию и удаления лишние элементы
// Эффективен, когда нужно взять бОльшую часть большОго массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
// Массив - Массив из Произвольный
// НачальныйЭлемент - Число - Индекс начального элемента
// ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//
// Возвращаемое значение:
// Массив из Произвольный
//
// Примеры:
// ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
// Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4" - Три элемента с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 1); //"2,3,4,5" - Все элементы с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2" - Первые 2 элемента
// Результат = КопияМассива(ИсходныйМассив); //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваУдалениемЛишних(Знач Массив,
Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт
КопияМассива = Новый Массив(Новый ФиксированныйМассив(Массив));
Пока НачальныйЭлемент > 0 Цикл
КопияМассива.Удалить(0);
НачальныйЭлемент = НачальныйЭлемент - 1;
КонецЦикла;
Если ЧислоЭлементов > 0 Тогда
ЭлементовКУдалению = КопияМассива.Количество() - ЧислоЭлементов;
Пока ЭлементовКУдалению > 0 Цикл
КопияМассива.Удалить(КопияМассива.ВГраница());
ЭлементовКУдалению = ЭлементовКУдалению - 1;
КонецЦикла;
КонецЕсли;
Возврат КопияМассива;
КонецФункции
// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает пустой массив и наполняет его циклом из оригинала
// Эффективен, когда нужно взять несколько элементов из оригинального большого массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
// Массив - Массив из Произвольный
// НачальныйЭлемент - Число - Индекс начального элемента
// ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//
// Возвращаемое значение:
// Массив из Произвольный
//
// Примеры:
// ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
// Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4" - Три элемента с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 1); //"2,3,4,5" - Все элементы с индекса 1
// Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2" - Первые 2 элемента
// Результат = КопияМассива(ИсходныйМассив); //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваНаполнением(Знач Массив,
Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт
Если ЧислоЭлементов = 0 Тогда
ЧислоЭлементов = Массив.Количество() - НачальныйЭлемент;
КонецЕсли;
КопияМассива = Новый Массив(ЧислоЭлементов);
ИндексКопии = 0;
ИндексМассива = НачальныйЭлемент;
Пока ИндексКопии < ЧислоЭлементов Цикл
КопияМассива[ИндексКопии] = Массив[ИндексМассива];
ИндексМассива = ИндексМассива + 1;
ИндексКопии = ИндексКопии + 1;
КонецЦикла;
Возврат КопияМассива;
КонецФункции
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
Для Стр=1 По Макет.ВысотаТаблицы Цикл
Код=Макет.Область(Стр, 1).Текст;
КонецЦикла;
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
Для Стр=1 По Макет.ВысотаТаблицы Цикл
Код=Макет.Область(Стр, 1).Текст;
КонецЦикла;
Отчет находится по наименованию, указывается нужный вариант отчета.
&НаКлиенте
Процедура ИнформацияПоЗданиям(Команда)
ВнешнийОтчетОбработкаДляОткрытияСсылка = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере("Информация по зданиям");
Если Не ЗначениеЗаполнено(ВнешнийОтчетОбработкаДляОткрытияСсылка) Тогда
Сообщить("Отчет не найден");
Возврат;
КонецЕсли;
ИмяОбработкиСлужебное = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВнешнийОтчетОбработкаДляОткрытияСсылка);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("КлючВарианта", "Основной");
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("ВнешнийОтчет." + ИмяОбработкиСлужебное + ".Форма", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере(ИмяОтчетаОбработки)
Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОтчетаОбработки).Ссылка;
КонецФункции
&НаКлиенте
Процедура ИнформацияПоЗданиям(Команда)
ВнешнийОтчетОбработкаДляОткрытияСсылка = ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере("Информация по зданиям");
Если Не ЗначениеЗаполнено(ВнешнийОтчетОбработкаДляОткрытияСсылка) Тогда
Сообщить("Отчет не найден");
Возврат;
КонецЕсли;
ИмяОбработкиСлужебное = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВнешнийОтчетОбработкаДляОткрытияСсылка);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("КлючВарианта", "Основной");
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("ВнешнийОтчет." + ИмяОбработкиСлужебное + ".Форма", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаВнешнийОтчетОбработкуПоИмениНаСервере(ИмяОтчетаОбработки)
Возврат Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОтчетаОбработки).Ссылка;
КонецФункции
В общем модуле ВариантыОтчетовПереопределяемый, в процедуре НастроитьВариантыОтчетов добавляем
Процедура НастроитьВариантыОтчетов(Настройки) Экспорт
ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.тдс_ОтчетПоДебиторскойЗадолжен...
Иногда с отчетами удобнее (или быстрее) работать в MS Excel, например, когда необходимо связать несколько разных отчетов. Если отчеты выводятся с группировкой, то связать их бывает проблематично. Если у отчета нет своей формы, то можно применить такое унив...
Возвращает значение перечисления по его синониму
// Описание функции
//
// Параметры:
// СинонимПеречисления - Тип.Строка - Синоним перечисления
//
// ИмяПеречисления - Тип.Строка - Имя метаданных перечисления в базе
// ...
ДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
// Какой-то код
Дельта = (ТекущаяУниверсальнаяДатаВМиллисекундах() - ДатаНачала)/1000;
ВремяВыполнения = Формат(Дата(1,1,1) + Дельта, "ДЛФ=T");
Сообщить(ВремяВыполнения);
ДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
// Какой-то код
Дельта = (ТекущаяУниверсальнаяДатаВМиллисекундах() - ДатаНачала)/1000;
ВремяВыполнения = Формат(Дата(1,1,1) + Дельта, "ДЛФ=T");
Сообщить(ВремяВыполнения);
Возвращает таблицу значений с колонками набора данных СКД
// Возвращает таблицу значений с колонками набора данных СКД
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/132
//
// Параметры:
// НаборДанных - НаборДанныхОбъектСхемыКомпоновкиДанных
//
// Возвращаемое значение:
// ТаблицаЗначений
//
// Пример:
// Таблица = ТаблицаИзНабораДанных(СКД.НаборыДанных.Получить(0));
// //Таблица содержит пустую ТЗ со всеми колонками для набора.
// //Теперь её можно заполнять данными и далее "скармливать" при формировании СКД
//
Функция ТаблицаИзНабораДанных(Знач НаборДанных) Экспорт
Результат = Новый ТаблицаЗначений();
Для Каждого Поле Из НаборДанных.Поля Цикл
Результат.Колонки.Добавить(Поле.Поле, Поле.ТипЗначения, Поле.Заголовок);
КонецЦикла;
Возврат Результат;
КонецФункции
// Возвращает таблицу значений с колонками набора данных СКД
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/132
//
// Параметры:
// НаборДанных - НаборДанныхОбъектСхемыКомпоновкиДанных
//
// Возвращаемое значение:
// ТаблицаЗначений
//
// Пример:
// Таблица = ТаблицаИзНабораДанных(СКД.НаборыДанных.Получить(0));
// //Таблица содержит пустую ТЗ со всеми колонками для набора.
// //Теперь её можно заполнять данными и далее "скармливать" при формировании СКД
//
Функция ТаблицаИзНабораДанных(Знач НаборДанных) Экспорт
Результат = Новый ТаблицаЗначений();
Для Каждого Поле Из НаборДанных.Поля Цикл
Результат.Колонки.Добавить(Поле.Поле, Поле.ТипЗначения, Поле.Заголовок);
КонецЦикла;
Возврат Результат;
КонецФункции
Перед вставкой параметров проверяет существование параметра в шаблоне
// @skip-check method-too-many-params
// Перед вставкой параметров проверяет существование параметра в шаблоне
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/129
//
// Параметры:
// Шаблон - Строка
// Параметр1 - Произвольный
// Параметр2 - Произвольный
// Параметр3 - Произвольный
// Параметр4 - Произвольный
// Параметр5 - Произвольный
// Параметр6 - Произвольный
// Параметр7 - Произвольный
// Параметр8 - Произвольный
// Параметр9 - Произвольный
// Параметр10 - Произвольный
//
// Возвращаемое значение:
// Строка
Функция СтрШаблонБезопасно(Знач Шаблон, Знач Параметр1 = Неопределено,
Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено,
Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено,
Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено, Знач Параметр10 = Неопределено) Экспорт
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр1, 1);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр2, 2);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр3, 3);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр4, 4);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр5, 5);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр6, 6);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр7, 7);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр8, 8);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр9, 9);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр10, 10);
Возврат СтрШаблон(Шаблон,
Параметр1, Параметр2, Параметр3, Параметр4, Параметр5,
Параметр6, Параметр7, Параметр8, Параметр9, Параметр10);
КонецФункции
// Затереть параметр при его отсутствии в шаблоне.
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/129
//
// Параметры:
// Шаблон - Строка
// Параметр - Произвольный
// Номер - Число
Процедура ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Знач Шаблон, Параметр, Знач Номер) Экспорт
Если Параметр <> Неопределено И СтрНайти(Шаблон, "%" + Номер) = 0 Тогда
Параметр = Неопределено;
КонецЕсли;
КонецПроцедуры
// @skip-check method-too-many-params
// Перед вставкой параметров проверяет существование параметра в шаблоне
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/129
//
// Параметры:
// Шаблон - Строка
// Параметр1 - Произвольный
// Параметр2 - Произвольный
// Параметр3 - Произвольный
// Параметр4 - Произвольный
// Параметр5 - Произвольный
// Параметр6 - Произвольный
// Параметр7 - Произвольный
// Параметр8 - Произвольный
// Параметр9 - Произвольный
// Параметр10 - Произвольный
//
// Возвращаемое значение:
// Строка
Функция СтрШаблонБезопасно(Знач Шаблон, Знач Параметр1 = Неопределено,
Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено,
Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено,
Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено, Знач Параметр10 = Неопределено) Экспорт
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр1, 1);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр2, 2);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр3, 3);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр4, 4);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр5, 5);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр6, 6);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр7, 7);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр8, 8);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр9, 9);
ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Шаблон, Параметр10, 10);
Возврат СтрШаблон(Шаблон,
Параметр1, Параметр2, Параметр3, Параметр4, Параметр5,
Параметр6, Параметр7, Параметр8, Параметр9, Параметр10);
КонецФункции
// Затереть параметр при его отсутствии в шаблоне.
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/129
//
// Параметры:
// Шаблон - Строка
// Параметр - Произвольный
// Номер - Число
Процедура ЗатеретьПараметрПриЕгоОтсутствииВШаблоне(Знач Шаблон, Параметр, Знач Номер) Экспорт
Если Параметр <> Неопределено И СтрНайти(Шаблон, "%" + Номер) = 0 Тогда
Параметр = Неопределено;
КонецЕсли;
КонецПроцедуры
Возвращает строку нужной длины из указанного символа
// Возвращает строку нужной длины из указанного символа
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/120
//
// Параметры:
// Длина - Число
// Символ - Строка
//
// Возвращаемое значение:
// Строка
Функция СтрокаСимволов(Знач Длина, Знач Символ = " ") Экспорт
Квалификатор = Новый КвалификаторыСтроки(Длина, ДопустимаяДлина.Фиксированная);
ОписаниеТипов = Новый ОписаниеТипов("Строка", Квалификатор);
Результат = ОписаниеТипов.ПривестиЗначение(""); // Строка
Если Символ <> " " Тогда
Результат = СтрЗаменить(Результат, " ", Символ);
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает строку нужной длины из указанного символа
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/120
//
// Параметры:
// Длина - Число
// Символ - Строка
//
// Возвращаемое значение:
// Строка
Функция СтрокаСимволов(Знач Длина, Знач Символ = " ") Экспорт
Квалификатор = Новый КвалификаторыСтроки(Длина, ДопустимаяДлина.Фиксированная);
ОписаниеТипов = Новый ОписаниеТипов("Строка", Квалификатор);
Результат = ОписаниеТипов.ПривестиЗначение(""); // Строка
Если Символ <> " " Тогда
Результат = СтрЗаменить(Результат, " ", Символ);
КонецЕсли;
Возврат Результат;
КонецФункции
Проверяет шаблон строки на корректность для передачи в СтрШаблон()
// Возвращает результат проверки корректности шаблона строки (метода СтрШаблон)
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/12
//
// Параметры:
// ШаблонСтроки - Строка
//
// Возвращаемое значение:
// Булево - Корректен ли шаблон строки
Функция ШаблонСтрокиКорректен(Знач ШаблонСтроки) Экспорт
Попытка
ПроверитьШаблонСтроки(ШаблонСтроки);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
// Проверяет корректность шаблона строки (метода СтрШаблон)
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/12
//
// Параметры:
// ШаблонСтроки - Строка
Процедура ПроверитьШаблонСтроки(Знач ШаблонСтроки) Экспорт
СтрШаблон(ШаблонСтроки, Неопределено, Неопределено,
Неопределено, Неопределено, Неопределено, Неопределено,
Неопределено, Неопределено, Неопределено, Неопределено);
КонецПроцедуры
// Возвращает результат проверки корректности шаблона строки (метода СтрШаблон)
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/12
//
// Параметры:
// ШаблонСтроки - Строка
//
// Возвращаемое значение:
// Булево - Корректен ли шаблон строки
Функция ШаблонСтрокиКорректен(Знач ШаблонСтроки) Экспорт
Попытка
ПроверитьШаблонСтроки(ШаблонСтроки);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
// Проверяет корректность шаблона строки (метода СтрШаблон)
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/12
//
// Параметры:
// ШаблонСтроки - Строка
Процедура ПроверитьШаблонСтроки(Знач ШаблонСтроки) Экспорт
СтрШаблон(ШаблонСтроки, Неопределено, Неопределено,
Неопределено, Неопределено, Неопределено, Неопределено,
Неопределено, Неопределено, Неопределено, Неопределено);
КонецПроцедуры
Метод выделяет подстроку внутри подстроки с использованием метода см. СтрНайтиИВыделитьОформлением
Платформенный метод СтрНайтиИВыделитьОформлением() находит только с начала слова
Например, если искать "200", то в код элемента не будет выделен: "CNT-000**200**"
// Метод выделяет подстроку внутри подстроки с использованием метода см. СтрНайтиИВыделитьОформлением
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/3
//
// Параметры:
// Строка - Строка - Исходная строка
// Подстрока - Строка - Искомая строка
//
// Возвращаемое значение:
// ФорматированнаяСтрока, Неопределено - вернет форматированную строку, если хотя бы одно вхождение найдено
Функция СтрокаНайтиИВыделитьОформлением(Знач Строка, Знач Подстрока) Экспорт
СтрокаВрег = ВРег(Строка);
ПодстрокаВрег = ВРег(Подстрока);
ДлинаСтроки = СтрДлина(Строка);
ДлинаПодстроки = СтрДлина(Подстрока);
ЧастиРезультата = Новый Массив; // Массив из Строка, ФорматированнаяСтрока
НачалоПоиска = 1;
Пока НачалоПоиска <= ДлинаСтроки Цикл
ТекущаяКоордината = СтрНайти(СтрокаВрег, ПодстрокаВрег, , НачалоПоиска);
Если ТекущаяКоордината = 0 Тогда
Если ЗначениеЗаполнено(ЧастиРезультата) Тогда
ЧастьСтроки = Сред(Строка, НачалоПоиска);
ЧастиРезультата.Добавить(ЧастьСтроки);
Прервать;
Иначе
Возврат Неопределено;
КонецЕсли;
Иначе
Если НачалоПоиска < ТекущаяКоордината Тогда
ЧастьСтроки = Сред(Строка, НачалоПоиска, ТекущаяКоордината - НачалоПоиска);
ЧастиРезультата.Добавить(ЧастьСтроки);
КонецЕсли;
ЧастьСтроки = Сред(Строка, ТекущаяКоордината, ДлинаПодстроки);
ЧастьСтроки = СтрНайтиИВыделитьОформлением(ЧастьСтроки, Подстрока);
ЧастиРезультата.Добавить(ЧастьСтроки);
НачалоПоиска = ТекущаяКоордината + ДлинаПодстроки;
КонецЕсли;
КонецЦикла;
Возврат Новый ФорматированнаяСтрока(ЧастиРезультата);
КонецФункции
// Метод выделяет подстроку внутри подстроки с использованием метода см. СтрНайтиИВыделитьОформлением
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/3
//
// Параметры:
// Строка - Строка - Исходная строка
// Подстрока - Строка - Искомая строка
//
// Возвращаемое значение:
// ФорматированнаяСтрока, Неопределено - вернет форматированную строку, если хотя бы одно вхождение найдено
Функция СтрокаНайтиИВыделитьОформлением(Знач Строка, Знач Подстрока) Экспорт
СтрокаВрег = ВРег(Строка);
ПодстрокаВрег = ВРег(Подстрока);
ДлинаСтроки = СтрДлина(Строка);
ДлинаПодстроки = СтрДлина(Подстрока);
ЧастиРезультата = Новый Массив; // Массив из Строка, ФорматированнаяСтрока
НачалоПоиска = 1;
Пока НачалоПоиска <= ДлинаСтроки Цикл
ТекущаяКоордината = СтрНайти(СтрокаВрег, ПодстрокаВрег, , НачалоПоиска);
Если ТекущаяКоордината = 0 Тогда
Если ЗначениеЗаполнено(ЧастиРезультата) Тогда
ЧастьСтроки = Сред(Строка, НачалоПоиска);
ЧастиРезультата.Добавить(ЧастьСтроки);
Прервать;
Иначе
Возврат Неопределено;
КонецЕсли;
Иначе
Если НачалоПоиска < ТекущаяКоордината Тогда
ЧастьСтроки = Сред(Строка, НачалоПоиска, ТекущаяКоордината - НачалоПоиска);
ЧастиРезультата.Добавить(ЧастьСтроки);
КонецЕсли;
ЧастьСтроки = Сред(Строка, ТекущаяКоордината, ДлинаПодстроки);
ЧастьСтроки = СтрНайтиИВыделитьОформлением(ЧастьСтроки, Подстрока);
ЧастиРезультата.Добавить(ЧастьСтроки);
НачалоПоиска = ТекущаяКоордината + ДлинаПодстроки;
КонецЕсли;
КонецЦикла;
Возврат Новый ФорматированнаяСтрока(ЧастиРезультата);
КонецФункции