ВЫБРАТЬ
ВложенныйЗапрос.Ссылка КАК Ссылка,
ВложенныйЗапрос.Валюта КАК Валюта,
ВложенныйЗапрос.ДатаКурса КАК ДатаКурса,
КурсыВалют.Курс КАК Курс,
КурсыВалют.Кратность КАК Кратность
ИЗ
(ВЫБРАТЬ
ПриобретениеТоваровУслуг.Ссылка КАК Ссылка,
ПриобретениеТоваровУслуг.Валюта КАК Валюта,
МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
ИЗ
Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ПриобретениеТоваровУслуг.Валюта = КурсыВалют.Валюта
И ПриобретениеТоваровУслуг.Дата >= КурсыВалют.Период
СГРУППИРОВАТЬ ПО
ПриобретениеТоваровУслуг.Ссылка,
ПриобретениеТоваровУслуг.Валюта) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ВложенныйЗапрос.Валюта = КурсыВалют.Валюта
И ВложенныйЗапрос.ДатаКурса = КурсыВалют.Период
dmitri
Перекодировка всех файлов в каталоге
for filename in *.txt; do iconv -f cp1251 -t utf8 "$filename" > "temp_$filename" && mv -f ./"temp_$filename" ./"$filename"; done
Добавление собственных RLS в БСП
Версионирование объектов
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтаФорма);
ВерсионированиеОбъектов.ВключитьВерсионированиеОбъекта("Документ|Справочник.Имя", Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриЗаписи);
В модуле формы, в процедуре «ПриЗаписиНаСервере», добавить:
ВерсионированиеОбъектовСобытия.ЗаписатьВерсиюДокумента(ТекущийОбъект, Отказ, РежимЗаписиДокумента, РежимПроведенияДокумента)
Добавить команду в ПанельНавигации.См также
Если ПараметрКоманды = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда
Если ПараметрКоманды.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СсылкаНаОбъект = ПараметрКоманды[0];
Иначе
СсылкаНаОбъект = ПараметрКоманды;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ссылка", СсылкаНаОбъект);
ПараметрыФормы.Вставить("ТолькоПросмотр", ПараметрыВыполненияКоманды.Источник.ТолькоПросмотр);
ОткрытьФорму("РегистрСведений.ВерсииОбъектов.Форма.ВыборХранимыхВерсий",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно);
Результат работы СКД в запросе
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
Если МакетКомпоновкиДанных.НаборыДанных.Количество() > 0 Тогда
Сообщить(МакетКомпоновкиДанных.НаборыДанных[0].Запрос); // Итиоговый текст запроса
КонецЕсли;
КонецПроцедуры // ПриКомпоновкеРезультата()
code>
Блокировка повторного запуска процессов в 1С: Документооборот
Все что нужно, добавить подписку на событие ПередЗаписью для БизнесПроцессСсылка.
Процедура РУ_ПередЗаписьюБизнесПроцессаПередЗаписью(Источник, Отказ) Экспорт
Если НЕ ЗначениеЗаполнено(Источник.Ссылка) И ЗначениеЗаполнено(Источник.Шаблон) И Источник.Предметы.Количество() > 0 Тогда
//Выполняем проверку только для процессов запущенных по шаблону и с указанным предметом
Предмет = Источник.Предметы[0].Предмет;
ВидПроцесса = Источник.Метаданные().Имя;
Запрос = Новый Запрос;
Запрос.Текст = СтрЗаменить(
"ВЫБРАТЬ
| БизнесПроцессыПоШаблону.Ссылка КАК СсылкаСсылка
|ИЗ
| КритерийОтбора.БизнесПроцессыПоШаблону(&Шаблон) КАК БизнесПроцессыПоШаблону
| ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.%ВИДПРОЦЕССА%.Предметы КАК КомплексныйПроцессПредметы
| ПО БизнесПроцессыПоШаблону.Ссылка = КомплексныйПроцессПредметы.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцессыДляЗапуска КАК ПроцессыДляЗапуска
| ПО БизнесПроцессыПоШаблону.Ссылка = ПроцессыДляЗапуска.БизнесПроцесс
|ГДЕ
| НЕ БизнесПроцессыПоШаблону.Ссылка.Завершен
| И БизнесПроцессыПоШаблону.Ссылка.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияБизнесПроцессов.Активен)
| И БизнесПроцессыПоШаблону.Ссылка <> &Ссылка
| И КомплексныйПроцессПредметы.Предмет = &Предмет
| И (ПроцессыДляЗапуска.Состояние ЕСТЬ NULL ИЛИ ПроцессыДляЗапуска.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияПроцессовДляЗапуска.СтартОтменен))", "%ВИДПРОЦЕССА%", ВидПроцесса);
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Запрос.УстановитьПараметр("Предмет", Предмет);
Запрос.УстановитьПараметр("Шаблон", Источник.Шаблон);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Сообщить("Процесс уже запущен");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Exception Details: System.Web.HttpException: A potentially dangerous Request.Path value was detected from the client (:)
Ошибка:
«Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: A potentially dangerous Request.Path value was detected from the client (:).
Решение:
1. Добавить параметр в раздел system.webServer:
<security> <requestFiltering allowDoubleEscaping="true" /> </security> |
2. Добавить параметр в раздел configuration
<system.web> <pages validateRequest="false" /> <httpRuntime requestPathInvalidCharacters="" /> </system.web> |
Обратите внимание, что если вы переопубликуете базу, изменения нужно будет вносить заново.
Источник: http://www.koderline.ru/expert/programming/article-problemy-bezopasnosti-pri-rabote-s-1s-cherez-iis/
APDEX: Замеры производительности
Встала задача замерить производительность открытия документов, отчетов и пр.
Стандартный ADPEX вполне походил для задачи, однако, серверный вариант замера производительности не удобен для управляемых форм. Пришлось немного допилить его.
Добавляем в серверный модуль
#Область ОценкаПроизводительности Функция ОП_СодержитСвойство(Переменная, ИмяСвойства) // Инициализируем структуру для теста с ключом (значение переменной "ИмяСвойства") и значением NULL СтруктураПроверка = Новый Структура; СтруктураПроверка.Вставить(ИмяСвойства, NULL); // Заполняем созданную структуру из переданного значения переменной ЗаполнитьЗначенияСвойств(СтруктураПроверка, Переменная); // Если значение для свойства структуры осталось NULL, то искомое свойство не найдено, и наоборот. Если СтруктураПроверка[ИмяСвойства] = NULL Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции Процедура ОП_НачатьЗамерФорма(Форма) Экспорт Если НЕ ОП_СодержитСвойство(Форма, "ИМС_ЗамерПроизводительности") Тогда ОписаниеТипа = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(14, 0, ДопустимыйЗнак.Неотрицательный)); Реквизиты = Новый Массив; Реквизиты.Добавить(Новый РеквизитФормы("ИМС_ЗамерПроизводительности", ОписаниеТипа)); Форма.ИзменитьРеквизиты(Реквизиты); КонецЕсли; Форма.ИМС_ЗамерПроизводительности = ОценкаПроизводительности.НачатьЗамерВремени(); КонецПроцедуры Процедура ОП_ЗавершитьЗамерФорма(Форма, Операция = ".Открытие") Экспорт Объект = Форма.РеквизитФормыВЗначение("Объект"); ИмяОбъекта = Объект.Метаданные().Имя; ОценкаПроизводительности.ЗакончитьЗамерВремени("Имс:"+ИмяОбъекта+Операция,Форма.ИМС_ЗамерПроизводительности); КонецПроцедуры #КонецОбласти |
Дальше, добавляем новое расширение конфигурации. В расширение добавляем требуемые формы документов и на форме:
&НаСервере Процедура ОП_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) РУ.ОП_НачатьЗамерФорма(ЭтаФорма); КонецПроцедуры &НаКлиенте Процедура ОП_ПриОткрытии(Отказ) ОП_ПриОткрытииНаСервере(); КонецПроцедуры &НаСервере Процедура ОП_ПриОткрытииНаСервере() РУ.ОП_ЗавершитьЗамерФорма(ЭтаФорма); КонецПроцедуры &НаСервере Процедура ОП_ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда РУ.ОП_НачатьЗамерФорма(ЭтаФорма); КонецЕсли; КонецПроцедуры &НаСервере Процедура ОП_ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда РУ.ОП_ЗавершитьЗамерФорма(ЭтаФорма,".Проведение"); КонецЕсли; КонецПроцедуры |
Главное, не забыть снять флаг «Безопасный режим» с расширения. Замеры производительности в безопасном режиме не работают.
Custom segue
Промучился вечер с настраиваемыми Segue. На новое окно переходило, а обратно — никак. Возвращаешь стандартный Segue — все работает. Фишка оказалась в порядке вызова функции present.
Изначальный вариант выглядел так:
class FlipSegue: UIStoryboardSegue { override func perform() { let fromViewController = self.source let toViewController = self.destination UIView.transition(from: fromViewController.view, to: toViewController.view, duration: 0.5, options: .transitionFlipFromLeft ) { fromViewController.present(toViewController, animated: false, completion: nil) } } } |
а правильный так:
class FlipSegue: UIStoryboardSegue { override func perform() { let fromViewController = self.source let toViewController = self.destination fromViewController.present(toViewController, animated: false, completion: nil) UIView.transition(from: fromViewController.view, to: toViewController.view, duration: 0.5, options: .transitionFlipFromLeft ) } } |
притом unwind segue должно быть таким:
class UnFlipSegue: UIStoryboardSegue { override func perform() { let fromViewController = self.source let toViewController = self.destination UIView.transition(from: fromViewController.view, to: toViewController.view, duration: 0.5, options: .transitionFlipFromRight) { _ in fromViewController.dismiss(animated: false, completion: nil ) } } } |
32-х битные isapi на 64-х битном IIS
Перейти в настройки IIS, выбрать «Пулы приложений», «DefaultAppPool», «Дополнительные параметры».
изменить «Разрешены 32-х разрядные приложения» на True.