Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741

Переменные класса

21.11.2018, 15:11. Показов 5427. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Python 3.6.5
 
# пример 1
class Foo:
    a = 5
    bar = [a]
 
print(Foo.bar)  # [5]
 
 
# пример 2
class Foo:
    bar = [x for x in range(5)]
 
print(Foo.bar)  # [0, 1, 2, 3, 4]
 
 
# пример 3
class Foo:
    a = 5
    bar = [a for x in range(5)]
 
# NameError: name 'a' is not defined
Почему в последнем случае выводится ошибка, что переменная не определена, хотя в первом случае все прекрасно работало?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2018, 15:11
Ответы с готовыми решениями:

Переменные класса и Python3
Появилась проблема при переносе кода проекта на 3й питон. Вкратце, вот такая: class TestMe: CONSTANT = (('1', 'One'), ('2', 'Two'),...

Переменные вне класса (asterisk agi)
Всем привет! Только начал изучать питон и не успел ознакомиться с ООП, как тут-же зашел в тупик) Стоит питон 2.7 с модулем pyagi для...

Переменные в методе класса
При использовании аргумента параметра restaurant_name и cuisine_type в функции describe_restaurant() почему нельзя использовать параметры...

20
21.11.2018, 16:49

Не по теме:

ошибся

0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
21.11.2018, 17:20
Лучший ответ Сообщение было отмечено vrm2 как решение

Решение

list comprehension компилируется в функцию, т.е. это как бы обычная функция со свей областью видимости. Штука в том, что тело класса - не создает или не является замыканием для вложенных функций, т.е. как Вам хорошо известно, любые переменные, объявленные в теле класса невидимы внутри методов (и вложенных функций).
3
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.11.2018, 17:35
Цитата Сообщение от shsv Посмотреть сообщение
компилируется в функцию
Что-то типа этого (но только в байткоде)?
Python
1
2
3
4
5
6
7
8
class Foo2:
    a = 5
    def f():
        tmp = []
        for x in range(5):  
            tmp.append(a)
        return tmp        
    bar = f()
Code
1
NameError: name 'a' is not defined
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
21.11.2018, 17:45
Да.

dis

Python
1
2
import dis
dis.dis(compile("(a for a in range(5))", '', 'exec'))
Code
1
2
3
4
5
6
7
8
9
10
11
1           0 LOAD_CONST               0 (<code object <genexpr> at 0x01B8BC00, file "", line 1>)
              3 LOAD_CONST               1 ('<genexpr>')
              6 MAKE_FUNCTION            0
              9 LOAD_NAME                0 (range)
             12 LOAD_CONST               2 (3)
             15 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             18 GET_ITER
             19 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             22 POP_TOP
             23 LOAD_CONST               3 (None)
             26 RETURN_VALUE
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.11.2018, 17:53
shsv,
Я так делал (весь код Foo) и dis мне показал
Code
1
13 CALL_FUNCTION            2 (2 positional, 0 keyword pair)
Но я не понял - какие 2 поз. аргумента имеются ввиду. И можно ли само тело функции вытащить на обозрение?
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
21.11.2018, 17:55
Можно ещё глянуть что-то типа
Python
1
dis.dis(compile("(a for a in range(5))", '', 'exec').co_consts[0])
но нужды особой нет, там действительно по сути просто цикл
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
21.11.2018, 17:55  [ТС]
Цитата Сообщение от shsv Посмотреть сообщение
list comprehension компилируется в функцию, т.е. это как бы обычная функция со свей областью видимости. Штука в том, что тело класса - не создает или не является замыканием для вложенных функций, т.е. как Вам хорошо известно, любые переменные, объявленные в теле класса невидимы внутри методов (и вложенных функций).
А почему срабатывают такие варианты:

Python
1
2
3
4
5
6
7
class Foo:
    xs = range(5)
    bar = [x for x in xs]
 
class Foo:
    xs = range(5)
    bar = [xs for x in xs]
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
21.11.2018, 18:01
Garry Galler, а что именно передаете dis, если скормить просто Foo, должен вывести тело метода.

vrm2, а оно и не срабатывает.
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
21.11.2018, 18:23  [ТС]
Цитата Сообщение от shsv Посмотреть сообщение
vrm2, а оно и не срабатывает.
Вот этот срабатывает:

Python
1
2
3
4
5
class Foo:
    xs = range(5)
    bar = [x for x in xs]
 
Foo.bar  # [0, 1, 2, 3, 4]
Другой, действительно, выдает ошибку
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.11.2018, 18:32
shsv,
Просто строку передаю:
Python
1
2
3
4
5
6
f2 = '''class Foo2:
    a = 5
    bar = [a for x in range(5)] 
'''    
 
dis.dis(f1)
Получаю:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
 1           0 LOAD_BUILD_CLASS
             1 LOAD_CONST               0 (<code object Foo2 at 0x00C9EF70, file "<dis>", line 1>)
             4 LOAD_CONST               1 ('Foo2')
             7 MAKE_FUNCTION            0
            10 LOAD_CONST               1 ('Foo2')
            13 CALL_FUNCTION            2 (2 positional, 0 keyword pair)
            16 STORE_NAME               0 (Foo2)
            19 LOAD_CONST               2 (None)
            22 RETURN_VALUE
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
21.11.2018, 18:47  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Просто строку передаю:
dis.dis(f1) - наверное надо передавать f2?
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
21.11.2018, 19:32
Если глянуть на вывод dis, можно заметить, что выражение после in вычисляется до того как будет вызвана новосозданная функция '<listcomp>', результат этого выражения запихивается на макушку стека, и затем передается в качестве позиционного аргумента функции '<listcomp>'.

Т.е. на примере Garry Galler

Python
1
2
3
4
5
def f(iterable):
    tmp = []
    for x in iterable:  
        tmp.append(a)
    return tmp
Garry Galler, данный dis отностится к LOAD_BUILD_CLASS, т.е. к созданию (тела) класса, функция которая вызывается с двумя параметрами - это __build_class__ (она кстати вполне доступна как builtins.__build_class__)
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.11.2018, 19:35
Цитата Сообщение от vrm2 Посмотреть сообщение
наверное надо передавать f2?
Передается и f2 и f1. Это я на форуме опечатался.

Добавлено через 1 минуту
Цитата Сообщение от shsv Посмотреть сообщение
данный dis отностится к LOAD_BUILD_CLASS,
Теперь понял. Спасибо за пояснение.
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
21.11.2018, 20:14  [ТС]
Сделал сравнение
Python
1
2
3
4
5
6
7
8
9
# работает
class Foo:
        xs = [1,2,3]
        bar = [x for x in xs]
 
# выдает ошибку
class Foo:
    xs = [1,2,3]
    bar = [xs for x in xs]
Вот что я сделал, чтобы увидеть байткод:
Python
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
from dis import dis
 
def print_vars(vs):
    for index, v in enumerate(vs):
        print(index, ':', v)
    
def print_code(code, code_name):
    print('===========')
    print('===', code_name)
    print('===========')
    print('bytecode:')
    dis(code)
    print()
    print('varnames:')
    print_vars(code.co_varnames)
    print()
    print('consts:')
    print_vars(code.co_consts)
    print()
    
def print_gen_foo_bytecode(fun):
    code1 = fun.__code__ # code object of gen_foo
    print_code(code1, 'gen_foo')
 
    code2 = code1.co_consts[1]  # code object of Foo
    print_code(code2, 'Foo')
 
    code3 = code2.co_consts[4] # code object of list comprehension
    print_code(code3, 'list comprehension')
Первый вариант (рабочий):
Python
1
2
3
4
5
6
def gen_foo_1():
    class Foo:
        xs = [1,2,3]
        bar = [x for x in xs]
 
print_gen_foo_bytecode(gen_foo_1)
Результат:
Кликните здесь для просмотра всего текста

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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
===========
=== gen_foo
===========
bytecode:
  2           0 LOAD_BUILD_CLASS
              2 LOAD_CONST               1 (<code object Foo at 0x7f232433a420, file "<ipython-input-100-8a1a18ceece8>", line 2>)
              4 LOAD_CONST               2 ('Foo')
              6 MAKE_FUNCTION            0
              8 LOAD_CONST               2 ('Foo')
             10 CALL_FUNCTION            2
             12 STORE_FAST               0 (Foo)
             14 LOAD_CONST               0 (None)
             16 RETURN_VALUE
 
varnames:
0 : Foo
 
consts:
0 : None
1 : <code object Foo at 0x7f232433a420, file "<ipython-input-100-8a1a18ceece8>", line 2>
2 : Foo
 
===========
=== Foo
===========
bytecode:
  2           0 LOAD_NAME                0 (__name__)
              2 STORE_NAME               1 (__module__)
              4 LOAD_CONST               0 ('gen_foo_1.<locals>.Foo')
              6 STORE_NAME               2 (__qualname__)
 
  3           8 LOAD_CONST               1 (1)
             10 LOAD_CONST               2 (2)
             12 LOAD_CONST               3 (3)
             14 BUILD_LIST               3
             16 STORE_NAME               3 (xs)
 
  4          18 LOAD_CONST               4 (<code object <listcomp> at 0x7f2324325f60, file "<ipython-input-100-8a1a18ceece8>", line 4>)
             20 LOAD_CONST               5 ('gen_foo_1.<locals>.Foo.<listcomp>')
             22 MAKE_FUNCTION            0
             24 LOAD_NAME                3 (xs)
             26 GET_ITER
             28 CALL_FUNCTION            1
             30 STORE_NAME               4 (bar)
             32 LOAD_CONST               6 (None)
             34 RETURN_VALUE
 
varnames:
 
consts:
0 : gen_foo_1.<locals>.Foo
1 : 1
2 : 2
3 : 3
4 : <code object <listcomp> at 0x7f2324325f60, file "<ipython-input-100-8a1a18ceece8>", line 4>
5 : gen_foo_1.<locals>.Foo.<listcomp>
6 : None
 
===========
=== list comprehension
===========
bytecode:
  4           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (x)
              8 LOAD_FAST                1 (x)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE
 
varnames:
0 : .0
1 : x
 
consts:



Первый вариант (НЕ рабочий):
Python
1
2
3
4
5
6
def gen_foo_2():
    class Foo:
        xs = [1,2,3]
        bar = [xs for x in xs]
 
print_gen_foo_bytecode(gen_foo_2)
Результат:
Кликните здесь для просмотра всего текста

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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
===========
=== gen_foo
===========
bytecode:
  7           0 LOAD_BUILD_CLASS
              2 LOAD_CONST               1 (<code object Foo at 0x7f23243dab70, file "<ipython-input-100-8a1a18ceece8>", line 7>)
              4 LOAD_CONST               2 ('Foo')
              6 MAKE_FUNCTION            0
              8 LOAD_CONST               2 ('Foo')
             10 CALL_FUNCTION            2
             12 STORE_FAST               0 (Foo)
             14 LOAD_CONST               0 (None)
             16 RETURN_VALUE
 
varnames:
0 : Foo
 
consts:
0 : None
1 : <code object Foo at 0x7f23243dab70, file "<ipython-input-100-8a1a18ceece8>", line 7>
2 : Foo
 
===========
=== Foo
===========
bytecode:
  7           0 LOAD_NAME                0 (__name__)
              2 STORE_NAME               1 (__module__)
              4 LOAD_CONST               0 ('gen_foo_2.<locals>.Foo')
              6 STORE_NAME               2 (__qualname__)
 
  8           8 LOAD_CONST               1 (1)
             10 LOAD_CONST               2 (2)
             12 LOAD_CONST               3 (3)
             14 BUILD_LIST               3
             16 STORE_NAME               3 (xs)
 
  9          18 LOAD_CONST               4 (<code object <listcomp> at 0x7f2324325030, file "<ipython-input-100-8a1a18ceece8>", line 9>)
             20 LOAD_CONST               5 ('gen_foo_2.<locals>.Foo.<listcomp>')
             22 MAKE_FUNCTION            0
             24 LOAD_NAME                3 (xs)
             26 GET_ITER
             28 CALL_FUNCTION            1
             30 STORE_NAME               4 (bar)
             32 LOAD_CONST               6 (None)
             34 RETURN_VALUE
 
varnames:
 
consts:
0 : gen_foo_2.<locals>.Foo
1 : 1
2 : 2
3 : 3
4 : <code object <listcomp> at 0x7f2324325030, file "<ipython-input-100-8a1a18ceece8>", line 9>
5 : gen_foo_2.<locals>.Foo.<listcomp>
6 : None
 
===========
=== list comprehension
===========
bytecode:
  9           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (x)
              8 LOAD_GLOBAL              0 (xs)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE
 
varnames:
0 : .0
1 : x
 
consts:


Отличаются только строчки
LOAD_FAST (x) - в рабочем варианте
LOAD_GLOBAL (xs) - в нерабочем варианте

Добавлено через 51 секунду
Что в данном случае является глобальными переменными для list comprehension?

Добавлено через 32 секунды
Т.е. где питон ищет xs?

Добавлено через 3 минуты
Для нерабочей версии интересен следующий момент:
- в правой части for для загрузки переменной используется LOAD_NAME (xs)
- в левой части for используется LOAD_GLOBAL (xs)

Разве это справедливо?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.11.2018, 20:36
vrm2,
Я так понял (из пояснений shsv) выражение справа от in уже вычислено до того, как создана и вызвана сам функция
list comprehension<listcomp>. И поэтому в вашем рабочем варианте это вычисленное значение просто передается в функцию как аргумент и никакой связи с именем xs не требуется.
А во вторым случае делается попытка загрузить в левую часть выражения именно xs с глобального уровня, но не выходит, так как xs не объявлена как global. Если объявить - то все ОК.
1
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
21.11.2018, 22:06  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
А во вторым случае делается попытка загрузить в левую часть выражения именно xs с глобального уровня, но не выходит, так как xs не объявлена как global. Если объявить - то все ОК.
Я понял, почему это происходит. Но зачем так сделано? Это не логично!

Я до сегодняшнего дня не разделял области видимости слева и справа от for в генераторах списках. А оно вон как ...

Считаю, что в генераторах в любом месте должна быть возможность использовать все переменные, находящиеся в области видимости. Не должны выражения в генераторах ничем отличаться от обычных выражений.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
21.11.2018, 23:19
Лучший ответ Сообщение было отмечено vrm2 как решение

Решение

vrm2,
Вычисление выражения до его использования - обычная оптимизация.
Тут вся разница в том как создается функция и как создается класс.
Python
1
2
3
4
5
6
7
8
9
10
11
def test():    
    xs = [1,2,3]
    
    def f(it):
        tmp = []
        for x in it:  
            tmp.append(xs)
        return tmp        
    
    bar = f([1,2,3])
    print(bar)
Здесь xs оказывается в области видимости вложенной функции, так как при вызове внешней функции образуется замыкание, поэтому внутренней функции доступен скоуп внешней функции.

Но стоит заменить определение верхней функции на class и все начинает работать по другому.
Python
1
2
3
4
5
6
7
8
9
10
11
class test2():    
    xs = [1,2,3]
    
    def f(it):
        tmp = []
        for x in it:  
            tmp.append(xs)
        return tmp        
    
    bar = f([1,2,3])
    print(bar)
При вводе определения класса создаётся новое пространство имён, которое и используется в качестве локальной области видимости. Таким образом, все присваивания локальным переменным происходят в этом новом пространстве имён.
Так как определение класса выполняется немедленно при компиляции кода, то скоуп класса и скоуп внутренней функции (в которую преобразуется list comprehension) оказываются на разных "этажах". И внутренняя функция просто не знает, где искать переменную xs, поскольку класс еще не создан окончательно. Если бы мы сказали - "эй, функция, это же global переменная, иди наверх" - тогда ошибки не будет.
И далее по книжке Дрейка:
При успешном окончании парсинга определения класса (по достижении конца определения), создаётся объект-класс (class object)....Оригинальная локальная область видимости (та, которая действовала в последний момент перед вводом определения класса) восстанавливается,
В общем, как-то так мне все это видится...
1
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
21.11.2018, 23:59  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Но стоит заменить определение верхней функции на class и все начинает работать по другому.
Собственно, вот этот момент мне и не нравится.

А почему почему работает именно так, я разобрался, спасибо shsv и Garry Galler.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.11.2018, 01:54
В общем вот некий окончательный итог, который я нарыл из одной статьи на хабре.

1) Области видимости, вложенные внутрь определения класса, игнорируют имена, привязанные к уровню класса. В обоих версиях Python.

Зачем так нужно - не знаю. Создателям виднее.

2) Генерирующее выражение (i for i in range(10)) имело собственную область видимости уже в Python 2.

Зачем нужно? Думаю, для изоляции от случайного изменения значения одноименных переменных, объявленных выше по коду.
(N.B. Обычный цикл for все еще не имеет своей собственной области видимости для переменной цикла, что, на мой взгляд, очень плохо.)

3) Начиная с Python 3 генераторы списков (list comprehensions) тоже имеют свои области видимости.

Думаю, ввели для консистентности с генераторными выражениями. Либо что-то поменялось в реализации list comprehensions.
То есть внутренняя переменная i в [x for i in range(10)] более недоступна за пределами выражения list comprehensions,
а переменная x (вследствие пункта 1) будет искаться исключительно в глобальном скоупе (если list comprehensions находится в области определения класса), игнорируя scope класса, либо,
просто в вышестоящем scope, если выражение находится внутри функции.
Пока у list comprehensions не было своего приватного скоупа - имя x могло браться с локальной области видимости класса,
который был у list comprehensions общим со вмещающим классом.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x = 10
class SomeClass:
    x = 17
    y = [x for i in range(10)]
    print(y)
 
#В Python 2:  [17, 17, 17, 17, 17, 17, 17, 17, 17, 17]
#В Python 3:  [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
 
 
x = 10
class SomeClass:
    x = 17
    y = (x for i in range(10))
    print(list(y))
 
#В Python 2:  [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
#В Python 3:  [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2018, 01:54
Помогаю со студенческими работами здесь

Не выводятся переменные класса
class User(): def __init__ (self,first_name,last_name,surname): self.first_name = first_name self.last_name = last_name ...

Класс: Как правильно создавать переменные класса?
Пытаюсь визуализировать граф, по клику мыши создается вершина, но возникает ошибка. В классе графа список listTop не инициализирован, а...

Как сделать вывод функции в другие переменные вне класса?
Мне нужен вывод функций on_pushButton_pressed и on_pushButton_pressed2 в другие переменные, допустим после функции retranslateUi я пишу d =...

Имеется выражение, левая часть - переменные, а правая- значения, которые будут записаны в эти переменные
Имеется выражение, левая часть - переменные, а правая- значения, которые будут записаны в эти переменные. Переменные существуют двух типов:...

Переменные экземпляра, класса, константы и переменные readonly
Как эту задачу записать в C#? Переменные экземпляра, класса, константы и переменные readonly: – Ф.И.О., – должность, – базовый...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru