auto и const

Еще неочевидная проблема. Реализована два метода получения объекта по индексу — At. Оба возвращают ссылку. Один константный возвращает константную ссылку, потому, что есть константные методы, из которых нельзя вызывать не константные методы. Второй — для редактирования. Возвращает ссылку которую можно редактировать.

Есть код:

auto object = At(x, y);

object.field = <какое-то значение>;

At, по умолчанию, возвращает константное значение. Присвоение отрабатывает, но изменение не происходит. И ни один компилятор ни на что не ругается.

Почему не предупредить, что объект константный и нельзя менять значение его полей? Почему не выдать ошибку? Исключение? Хоть что-то?!

Да, проблема решается просто:

Object& object = At(x, y);

Но надо же еще найти, что проблема в этом!

Вывод один: auto — Зло. Ну или не зло, но за ним надо смотреть в оба глаза.

Контейнеры и ссылки

Начал переписывать свой проект со swift на C++ и посыпались проблемы, от которых я уже отвык. Начнем по порядку.

В С++ невозможно сделать массив ссылок. Ни массив, ни контейнер из STL ссылки не поддерживают.

Объекты достаточно большие, копировать их не хочется. В классы передаются ссылками. Морочится с указателями, new и delete не вдохновляет. Что делать?

Берем smart_ptr. Начинаются проблемы. В smart_ptr нельзя обернуть this. Точнее можно, при условии если унаследовать специальный класс, если гарантировать, что объект создан через smart_ptr.

То есть, использовать smart_ptr везде нельзя. Остается зоопарк из ссылок и smart_prt.

Делаем контейнер из smart_ptr и узнаем, что он не понимает иерархию классов. Надо вручную приводить добавляемый в контейнер объект к родительскому классу.

Получается вот такая сложная конструкция:

std::vector<std::shared_ptr<Object>> Objects;
someObject= std::make_shared<SomeObject>();
Objects.push_back(std::static_pointer_cast<Object>(someObject));

То же самое на Swift:

var objects = [Objects]()
let somObject = SomeObject()
objecs.append(someObject)

И никаких «;» «<>». При том, что мы сразу получаем массив ссылок. Объекты не копируются и не надо городить над ними ничего лишнего.

Исправить нумерацию объектов

ОбновитьНумерациюОбъектов();

Код 1C v 8.х
 ОбновитьНумерациюОбъектов(<Метаданные>)    


Параметры:
<Метаданные> (необязательный, НО Если значение параметра не указано, то обновление будет выполнено для всех типов объектов)

Тип:
Массив; Объекты метаданных. Объект метаданного или массив объектов метаданных, для объектов которого будет выполнено обновление. Если значение параметра не указано, то обновление будет выполнено для всех типов объектов.

Описание:
Выполняет обновление номеров в соответствии с номерами, записанными в базе данных. После вызова данного метода все выданные, но не записанные номера, становятся невалидными, т.к. не гарантируется их уникальность. Данный метод разрешено вызывать только администратору системы.

Доступность:
Сервер, толстый клиент, внешнее соединение

Построитель отчета, агрегатная функция МАССИВ

Век живи — век учись. Для меня стало неожиданным и приятным сюрпризом, что в построителе отчетов 1С, на закладке Ресурсы, помимо стандартных агрегатных функций вроде КОЛИЧЕСТВО, МАКСИМУМ и МИНИМУМ есть функция МАССИВ, которая собирает значения вместе.

При чем, в самом построителе отчета эта функция не отображается. Надо вводить вручную.

Прекрасная функция, экономит массу усилий и времени.

Получить курс валюты на дату документа в запросе 1С

ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка КАК Ссылка,
	ВложенныйЗапрос.Валюта КАК Валюта,
	ВложенныйЗапрос.ДатаКурса КАК ДатаКурса,
	КурсыВалют.Курс КАК Курс,
	КурсыВалют.Кратность КАК Кратность
ИЗ
	(ВЫБРАТЬ
		ПриобретениеТоваровУслуг.Ссылка КАК Ссылка,
		ПриобретениеТоваровУслуг.Валюта КАК Валюта,
		МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
	ИЗ
		Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
			ПО ПриобретениеТоваровУслуг.Валюта = КурсыВалют.Валюта
				И ПриобретениеТоваровУслуг.Дата >= КурсыВалют.Период
	
	СГРУППИРОВАТЬ ПО
		ПриобретениеТоваровУслуг.Ссылка,
		ПриобретениеТоваровУслуг.Валюта) КАК ВложенныйЗапрос
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
		ПО ВложенныйЗапрос.Валюта = КурсыВалют.Валюта
			И ВложенныйЗапрос.ДатаКурса = КурсыВалют.Период

Результат работы СКД в запросе

В модуле объекта «Отчет» добавить:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета 		= Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных 	= КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
	
	Если МакетКомпоновкиДанных.НаборыДанных.Количество() &gt; 0 Тогда
		Сообщить(МакетКомпоновкиДанных.НаборыДанных&#91;0].Запрос);      // Итоговый текст запроса
	КонецЕсли;
	
КонецПроцедуры // ПриКомпоновкеРезультата()

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>


и перезапустить IIS. Функциональность будет полная. Обратите внимание, что если вы переопубликуете базу, изменения нужно будет вносить заново.

Источник: http://www.koderline.ru/expert/programming/article-problemy-bezopasnosti-pri-rabote-s-1s-cherez-iis/

Получить целые числа языком запросов 1С

Интересная задачка с собеседования — получить средствами языка запросов числа от -500 до 500. Само решение тривиально, но для него нужно получить перечень чисел от 0 до… ну хотя бы до 500. А это уже интереснее. Одно из возможных решений приведено ниже. Продолжая подставляя степени двойки можно получить очень длинную последовательность целых чисел.

ВЫБРАТЬ
0 КАК Числа
ПОМЕСТИТЬ Шаг0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Лево.Числа * 2 + Право.Числа КАК Числа
ПОМЕСТИТЬ Шаг2
ИЗ
Шаг0 КАК Лево,
Шаг0 КАК Право
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Лево.Числа * 4 + Право.Числа КАК Числа
ПОМЕСТИТЬ Шаг4
ИЗ
Шаг2 КАК Лево,
Шаг2 КАК Право
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Лево.Числа * 8 + Право.Числа КАК Числа
ПОМЕСТИТЬ Шаг8
ИЗ
Шаг4 КАК Лево,
Шаг4 КАК Право
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Лево.Числа * 16 + Право.Числа КАК Числа
ПОМЕСТИТЬ Шаг16
ИЗ
Шаг8 КАК Лево,
Шаг8 КАК Право
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Лево.Числа * 32 + Право.Числа КАК Числа
ИЗ
Шаг16 КАК Лево,
Шаг16 КАК Право

IIS & 1C

Если веб-интерфейс у 1С не работает, не отображает элементы,  выходят ошибки  и т.п. можно попробовать отредактировать web.config на сервере IIS:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
      <handlers>
         <remove name="ISAPI-dll" />
         <add name="1C Web-service Extension" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\1cv8\8.3.5.1443\bin\wsisapi.dll" resourceType="Unspecified" requireAccess="None" />
         <add name="ISAPI-dll" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\1cv8\8.3.5.1443\bin\wsisapi.dll" resourceType="File" requireAccess="Execute" allowPathInfo="true" preCondition="bitness64" />
      </handlers>
   </system.webServer>
</configuration>