Имя: Пароль:
1C
1С v8
запрос: проверка на пустое значение реквизита составного типа
, ,
0 серый КТУЛХУ
 
03.10.21
16:44
а не изобретен ли случайно (или неслучйно) коллективным разумом (или каким-нибудь неколлективным) способ проверить в запросе значение реквизита составного типа на пустое значение (которое может быть пустым значением любого доступного для этого реквизита типа!) - без перебора его в богато ветвящейся конструкции "ВЫБОР КОГДА ТОГДА КОГДА ТОГДА ..." на равенство пустым значениям всех возможных типов?.. (а то ДАЖЕ использовав эту монструозную конструкцию - с дрожью думаешь о том, что же придется делать если вдруг в состав такого реквизита когда-нибудь добавится еще тип)...
на IS NULL / ISNULL() - не работает...
1 ДенисЧ
 
03.10.21
16:46
реквизит.Ссылка есть NULL
2 ДенисЧ
 
03.10.21
16:46
Если там строк и чисел нет
3 тук-тук
 
03.10.21
16:48
Неопределено
4 ДенисЧ
 
03.10.21
16:49
(3) Зачёт не сдан, на переподготовку.
5 серый КТУЛХУ
 
03.10.21
16:51
(1),(2): сам-то пробовал? годится только если тип не укахан. а если значение пустое с указанным типом - не работает (я же вроде про "IS NULL" упомянул - это то же самое что "есть NULL")
я читал про такой способ - проверку на реальных данных с установленным непустым (агрегатным) типом реквизита - не работает.
(3) сам-то пробовал: (см.выше)
6 ДенисЧ
 
03.10.21
16:53
(5) Ты не заметил .ссылка? О_о
7 тук-тук
 
03.10.21
16:57
ЕСТЬNULL(СправочникИмя.РеквизитСоставной.Представление, Неопределено)=Неопределено
8 hhhh
 
03.10.21
16:58
(0) вообще-то сейчас приняли за правило в перед записью проверять, если пустая ссылка, то принудительно туда писать НЕОПРЕДЕЛЕНО. Чтобы пустых ссылок в базе не было. А в запросе просто пишут ВЫБОР КОГДА реквизит = НЕОПРЕДЕЛЕНО ТОГДА
9 серый КТУЛХУ
 
03.10.21
16:58
(6): таак. щя пойду перепроверю... благо запросы еще в консоли вроде сохранились (ну почти)).
10 тук-тук
 
03.10.21
16:58
ЕСТЬNULL(СправочникИмя.РеквизитСоставной.Представление, Неопределено)=Неопределено - для выбранного типа
СправочникИмя.РеквизитСоставной = Неопределено - для невыбранного типа в реквизите
11 ДенисЧ
 
03.10.21
16:58
(8) Правила существуют, чтобы их нарушать )))
12 серый КТУЛХУ
 
03.10.21
16:59
(7) тоже не работает. потому что оно НЕ NULL
13 Ненавижу 1С
 
гуру
03.10.21
17:16
Какая интересная тема
14 vde69
 
03.10.21
17:26
для любых ссылочных типов:

ВЫБОР
КОГДА ЕСТЬNULL(а, Неопределено)=Неопределено ТОГДА ЛОЖЬ
КОГДА а.ссылка.Версия есть null ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КонецВыбор
15 серый КТУЛХУ
 
03.10.21
17:56
(1),(6): гут, работает. спасибо тебе. добрый человек (пойду в запрос поменяю дерево проверок на одно условие)
и тогда - сразу вопрос: это еще одно лазание "через точку" (.Ссылка) - не затормозит запрос? как-то оптимизировать в этом месте можно или нинада?
(14): Поле не найдено РеализацияТоваровУслуг.Сделка.Версия
КОГДА РеализацияТоваровУслуг.Сделка.<<?>>Версия IS NULL ТОГДА "авто-очистка!"
16 серый КТУЛХУ
 
03.10.21
17:59
(15)+:
(14) та же байда со ссылкой:
КОГДА РеализацияТоваровУслуг.Сделка.Ссылка.<<?>>Версия IS NULL ТОГДА "авто-очистка!"
17 ДенисЧ
 
03.10.21
18:05
(15) Затормозит.
Если нужно быстро, тогда используй (8)
18 vde69
 
03.10.21
18:27
(16) тут вопрос будет если ссылка но битая.... или если ссылка но доступа нет....
19 Ненавижу 1С
 
гуру
03.10.21
18:27
Еще есть тема написать универсальную функцию, которая по метаданным реквизита собирает все возможные пустые ссылки и неопределено в массив
и потом писать соответственно Реквизит В (&МассивПустыхСсылок)
а можно и не по метаданным, вообще все пустые ссылки и неопределено )))
20 vde69
 
03.10.21
18:32
(19) я недавно в типовой видел похожую, в динамическом списке файлов есть параметр "пустойпользователь", туда суется похожий массив.
21 серый КТУЛХУ
 
03.10.21
19:06
(17): наверное потому что .Ссылка будет дергать все таблицы. абыдна. ну да ладно, в (19) норм тема если тормоза полезут. хотя и там тоже - будет дергать все(!) таблицы документов, которые есть в составе...
спасибо, люди.
22 Ненавижу 1С
 
гуру
03.10.21
19:09
(21) почему там будут дергаться все таблицы? ссылка, она как бы не требует ничего
23 vde69
 
03.10.21
19:15
(22) (21) будет дергатся все таблицы, начиная с таблицы конфиг...

составной тип - зло, гораздо красивее выходит использование ПВХ, хотя то-же не сахар...

хотя без составных типов обойтись очень тяжело, у меня сейчас есть задачка похожая, я знаю, что сейчас делаю медленную телегу, но когда данных будет побольше вот тогда и буду переделывать
24 pechkin
 
03.10.21
19:17
А пвх значит не составной тип?
25 youalex
 
03.10.21
19:18
(0) если искомый тип ссылка конкретной таблицы то тупо джойн к этой таблице
26 Ненавижу 1С
 
гуру
03.10.21
19:20
(23) ПВХ тоже самое - составной тип
а для обхода всех метаданных ничего кроме метаданных не надо, имхо
27 youalex
 
03.10.21
19:20
(23) ПВХ в этом смысле ничем не лучше
28 youalex
 
03.10.21
19:22
(25) + еще не факт что 1С задействует при этом нужный индекс при неактуальной статистике.
29 pechkin
 
03.10.21
19:25
В (19) никаких лишних соединений не будет
30 серый КТУЛХУ
 
03.10.21
19:27
(29): о.
Ок, спасибо.
31 ГдеСобака Зарыта
 
03.10.21
19:31
32 Ненавижу 1С
 
гуру
03.10.21
19:55
Но думаю обход метаданных будет сложно организовать, надо будет обегать дерево, когда реквизит не прямо у таблицы берется, например:

ТоварыКОтбору.Распоряжение.ДокументОснование

где Распоряжение сам составного типа и у каждого из них ДокументОснование состоит из разных типов
33 vde69
 
03.10.21
20:10
(32) для твоего случая следует создать и использовать "критерииОтбора", и хотя там нет никаких доп таблиц, но запросы строятся с учетом специфики составных полей, и с индексами там все хорошо будет
34 Ненавижу 1С
 
гуру
03.10.21
20:38
(33) я не думаю, что он тут необходим и чем-то вообще поможет
35 pechkin
 
03.10.21
20:47
(33) критерий отбора просто создает индекс по выбранным полям
36 roman52
 
03.10.21
20:54
а вот интересно: были ли у кого-нибудь задачи, в которых нужны И Неопределено и пустые ссылки?
Т.е. когда нельзя пустую ссылку приводить к Неопределено.
Ну не знаю, например, если в реквизите Неопределено, то от пользователя доп.действий не требуется, а если в реквизите пустая ссылка определенного типа, то пользователь должен указать уже непустую ссылку этого типа.
37 vde69
 
03.10.21
21:01
(36) да такие задачи бывают, обычно это связано с необходимостью работать с результатом например по индексу после разыменования (или что более правильно после джойна)
38 Ненавижу 1С
 
гуру
03.10.21
21:05
(36) в типовой была тема, что если скидка применялась для всех (складов или договора) то нужно было ставить ссылку на пустой договор. Наверное осталось когда реквизит не был составным.

Мое мнение прежнее - тема надуманная. Не нужно их различать, а 1с просто неудачно модель выстроила. Имхо null там должен быть. Но имеем то, что имеем
39 acanta
 
03.10.21
22:16
И поэтому в справочнике появились предопределенные значения ПоУмолчанию.
40 серый КТУЛХУ
 
03.10.21
22:58
(32): нет, не сложно.
    СписокПустыхСсылок = Новый Массив;
    Для Каждого ТипИзСоставного Из Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Сделка.Тип.Типы() Цикл
        ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипИзСоставного);
        Если Метаданные.Справочники.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.Перечисления.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.Задачи.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)
            ИЛИ Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных)
            Тогда
            СписокПустыхСсылок.Добавить(Новый(ТипИзСоставного));
        КонецЕсли;
    КонецЦикла;
    ЗапросПроверкаПоСпискуПустыхСсылок.Параметры.Вставить("ПустыеСделки", СписокПустыхСсылок);
(код "с запасом")
41 серый КТУЛХУ
 
03.10.21
23:05
в общем сделал тестовое сравнение времени запросов с проверкой на пустые значения составных реквизитов (все типы в составе агрегатные, всего 29 типов документов в реквизите Сделка м.б.):

1-е место по скорости: проверка на вхождение в список пустых значений всех типов для составного типа (реквизита), включая время составления списка по метаданным - см.(40)

2-е место - с развесистым деревом типа:
ВЫБОР КОГДА РеализацияТоваровУслуг.Сделка = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА
  КОГДА РеализацияТоваровУслуг.Сделка = ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка) ТОГДА
  ...
КОНЕЦ
- в 1.2 - 1.5 раз медленнее варианта 1

3-е место - с проверкой на .Ссылка IS NULL - в 3.2 - 3.5 раз медленнее варианта 1

вусем спасибо, надеюсь мои тесты кому-нибудь пригодятся (в качестве благодарности за продуктивный обмен мнениями по интересующему меня вопросу).
42 Ненавижу 1С
 
гуру
03.10.21
23:13
(40) вы это сделали скажем так для поля
Документы.РеализацияТоваровУслуг.Сделка

Я же говорил про ситуацию

Документы.РеализацияТоваровУслуг.Сделка.ДокументОснование

Причем:
Сделка сама по себе составной тип и ДокументОснование составной, причем состав типов разный у разных типов сделок
Вообще вложенность точек может быть длиннее
43 Ненавижу 1С
 
гуру
03.10.21
23:15
(40) теперь это надо функцией оформить для общего случая и будет ОК
44 Ненавижу 1С
 
гуру
03.10.21
23:17
А если вместо (40) сделать универсальный список ВСЕХ пустых? Понятно, что список длиннее будет, но зато его готовить не надо долго. Вообще в параметры сеанса можно запихнуть
45 серый КТУЛХУ
 
03.10.21
23:40
(44): угу, мысль хорошая...
(ну кроме элементарных типов - они-то пустые даже - не совсем пустые как бы, особняком от агрегатных стоят, да и при желании в виде прямой формулы легко получаются)
46 серый КТУЛХУ
 
03.10.21
23:45
(42): а давайте на "ты". я с начал интернетов, фидо, чатов-форумов еще, и как-то привык. что доброжелательное и уважительное общение - это как раз на "ты"; а "вы"-канье - это уже демостративное дистанцирование с как минимум оттенком неодобрения.
(ну, кроме естественной ниши для "вы" - деловой переписки, переписки с публичными фигурами и с теми, с кем в реале знаком и на "вы" общаешься).
47 TormozIT
 
гуру
04.10.21
00:37
Если устроит генератор выражения проверки условия "Значение заполнено" для поля любого составного типа, то "Конструктор запроса (ИР)" умеет это делать.
Правда для булева типа он работает не так как встроенный язык - значение "Ложь" считает незаполненным. Мне так показалось логичнее.
https://i.imgur.com/5N9fbrP.png
48 серый КТУЛХУ
 
04.10.21
01:14
(47): спасибо. только я так понимаю это типа автоматическая генерация в сам текст запроса того самого развесистого дерева со сравнением по типам - нет? если "да" то это немного не то, я как раз про универсальный (не зависящий от состава допустимых типов реквизита) условие(сравнение) спрашивал.
(ага, ложь в качестве незаполненного кажется весьма логичной интерпретацией)
49 Конструктор1С
 
04.10.21
09:22
Совершенно незачем дёргать метаданные для этой задачи. Выручит СхемаЗапроса
50 Конструктор1С
 
04.10.21
09:22
Функция ПустыеЗначенияПоляСоставногоТипа(ПутьКТаблице, ИмяПоля)
    
    ТекстЗапроса = СтрШаблон("ВЫБРАТЬ %1 ИЗ %2", ИмяПоля, ПутьКТаблице);
    
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
    
    ОписаниеТиповПоля = СхемаЗапроса.ПакетЗапросов[0].Колонки[0].ТипЗначения;
    
    ПустыеЗначения = Новый Массив;
    ПустыеЗначения.Добавить(Неопределено);
    
    Для каждого ТипЗначения Из ОписаниеТиповПоля.Типы() Цикл
        
        МассивТипов = Новый Массив;
        МассивТипов.Добавить(ТипЗначения);
        
        ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);
        
        Значение = ОписаниеТипа.ПривестиЗначение(Неопределено);
        
        ПустыеЗначения.Добавить(Значение)
    
    КонецЦикла;
    
    Возврат ПустыеЗначения;
    
КонецФункции
51 Конструктор1С
 
04.10.21
09:31
(40) а если в составе окажется примитивный тип?
52 Ненавижу 1С
 
гуру
04.10.21
09:35
(50) это таже рефлексия, вид с другой стороны
53 Конструктор1С
 
04.10.21
09:41
(52) тока схема запроса легче справляется. На шальном поле с типом ЛюбаяСсылка или хотя бы ДокументСсылка перебор всех метаданных может вылиться в значительное время. СхемаЗапроса моментально выплюнет все необходимые типы
54 серый КТУЛХУ
 
04.10.21
13:05
(51): см.(47), и - у примитивных типов данных де-факто не бывает пустых значений. 0, "", "01.01.01", Ложь/Истина - не пустые значения. для всех этих типов пустое значение - нетипизированное Неопределено, а оно охватывается в коде простым условием.
55 Ненавижу 1С
 
гуру
04.10.21
13:09
(53) вы прилагательными не говорите, вы количественные тесты приведите
56 серый КТУЛХУ
 
04.10.21
13:09
(53): нет. перебор метаданных не "выливается в значительное время". проверено на практике, замер для (41) - там для этого варианта (п.1) "включая время составления списка по метаданным" по не очень маленькому списку ~30 типов.
не веришь - сделай хронометраж, и покажи - как мерял и что получилось.
57 серый КТУЛХУ
 
04.10.21
13:09
(55): опередил заразюка )))
58 серый КТУЛХУ
 
04.10.21
13:18
прим.: и - мне тоже для тестирования - в (50) как убрать элементарные (неагрегатны) типы из списка (пропустить при составлении списка) - дай код с этой оговоркой, пжалст.
59 H A D G E H O G s
 
04.10.21
13:22
(1) Херовое решение.
60 серый КТУЛХУ
 
04.10.21
13:40
(59): как насчет (41)?
61 серый КТУЛХУ
 
04.10.21
13:53
(53):
// на обсуждаемом реквизите (Документ.РеализацияТоваровУслуг.Сделка) составного типа (29 типов):

Функция ЭтоАгрегатныйТип(ТипЗначения)
    ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
    Возврат    Метаданные.Справочники.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.Перечисления.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.Задачи.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)
        ИЛИ Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных);
КонецФункции

Функция ПустыеЗначенияПоляСоставногоТипаПоСхемеЗапроса(ПутьКТаблице, ИмяПоля)
    ТекстЗапроса = "ВЫБРАТЬ " + ИмяПоля + " ИЗ " + ПутьКТаблице;
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
    ОписаниеТиповПоля = СхемаЗапроса.ПакетЗапросов[0].Колонки[0].ТипЗначения;
    ПустыеЗначения = Новый Массив;
    ПустыеЗначения.Добавить(Неопределено);
    Для Каждого ТипЗначения Из ОписаниеТиповПоля.Типы() Цикл
        Если ЭтоАгрегатныйТип(ТипЗначения) Тогда
            МассивТипов = Новый Массив;
            МассивТипов.Добавить(ТипЗначения);
            ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);
            Значение = ОписаниеТипа.ПривестиЗначение(Неопределено);
            ПустыеЗначения.Добавить(Значение)
        КонецЕсли;
    КонецЦикла;
    Возврат ПустыеЗначения;
КонецФункции

Функция ПустыеЗначенияПоляСоставногоТипаИзМетаданных(ТипДанных, ВидДанных, ИмяПоля)
    ПустыеЗначения = Новый Массив;
    Для Каждого ТипЗначения Из Метаданные[ТипДанных][ВидДанных].Реквизиты[ИмяПоля].Тип.Типы() Цикл
        ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
        Если ЭтоАгрегатныйТип(ТипЗначения) Тогда
            ПустыеЗначения.Добавить(Новый(ТипЗначения));
        КонецЕсли;
    КонецЦикла;
    Возврат ПустыеЗначения;
КонецФункции

    ТаймерыПолученияПустыхСсылок = Новый Структура("ПоСхемеЗапроса, ПоМетаданным", 0, 0);
    КоличествоТестов = 100;
    
    СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаПоСхемеЗапроса("Документ.РеализацияТоваровУслуг", "Сделка");
    СписокПустыхСсылок = Неопределено;
    ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Для СчетчикТестов = 1 По КоличествоТестов Цикл;
        СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаПоСхемеЗапроса("Документ.РеализацияТоваровУслуг", "Сделка");
        СписокПустыхСсылок = Неопределено;
    КонецЦикла;
    ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса = ТекущаяУниверсальнаяДатаВМиллисекундах() - ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса;
    Сообщить("Составление списка пустых значений по Схеме запроса: миллсекунд = " + ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса + " / " + КоличествоТестов);
    
    СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаИзМетаданных("Документы","РеализацияТоваровУслуг", "Сделка");
    СписокПустыхСсылок = Неопределено;
    ТаймерыПолученияПустыхСсылок.ПоМетаданным = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Для СчетчикТестов = 1 По КоличествоТестов Цикл;
        СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаИзМетаданных("Документы","РеализацияТоваровУслуг", "Сделка");
        СписокПустыхСсылок = Неопределено;
    КонецЦикла;
    ТаймерыПолученияПустыхСсылок.ПоМетаданным = ТекущаяУниверсальнаяДатаВМиллисекундах() - ТаймерыПолученияПустыхСсылок.ПоМетаданным;
    Сообщить("Составление списка пустых значений по Метаданным: миллсекунд = " + ТаймерыПолученияПустыхСсылок.ПоМетаданным + " / " + КоличествоТестов);

результат:
Составление списка пустых значений по Схеме запроса: миллсекунд = 220 / 100
Составление списка пустых значений по Метаданным: миллсекунд = 179 / 100

(да и как-то короче и понятнее кажется код по Метаданным)
62 H A D G E H O G s
 
04.10.21
14:01
Лучше всего через составной тип

    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ДатыСоздания.ДатаСоздания КАК ДатаСоздания
    |ИЗ
    |    РегистрСведений.ДатыСоздания КАК ДатыСоздания
    |ГДЕ
    |    НЕ ДатыСоздания.СкладскойДокумент В (НЕОПРЕДЕЛЕНО, &МассивПустыхСкладскихДокументов)";
    МассивПустыхСкладскихДокументов=Новый Массив;
    Для Каждого Тип Из Метаданные.ОпределяемыеТипы.СкладскиеДокументы.Тип.Типы() Цикл
        МассивПустыхСкладскихДокументов.Добавить(Новый(Тип));
    КонецЦикла;
    Запрос.УстановитьПараметр("МассивПустыхСкладскихДокументов",МассивПустыхСкладскихДокументов);
    Результат=Запрос.Выполнить().Выгрузить();


Но с типовыми конечно так не получится
63 H A D G E H O G s
 
04.10.21
14:02
(62) Пардон

через составной тип-> через определяемый тип
64 pechkin
 
04.10.21
14:15
(62) в конкретном случае можно напрямую к метаданным реквизита регистра обратиться, без всяких опрпделяемых типов
65 H A D G E H O G s
 
04.10.21
14:24
(64) Да, это гораздо лучше!
66 Конструктор1С
 
04.10.21
14:39
(58) можно приводить тип к строке и проверять

ИмяТипаXML = XMLТип(ПроверяемыйТип).ИмяТипа;

На выходе
CatalogRef.Номенклатура
DocumentRef.ПриходнаяНакладная

вот по подстроке "Ref." можно ориентироваться. Соответственно, без Ref это какой-то примитивный тип.
67 pechkin
 
04.10.21
14:42
(66) это быстрее? строки в 1с не быстро работают
68 Конструктор1С
 
04.10.21
16:05
(67) гораздо быстрее обращения к метаданным. XMLТип() скорее всего завязано на движок обмена данными 1с, поэтому хорошо оптимизировано
69 TormozIT
 
гуру
04.10.21
19:07
(53) Ну это очень смелое утверждение. Я много раз проверял - схема запроса также буксует на широких по составу описаниях типов полей, как и остальные механизмы платформы. И это вполне ожидаемо.
70 TormozIT
 
гуру
04.10.21
19:11
(69) + Если конечно сравнивать с буквальным перебором метаданных, то выигрыш будет только первый раз за счет разовой загрузки метаданных. Супертип ЛюбаяСсылка развернется в массив типов без загрузки всех метаданных в память.
71 Конструктор1С
 
05.10.21
06:44
(69) не также она буксует, значительно быстрее отрабатывает
Закон Брукера: Даже маленькая практика стоит большой теории.