Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510

Сервис обмена валюты Spring

29.11.2020, 20:22. Показов 3606. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть техническое задание:
С использованием фреймворка Spring необходимо разработать сервис для конвертации валют и сбора статистики операций.

API: /exchange, /stats

/exchange

Запрос: id пользователя, сумма в исходной валюте, исходная валюта, целевая валюта.

Ответ: id запроса, сумма в целевой валюте.

Можно использовать внешние api для конвертации или для получения курса конвертации.

/stats

Предоставление доступа к выборочной информации по запросам.

Примеры запросов:

Пользователи, запросившие конвертацию больше 10 000 $ за один запрос.

Пользователи, суммарный запрошенный объём которых больше 100 000 $.

Рейтинг направлений конвертации валют по популярности.
Его я выполнил. Пытаюсь понять фидбек по /stats (Пользователи, запросившие конвертацию больше 10 000 $ за один запрос):
захардкожена пороговая сумма и валюта запроса. Предполагалось, что сумма передаётся как параметр. Подразумевалось, что пороговая сумма задаётся в долларах, но поиск идёт по конвертациям в любых валютах.
Как понимать? Допустим, сервис работает продолжительное время. Курс меняется. Допустим, пользователь обменял 1000000 рублей в евро по курсу 70.5544 р/$ (29.11.2019). В долларах это $15565 (курс 64.2454926243 р/евро). Сейчас эти 14173 евро обмениваются в $16897 (курс 1.1922 $/евро, 29.11.2020).

Вопрос: сколько пользователей запросило конвертацию >$16k, если запрос поступил сейчас (29.11.2020)?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2020, 20:22
Ответы с готовыми решениями:

Веб сервис на Spring
Нужен веб сервис, который должен выполнять две задачи: по расписанию загружать содержимое определенного сайта, отвечать на GET запросы....

Spring Boot REST сервис
Создаю в учебных целях REST сервис и постоянно возникают различные вопросы, каждый раз создавать тему не хочется по этому буду спрашивать...

Нужно на Spring написать сервис логирования запросов Hibernate сучностей
Добрый день, Нужно на Spring написать сервис логирования запросов Hibernate сучностей. Например, если сущность меняется в...

7
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.11.2020, 01:17
ничего непонятно
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
30.11.2020, 01:47
Arsegg, очевидно, нужно сохранять использованный курс обмена для каждого запроса.
1
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
30.11.2020, 04:52  [ТС]
xoraxax, korvin_, я так оформил сущности:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import javax.persistence.*;
 
@Entity
public final class Exchange {
    @Id
    @GeneratedValue
    private int id;
    private int userId;
    @Embedded
    private Money money;
    @AttributeOverrides({
            @AttributeOverride(name = "amount", column = @Column(name = "converted_amount")),
            @AttributeOverride(name = "currency", column = @Column(name = "converted_currency")),
    })
    @Embedded
    private Money convertedMoney;
 
    @Override
    public String toString() {
        return "Exchange{" +
                "id=" + id +
                ", userId=" + userId +
                ", money=" + money +
                ", convertedMoney=" + convertedMoney +
                '}';
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public int getUserId() {
        return userId;
    }
 
    public void setUserId(int userId) {
        this.userId = userId;
    }
 
    public Money getMoney() {
        return money;
    }
 
    public void setMoney(Money money) {
        this.money = money;
    }
 
    public Money getConvertedMoney() {
        return convertedMoney;
    }
 
    public void setConvertedMoney(Money convertedMoney) {
        this.convertedMoney = convertedMoney;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import javax.persistence.Embeddable;
import java.math.BigDecimal;
import java.util.Currency;
 
@Embeddable
public final class Money {
    private BigDecimal amount;
    private Currency currency;
 
    @Override
    public String toString() {
        return "Money{" +
                "amount=" + amount +
                ", currency=" + currency +
                '}';
    }
 
    public BigDecimal getAmount() {
        return amount;
    }
 
    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }
 
    public Currency getCurrency() {
        return currency;
    }
 
    public void setCurrency(Currency currency) {
        this.currency = currency;
    }
}
Ресурсы:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.math.BigDecimal;
import java.util.Currency;
 
public final class ExchangeDTO {
    private final int userId;
    private final BigDecimal amount;
    private final Currency source;
    private final Currency destination;
 
    private ExchangeDTO(int userId, BigDecimal amount, Currency source, Currency destination) {
        this.userId = userId;
        this.amount = amount;
        this.source = source;
        this.destination = destination;
    }
 
    public static ExchangeDTO createExchangeDTO(int userId, BigDecimal amount, Currency source, Currency destination) {
        return new ExchangeDTO(userId, amount, source, destination);
    }
 
    @Override
    public String toString() {
        return "ExchangeDTO{" +
                "userId=" + userId +
                ", amount=" + amount +
                ", source=" + source +
                ", destination=" + destination +
                '}';
    }
 
    public int getUserId() {
        return userId;
    }
 
    public BigDecimal getAmount() {
        return amount;
    }
 
    public Currency getSource() {
        return source;
    }
 
    public Currency getDestination() {
        return destination;
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.math.BigDecimal;
import java.util.Currency;
 
public class ExchangeDTOBuilder {
    private int userId;
    private BigDecimal amount;
    private Currency source;
    private Currency destination;
 
    public ExchangeDTOBuilder setUserId(int userId) {
        this.userId = userId;
        return this;
    }
 
    public ExchangeDTOBuilder setAmount(BigDecimal amount) {
        this.amount = amount;
        return this;
    }
 
    public ExchangeDTOBuilder setSource(Currency source) {
        this.source = source;
        return this;
    }
 
    public ExchangeDTOBuilder setDestination(Currency destination) {
        this.destination = destination;
        return this;
    }
 
    public ExchangeDTO createExchangeDTO() {
        return ExchangeDTO.createExchangeDTO(userId, amount, source, destination);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.math.BigDecimal;
 
public final class ExchangeResponseDTO {
    private final int id;
    private final BigDecimal amount;
 
    private ExchangeResponseDTO(int id, BigDecimal amount) {
        this.id = id;
        this.amount = amount;
    }
 
    public static ExchangeResponseDTO createExchangeResponseDTO(Exchange exchange) {
        return createExchangeResponseDTO(exchange.getId(), exchange.getConvertedMoney().getAmount());
    }
 
    private static ExchangeResponseDTO createExchangeResponseDTO(int id, BigDecimal amount) {
        return new ExchangeResponseDTO(id, amount);
    }
 
    @Override
    public String toString() {
        return "ExchangeResponseDTO{" +
                "id=" + id +
                ", amount=" + amount +
                '}';
    }
 
    public int getId() {
        return id;
    }
 
    public BigDecimal getAmount() {
        return amount;
    }
}
Репозиторий:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
 
import javax.persistence.Tuple;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.List;
import java.util.Set;
 
public interface ExchangeRepository extends CrudRepository<Exchange, Integer> {
    @Query("SELECT DISTINCT e.userId FROM Exchange e WHERE e.money.amount > :amount and e.money.currency = :currency")
    Set<Integer> getUsersRequestedGreaterThan(@Param(value = "amount") BigDecimal amount,
                                              @Param(value = "currency") Currency currency);
    @Query("SELECT e.userId " +
            "FROM Exchange e " +
            "WHERE e.money.currency = :currency " +
            "GROUP BY e.userId " +
            "HAVING SUM(e.money.amount) > :amount")
    Set<Integer> getUsersRequestedSummaryGreaterThan(@Param(value = "amount") BigDecimal amount,
                                                     @Param(value = "currency") Currency currency);
    @Query("SELECT e.money.currency AS s, e.convertedMoney.currency AS d " +
            "FROM Exchange e " +
            "GROUP BY s, d " +
            "ORDER BY COUNT(e)")
    List<Tuple> getRating();
}
Сервисы:
Кликните здесь для просмотра всего текста
Java
1
2
3
public interface ExchangeService {
    Exchange exchange(ExchangeDTO exchangeDTO);
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
 
import javax.money.convert.MonetaryConversions;
import java.util.Currency;
import java.util.Objects;
 
@Service
public class ExchangeServiceImpl implements ExchangeService {
    private static final Logger log = LoggerFactory.getLogger(ExchangeServiceImpl.class);
 
    private final ExchangeRepository exchangeRepository;
 
    private ExchangeServiceImpl(ExchangeRepository exchangeRepository) {
        this.exchangeRepository = exchangeRepository;
    }
 
    private static Money exchange(Money money, Currency to) {
        Objects.requireNonNull(money, "money can't be null");
        Objects.requireNonNull(to, "to can't be null");
 
        final var amount = money.getAmount();
        final var source = money.getCurrency().toString();
        final var monetaryAmount = org.javamoney.moneta.Money.of(amount, source);
 
        final var destination = to.toString();
        final var conversion = MonetaryConversions.getConversion(destination);
        final var convertedMonetaryAmount = monetaryAmount.with(conversion);
 
        final var convertedMoney = new Money();
        convertedMoney.setAmount(convertedMonetaryAmount.getNumberStripped());
        convertedMoney.setCurrency(to);
 
        return convertedMoney;
    }
 
    @Override
    public Exchange exchange(ExchangeDTO exchangeDTO) {
        Objects.requireNonNull(exchangeDTO, "exchangeDTO can't be null");
 
        log.info("Exchanging: " + exchangeDTO + "...");
        final var exchange = new Exchange();
        exchange.setUserId(exchangeDTO.getUserId());
 
        final var money = new Money();
        money.setAmount(exchangeDTO.getAmount());
        money.setCurrency(exchangeDTO.getSource());
        exchange.setMoney(money);
 
        final var destination = exchangeDTO.getDestination();
        final var convertedMoney = exchange(money, destination);
        exchange.setConvertedMoney(convertedMoney);
        log.info("Exchanged as: " + exchange);
 
        log.info("Saving to repository...");
        final var result = exchangeRepository.save(exchange);
        log.info("Saved as: " + result);
 
        return result;
    }
}
Java
1
2
3
4
5
6
7
8
9
import javax.persistence.Tuple;
import java.util.List;
import java.util.Set;
 
public interface StatisticsService {
    Set<Integer> getUsersRequestedGreaterThan$10kPerRequest();
    Set<Integer> getUsersRequestedSummaryGreaterThan$100k();
    List<Tuple> getRating();
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import org.springframework.stereotype.Service;
 
import javax.persistence.Tuple;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.List;
import java.util.Set;
 
@Service
public class StatisticsServiceImpl implements StatisticsService {
    private static final BigDecimal TEN_THOUSAND = BigDecimal.valueOf(10_000);
    private static final BigDecimal ONE_HUNDRED_THOUSAND = BigDecimal.valueOf(100_000);
    private static final Currency USD = Currency.getInstance("USD");
 
    private final ExchangeRepository exchangeRepository;
 
    private StatisticsServiceImpl(ExchangeRepository exchangeRepository) {
        this.exchangeRepository = exchangeRepository;
    }
 
    @Override
    public Set<Integer> getUsersRequestedGreaterThan$10kPerRequest() {
        return exchangeRepository.getUsersRequestedGreaterThan(TEN_THOUSAND, USD);
    }
 
    @Override
    public Set<Integer> getUsersRequestedSummaryGreaterThan$100k() {
        return exchangeRepository.getUsersRequestedSummaryGreaterThan(ONE_HUNDRED_THOUSAND, USD);
    }
 
    @Override
    public List<Tuple> getRating() {
        return exchangeRepository.getRating();
    }
}
Контроллеры:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Objects;
 
@RestController
public class ExchangeController {
    private final ExchangeService exchangeService;
 
    private ExchangeController(ExchangeService exchangeService) {
        this.exchangeService = exchangeService;
    }
 
    @GetMapping("/exchange")
    public ExchangeResponseDTO exchange(@RequestParam("user_id") int userId, @RequestParam("amount") BigDecimal amount,
                                        @RequestParam("source") Currency source, @RequestParam("destination") Currency destination) {
        Objects.requireNonNull(amount, "amount can't be null");
        Objects.requireNonNull(source, "source can't be null");
        Objects.requireNonNull(destination, "destination can't be null");
 
        final var exchangeDTOBuilder = new ExchangeDTOBuilder();
        final var exchangeDTO = exchangeDTOBuilder
                .setUserId(userId)
                .setAmount(amount)
                .setSource(source)
                .setDestination(destination)
                .createExchangeDTO();
        final var exchange = exchangeService.exchange(exchangeDTO);
 
        return ExchangeResponseDTO.createExchangeResponseDTO(exchange);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.persistence.Tuple;
import java.util.List;
import java.util.Set;
 
@RestController
@RequestMapping("/stats")
public class StatisticsController {
    private final StatisticsService statisticsService;
 
    private StatisticsController(StatisticsService statisticsService) {
        this.statisticsService = statisticsService;
    }
 
    @GetMapping("/1")
    public Set<Integer> getUsersRequestedGreaterThan$10kPerRequest() {
        return statisticsService.getUsersRequestedGreaterThan$10kPerRequest();
    }
 
    @GetMapping("/2")
    public Set<Integer> getUsersRequestedSummaryGreaterThan$100k() {
        return statisticsService.getUsersRequestedSummaryGreaterThan$100k();
    }
 
    @GetMapping("/rating")
    public List<Tuple> getRating() {
        return statisticsService.getRating();
    }
}
Само приложение:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Зависимости:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.javamoney</groupId>
            <artifactId>moneta</artifactId>
            <version>1.4.2</version>
            <type>pom</type>
        </dependency>
    </dependencies>

Не по теме:

Сильно не смейтесь над кодом, только недавно начал изучение Spring.


P. S. Дропнул пакеты, т. к. сенситив.

Не по теме:

P. P. S. Без слез не могу теперь взглянуть на свой код, особенно код контроллеров: чего только стоят названия методов и эндпоинтов - треш, угар и содомия. Тут даже мелкие грехи, типа невыделения интерфейсов контроллеров и т.п., меркнут перед этим.

0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.11.2020, 09:57
сформулируй пожалуйста конкретный вопрос
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
30.11.2020, 10:29  [ТС]
Цитата Сообщение от Arsegg Посмотреть сообщение
Пользователи, запросившие конвертацию больше 10 000 $ за один запрос.
Пользователи, суммарный запрошенный объём которых больше 100 000 $.
xoraxax, как это сделать?

Не могу понять, что требуется в задаче. Какие данные на вход подаются я выяснил - сумма. Но что с этим делать совершенно не ясно. Как и что должно быть на выходе.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
30.11.2020, 10:39
Цитата Сообщение от Arsegg Посмотреть сообщение
что должно быть на выходе.
Цитата Сообщение от Arsegg Посмотреть сообщение
Пользователи
...
2
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
30.11.2020, 10:41
Лучший ответ Сообщение было отмечено Arsegg как решение

Решение

ну вот заказчик тебе говорит: "сделай мне какую-то непонятную хрень", ты, наверно, у заказчика же спросишь, что он имеет ввиду, а не пойдешь гуглить, например?
Цитата Сообщение от Arsegg Посмотреть сообщение
Пользователи, запросившие конвертацию больше 10 000 $ за один запрос.
Цитата Сообщение от Arsegg Посмотреть сообщение
Пользователи, суммарный запрошенный объём которых больше 100 000 $.
тут, видимо, нужно вернуть лист пользователей, отфильтрованный по заданному условию.
Соответственно будут например 2 ендпоинта
List<User> getUsersConvertingMoreThan(BigDecimal amount);
List<User> getUsersWithTotalCashFlowMoreThan(BigDec imal amount);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2020, 10:41
Помогаю со студенческими работами здесь

Сервис загрузки файлов Spring
Добрый день. Необходимо реализовать загрузку файлов в виде сервиса. Использую Spring версии 4.3.3. В контроллере следующая функция: ...

Реализация обмена валюты на сайте
Доброго времени суток! Вот хочу сделать так чтобы можно было менять доллары на бонусные баллы. На сайте при регистрации дается $300 и 7...

Приложение для кассы обмена валюты vs 2010
Приложение для кассы обмена валюты. Исходное значение (доллары или рубли) вводится в текстовое поле (TextBox). Курс доллара задан в...

В нарушении правил обмена валюты подозреваются четыре работника банка
пожалуйста помогие решить задачу=( В нарушении правил обмена валюты подозреваются четыре работника банка A, B, C и D. Известно, что ...

В нарушении правил обмена валюты подозреваются четыре работника банка
кто-нибудь помогите решить задачу на прологе. сколько ни бился, ничего не выходит В нарушении правил обмена валюты подозреваются четыре...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru