Skip to content

Commit

Permalink
#22 Поддержка функции ОбщегоНазначенияКлиентСервер.СвернутьМассив() (#42
Browse files Browse the repository at this point in the history
)

Возвращать типизированный массив как входящий тип
  • Loading branch information
iArtemv authored Jun 25, 2021
1 parent bafe1ae commit 1298dca
Show file tree
Hide file tree
Showing 10 changed files with 178 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* Поддержка функции ОбщегоНазначения.ОписаниеСвойствОбъекта()
* Поддержка функции ОбщегоНазначения.СкопироватьРекурсивно()
* Документация Markdown в составе плагина
* Поддержка функции ОбщегоНазначенияКлиентСервер.СвернутьМассив()
* Поддержка функции ОбщегоНазначенияКлиентСервер.РазностьМассивов()
* Поддержка функции ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве()
* Поддержка функции ОбщегоНазначения.ВыгрузитьКолонку()
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

Позволяет налету вычислять функции общего модуля `ОбщегоНазначенияКлиентСервер` (`CommonClientServer`), которые возвращают тип в зависимости от переданных параметров.

* `СвернутьМассив`(`CollapseArray`) - возвращает типизированный массив на основе типа расчитанного по первому параметру
* `РазностьМассивов`(`ArraysDifference`) - возвращает типизированный массив на основе типа расчитанного по первому параметру
* `ЗначениеВМассиве`(`ValueInArray`) - возвращает типизированный массив с типом первого параметра

Expand Down
5 changes: 5 additions & 0 deletions bundles/com.e1c.ssl.bsl/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@
name="ObjectPropertiesDetails"
nameRu="ОписаниеСвойствОбъекта">
</computers>
<computers
computer="com.e1c.ssl.bsl.internal.ExecutableExtensionFactory:com.e1c.ssl.bsl.CommonFunctionCollapseArrayTypesComputer"
name="CollapseArray"
nameRu="СвернутьМассив">
</computers>
<computers
computer="com.e1c.ssl.bsl.internal.ExecutableExtensionFactory:com.e1c.ssl.bsl.CommonFunctionArraysDifferenceTypesComputer"
name="ArraysDifference"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*******************************************************************************
* Copyright (C) 2021, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* 1C-Soft LLC - initial API and implementation
*******************************************************************************/
package com.e1c.ssl.bsl;

import java.util.Collections;
import java.util.List;

import org.eclipse.xtext.EcoreUtil2;

import com._1c.g5.v8.dt.bsl.model.Expression;
import com._1c.g5.v8.dt.bsl.model.Invocation;
import com._1c.g5.v8.dt.mcore.Environmental;
import com._1c.g5.v8.dt.mcore.TypeItem;

/**
* Extension computer of invocation types of 1C:SSL API module function {@code CommonClientServer.CollapseArray()} that
* returns the typed array.
*
* @author Artem Iliukhin
*
*/
public class CommonFunctionCollapseArrayTypesComputer
extends AbstractCommonModuleObjectAttributeValueTypesComputer
{

@Override
public List<TypeItem> getTypes(Invocation inv)
{
if (inv.getParams().size() != 1)
return Collections.emptyList();

if (!isValidClientServerModuleNameInvocation(inv))
return Collections.emptyList();

Expression expr = inv.getParams().get(0);
if (expr != null)
{
Environmental envs = EcoreUtil2.getContainerOfType(expr, Environmental.class);
return this.getTypesComputer().computeTypes(expr, envs.environments());
}

return Collections.emptyList();

}

}
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

* [`РазностьМассивов` (`ArraysDifference`)](common-client-server-arrays-difference.md)
* [`ЗначениеВМассиве` (`ValueInArray`)](common-client-server-value-in-array.md)
* [`СвернутьМассив` (`CollapseArray`)](common-client-server-collapse-array.md)

Позволяет на лету вычислять функции общего модуля `ОбщегоНазначенияКлииент` (`CommonClient`)

Expand Down
21 changes: 21 additions & 0 deletions docs/common-client-server-collapse-array.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# `ОбщегоНазначенияКлиентСервер.СвернутьМассив` (`CommonClientServer.CollapseArray`)

Описание функции:

> Возвращает копию исходного массива с уникальными значениями.
## Типизация возвращаемых значений

Функция возвращает типизированный массив как входящий тип.

Пример:

```bsl
Процедура Тест()
Товары = Новый Массив; // Массив из СправочникСсылка.Товары -
УникальныеТовары = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Товары);
УникальныйТовар = УникальныеТовары.Получить(0);
КонецПроцедуры
```
3 changes: 3 additions & 0 deletions docs/toc.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
<topic href="html/common-client-subsystem-exist.html" label="ОбщегоНазначенияКлиент.ПодсистемаСуществует">
<anchor id="common-client-subsystem-exist"/>
</topic>
<topic href="html/common-client-server-collapse-array.html" label="ОбщегоНазначенияКлиентСервер.СвернутьМассив">
<anchor id="common-client-server-collapse-array"/>
</topic>
<topic href="html/common-client-arrays-difference.html" label="ОбщегоНазначенияКлиентСервер.РазностьМассивов">
<anchor id="common-client-arrays-difference"/>
</topic>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

Процедура Тест()

Товары = Новый Массив; // Массив из СправочникСсылка.Товары -
УникальныеТовары = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Товары);
УникальныйТовар = УникальныеТовары.Получить(0);

КонецПроцедуры
Original file line number Diff line number Diff line change
Expand Up @@ -1086,6 +1086,40 @@ public void testFunctionObjectPropertiesDetails() throws Exception
restoreState(oldFileContent, oldFile);
}

@Test
public void testFunctionCollapseArray() throws Exception
{
this.oldFile = project.getFile(Path.fromPortableString(PATH_COMMON_MODULE_TEST));
BufferedReader reader =
new BufferedReader(new InputStreamReader(oldFile.getContents(true), StandardCharsets.UTF_8));
this.oldFileContent = reader.lines().collect(Collectors.joining(System.lineSeparator()));
File newFile = new File(FOLDER_NAME + "common-functions/collapse-array.bsl"); //$NON-NLS-1$
replaceFileContent(oldFile, newFile);

Module module = getBslModule(PROJECT_NAME, PATH_COMMON_MODULE_TEST);
assertEquals(1, module.allMethods().size());
Method method = module.allMethods().get(0);
assertEquals(3, method.getStatements().size());
Expression array = getRightExpr(method.getStatements().get(2));
Environmental envs = EcoreUtil2.getContainerOfType(array, Environmental.class);

List<TypeItem> types = typesComputer.computeTypes(array, envs.environments())
.stream()
.filter(t -> !IEObjectTypeNames.ARBITRARY.equalsIgnoreCase(McoreUtil.getTypeName(t)))
.collect(Collectors.toList());

assertEquals(1, types.size());

TypeItem type = types.get(0);

assertTrue(type instanceof Type);

assertEquals("CatalogRef.Товары", McoreUtil.getTypeName(type)); //$NON-NLS-1$

restoreState(oldFileContent, oldFile);

}

@Test
public void testFunctionArraysDifference() throws Exception
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,52 @@

// Возвращает копию исходного массива с уникальными значениями.
//
// Параметры:
// Массив - Массив - массив произвольных значений.
//
// Возвращаемое значение:
// Массив - массив уникальных элементов.
//
Функция СвернутьМассив(Знач Массив) Экспорт
Результат = Новый Массив;
ДополнитьМассив(Результат, Массив, Истина);
Возврат Результат;
КонецФункции

// Дополняет массив МассивПриемник значениями из массива МассивИсточник.
//
// Параметры:
// МассивПриемник - Массив - массив, в который необходимо добавить значения.
// МассивИсточник - Массив - массив значений для заполнения.
// ТолькоУникальныеЗначения - Булево - если истина, то в массив будут включены только уникальные значения.
//
Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт

Если ТолькоУникальныеЗначения Тогда

УникальныеЗначения = Новый Соответствие;

Для Каждого Значение Из МассивПриемник Цикл
УникальныеЗначения.Вставить(Значение, Истина);
КонецЦикла;

Для Каждого Значение Из МассивИсточник Цикл
Если УникальныеЗначения[Значение] = Неопределено Тогда
МассивПриемник.Добавить(Значение);
УникальныеЗначения.Вставить(Значение, Истина);
КонецЕсли;
КонецЦикла;

Иначе

Для Каждого Значение Из МассивИсточник Цикл
МассивПриемник.Добавить(Значение);
КонецЦикла;

КонецЕсли;

КонецПроцедуры

// Возвращает разность массивов. Разностью двух массивов является массив, содержащий
// все элементы первого массива, не существующие во втором массиве.
//
Expand Down

0 comments on commit 1298dca

Please sign in to comment.