Форум программистов, компьютерный форум, киберфорум
1С Битрикс
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/32: Рейтинг темы: голосов - 32, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 12.10.2022
Сообщений: 6

Не работет CCatalogProduct::Update в обработчике

12.10.2022, 06:17. Показов 7115. Ответов 10

Студворк — интернет-сервис помощи студентам
Написал вот такой обработчик, который берёт вес из свойств торгового предложения и подставляет в параметр торгового каталога

PHP
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
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", "CustomWeight");
function CustomWeight(&$arFields)
{
  if($arFields["IBLOCK_ID"]=="39")
  {
    \Bitrix\Main\Loader::includeModule('iblock');
    $PRODUCT_ID = $arFields["ID"];
    $addProps = CIBlockElement::GetList (
      Array("ID" => "ASC"),
      Array("IBLOCK_ID" => 39, "ID" => $PRODUCT_ID),
      false,
      false,
    Array(
      'ID',
      'PROPERTY_VES',
    )
    );
 
    while($ar_fields = $addProps->GetNext())
    {
      Cmodule::IncludeModule('catalog');
      $arFieldsCustom = array(
      'WEIGHT' => $ar_fields['PROPERTY_VES_VALUE'] * 1000,
      );
      CCatalogProduct::Update($PRODUCT_ID, $arFieldsCustom);
    };
  }
}
Не работает строчка "CCatalogProduct::Update($PRODUCT_ID , $arFieldsCustom);" именно в файле init.php. Проверял в лог-файле, выводил $arFieldsCustom, нужный вес встаёт в массив при обновлении любого торгового предложения.

Пробовал скрипт, который находится в if, в командной строке, естественно подставлял в $PRODUCT_ID id торгового предложения, скрипт работал.

Мне подсказали такое решение https://dev.1c-bitrix.ru/commu... obloka.php

Написал в /local/php_interface/iblock_element_edit_before_save.php:

PHP
1
2
3
function BXIBlockAfterSave($arFields) {
   CustomWeight($arFields);
}
Добавил путь до файла в "Файл для редактирования элемента, позволяющий модифицировать поля перед сохранением".

Не сработало. Что-то не так сделал?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2022, 06:17
Ответы с готовыми решениями:

Ошибка: Query-based update failed because the row to update could not be found
Narod, kto-nibud' stalkivalsia s takoi problemoi: is VB connect to mySQL db, rs.Open 'SELECT * FROM <tablename> WHERE <columnname> =...

DataGrid update ПРОБЛЕМА: Key column information is insufficient or incorect. Too many rows were affected by update
Привет всем ! В Вижуал Басик6 на форме имею ДатаГрид с информацией из Аксцессс 2000. Соединение - АДО. Пропертями усе установленно...

Не получается сделать Update (Update requires a valid InsertCommand)
Не получается сделать Update выдаёт ошибку, что делаю не так? В таблице только одно поле, оно строковое. public void...

10
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,444
Записей в блоге: 2
13.10.2022, 09:40
Суть в том, что у вас не правильно выбрано событие под задачу. Если утрировано сейчас происходит следующая последовательность
1 Выполняется ваша функция
2 выполняется обновление элемента инфоблока (данными из формы)
3 выполняется обновление товара (данными из формы)

Таким образом работа вашего метода сразу же перезаписывается данными формы.

И тут надо понять что вы хотите в итоге. Как я понимаю ваша цель при изменении значения в VES менять значения веса товара по заданной формуле.

Таким образом я бы предложил использовать событие OnAfterIBlockElementUpdate и событие обновления продукта. (т.к. могут быть разные сценарии изменения свойства)

Так же дополнительно (примечания не приводящие к ошибке но полезно знать) имейте ввиду что в arFields есть значение VES (если оно менялось). единственная сложность она там в зависимости от ситуации в массиве либо с индексом VES либо с ID этого свойства (сбросьте в лог файл $arFields и найдете) - т.е можно избежать лишнего запроса.

Подключаете модуль catalog в цикле (да он выполняется в данном случае один раз, но тем не менее) и устаревшей функцией (посмотрите как подключается iblock)

Так же метод CCatalogProduct::Update($PRODUCT_ID, $arFieldsCustom); объявлен устаревшим и однажды в обозримом будущем с обновлением битрикс он перестанет работать.


Кроме того советую не засорять init.php в т.ч. и инклудами безусловными. Лучше использовать классы и автозагрузку.


Сейчас нет времени накидать пример. Если не разберетесь сами пишите - по возможности помогу
0
0 / 0 / 0
Регистрация: 12.10.2022
Сообщений: 6
13.10.2022, 10:26  [ТС]
В $arFields нет доступа к Торговый каталог -> Параметры -> Вес и размеры.

В каждом торговом предложении есть свойство Вес, который заполнялся в 1С. В корзине и в оформлении заказа вес берётся из параметра торгового каталога каждого торгового предложения. Для подсчёта доставки также берётся из параметров.

Мне нужно взять вес из свойства и засунуть в вес из параметра. Чтобы потом автоматически при выгрузке товаров из 1С все веса встали в параметры, и по итогу корзина и оформление заказа показывали правильный вес.

На всякий случай прикладываю фото, тут взят товар, зашёл в торговое предложение, показано его свойство вес элемента и его параметр вес торгового каталога.

Я вот перепробовал всё, пытался поменять код в class.php в корзине и в оформлении заказа(во втором не было этого файла), потом решил через обработчик делать и нашёл только CCatalogProduct::Update, который поменял вес в параметре через код командной строки.

Как добраться до этого параметра, может быть есть другие способы, чтобы поместить вес туда куда надо?
Миниатюры
Не работет CCatalogProduct::Update в обработчике   Не работет CCatalogProduct::Update в обработчике  
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,444
Записей в блоге: 2
13.10.2022, 12:20
Цитата Сообщение от Daniil Melnikov Посмотреть сообщение
В $arFields нет доступа к Торговый каталог -> Параметры -> Вес и размеры.
Там доступ к VES

Добавлено через 1 минуту
Направление мыслей у вас в исходном коде верное. Но не верно выбраны обработчики событий - я вам сказал какие искать... Позже постараюсь накидать пример (у меня сейчас со временем очень сложно)

Добавлено через 1 час 32 минуты
Чтобы не замусоривать init.php и не инклудить вечно лишние файлы без надобности. Рекомендую выносить обработчики в классы и использовать автозагрузку. В примерах ниеже "MyProject" это имя проекта. Например, для этого форума у меня бы было "Cyberforum". Так же обратите внимание нужен обработчик именно OnAfterIBlockElementUpdtae. т.к. в вашем примере вы. по сути, берете старой значение VES.

Файл класса /local/MyProject/Handlers/ProductNormalizer.php
PHP
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
namespace MyProject\Handlers;
 
class ProductNormalizer
{
    public const CATALOG_IBLOCK_ID = 39;
    public const PROPERTY_CODE = 'VES';
 
    private static array $cacheWeight = [];
 
    
    public static function onAfterIBlockElementUpdate(array &$arFields)
    {
        if (self::CATALOG_IBLOCK_ID === (int)$arFields["IBLOCK_ID"]) {
            \Bitrix\Main\Loader::includeModule('catalog');
            $productId = (int)$arFields["ID"];
// здесь можно оптимизировать. При изменениях значение VES есть в массиве $arFields, 
// т.е. в этом случае можно избавиться от запроса в базу
            $weight = self::calcWeight($productId);
            if ($weight === 0) {
                return;
            }
            \Bitrix\Catalog\Model\Product::update($productId, ['WEIGHT' => $weight]);
        }
    }
 
    /**
     * расчет веса с кешированием, чтобы на одном запрсое не пересчитывало много раз  
     */
    private static function calcWeight(int $productId)
    {
        if (!array_key_exists($productId,self::$cacheWeight)) {
            $iterator = CIBlockElement::GetProperty(
                self::CATALOG_IBLOCK_ID,
                $productId,
                ["sort" => "asc"],
                ["CODE" => self::PROPERTY_CODE]
            );
            $props = $iterator->Fetch();
            if (!$props) {
                return 0;
            }
            self::$cacheWeight[$productId] = $props['VALUE'] * 1000;
        }
        return self::$cacheWeight[$productId];
    }
 
    public static function onBeforeProductUpdate(\Bitrix\Main\Event $event)
    {
        $productId = (int)$event->getParameter('ID');
        $result = new Bitrix\Main\ORM\EventResult();
        $modifiedFields = ['fields' => ['WEIGHT' => self::calcWeight($productId)]];
        $result->modifyFields($modifiedFields);
        $event->addResult($result);
    }
}
Подключение в init.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
use Bitrix\Main\EventManager;
use MyProject\Handlers\ProductNormalizer;
 
// Регистрируем класс в автозагрузке
Bitrix\Main\Loader::registerAutoLoadClasses(null, [
    ProductNormalizer::class => '/local/MyProject/Handlers/ProductNormalizer.php',
]);
 
// Регистрируем обработчики событий
$eventManager = EventManager::getInstance();
$eventManager->addEventHandler("iblock", 'OnAfterIBlockElementUpdate', [ProductNormalizer::class, 'onAfterIBlockElementUpdate']);
$eventManager->addEventHandler('catalog', 'Bitrix\Catalog\Model\Product::OnBeforeUpdate', [ProductNormalizer::class, 'onBeforeProductUpdate']);
0
0 / 0 / 0
Регистрация: 12.10.2022
Сообщений: 6
24.10.2022, 10:23  [ТС]
Спасибо за ответ, просто скопировал и вставил так, как и у вас, но при обновлении торгового предложения идёт бесконечная загрузка
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,444
Записей в блоге: 2
24.10.2022, 10:29
Проверьте не вызывает ли это (вызов при сохранении элемента ИБ обновления товра, а соответственно и вызывается метод н а его обновление) цикличности.
Вероятно лучше сделать у класса некое статическое свойство, которое будет являться флагом, чтобы не зацикливалось.
0
0 / 0 / 0
Регистрация: 12.10.2022
Сообщений: 6
24.10.2022, 13:42  [ТС]
Добавил свойство:
PHP
1
protected static $handlerDisallow = false;
Также вставил вот такую проверку в каждый обработчик в начало функции:
PHP
1
2
3
4
if (self::$handlerDisallow) {
    return;
}
self::$handlerDisallow = true;
Также бесконечная загрузка, не помогло

Проверил функцию calcWeight, он не отрабатывает. То есть засунул в функцию:
PHP
1
AddMessage2Log('Вес *1000');
но в логе нет записи
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,444
Записей в блоге: 2
25.10.2022, 08:01
Хм... странно
Поставьте и в начало обработчика вывод в лог - посмотреть как они вообще вызываются.
0
0 / 0 / 0
Регистрация: 12.10.2022
Сообщений: 6
25.10.2022, 09:25  [ТС]
Программа стопорится на:
PHP
1
2
3
4
5
6
$iterator = CIBlockElement::GetProperty(
                self::CATALOG_IBLOCK_ID,
                $productId,
                ["sort" => "asc"],
                ["CODE" => self::PROPERTY_CODE]
            );
После него поставил вывод в лог, но дальше код не двинулся. Проверил в командной строке, он работал.
Написал тоже самое, что и в моём было вместо GetProperty, GetList:
PHP
1
2
3
4
5
6
7
8
9
10
11
\Bitrix\Main\Loader::includeModule('iblock');
$iterator = CIBlockElement::GetList (
    Array("ID" => "ASC"),
    Array("IBLOCK_ID" => self::CATALOG_IBLOCK_ID, "ID" => $productId),
    false,
    false,
    Array(
        'ID',
        'PROPERTY_' . self::PROPERTY_CODE,  // Вес
        )
);
Тоже не работает.

Я решил сделать через arFields, вот весь код, он не зацикливается, вызывается пару раз onBeforeProductUpdate, но из-за флага запрещает запускаться:
Вес в параметре не изменяется. Вроде UPDATE в onAfterIBlockElementUpdate сработал, но ничего не изменилось((

PHP
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
namespace MyProject\Handlers;
 
class ProductNormalizer
{
    public const CATALOG_IBLOCK_ID = 39;
    public const PROPERTY_CODE = 'VES';
    protected static $handlerDisallow = false;
 
    private static array $cacheWeight = [];
 
    
    public static function onAfterIBlockElementUpdate(array &$arFields)
    {
        AddMessage2Log('onAfterIBlockElementUpdate');
        if (self::$handlerDisallow) {
           return;
        }
        self::$handlerDisallow = true;
        if (self::CATALOG_IBLOCK_ID === (int)$arFields["IBLOCK_ID"]) {
            \Bitrix\Main\Loader::includeModule('catalog');
            // Для теста использую один товар
            $productId = 8808;
            $weight = self::calcWeight($arFields, $productId);
            if ($weight === 0) {
                return;
            }
            \Bitrix\Catalog\Model\Product::update($productId, ['WEIGHT' => $weight]);
            AddMessage2Log('Вес update в onAfterIBlockElementUpdate');
        }
    }
 
    private static function calcWeight($arFields, int $productId)
    {
        if (!array_key_exists($productId, self::$cacheWeight)) {
//Ничего лучше не придумал, перебором ищу Вес в arFields
            $propArray = $arFields['PROPERTY_VALUES'][614];
            foreach ($propArray as $key => $val) {
                if ($val['DESCRIPTION'] == 'Вес') {
                    $weightProps = $val['VALUE'];
                    break;
                }
            }
            
            if (!$weightProps) {
                return 0;
            }
            self::$cacheWeight[$productId] = $weightProps * 1000;
        }
        AddMessage2Log(self::$cacheWeight[$productId]);
        return self::$cacheWeight[$productId];
    }
 
    public static function onBeforeProductUpdate(\Bitrix\Main\Event $event)
    {
        AddMessage2Log('onBeforeProductUpdate');
        if (self::$handlerDisallow) {
           return;
        }
        self::$handlerDisallow = true;
        $productId = (int)$event->getParameter('ID');
        $result = new Bitrix\Main\ORM\EventResult();
        $modifiedFields = ['fields' => ['WEIGHT' => self::calcWeight($productId)]];
        $result->modifyFields($modifiedFields);
        $event->addResult($result);
        AddMessage2Log('Вес addResult  в onBeforeProductUpdate');
    }
}
Я оставил в коде AddMessage2Log, чтобы можно было сопоставить с логом ниже:

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
77
78
79
80
81
82
83
84
85
86
Host: elley.ru:443
Date: 2022-10-25 09:13:30
onAfterIBlockElementUpdate
#0: MyProject\Handlers\ProductNormalizer::onAfterIBlockElementUpdate
    /home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#1: ExecuteModuleEventEx
    /home/bitrix/www/bitrix/modules/iblock/classes/mysql/iblockelement.php:1778
#2: CIBlockElement->Update
    /home/bitrix/www/bitrix/modules/iblock/admin/iblock_subelement_edit.php:849
#3: require(string)
    /home/bitrix/www/bitrix/admin/iblock_subelement_edit.php:1
----------
Host: elley.ru:443
Date: 2022-10-25 09:13:30
1300.0
#0: MyProject\Handlers\ProductNormalizer::calcWeight
    /home/bitrix/www/local/MyProject/Handlers/ProductNormalizer.php:26
#1: MyProject\Handlers\ProductNormalizer::onAfterIBlockElementUpdate
    /home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#2: ExecuteModuleEventEx
    /home/bitrix/www/bitrix/modules/iblock/classes/mysql/iblockelement.php:1778
#3: CIBlockElement->Update
    /home/bitrix/www/bitrix/modules/iblock/admin/iblock_subelement_edit.php:849
#4: require(string)
    /home/bitrix/www/bitrix/admin/iblock_subelement_edit.php:1
----------
Host: elley.ru:443
Date: 2022-10-25 09:13:30
onBeforeProductUpdate
#0: MyProject\Handlers\ProductNormalizer::onBeforeProductUpdate
    
#1: call_user_func_array
    /home/bitrix/www/bitrix/modules/main/lib/eventmanager.php:443
#2: Bitrix\Main\EventManager->sendToEventHandler
    /home/bitrix/www/bitrix/modules/main/lib/eventmanager.php:379
#3: Bitrix\Main\EventManager->send
    /home/bitrix/www/bitrix/modules/main/lib/event.php:142
#4: Bitrix\Main\Event->send
    /home/bitrix/www/bitrix/modules/catalog/lib/model/entity.php:249
#5: Bitrix\Catalog\Model\Entity::update
    /home/bitrix/www/local/MyProject/Handlers/ProductNormalizer.php:30
----------
Host: elley.ru:443
Date: 2022-10-25 09:13:30
Вес update в onAfterIBlockElementUpdate
#0: MyProject\Handlers\ProductNormalizer::onAfterIBlockElementUpdate
    /home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#1: ExecuteModuleEventEx
    /home/bitrix/www/bitrix/modules/iblock/classes/mysql/iblockelement.php:1778
#2: CIBlockElement->Update
    /home/bitrix/www/bitrix/modules/iblock/admin/iblock_subelement_edit.php:849
#3: require(string)
    /home/bitrix/www/bitrix/admin/iblock_subelement_edit.php:1
----------
Host: elley.ru:443
Date: 2022-10-25 09:13:30
onBeforeProductUpdate
#0: MyProject\Handlers\ProductNormalizer::onBeforeProductUpdate
    
#1: call_user_func_array
    /home/bitrix/www/bitrix/modules/main/lib/eventmanager.php:443
#2: Bitrix\Main\EventManager->sendToEventHandler
    /home/bitrix/www/bitrix/modules/main/lib/eventmanager.php:379
#3: Bitrix\Main\EventManager->send
    /home/bitrix/www/bitrix/modules/main/lib/event.php:142
#4: Bitrix\Main\Event->send
    /home/bitrix/www/bitrix/modules/catalog/lib/model/entity.php:249
#5: Bitrix\Catalog\Model\Entity::update
    /home/bitrix/www/bitrix/modules/catalog/general/product.php:525
----------
Host: elley.ru:443
Date: 2022-10-25 09:13:30
onBeforeProductUpdate
#0: MyProject\Handlers\ProductNormalizer::onBeforeProductUpdate
    
#1: call_user_func_array
    /home/bitrix/www/bitrix/modules/main/lib/eventmanager.php:443
#2: Bitrix\Main\EventManager->sendToEventHandler
    /home/bitrix/www/bitrix/modules/main/lib/eventmanager.php:379
#3: Bitrix\Main\EventManager->send
    /home/bitrix/www/bitrix/modules/main/lib/event.php:142
#4: Bitrix\Main\Event->send
    /home/bitrix/www/bitrix/modules/catalog/lib/model/entity.php:249
#5: Bitrix\Catalog\Model\Entity::update
    /home/bitrix/www/bitrix/modules/catalog/lib/product/sku.php:1565
----------
0
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,444
Записей в блоге: 2
25.10.2022, 10:10
Странно... у меня тот код, что я приводил срабатывал - я его тогда проверял. даже без флага. Правда я редактировал только в админке. Кстати флаг включать, можно только перед Product::update и потом надо не забывать его "отпускать" иначе при массовой загрузке у вас только у первого товара произойдет расчет
0
0 / 0 / 0
Регистрация: 12.10.2022
Сообщений: 6
25.10.2022, 14:18  [ТС]
Поставил после update :
PHP
1
self::$handlerDisallow = false;
И снова начало зацикливаться, но уже прошёл весь onBeforeProductUpdate и снова в него залез.
В функции onBeforeProductUpdate $productId возвращает 0;
PHP
1
$productId = (int)$event->getParameter('ID');
Присвоил $productId = 8808, но ничего не изменилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2022, 14:18
Помогаю со студенческими работами здесь

Дедлоки между update limit N и update по primary key
Добрый день! Столкнулся с дедлоками, хотелось бы послушать опытных товарищей как с этим быть. Описание: Есть табличка CREATE...

Перевести UPDATE SQL в linq Update (linq2db)
Добрый день всем !!! На днях создавал тему по ассоциациям linq2db, эта тема вопрос по той же структуре, но вопрос совсем другой. ...

Не работет Singleton
Здравствуйте. Подскажите, пожалуйста, почему не работает Singleton? class: class Singleton { static private $instance =...

Не работет подсветка
Юмор такой, купил в ДНСе вертушки Aerocool Mirage 12 PRO конвертер с RGB(12v-G-R-B) на ARGB(5v-D-G) и ленту Deepcool RGB200EX. Воткнул это...

Не работет сайт
Привет Всем! Пожскажите пожалуйста Загрузил joomla на хостинг и установил там ее Потом там было наисано что надо удалить папку...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru