&НаКлиенте
Функция Биометрия()
#Если МобильноеПриложениеКлиент Тогда
Если ТелефонПоддерживаетБиометрическийВход() Тогда
ПоказатьВопрос(Новый ОписаниеОповещения("ТелефонПоддерживаетБиометрическийВходЗавершение", ЭтотОбъект), "Использовать биометрию для входа", РежимДиалогаВопрос.ДаНет);
КонецЕсли;
#КонецЕсли
КонецФункции
&НаКлиенте
Процедура ТелефонПоддерживаетБиометрическийВходЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
ПровестиБиометрическийВход();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПровестиБиометрическийВход()
#Если МобильноеПриложениеКлиент Тогда
Попытка
СпособПроверки = СпособДополнительнойПроверкиПользователя.ТолькоБиометрическая;
Если ДополнительнаяПроверкаПользователя.ПоддерживаетсяПроверка(СпособПроверки) Тогда
ДопПараметры = Новый Структура;
ОписаниеОповещения = Новый ОписаниеОповещения("ПровестиБиометрическийВходЗавершение", ЭтотОбъект, ДопПараметры);
ДополнительнаяПроверкаПользователя.НачатьПроверку(СпособПроверки, "Введите код", ОписаниеОповещения);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Mobile", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПровестиБиометрическийВходЗавершение(ОтмененоПользователем, ДополнительныеПараметры) Экспорт
Попытка
Если НЕ ОтмененоПользователем Тогда
Если ИспользоватьБиометрию = Ложь Тогда
УстановитьИспользоватьБиометрию(Истина);
Иначе
АвторизацияВыполнена = Истина;
Структура = Новый Структура("ВходВыполнен", АвторизацияВыполнена);
ОбщегоНазначенияКлиент.ЗвукУспешногоВвода();
ЭтаФорма.Закрыть(Структура);
КонецЕсли;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Mobile", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ТелефонПоддерживаетБиометрическийВход()
#Если МобильноеПриложениеКлиент Тогда
Попытка
Если ДополнительнаяПроверкаПользователя.ПоддерживаетсяПроверка(СпособДополнительнойПроверкиПользователя.БиометрическаяИлиВводПароля) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Mobile", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
#КонецЕсли
КонецФункции
&НаКлиенте
Функция Биометрия()
#Если МобильноеПриложениеКлиент Тогда
Если ТелефонПоддерживаетБиометрическийВход() Тогда
ПоказатьВопрос(Новый ОписаниеОповещения("ТелефонПоддерживаетБиометрическийВходЗавершение", ЭтотОбъект), "Использовать биометрию для входа", РежимДиалогаВопрос.ДаНет);
КонецЕсли;
#КонецЕсли
КонецФункции
&НаКлиенте
Процедура ТелефонПоддерживаетБиометрическийВходЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
ПровестиБиометрическийВход();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПровестиБиометрическийВход()
#Если МобильноеПриложениеКлиент Тогда
Попытка
СпособПроверки = СпособДополнительнойПроверкиПользователя.ТолькоБиометрическая;
Если ДополнительнаяПроверкаПользователя.ПоддерживаетсяПроверка(СпособПроверки) Тогда
ДопПараметры = Новый Структура;
ОписаниеОповещения = Новый ОписаниеОповещения("ПровестиБиометрическийВходЗавершение", ЭтотОбъект, ДопПараметры);
ДополнительнаяПроверкаПользователя.НачатьПроверку(СпособПроверки, "Введите код", ОписаниеОповещения);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Mobile", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПровестиБиометрическийВходЗавершение(ОтмененоПользователем, ДополнительныеПараметры) Экспорт
Попытка
Если НЕ ОтмененоПользователем Тогда
Если ИспользоватьБиометрию = Ложь Тогда
УстановитьИспользоватьБиометрию(Истина);
Иначе
АвторизацияВыполнена = Истина;
Структура = Новый Структура("ВходВыполнен", АвторизацияВыполнена);
ОбщегоНазначенияКлиент.ЗвукУспешногоВвода();
ЭтаФорма.Закрыть(Структура);
КонецЕсли;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Mobile", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ТелефонПоддерживаетБиометрическийВход()
#Если МобильноеПриложениеКлиент Тогда
Попытка
Если ДополнительнаяПроверкаПользователя.ПоддерживаетсяПроверка(СпособДополнительнойПроверкиПользователя.БиометрическаяИлиВводПароля) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Mobile", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
#КонецЕсли
КонецФункции
FTP_Cоединение.УстановитьТекущийКаталог("."); - строковый параметр означает корневой каталог, можно указать папку "\НазваниеПапки";
FTP_Cоединение.Записать(ПутьКФайлу, "actual_products.json"); - второй параметр, название файла с расширением (.txt, .csv, .xml);
Директива компиляции - &НаСервере
// Параметры соединения;
Сервер = "00.000.000.000";
Порт = 21;
ИмяПользователя = "u00000";
ПарольПользователя = "86731db349";
// Загрузка на FTP;
FTP_Cоединение = Новый FTPСоединение(Сервер, Порт, ИмяПользователя, ПарольПользователя,,, 20);
Попытка
FTP_Cоединение.УстановитьТекущийКаталог(".");
FTP_Cоединение.Записать(ПутьКФайлу, "actual_products.json"); // представим что отсюда сайт подгружает данные;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ".JSON файл, находящийся в каталоге: " + ПутьКФайлу + " был успешно загружен на FTP_сервер!";
Сообщение.Сообщить();
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось подключиться к FTP_серверу! Описание ошибки: " + ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
// Параметры соединения;
Сервер = "00.000.000.000";
Порт = 21;
ИмяПользователя = "u00000";
ПарольПользователя = "86731db349";
// Загрузка на FTP;
FTP_Cоединение = Новый FTPСоединение(Сервер, Порт, ИмяПользователя, ПарольПользователя,,, 20);
Попытка
FTP_Cоединение.УстановитьТекущийКаталог(".");
FTP_Cоединение.Записать(ПутьКФайлу, "actual_products.json"); // представим что отсюда сайт подгружает данные;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ".JSON файл, находящийся в каталоге: " + ПутьКФайлу + " был успешно загружен на FTP_сервер!";
Сообщение.Сообщить();
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось подключиться к FTP_серверу! Описание ошибки: " + ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
TurboConf повышает эффективность работы в Конфигураторе 1С и помогает программисту автоматизировать свои задачи.
Удаляет префикс, по типу "ТДУТ-", чистит лидирующие нули;
&НаКлиенте
Функция ФорматироватьНомерДокуметаНаКлиенте(Знач НомерДокумента)
НомерДокументаСтрокой = Строка(НомерДокумента);
НомерДокументаСтрокой = СтрЗаменить(НомерДокументаСтрокой, "-", "");
ПозицияПервогоНуля = СтрНайти(НомерДокументаСтрокой, "0", НаправлениеПоиска.СНачала);
НомерДокументаСтрокой = Сред(НомерДокументаСтрокой, ПозицияПервогоНуля, СтрДлина(НомерДокументаСтрокой)); //символы = цифры;
Счетчик = 1;
Пока Лев(НомерДокументаСтрокой, 1) = "0" Цикл
НомерДокументаСтрокой = Сред(НомерДокументаСтрокой, Счетчик + 1);
КонецЦикла;
Возврат НомерДокументаСтрокой;
КонецФункции // ()
&НаКлиенте
Функция ФорматироватьНомерДокуметаНаКлиенте(Знач НомерДокумента)
НомерДокументаСтрокой = Строка(НомерДокумента);
НомерДокументаСтрокой = СтрЗаменить(НомерДокументаСтрокой, "-", "");
ПозицияПервогоНуля = СтрНайти(НомерДокументаСтрокой, "0", НаправлениеПоиска.СНачала);
НомерДокументаСтрокой = Сред(НомерДокументаСтрокой, ПозицияПервогоНуля, СтрДлина(НомерДокументаСтрокой)); //символы = цифры;
Счетчик = 1;
Пока Лев(НомерДокументаСтрокой, 1) = "0" Цикл
НомерДокументаСтрокой = Сред(НомерДокументаСтрокой, Счетчик + 1);
КонецЦикла;
Возврат НомерДокументаСтрокой;
КонецФункции // ()
Одной из причин ошибки может быть наличие бага платформе.
Столкнулись с ошибкой на платформе 8.3.22.1923. Конфигурация с расширением стала выдавать ошибку при запуске.
Недопустимое состояние объекта
[backbas - src\backbas\src\ModuleWithPragmasHelper.cpp...
Проверяет, что переданное значение имеет тип "Табличная часть", а не какой-либо другой.
Поддерживаемые контексты: сервер.
// Проверяет, что переданное значение имеет тип "Табличная часть", а не какой-либо другой.
Функция ЭтоТабличнаяЧасть(Знач ТЧ) Экспорт
ЭтоТЧ = Ложь;
ТипЗначенияСтрокой = Строка(ТипЗнч(ТЧ)); // "Справочник табличная часть: ...", "Внешняя обработка табличная часть: ...",
// "Catalog Tabular section: ...", "External data processor Tabular section: ..." и т.д.
Фрагменты = СтрРазделить(ТипЗначенияСтрокой, ":", Ложь);
Если Фрагменты.Количество() > 1 Тогда
Пациент = Фрагменты[0]; // Анализируем только первый фрагмент (до первого двоеточия).
// В синониме какого-либо объекта метаданных тоже может встретиться маркер "... табличная часть:",
// но это всегда будет уже следующий фрагмент (и он нас не интересует).
Пациент = НРег(Пациент); // Фирма 1С не выдерживает единый стиль для русскоязычного и англоязычного вариантов встроенного языка,
// поэтому на всякий случай приводим всё к какому-то одному регистру букв.
Если СтрЗаканчиваетсяНа(Пациент, НРег(" табличная часть")) ИЛИ СтрЗаканчиваетсяНа(Пациент, НРег(" Tabular section")) Тогда
ЭтоТЧ = Истина;
КонецЕсли;
КонецЕсли;
Возврат ЭтоТЧ;
КонецФункции
// Проверяет, что переданное значение имеет тип "Табличная часть", а не какой-либо другой.
Функция ЭтоТабличнаяЧасть(Знач ТЧ) Экспорт
ЭтоТЧ = Ложь;
ТипЗначенияСтрокой = Строка(ТипЗнч(ТЧ)); // "Справочник табличная часть: ...", "Внешняя обработка табличная часть: ...",
// "Catalog Tabular section: ...", "External data processor Tabular section: ..." и т.д.
Фрагменты = СтрРазделить(ТипЗначенияСтрокой, ":", Ложь);
Если Фрагменты.Количество() > 1 Тогда
Пациент = Фрагменты[0]; // Анализируем только первый фрагмент (до первого двоеточия).
// В синониме какого-либо объекта метаданных тоже может встретиться маркер "... табличная часть:",
// но это всегда будет уже следующий фрагмент (и он нас не интересует).
Пациент = НРег(Пациент); // Фирма 1С не выдерживает единый стиль для русскоязычного и англоязычного вариантов встроенного языка,
// поэтому на всякий случай приводим всё к какому-то одному регистру букв.
Если СтрЗаканчиваетсяНа(Пациент, НРег(" табличная часть")) ИЛИ СтрЗаканчиваетсяНа(Пациент, НРег(" Tabular section")) Тогда
ЭтоТЧ = Истина;
КонецЕсли;
КонецЕсли;
Возврат ЭтоТЧ;
КонецФункции
Шаблон кода внешней обработки Вида Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта
НаСервере
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
//: ОбъектыНазначенияМассив = Новый Массив;
Если Идентиф...
Поиск похожей строки из массива объектов для проверки на основании исходной строки.
// Функция - Поиск похожей строки из набора строк
//
// Параметры:
// ИсходнаяСтрока - Строка - Исходная строка
// ОбъектыДляПроверки - Массив - Массив элементов произвольного типа, в котором будем искать похожую строку
// пНаправлениеПоиска - НаправлениеПоиска - Указывает направление поиска подстроки в строке
// ЖелательныйПроцентСовпадения - Число - Ожидаемый процент совпадения подстроки поиска в проверяемой строке. По умолчанию 50
//
// Возвращаемое значение:
// Строка - строка с максимальным вхождением подстроки поиска
//
Функция ПоискПохожейСтроки(ИсходнаяСтрока, ОбъектыДляПроверки, пНаправлениеПоиска, ЖелательныйПроцентСовпадения)
ПохожаяСтрока = "";
ТаблицаСтатистики = Новый ТаблицаЗначений;
ТаблицаСтатистики.Колонки.Добавить("Объект");
ТаблицаСтатистики.Колонки.Добавить("ЧислоВхождений");
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Для каждого Элемент Из ОбъектыДляПроверки Цикл
ТекОбъект = ВРЕГ(Элемент);
ДлинаТекОбъекта = СтрДлина(ТекОбъект);
Для Сч = 0 По ДлинаИсходнойСтроки Цикл
Если пНаправлениеПоиска = НаправлениеПоиска.СНачала Тогда
ИскомаяСтрока = Сред(ИсходнаяСтрока, 1, Сч + 1);
НачПозицияПоиска = 1;
Иначе
ИскомаяСтрока = Сред(ИсходнаяСтрока, ДлинаИсходнойСтроки - Сч, Сч + 1);
НачПозицияПоиска = ДлинаТекОбъекта;
КонецЕсли;
Если СтрНайти(ТекОбъект, ИскомаяСтрока, пНаправлениеПоиска, НачПозицияПоиска) > 0 Тогда
СтрСтатистика = ТаблицаСтатистики.Найти(ТекОбъект, "Объект");
Если СтрСтатистика <> Неопределено Тогда
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
Иначе
Если Цел(СтрДлина(ИскомаяСтрока) / ДлинаТекОбъекта * 100) > ЖелательныйПроцентСовпадения Тогда
СтрСтатистика = ТаблицаСтатистики.Добавить();
СтрСтатистика.Объект = ТекОбъект;
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ЗначениеЗаполнено(ТаблицаСтатистики) Тогда
ТаблицаСтатистики.Сортировать("ЧислоВхождений УБЫВ");
ПохожаяСтрока = ТаблицаСтатистики.Получить(0).Объект;
КонецЕсли;
Возврат ПохожаяСтрока
КонецФункции
// Функция - Поиск похожей строки из набора строк
//
// Параметры:
// ИсходнаяСтрока - Строка - Исходная строка
// ОбъектыДляПроверки - Массив - Массив элементов произвольного типа, в котором будем искать похожую строку
// пНаправлениеПоиска - НаправлениеПоиска - Указывает направление поиска подстроки в строке
// ЖелательныйПроцентСовпадения - Число - Ожидаемый процент совпадения подстроки поиска в проверяемой строке. По умолчанию 50
//
// Возвращаемое значение:
// Строка - строка с максимальным вхождением подстроки поиска
//
Функция ПоискПохожейСтроки(ИсходнаяСтрока, ОбъектыДляПроверки, пНаправлениеПоиска, ЖелательныйПроцентСовпадения)
ПохожаяСтрока = "";
ТаблицаСтатистики = Новый ТаблицаЗначений;
ТаблицаСтатистики.Колонки.Добавить("Объект");
ТаблицаСтатистики.Колонки.Добавить("ЧислоВхождений");
ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
Для каждого Элемент Из ОбъектыДляПроверки Цикл
ТекОбъект = ВРЕГ(Элемент);
ДлинаТекОбъекта = СтрДлина(ТекОбъект);
Для Сч = 0 По ДлинаИсходнойСтроки Цикл
Если пНаправлениеПоиска = НаправлениеПоиска.СНачала Тогда
ИскомаяСтрока = Сред(ИсходнаяСтрока, 1, Сч + 1);
НачПозицияПоиска = 1;
Иначе
ИскомаяСтрока = Сред(ИсходнаяСтрока, ДлинаИсходнойСтроки - Сч, Сч + 1);
НачПозицияПоиска = ДлинаТекОбъекта;
КонецЕсли;
Если СтрНайти(ТекОбъект, ИскомаяСтрока, пНаправлениеПоиска, НачПозицияПоиска) > 0 Тогда
СтрСтатистика = ТаблицаСтатистики.Найти(ТекОбъект, "Объект");
Если СтрСтатистика <> Неопределено Тогда
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
Иначе
Если Цел(СтрДлина(ИскомаяСтрока) / ДлинаТекОбъекта * 100) > ЖелательныйПроцентСовпадения Тогда
СтрСтатистика = ТаблицаСтатистики.Добавить();
СтрСтатистика.Объект = ТекОбъект;
СтрСтатистика.ЧислоВхождений = СтрДлина(ИскомаяСтрока);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ЗначениеЗаполнено(ТаблицаСтатистики) Тогда
ТаблицаСтатистики.Сортировать("ЧислоВхождений УБЫВ");
ПохожаяСтрока = ТаблицаСтатистики.Получить(0).Объект;
КонецЕсли;
Возврат ПохожаяСтрока
КонецФункции
Установка параметра по имени на примере склада
ПараметрДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Склад");
ПараметрДанных.Значение = Справочники.Склады.НайтиПоНаименованию("Основной");
ПараметрДанных.Использование = Истина;
ПараметрДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Склад");
ПараметрДанных.Значение = Справочники.Склады.НайтиПоНаименованию("Основной");
ПараметрДанных.Использование = Истина;
Всем доброго дня. Мы проект 42Clouds, предоставляем пользователям решения 1С в аренду, а еще у нас есть магазин расширений для 1С – Маркет42. Здесь разработчики размещают свои сервисы и обработки и получают за это деньги от благодарных пользователей.
Месяц...
Функция ПересечениеСписков(м1,м2)
Тз = Новый ТаблицаЗначений();
Для каждого Эл из М1 Цикл
ТЗ.Добавить().Элемент=Эл.Значение;
КонецЦикла;
Для каждого Эл из М2 Цикл
ТЗ.Добавить().Элемент=Эл.Значение;
КонецЦикла;
ТЗ.Колонки.Добавить("Флаг");
ТЗ.ЗаполнитьЗначения(1,"Флаг");
ТЗ.Свернуть("Элемент","Флаг");
Совпадающие = Новый СписокЗначений;
Для каждого Строка из ТЗ.НайтиСтроки(Новый Структура("Флаг",2)) Цикл
Совпадающие.Добавить(Строка.Элемент);
КонецЦикла;
Возврат Совпадающие
КонецФункции
Функция ПересечениеСписков(м1,м2)
Тз = Новый ТаблицаЗначений();
Для каждого Эл из М1 Цикл
ТЗ.Добавить().Элемент=Эл.Значение;
КонецЦикла;
Для каждого Эл из М2 Цикл
ТЗ.Добавить().Элемент=Эл.Значение;
КонецЦикла;
ТЗ.Колонки.Добавить("Флаг");
ТЗ.ЗаполнитьЗначения(1,"Флаг");
ТЗ.Свернуть("Элемент","Флаг");
Совпадающие = Новый СписокЗначений;
Для каждого Строка из ТЗ.НайтиСтроки(Новый Структура("Флаг",2)) Цикл
Совпадающие.Добавить(Строка.Элемент);
КонецЦикла;
Возврат Совпадающие
КонецФункции
Формирует из любой строки (включая многострочную) ее краткое однострочное представление, состоящее из первых N символов.
Поддерживаемые контексты: клиент, сервер. Метод подходит для размещения в клиент-серверном общем модуле.
// Формирует из любой строки (в т.ч. многострочной) ее краткое однострочное представление, состоящее из первых N символов.
// Если исходная строка многострочная, то берется ее первая подстрока.
//
// В варианте по умолчанию метод пропускает все пустые строки и незначащие символы слева перед тем,
// как начать подсчет первых N символов, но этим можно управлять через необязательные параметры.
//
// Если длина исходной строки больше максимально допустимой (или если исходная строка многострочная),
// то в возвращаемый результат добавляется многоточие, иначе - не добавляется.
//
// Параметры:
// ИсходнаяСтрока - Строка - Строка, которую нужно обрезать.
// МаксимальнаяДлина - Число - Сколько символов оставлять в возвращаемом результате.
// УдалятьПустыеСтроки - Булево - Исходная многострочная строка может начинаться с одной или нескольких пустых строк.
// Если их не удалять, то возвращаемый результат будет состоять из первой такой пустой строки.
// УдалятьПробелыСлева - Булево - Удалять или не удалять незначащие символы (пробелы, табуляции и т.д.) из начала возвращаемой строки.
//
// Возвращаемое значение:
// Строка - Результат усечения исходной строки до N символов.
//
Функция КраткоеПредставлениеСтроки(Знач ИсходнаяСтрока, Знач МаксимальнаяДлина, Знач УдалятьПустыеСтроки = Истина, Знач УдалятьПробелыСлева = Истина) Экспорт
Результат = "";
Подстроки = СтрРазделить(ИсходнаяСтрока, Символы.ПС, НЕ УдалятьПустыеСтроки);
Если Подстроки.Количество() > 0 Тогда
Результат = Подстроки[0];
КонецЕсли;
Если УдалятьПробелыСлева Тогда
Результат = СокрЛ(Результат);
КонецЕсли;
Если СтрЧислоСтрок(ИсходнаяСтрока) > 1 ИЛИ СтрДлина(Результат) > МаксимальнаяДлина Тогда
Результат = Лев(Результат, МаксимальнаяДлина) + "...";
КонецЕсли;
Возврат Результат;
КонецФункции
// Формирует из любой строки (в т.ч. многострочной) ее краткое однострочное представление, состоящее из первых N символов.
// Если исходная строка многострочная, то берется ее первая подстрока.
//
// В варианте по умолчанию метод пропускает все пустые строки и незначащие символы слева перед тем,
// как начать подсчет первых N символов, но этим можно управлять через необязательные параметры.
//
// Если длина исходной строки больше максимально допустимой (или если исходная строка многострочная),
// то в возвращаемый результат добавляется многоточие, иначе - не добавляется.
//
// Параметры:
// ИсходнаяСтрока - Строка - Строка, которую нужно обрезать.
// МаксимальнаяДлина - Число - Сколько символов оставлять в возвращаемом результате.
// УдалятьПустыеСтроки - Булево - Исходная многострочная строка может начинаться с одной или нескольких пустых строк.
// Если их не удалять, то возвращаемый результат будет состоять из первой такой пустой строки.
// УдалятьПробелыСлева - Булево - Удалять или не удалять незначащие символы (пробелы, табуляции и т.д.) из начала возвращаемой строки.
//
// Возвращаемое значение:
// Строка - Результат усечения исходной строки до N символов.
//
Функция КраткоеПредставлениеСтроки(Знач ИсходнаяСтрока, Знач МаксимальнаяДлина, Знач УдалятьПустыеСтроки = Истина, Знач УдалятьПробелыСлева = Истина) Экспорт
Результат = "";
Подстроки = СтрРазделить(ИсходнаяСтрока, Символы.ПС, НЕ УдалятьПустыеСтроки);
Если Подстроки.Количество() > 0 Тогда
Результат = Подстроки[0];
КонецЕсли;
Если УдалятьПробелыСлева Тогда
Результат = СокрЛ(Результат);
КонецЕсли;
Если СтрЧислоСтрок(ИсходнаяСтрока) > 1 ИЛИ СтрДлина(Результат) > МаксимальнаяДлина Тогда
Результат = Лев(Результат, МаксимальнаяДлина) + "...";
КонецЕсли;
Возврат Результат;
КонецФункции
Шаблон кода внешней обработки Вида Перечисления.ВидыДополнительныхОтчетовИОбработок.РасчетСкидкиНаценки
////////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
Наименование = НСтр("ru = 'Процент/сумма по ... '");
Информация = НСтр("ru = 'Предоставляется скидка (наценка) процентом (суммой), зависит от ... .'");
Назначение = Новый Массив;
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.РасчетСкидкиНаценки);
ПараметрыРегистрации.Вставить("Версия", "1.01.001");
ПараметрыРегистрации.Вставить("Назначение", Назначение);
ПараметрыРегистрации.Вставить("Наименование", Наименование);
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", Информация);
ПараметрыРегистрации.Вставить("ВерсияБСП", "2.1.2.1");
ПараметрыРегистрации.Вставить("Команды", Новый ТаблицаЗначений);
Возврат ПараметрыРегистрации;
КонецФункции
// Возвращает способ применения скидки (наценки)
//
// Возвращаемое значение:
// Перечисления.СпособыПримененияСкидокНаценок - способ применения скидки (наценки)
//
Функция СпособПрименения() Экспорт
Возврат Перечисления.СпособыПримененияСкидокНаценок.ПрименитьВМоментРасчетаСкидокНаценок;
КонецФункции
// Выполняет расчет скидки (наценки)
//
// Параметры:
// СкидкаНаценка - Строка дерева скидок (наценок). Включает результаты проверки условий, способы совместного применения
// Настройки - Структура - Настройки, заданные пользователем в форме настроек внешней обработки
// Товары - Коллекция товаров, для которых требуется применить скидку (наценку)
// ПараметрыРасчета - Структура - Параметры расчета скидок (наценок)
//
// Возвращаемое значение:
// РезультатРасчета - ТаблицаЗначений - результат расчета
//
Функция Рассчитать(СкидкаНаценка, Настройки, Товары, ПараметрыРасчета) Экспорт
ИмяРеквизитаУсловия = "";
РезультатРасчета = СкидкиНаценкиСервер.ПустаяТаблицаСкидокСРасшифровкой();
//Если своя {
//РезультатРасчета = ПустаяТаблицаСкидокСРасшифровкой();
//Если своя }
Если ПараметрыРасчета.Объект.Ссылка.Пустая() Тогда
Возврат РезультатРасчета;
КонецЕсли;
ЭтоУмножение = СкидкаНаценка.ПрименятьУмножениеВРамкахВышестоящейГруппы;
// { Поиск строк с нужным условием
СтрокаТЧ = Настройки.Таблица.Найти(ПараметрыРасчета.Объект[ИмяРеквизитаУсловия], "КолонкаУсловие");
// } Поиск строк с нужным условием
Если СтрокаТЧ <> Неопределено Тогда
Для Каждого Товар Из Товары Цикл
Если СтрокаТЧ.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидокНаценок.Процент Тогда
СуммаСкидки = СтрокаТЧ.Значение / 100 * СкидкиНаценкиСервер1.ОстатокСуммыПоСтроке(СкидкаНаценка, Товар, ПараметрыРасчета, ЭтоУмножение);
СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаСкидки, Товар, РезультатРасчета, ПараметрыРасчета);
Иначе
ДатаЦены = ?(ЗначениеЗаполнено(ПараметрыРасчета.Объект.ДатаСогласования), ПараметрыРасчета.Объект.ДатаСогласования, ПараметрыРасчета.Объект.Дата);
СуммаСкидки = СтрокаТЧ.Значение * РаботаСКурсамиВалют.ПолучитьКурсВалюты(ПараметрыРасчета.Объект.Соглашение.ВидЦен.ВалютаЦены, ДатаЦены).Курс;
СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаСкидки, Товар, РезультатРасчета, ПараметрыРасчета);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат РезультатРасчета;
КонецФункции
// Возвращает имя формы внешней обработки,
// предназначенной для настройки условия предоставления
//
// Возвращаемое значение:
// Строка - Имя формы
//
Функция ИмяФормыНастроек() Экспорт
Возврат "Настройки";
КонецФункции
// Возвращает расширенное описание условия предоставления с учетом настроек
//
// Параметры:
// Настройки - Структура - Значения настроек условия предоставления
//
// Возвращаемое значение:
// Строка - Расширенное описание
//
Функция ОписаниеДействия(Настройки) Экспорт
Попытка
Если Настройки<> Неопределено И Настройки.Таблица.Количество() > 0 Тогда
Описание = "Предоставляется скидка (наценка) процентом (суммой), зависит от ... :";
Для Каждого СтрокаТЧ Из Настройки.Таблица Цикл
Описание = Описание + Символы.ПС + "По условию " + " """ + СтрокаТЧ.КолонкаУсловие + """: " + СтрокаТЧ.Значение
+ ?(СтрокаТЧ.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидокНаценок.Процент, "%", "€");
КонецЦикла;
Иначе
Описание = "Не заданы настройки скидки (наценки)";
КонецЕсли;
Исключение
Описание = "Настройки не загружены.
|При загрузке настроек скидки (наценки) произошла ошибка:
|" + ОписаниеОшибки();
КонецПопытки;
Возврат Описание;
КонецФункции
// Возвращает заголовок условия предоставления с учетом настроек
//
// Параметры:
// Настройки - Структура - Значения настроек условия предоставления
//
// Возвращаемое значение:
// Строка - Наименование условия
//
Функция Автонаименование(Настройки) Экспорт
Возврат НСтр("ru = 'Процент/сумма по ... '");
КонецФункции
Функция ПустаяТаблицаСкидокСРасшифровкой(ПараметрыРасчета = Неопределено) Экспорт
Если ПараметрыРасчета = Неопределено Тогда
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Расшифровка", Новый ОписаниеТипов("ТаблицаЗначений"));
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2)));
Таблица.Колонки.Добавить("Действует", Новый ОписаниеТипов("Булево"));
Возврат Таблица;
Иначе
Возврат ПараметрыРасчета.ПустаяТаблицаСкидокСРасшифровкой.СкопироватьКолонки();
КонецЕсли;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
Наименование = НСтр("ru = 'Процент/сумма по ... '");
Информация = НСтр("ru = 'Предоставляется скидка (наценка) процентом (суммой), зависит от ... .'");
Назначение = Новый Массив;
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.РасчетСкидкиНаценки);
ПараметрыРегистрации.Вставить("Версия", "1.01.001");
ПараметрыРегистрации.Вставить("Назначение", Назначение);
ПараметрыРегистрации.Вставить("Наименование", Наименование);
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", Информация);
ПараметрыРегистрации.Вставить("ВерсияБСП", "2.1.2.1");
ПараметрыРегистрации.Вставить("Команды", Новый ТаблицаЗначений);
Возврат ПараметрыРегистрации;
КонецФункции
// Возвращает способ применения скидки (наценки)
//
// Возвращаемое значение:
// Перечисления.СпособыПримененияСкидокНаценок - способ применения скидки (наценки)
//
Функция СпособПрименения() Экспорт
Возврат Перечисления.СпособыПримененияСкидокНаценок.ПрименитьВМоментРасчетаСкидокНаценок;
КонецФункции
// Выполняет расчет скидки (наценки)
//
// Параметры:
// СкидкаНаценка - Строка дерева скидок (наценок). Включает результаты проверки условий, способы совместного применения
// Настройки - Структура - Настройки, заданные пользователем в форме настроек внешней обработки
// Товары - Коллекция товаров, для которых требуется применить скидку (наценку)
// ПараметрыРасчета - Структура - Параметры расчета скидок (наценок)
//
// Возвращаемое значение:
// РезультатРасчета - ТаблицаЗначений - результат расчета
//
Функция Рассчитать(СкидкаНаценка, Настройки, Товары, ПараметрыРасчета) Экспорт
ИмяРеквизитаУсловия = "";
РезультатРасчета = СкидкиНаценкиСервер.ПустаяТаблицаСкидокСРасшифровкой();
//Если своя {
//РезультатРасчета = ПустаяТаблицаСкидокСРасшифровкой();
//Если своя }
Если ПараметрыРасчета.Объект.Ссылка.Пустая() Тогда
Возврат РезультатРасчета;
КонецЕсли;
ЭтоУмножение = СкидкаНаценка.ПрименятьУмножениеВРамкахВышестоящейГруппы;
// { Поиск строк с нужным условием
СтрокаТЧ = Настройки.Таблица.Найти(ПараметрыРасчета.Объект[ИмяРеквизитаУсловия], "КолонкаУсловие");
// } Поиск строк с нужным условием
Если СтрокаТЧ <> Неопределено Тогда
Для Каждого Товар Из Товары Цикл
Если СтрокаТЧ.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидокНаценок.Процент Тогда
СуммаСкидки = СтрокаТЧ.Значение / 100 * СкидкиНаценкиСервер1.ОстатокСуммыПоСтроке(СкидкаНаценка, Товар, ПараметрыРасчета, ЭтоУмножение);
СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаСкидки, Товар, РезультатРасчета, ПараметрыРасчета);
Иначе
ДатаЦены = ?(ЗначениеЗаполнено(ПараметрыРасчета.Объект.ДатаСогласования), ПараметрыРасчета.Объект.ДатаСогласования, ПараметрыРасчета.Объект.Дата);
СуммаСкидки = СтрокаТЧ.Значение * РаботаСКурсамиВалют.ПолучитьКурсВалюты(ПараметрыРасчета.Объект.Соглашение.ВидЦен.ВалютаЦены, ДатаЦены).Курс;
СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаСкидки, Товар, РезультатРасчета, ПараметрыРасчета);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат РезультатРасчета;
КонецФункции
// Возвращает имя формы внешней обработки,
// предназначенной для настройки условия предоставления
//
// Возвращаемое значение:
// Строка - Имя формы
//
Функция ИмяФормыНастроек() Экспорт
Возврат "Настройки";
КонецФункции
// Возвращает расширенное описание условия предоставления с учетом настроек
//
// Параметры:
// Настройки - Структура - Значения настроек условия предоставления
//
// Возвращаемое значение:
// Строка - Расширенное описание
//
Функция ОписаниеДействия(Настройки) Экспорт
Попытка
Если Настройки<> Неопределено И Настройки.Таблица.Количество() > 0 Тогда
Описание = "Предоставляется скидка (наценка) процентом (суммой), зависит от ... :";
Для Каждого СтрокаТЧ Из Настройки.Таблица Цикл
Описание = Описание + Символы.ПС + "По условию " + " """ + СтрокаТЧ.КолонкаУсловие + """: " + СтрокаТЧ.Значение
+ ?(СтрокаТЧ.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидокНаценок.Процент, "%", "€");
КонецЦикла;
Иначе
Описание = "Не заданы настройки скидки (наценки)";
КонецЕсли;
Исключение
Описание = "Настройки не загружены.
|При загрузке настроек скидки (наценки) произошла ошибка:
|" + ОписаниеОшибки();
КонецПопытки;
Возврат Описание;
КонецФункции
// Возвращает заголовок условия предоставления с учетом настроек
//
// Параметры:
// Настройки - Структура - Значения настроек условия предоставления
//
// Возвращаемое значение:
// Строка - Наименование условия
//
Функция Автонаименование(Настройки) Экспорт
Возврат НСтр("ru = 'Процент/сумма по ... '");
КонецФункции
Функция ПустаяТаблицаСкидокСРасшифровкой(ПараметрыРасчета = Неопределено) Экспорт
Если ПараметрыРасчета = Неопределено Тогда
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("КлючСвязи", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Расшифровка", Новый ОписаниеТипов("ТаблицаЗначений"));
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2)));
Таблица.Колонки.Добавить("Действует", Новый ОписаниеТипов("Булево"));
Возврат Таблица;
Иначе
Возврат ПараметрыРасчета.ПустаяТаблицаСкидокСРасшифровкой.СкопироватьКолонки();
КонецЕсли;
КонецФункции
Наиболее полный и актуальный список каналов Telegram, так или иначе связанных с 1C
SeiOkami проделал большую работу и собрал большой реестр каналов по 1С.
В таблице есть название, описание, ссылка, количество подписчиков и другая информация.
Если у вас ...
выгружает в массив поле коллекции без дублей
Функция ВыгрузитьРазличные(Коллекция,ИмяПоля)
Результат = Новый Массив;
Для каждого ТекущийЭлемент Из Коллекция Цикл
ТекущееЗначение = ТекущийЭлемент[ИмяПоля];
Если Результат.Найти(ТекущееЗначение) = Неопределено Тогда
Результат.Добавить(ТекущееЗначение);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ВыгрузитьРазличные(Коллекция,ИмяПоля)
Результат = Новый Массив;
Для каждого ТекущийЭлемент Из Коллекция Цикл
ТекущееЗначение = ТекущийЭлемент[ИмяПоля];
Если Результат.Найти(ТекущееЗначение) = Неопределено Тогда
Результат.Добавить(ТекущееЗначение);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Если у партнера заполнено одно контактное лицо - оно определяется как по умолчанию
// версия по партнеру
КонтактноеЛицо = ПартнерыИКонтрагенты.ПолучитьКонтактноеЛицоПартнераПоУмолчанию(Партнер);
// версия по контрагенту
КонтактноеЛицо = ПартнерыИКонтра...
Функция возвращает истину, если текущая дата или произвольная -- переданная в параметре, является первым рабочим днем месяца. Работает в семействе УТ
// Функция - Это первый рабочий день месяца
//
// Параметры:
// Дата - Дата - Дата, которую необходимо...
Создает в переданной переменной указанный тип через конструктор Новый или вызывает метод Очистки
Процедура ИнициализацияТипом(Переменная,ТипДанных = "СписокЗначений",Очищать = Истина)
Если Переменная = Неопределено Тогда
Переменная = Вычислить("Новый " + ТипДанных);
ИначеЕсли ТипЗнч(Переменная) = Тип("СписокЗначений") Или ТипЗнч(Переменная) = Тип("Массив") Или ТипЗнч(Переменная) = Тип("ТаблицаЗначений") Тогда
Если Очищать = Истина Тогда
Переменная.Очистить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ИнициализацияТипом(Переменная,ТипДанных = "СписокЗначений",Очищать = Истина)
Если Переменная = Неопределено Тогда
Переменная = Вычислить("Новый " + ТипДанных);
ИначеЕсли ТипЗнч(Переменная) = Тип("СписокЗначений") Или ТипЗнч(Переменная) = Тип("Массив") Или ТипЗнч(Переменная) = Тип("ТаблицаЗначений") Тогда
Если Очищать = Истина Тогда
Переменная.Очистить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(Форма.Объект.Наименование)
ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(Форма.Объект.Наименование)
Контекстная подсказка T9 умеет предлагать подходящие варианты, в зависимости от вводимой строки и контекста кода.
Пример такой умной подсказки:
Подсказка предлагает КонецПроцедуры и не предлагает КонецФункции, КонецЕсли и т.д.
Это происходит благодаря ...
&НаСервереБезКонтекста
Функция ПараметрыВыбораБанковскихСчетов(ОплатаВВалюте, Организация)
МассивПараметров = Новый Массив;
Если НЕ ОплатаВВалюте Тогда
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ВалютаДенежныхСредств",
ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация)));
Иначе
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ВалютаДенежныхСредств", Новый ФиксированныйМассив(ИностранныеВалюты(Организация))));
КонецЕсли;
МассивПараметров.Добавить(Новый ПараметрВыбора("ВыборСчетовГоловнойОрганизации", Неопределено));
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Закрыт", Ложь));
Возврат Новый ФиксированныйМассив(МассивПараметров);
КонецФункции
&НаСервере
Процедура ПриЧтенииНаСервере()
ПараметрыВыбораБанковскогоСчета = ПараметрыВыбораБанковскихСчетов(Ложь, Объект.Организация);
Элементы.БанковскийСчет.ПараметрыВыбора = ПараметрыВыбораБанковскогоСчета;
Элементы.БанковскийСчетКонтрагента.ПараметрыВыбора = ПараметрыВыбораБанковскогоСчета;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПараметрыВыбораБанковскихСчетов(ОплатаВВалюте, Организация)
МассивПараметров = Новый Массив;
Если НЕ ОплатаВВалюте Тогда
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ВалютаДенежныхСредств",
ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация)));
Иначе
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ВалютаДенежныхСредств", Новый ФиксированныйМассив(ИностранныеВалюты(Организация))));
КонецЕсли;
МассивПараметров.Добавить(Новый ПараметрВыбора("ВыборСчетовГоловнойОрганизации", Неопределено));
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Закрыт", Ложь));
Возврат Новый ФиксированныйМассив(МассивПараметров);
КонецФункции
&НаСервере
Процедура ПриЧтенииНаСервере()
ПараметрыВыбораБанковскогоСчета = ПараметрыВыбораБанковскихСчетов(Ложь, Объект.Организация);
Элементы.БанковскийСчет.ПараметрыВыбора = ПараметрыВыбораБанковскогоСчета;
Элементы.БанковскийСчетКонтрагента.ПараметрыВыбора = ПараметрыВыбораБанковскогоСчета;
КонецПроцедуры