Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250

Как работает union в С++

01.11.2024, 15:47. Показов 5594. Ответов 91
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста.
Как работает union в С++
Везде написано, что элементы union, занимают одну область памяти.
Область памяти размером по наибольшему элементу.

C++
1
2
3
4
5
union Foo
{
   int a;
   char b;
};
Если я присвою int какое либо значение.
И присвою значение для char.
И учитывая, что они занимают одну область памяти.
Значит char должна затереть часть битов int.
И int перестанет иметь прежнее значение.

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2024, 15:47
Ответы с готовыми решениями:

Union как работает?
union U { double f; long l; int d; }; U un; un.f = 0; un.l = 10; cout << un.f; почему выводит 4.94066e-323 ? я так понял это...

union как определить из какой таблице запись после UNION?
Подскажите пожалуйста! Вот например две таблице (TEBLE_1) у которой поля row_1(BIGINT) и (TABLE_2) у которой поля row_2(TEXT) Я ИХ...

функция union что выводит на консоль? как работает?
union U { double f; long l; int d; }; U un; un.f = 0; un.l = 10; cout << un.f; И что выведет на экран?

91
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
01.11.2024, 22:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Curry Посмотреть сообщение
Использовать для реинтерпретации memcpy, да даже и приведение типа указателей к другому типу, ничем не менее безопасно чем union-ы. .
Вы о чем вообще?

При чем здесь "безопасно", если в С++ union НЕ может быть использован для реинтерпретации памяти? Такой функциональности у union нет в принципе и никогда не было.

К чему вы привели здесь "приведение типа указателей"? "Приведение типа указателей" НЕ может быть использовано для реинтерпретации памяти вообще нигде - ни в С, ни в С++ (кроме исключения, сделанного для char).

Нет такой функциональности в С++. В С++ для реинтерпретации памяти есть только std::memcpy, std::bit_cast и приведение к char *.

Цитата Сообщение от Curry Посмотреть сообщение
А memcpy ещё и затратно по времени и памяти.
Феерия крепчает прямо на глазах... Это с чего бы это вдруг? Наоборот: memcpy - стандартная, функция, то есть самый оптимальный вариант и по времени, и по памяти.

Цитата Сообщение от Curry Посмотреть сообщение
Пример где, как раз, начальные последовательности разные.

И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.
О чем речь вообще? Покажите мне пальцем, где вы по этой ссылке увидели доступ к неактивному члену union или даже какой-то намек на него?
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
01.11.2024, 22:20
Цитата Сообщение от Curry Посмотреть сообщение
А memcpy ещё и затратно по времени и памяти.
Не-а.
memcpy - это интринсик. И для статических размеров он выраждается в обычный доступ, только оптимизации алиасинга предупреждены.

Цитата Сообщение от Curry Посмотреть сообщение
Пример где, как раз, начальные последовательности разные.
И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.
Это Сишные структуры. Win API оно ж на Си, никакого алиасинга на стороне библиотеки, которая поставляет этот заголовок, естественно не будет. Библиотека на Си.
А в начале темы было сказано, что на Си так можно делать.

Цитата Сообщение от Curry Посмотреть сообщение
Но альтернативы - reinterpret_cast, сырые указатели, ни чем не лучше.
В современном Си++ есть bit_cast и он лучше.

А reinterpret_cast - для type punning - это никакая не альтернатива, а точно такой же некорректный код.

Читайте уже ссылку выше, хватить поддерживать безграмотность!
2
фрилансер
 Аватар для Алексей1153
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
02.11.2024, 06:55
Verevkin, можно верить, а можно не верить в UB. Но в стандарте про это написано, а разработчики компиляторов (лично слышал от одного из них) прямо говорят - оно существует
Выражается это так: сегодня твоя программа работает вроде правильно и кормит тебя. А завтра чуть поменяешь настройки компилятора или обновишь версию/стандарт. Пересобирёшь программу, и там всё станет работать чуточку иначе. Непредсказуемо.

Цитата Сообщение от Curry Посмотреть сообщение
А memcpy ещё и затратно по времени и памяти.
нет, не затратно. Внутри (даже без оптимизации) компилятор не будет вызывать функцию, он сделает прямо вот так: A a=*((A*)&b);, только при этом не будет UB (если, конечно, это POD типы). А человеку так нельзя
0
фрилансер
 Аватар для Алексей1153
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
02.11.2024, 07:20
с оптимизацией -O0

https://godbolt.org/z/jd5a69694



C++
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
#include <iostream>
#include <cstring>
#include <type_traits>
 
struct A
{
    unsigned long int i{};
};
 
struct B
{
    double d{11.22};
};
 
int main()
{
    A a;
    B b;
    
    //так делать нельзя!
    a=*((A*)&b);
    std::cout<<a.i<<'\n';
 
    //а так можно
    static_assert(sizeof a == sizeof b);
    static_assert(std::is_trivially_copyable_v<A>);
    static_assert(std::is_trivially_copyable_v<B>);
    static_assert(std::is_standard_layout_v<A>);
    static_assert(std::is_standard_layout_v<B>);
    std::memcpy(&a, &b, sizeof a);
    std::cout<<a.i<<'\n';
}
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 10:24
Цитата Сообщение от Verevkin Посмотреть сообщение
то я ума не разложу, зачем так сделано? Чтобы было неудобно? Получается, что поля каким-то волшебным образом имеют разное время жизни, которое заранее неизвестно. Зачем?
Чтобы оптимизатор творил всякую дичь.

Фантазийный пример (я не знаю как тут будет на самом деле в данном случае, но почему бы оптимизатору не поступить именно так?)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
union myunion
{
   int a;
   char b;  
};
 
 
int main()
{
    myunion unn;
    unn.a = 6;
    unn.b = 'Z';
    
    //выше мы полю unn.b присвоили константу и далее это поле не используем -
    //тогда ничего не мешает компилятору тут просто вызвать метод с константным параметром 'Z',
    //а в поле unn.b вообще ничего не записывать выше, зачем? всё равно оно ниже не используется
    cout<< "unn.b =  " << unn.b;
 
    //последний раз присваивали значение полю unn.b, а обращаемся к unn.a, что есть UB
    //сильно умный оптимизатор тут вообще может вставить вызов метода с любым случайным константным значением,
    //это ж всё равно UB, можно выводить что хочешь;
    //можно даже в unn.a выше не присваивать 6, т.к. ниже оно не используется
    cout<< "unn.a  =  " << unn.a;
}
Такая вот нынче дикая логика у оптимизаторов...

Причем наверняка можно придумать такую архитектуру (а может таковая даже есть?), где и без оптимизатора вот это вот "наложение байтов в памяти для union", как это было придумано в Си и как это фактически реализовывают в С++ компиляторах на x86 сейчас, фактически будет просто невозможным.
Но у меня не хватает фантазии такое придумать.

PS
Ну вот так мир устроен... какой-то особой глубокой логики в этом нет кроме желания бешенной универсальности от языка не зависимо от платформы. Остаётся лишь принять по стандартной схеме:
1. Отрицание · 2. Злость · 3. Торг · 4. Депрессия · 5. Принятие.
1
Заблокирован
02.11.2024, 12:00
Интересная тема....
А реальная польза?
Примерчик бы кто привёл...
0
 Аватар для sporta1982
213 / 59 / 7
Регистрация: 05.10.2023
Сообщений: 514
02.11.2024, 12:04

Не по теме:


https://habr.com/ru/articles/740056/

Тема неопределённого поведения — большая. Людей, которые очень хорошо понимают все связанные с ним аспекты — в мире достаточно немного. Примеров, как оно может проявляться и использоваться компилятором — десятки.


0
Заблокирован
02.11.2024, 12:16
Всё говорит о том, что бы с union не связываться?
https://ru.stack....flow.com/q... 0%B5-union
0
Модератор
 Аватар для Curry
5160 / 3505 / 536
Регистрация: 01.06.2013
Сообщений: 7,610
Записей в блоге: 9
02.11.2024, 12:23
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
в С++ union НЕ может быть использован для реинтерпретации памяти
На практике он широко для этого используется. Я не буду для доказательства собирать 100500 ссылок на опубликованные коды.
Приведу решённую мной реальную задачу.
Во входном потоке поступают данные в виде разных struct следующих одна за другой. На самом деле существует дополнительная информация для определения границ и типов структур, но для меня она потеряна. Однако имеется возможность угадывать тип структуры по содержимому.
Я сочинил "не могущий быть использованным" юнит
C++
1
2
3
4
5
union SlidingWindow{
   struct1 s1;
   struct2 s2;
   unsigned char bytes[1];
};
Скольжу им вдоль данных и определяю где какая структура, затем извлекаю нужные данные из юниона. Это работает.
А теперь объясните почему я должен реализацию переделать на безюнионную, использовать bit_cast или чтото ещё?
Чем это плохо по сравнению с [указать другой вариант]?
Никакого UB у меня там нет.


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
memcpy - стандартная, функция, то есть самый оптимальный вариант и по времени, и по памяти.
В варианте с union не нужно создавать ещё одну переменную и данные туда копировать, можно данные использовать по месту, сразу в юнионе.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Покажите мне пальцем, где вы по этой ссылке увидели доступ к неактивному члену union
Я не про "неактивный член", а про ваше высказывание
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов.
А насчёт активного члена, то, если компилятор этот "активный член" не контролирует, то нечего про него и говорить.
Есть языки в которых тип может иметь разное содержимое, и какое оно контролируется в компайл и ран-таймах, но там в типе хранится ещё и код варианта, в С++, насколько я в курсе, такие типы пока не завезли, да и неудобны они для реинтерпретации. Но там то можно было бы говорить про "активный член" хотя используют другие термины. А в С++ "активный член" можно обсуждать только как рекомендацию в разработке, не обязательную, кто бы что не говорил.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Выражается это так: сегодня твоя программа работает вроде правильно и кормит тебя. А завтра чуть поменяешь настройки компилятора или обновишь версию/стандарт. Пересобирёшь программу, и там всё станет работать чуточку иначе. Непредсказуемо.
Может быть не нужно обобщать на все случаи использования union?

Цитата Сообщение от Алексей1153 Посмотреть сообщение
с оптимизацией -O0
Вот они лишние 2 машинные команды и лишняя переменная. А в случае union можем работать с данными прямо в union.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 12:25
Цитата Сообщение от Наталья8 Посмотреть сообщение
что бы с union не связываться?
Зависит от целей.
Для "реинтерпретации памяти" - в С++ нелья, ибо UB. В Си можно.
Для задач экономии памяти, когда разработчик очень внимательно следит за руками и очень в этих руках уверен - сколько угодно.
1
Заблокирован
02.11.2024, 12:26

Тоже пишут что то похожее. (Покорректнее правда.)
А как если у меня на компиляторе и си и с++ включено.?..
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 12:30
Цитата Сообщение от Наталья8 Посмотреть сообщение
если у меня на компиляторе и си и с++ включено.?
Чего? можно расшифровать?
0
Заблокирован
02.11.2024, 12:32
Я пишу на смеси си и си++.
Принимает и то и другое.
Где то в настройках наверное можно переключиться на чистое си.
Я пишу вот так...
msvc2015
Понял - UB.. Ну и ладушки...
(Не пользовал я union ни разу...)
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
02.11.2024, 12:41
Цитата Сообщение от Наталья8 Посмотреть сообщение
Я пишу на смеси си и си++.
Принимает и то и другое.
То, что компилируется компилятором C++ - это по правилам С++
То, что компилируется компилятором Си - работает по правилам Си.

Вы разные части программы реально компилируете компиляторами с разными настройками? чета я сомневаюсь.
Наверняка же всё С++ компилятором комплируете и не заморачиваетесь.

А то, что сама параграмма при этом не выходит за рамки синтаксиса Си - так это не важно абсолютно.
0
Заблокирован
02.11.2024, 12:49
Как можно писать на Си в Visual Studio 2015?
Есть такое...

Добавлено через 2 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
Наверняка же всё С++ компилятором комплируете
Ну да...
printf() - это си.
std printf() - это плюсы.
Очень просто.
И так всё до кучи...
0
фрилансер
 Аватар для Алексей1153
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
02.11.2024, 13:21
Цитата Сообщение от Curry Посмотреть сообщение
Скольжу им вдоль данных и определяю где какая структура
это нарушение strict aliasing
Точно так же можно скользить указателем const char*, а вот его уже можно кастить к другому указателю, который можно разыменовать (если в указуемом месте достаточно памяти для размещения целевого типа).
После этого данные копируются std::memcpy

Цитата Сообщение от Curry Посмотреть сообщение
Может быть не нужно обобщать на все случаи использования union?
так я только про реинтерпретацию, а не про все случаи

Цитата Сообщение от Curry Посмотреть сообщение
Вот они лишние 2 машинные команды и лишняя переменная
не очень понял данный комментарий.
Видно, что как раз при "запрещённом" действии три ассемблерные инструкции, а для std::memcpy - две.
Но по содержимому видно, что делается то же самое, только в первом случае компилятор сначала в rax засунул адрес

Опять же, тут отключена оптимизация, поэтому, что будет в реальности - нужно смотреть с оптимизацией. В данном же случае я просто показал, что нет вызова функции даже без оптимизации, это обеспечивается стандартом

Добавлено через 2 минуты
Цитата Сообщение от KSergey9 Посмотреть сообщение
разные части программы реально компилируете компиляторами с разными настройками? чета я сомневаюсь.
в студии по умолчанию так и настроено - ЕТ *.c отдаются компилятору C , а *.cpp - компилятору C++
0
Модератор
 Аватар для Curry
5160 / 3505 / 536
Регистрация: 01.06.2013
Сообщений: 7,610
Записей в блоге: 9
02.11.2024, 14:48
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это нарушение strict aliasing
К чему плохому описанный мной способ приведёт? К нарушению защиты памяти? К извлечению неверных данных?
Нет, не приводит.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Точно так же можно скользить указателем const char*, а вот его уже можно кастить к другому указателю
И чем это лучше? Только кода больше.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
не очень понял данный комментарий.
Я сравниваю memcpy не с операцией присваивания, а с использованием данных прямо в union, они там уже есть, в члене юниона нужного типа. Кому хочется, может теперь считать его активным. В этом случае вообще нет копирования.
0
фрилансер
 Аватар для Алексей1153
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
02.11.2024, 15:04
Цитата Сообщение от Curry Посмотреть сообщение
К чему плохому описанный мной способ приведёт
это приведёт к наличию UB в программе. Если не страшно - на здоровье Но это действительно на свой страх и риск.

Цитата Сообщение от Curry Посмотреть сообщение
И чем это лучше
это лучше тем, что UB отсутствует
0
Модератор
 Аватар для Curry
5160 / 3505 / 536
Регистрация: 01.06.2013
Сообщений: 7,610
Записей в блоге: 9
02.11.2024, 15:50
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это приведёт к наличию UB в программе.
С чего бы?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
02.11.2024, 18:58
Цитата Сообщение от Curry Посмотреть сообщение
На практике он широко для этого используется. Я не буду для доказательства собирать 100500 ссылок на опубликованные коды.
Нет, конечно. Никогда и нигде это не используется. Я бы мог вам долго рассказывать про "100500 уличных овнокодеров", которые по причине некомпетентности могу лабать подобный трэшак, но на само деле это не нужно.

Тут все намного проще: как только в коде появляется такое использование union, этот код уже автоматически не является С++. Это может быть "Вася++ 2.0", это "мегаязык коляна из третьего подъезда" и т.п. замечательные эзотерические языки программирования. Но это не С++.

А здесь - форум по С++.

Цитата Сообщение от Curry Посмотреть сообщение
Приведу решённую мной реальную задачу.
Во входном потоке поступают данные в виде разных struct следующих одна за другой. На самом деле существует дополнительная информация для определения границ и типов структур, но для меня она потеряна. Однако имеется возможность угадывать тип структуры по содержимому.
Я сочинил "не могущий быть использованным" юнит
C++
1
2
3
4
5
union SlidingWindow{
   struct1 s1;
   struct2 s2;
   unsigned char bytes[1];
};
Скольжу им вдоль данных и определяю где какая структура, затем извлекаю нужные данные из юниона. Это работает.
А теперь объясните почему я должен реализацию переделать на безюнионную, использовать bit_cast или чтото ещё?
Чем это плохо по сравнению с [указать другой вариант]?
Никакого UB у меня там нет.
Вы снова, как в случае с ссылкой на сайт MS, стыдливо не привели собственно кода, который работатет c union, а ограничились "словесным описанием". То есть опять совершенно непонятно, о чем вы ведете речь.

Однако что мой дар предвидения мне подсказывает по этому словесному описанию, что вы действительно там "наовнокодили".

Цитата Сообщение от Curry Посмотреть сообщение
Никакого UB у меня там нет.
Вот именно такие заявления свидетельствуют о полной некомпетентности говорящего. О каком "никакого UB у меня там нет", если спецификация языка говорит, что есть? Смех, да и только...

Цитата Сообщение от Curry Посмотреть сообщение
В варианте с union не нужно создавать ещё одну переменную и данные туда копировать, можно данные использовать по месту, сразу в юнионе.
Вот именно для таких ситуаций в членах union делается общая начальная подпоследовательность, которую можно инспектировать для определения фактического состояния (т.е. активного члена) union. Имено для этого она упоминается в спецификации языка. То есть вашу функциональность не обязательно было "овнокодить". Ее можно было сделать правильно.

С, этого, кстати, и начинается банальная компетентность в программирования: со знания того, что как то же самое можно сделать без "овнокодинга".

Цитата Сообщение от Curry Посмотреть сообщение
Я не про "неактивный член", а про ваше высказывание
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Исключение в С++ сделано только для членов union, которые являются структурами с одинаковыми начальными последовательностями объявлений членов. Вот эти общие начальные последовательности можно просматривать, игнорируя соображения текущего активного члена.
Опять не пойму: вы о чем вообще??? Все мои высказывания до сих пор были посвящены теме активного/неактивного члена union. Это высказывание тоже (я специально процитировал его полнее и выделил жирненьким) - именно об этом. Вся тема этому посвящена.

Цитата Сообщение от Curry Посмотреть сообщение
А насчёт активного члена, то, если компилятор этот "активный член" не контролирует, то нечего про него и говорить...
Вам нужно начать изучать основы языка, чтобы вот такого ^^^ в голове не было. Пока что ни о каком программировании на С или С++ с вашей стороны речи идти не может ни в какой форме. Пока не возникло в голове понимания того, что такое UB, все будет вот так вот плохенько...

---

Также в #41 я задал вопрос по поводу вашего:

Цитата Сообщение от Curry Посмотреть сообщение
Пример где, как раз, начальные последовательности разные.

И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных.
Повторяю вопрос:

О каком "MS неправильные" вы ведет речь? Где вы увидели связь вашей ссылки с темой? Что мы должны были увидеть там? Это не риторический вопрос, я хочу видеть подробный ответ.

В сообщении #49 вы снова вывалили сюда пример уже некоего своего union, объявление которого само по себе совершенно ни о чем не говорит, и снова не видно никакого объяснения. Опять непонятно, что вы этим хотели сказать. Что это было???

Вы флудлите форум тоннами какого-то левого текста и ссылками, которые не имеет никакого отношения к теме. Каждый такой флуд вам придется подробно объяснять. Начнем с ссылки на сайт MS. Итак?

(И еще раз: если мой вопрос явно не помечен как риторический, ответ обязателен. Игнорировать заданные мнюю вопросы здесь не принято.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2024, 18:58
Помогаю со студенческими работами здесь

Не так работает Union
Есть функция Union которая вычисляет объединение двух множеств. Значение функции представляет собой список всех выражений, являющихся...

Не работает UNION в SQLite
Добрый день. Есть два стула работающих по отдельности SQL-запроса на выборку: SELECT * FROM t WHERE password='ANY4FvM9n25AsrU262L6' ...

два и более struct в union неправильно работает
#include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;string.h&gt; using namespace std; struct Matematika { char imya; char...

НЕ работает Union с присоединенными через ODBC dbf-ми
Что за фигня с присоединенными через ODBC foxpro26 DBF таблицами: SELECT * FROM T1 UNION ALL SELECT * FROM T2 Говорит ODBC -...

Как обращаться к Union
Создал указатель на структуру Person в 19 строчке. Как обратиться к полю Union'a? Некорректное обращение к union в 30, 34, 38, 49, 56,...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru