Индексированная коллекция элементов типа ВыражениеОтбораКомпоновкиДанныхСхемыЗапроса.
Полное описание, параметры и ограничения
ВыраженияОтбораКомпоновкиДанныхСхемыЗапроса (QuerySchemaDataCompositionFilterExpressions)
ВыраженияОтбораКомпоновкиДанныхСхемыЗапроса (QuerySchemaDataCompositionFilterExpressions)
Доступен, начиная с версии 8.3.14.
Элементы коллекции:
ВыражениеОтбораКомпоновкиДанныхСхемыЗапроса
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются выражения отбора.
Возможно обращение к выражению отбора посредством оператора [...]. В качестве аргумента передается индекс.
Методы:
Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Очистить (Clear)
Получить (Get)
Удалить (Delete)
Описание:
Индексированная коллекция элементов типа ВыражениеОтбораКомпоновкиДанныхСхемыЗапроса.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.14.
Методическая информация
Практические примеры
Выражения отбора СКД: найти текущий элемент, удалить цену, восстановить и очистить
В своей модели запроса разрешаем отбор по коду и цене. Ищем реальные элементы по их представлению, удаляем только цену числовым индексом, восстанавливаем её и очищаем исходную схему. Независимая копия сохраняет весь отбор; данные базы не читаются.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи своего нового стенда УчебныеПараметрыТаблицы85; BSL в1С не запускался.
Подготовка
Нужна НОВАЯ отдельная учебная база, не копия рабочей, на точно платформе8.5.1.1343. Имя конфигурации УчебныеПараметрыТаблицы85, совместимость Не использовать. Единственный независимый регистр сведений УчебнаяИстория85, В пределах секунды; измерение КодТовара Строка3, ресурс Цена Число12,2, без реквизитов/обработчиков. Остальных прикладных объектов, расширений, подписок и заданий нет. Записи не нужны.
Своя конфигурация → Общие → Общие модули → УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Другие вручную создаваемые модули пусты.
Создайте свою внешнюю обработку УчебныйОтборЗапроса85, управляемую Форму и команду/кнопку Выполнить с действием Выполнить. Реквизиты не нужны. Полный отдельный модуль формы дан ниже; схема остаётся на сервере.
До опыта завершите прежний свой сеанс без транзакции, сохраните/F7: Конфигурация → Обновить конфигурацию базы данных. Только после успеха свежий собственный управляемый клиент и своя обработка. Здесь F7 и BSL не запускались.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойМинимальныйСтенд();
ПроверитьСвойРегистр();
Схема = Новый СхемаЗапроса;
Схема.РежимКомпоновкиДанных = Истина;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ История.КодТовара КАК КодТовара, История.Цена КАК Цена
|ИЗ РегистрСведений.УчебнаяИстория85 КАК История");
Отбор = ПолучитьСвойОтбор(Схема);
ПроверитьСвойОтбор(Схема, 0);
ПроверитьПовторныйРазборОтбора(Схема, 0);
Код = Отбор.Добавить("История.КодТовара");
Код.Псевдоним = "КодДляОтбора";
Код.ИспользоватьРеквизиты = Ложь;
Цена = Отбор.Добавить(Новый ВыражениеСхемыЗапроса("История.Цена"));
Цена.Псевдоним = "ЦенаДляОтбора";
Цена.ИспользоватьРеквизиты = Ложь;
ПроверитьСвойОтбор(Схема, 2);
ПроверитьПовторныйРазборОтбора(Схема, 2);
Если Отбор.Индекс(Цена) <> 1 Тогда
ВызватьИсключение "Перед удалением нужен фактический индекс своей цены";
КонецЕсли;
Отбор.Удалить(1);
ПроверитьСвойОтбор(Схема, 1);
ПроверитьПовторныйРазборОтбора(Схема, 1);
ВосстановленнаяЦена = Отбор.Добавить(Новый ВыражениеСхемыЗапроса("История.Цена"));
ВосстановленнаяЦена.Псевдоним = "ЦенаДляОтбора";
ВосстановленнаяЦена.ИспользоватьРеквизиты = Ложь;
ПроверитьСвойОтбор(Схема, 2);
ПроверитьПовторныйРазборОтбора(Схема, 2);
Копия = Новый СхемаЗапроса;
Копия.РежимКомпоновкиДанных = Истина;
Копия.УстановитьТекстЗапроса(Схема.ПолучитьТекстЗапроса());
ПроверитьСвойОтбор(Копия, 2);
Отбор.Очистить();
ПроверитьСвойОтбор(Схема, 0);
ПроверитьПовторныйРазборОтбора(Схема, 0);
ПроверитьСвойОтбор(Копия, 2);
Сообщить("Своя схема: выражений отбора0, обычных колонок2; самостоятельная копия: два полных выражения с признаком Ложь");
КонецПроцедуры
Процедура ПроверитьСвойМинимальныйСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 1 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойРегистр()
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим для учебного разбора не нужен";
КонецЕсли;
МетаРегистр = Метаданные.РегистрыСведений.Найти("УчебнаяИстория85");
Если МетаРегистр = Неопределено Тогда
ВызватьИсключение "Нужен только собственный регистр УчебнаяИстория85";
КонецЕсли;
Если МетаРегистр.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый
Или МетаРегистр.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Секунда
Или МетаРегистр.Измерения.Количество() <> 1 Или МетаРегистр.Ресурсы.Количество() <> 1
Или МетаРегистр.Реквизиты.Количество() <> 0 Тогда
ВызватьИсключение "Нужен независимый периодический регистр с одним измерением и ресурсом";
КонецЕсли;
МетаКод = МетаРегистр.Измерения.Найти("КодТовара");
МетаЦена = МетаРегистр.Ресурсы.Найти("Цена");
Если МетаКод = Неопределено Или МетаЦена = Неопределено Тогда
ВызватьИсключение "Нужны свои КодТовара и Цена";
КонецЕсли;
КодТипы = МетаКод.Тип.Типы();
ЦенаТипы = МетаЦена.Тип.Типы();
Если КодТипы.Количество() <> 1 Или ЦенаТипы.Количество() <> 1 Тогда
ВызватьИсключение "Составные типы своих полей не подходят";
КонецЕсли;
Если КодТипы[0] <> Тип("Строка") Или ЦенаТипы[0] <> Тип("Число")
Или МетаКод.Тип.КвалификаторыСтроки.Длина <> 3
Или МетаЦена.Тип.КвалификаторыЧисла.Разрядность <> 12
Или МетаЦена.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2 Тогда
ВызватьИсключение "Не совпали полные собственные типы полей";
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСвойОператор(Схема)
Если Не Схема.РежимКомпоновкиДанных Или Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Нужна одна собственная схема в режиме СКД";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Или Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный запрос выбора и оператор";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Если ТипЗнч(Оператор) <> Тип("ОператорВыбратьСхемыЗапроса") Или Оператор.Источники.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный источник";
КонецЕсли;
Источник = Оператор.Источники.Получить(0);
Таблица = Источник.Источник;
Если ТипЗнч(Таблица) <> Тип("ТаблицаСхемыЗапроса")
Или НРег(Таблица.ИмяТаблицы) <> НРег("РегистрСведений.УчебнаяИстория85")
Или Таблица.Псевдоним <> "История" Тогда
ВызватьИсключение "Только свой физический источник История, без виртуальных или вложенных таблиц";
КонецЕсли;
Возврат Оператор;
КонецФункции
Функция ПолучитьСвойВыбор(Схема)
Оператор = ПолучитьСвойОператор(Схема);
Выбор = Схема.ПакетЗапросов.Получить(0);
Если Выбор.Колонки.Количество() <> 2 Или Оператор.ВыбираемыеПоля.Количество() <> 2 Тогда
ВызватьИсключение "Нужны ровно две собственные исходные колонки";
КонецЕсли;
Для Индекс = 0 По 1 Цикл
Колонка = Выбор.Колонки.Получить(Индекс);
Если Индекс = 0 Тогда
Имя = "КодТовара";
Выражение = Новый ВыражениеСхемыЗапроса("История.КодТовара");
ОжидаемыйТип = Тип("Строка");
Иначе
Имя = "Цена";
Выражение = Новый ВыражениеСхемыЗапроса("История.Цена");
ОжидаемыйТип = Тип("Число");
КонецЕсли;
Если ТипЗнч(Колонка) <> Тип("КолонкаСхемыЗапроса") Или Колонка.Псевдоним <> Имя
Или Выбор.Колонки.Найти(Имя) <> Колонка Или Колонка.Поля.Количество() <> 1
Или ТипЗнч(Колонка.Поля.Получить(0)) <> Тип("ВыражениеСхемыЗапроса")
Или Колонка.Поля.Получить(0) <> Выражение Тогда
ВызватьИсключение "Не совпали имя, порядок и полное выражение собственной колонки";
КонецЕсли;
Если ТипЗнч(Колонка.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
ВызватьИсключение "Нужно описание типа собственной колонки";
КонецЕсли;
Типы = Колонка.ТипЗначения.Типы();
Если Типы.Количество() <> 1 Или Типы[0] <> ОжидаемыйТип Тогда
ВызватьИсключение "Не совпал полный набор типов собственной колонки";
КонецЕсли;
КонецЦикла;
Возврат Выбор;
КонецФункции
Функция ПолучитьСвойОтбор(Схема)
Выбор = ПолучитьСвойВыбор(Схема);
Оператор = Выбор.Операторы.Получить(0);
Отбор = Оператор.ВыраженияОтбораКомпоновкиДанных;
Если ТипЗнч(Отбор) <> Тип("ВыраженияОтбораКомпоновкиДанныхСхемыЗапроса") Тогда
ВызватьИсключение "Нужен собственный контейнер выражений отбора СКД оператора";
КонецЕсли;
Возврат Отбор;
КонецФункции
Процедура ПроверитьСвойОтбор(Схема, ОжидаемоеКоличество)
Отбор = ПолучитьСвойОтбор(Схема);
Если Отбор.Количество() <> ОжидаемоеКоличество Тогда
ВызватьИсключение "Не совпало полное число собственных выражений отбора СКД";
КонецЕсли;
Для Индекс = 0 По Отбор.Количество() - 1 Цикл
Элемент = Отбор.Получить(Индекс);
Если Индекс = 0 Тогда
Ожидаемое = Новый ВыражениеСхемыЗапроса("История.КодТовара");
Псевдоним = "КодДляОтбора";
Иначе
Ожидаемое = Новый ВыражениеСхемыЗапроса("История.Цена");
Псевдоним = "ЦенаДляОтбора";
КонецЕсли;
Если ТипЗнч(Элемент) <> Тип("ВыражениеОтбораКомпоновкиДанныхСхемыЗапроса")
Или ТипЗнч(Элемент.Выражение) <> Тип("ВыражениеСхемыЗапроса") Или Элемент.Выражение <> Ожидаемое
Или ТипЗнч(Элемент.Псевдоним) <> Тип("Строка") Или Элемент.Псевдоним <> Псевдоним
Или ТипЗнч(Элемент.ИспользоватьРеквизиты) <> Тип("Булево") Или Элемент.ИспользоватьРеквизиты
Или Отбор.Индекс(Элемент) <> Индекс Или Отбор[Индекс] <> Элемент Тогда
ВызватьИсключение "Не совпали полный тип, выражение, псевдоним, признак и индекс собственного отбора";
КонецЕсли;
Представление = Строка(Элемент.Выражение);
Если Представление = "" Или Отбор.Найти(Представление) <> Элемент Тогда
ВызватьИсключение "Найти по фактическому полному представлению должен вернуть именно текущий элемент";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьПовторныйРазборОтбора(Схема, ОжидаемоеКоличество)
Текст = Схема.ПолучитьТекстЗапроса();
Если ТипЗнч(Текст) <> Тип("Строка") Или Текст = "" Тогда
ВызватьИсключение "Нужен реальный сформированный текст собственной схемы";
КонецЕсли;
Повторная = Новый СхемаЗапроса;
Повторная.РежимКомпоновкиДанных = Истина;
Повторная.УстановитьТекстЗапроса(Текст);
ПроверитьСвойОтбор(Повторная, ОжидаемоеКоличество);
КонецПроцедурыУчебныйОтборЗапроса85.Форма
Своя внешняя обработка УчебныйОтборЗапроса85 → управляемая Форма → Модуль
Полный отдельный модуль своей управляемой формы; схемы работают на сервере, здесь не исполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Поиск, удаление, очистка и независимая копия своего отбора СКД проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Включить режим СКД до разбора своего обычного текста. Проверить один физический источник История, две колонки КодТовара и Цена, их полный порядок/выражения/типы. Контейнер отбора берётся именно у своего ОператорВыбратьСхемыЗапроса, не из параметров виртуальной таблицы.
Исходный список пуст. Добавить История.КодТовара строкой, а История.Цена объектом ВыражениеСхемыЗапроса. Назначить КодДляОтбора и ЦенаДляОтбора; в ЭТИХ элементах ИспользоватьРеквизиты поддерживает запись, поэтому явно установить Ложь. Свойство Выражение readonly: его задаёт Добавить.
Для обоих элементов проверить точный тип, полное выражение, строковый псевдоним, Булево Ложь, Индекс, Получить и []. Положительный Найти получает фактическое полное Строка(Элемент.Выражение), не один псевдоним и не произвольную строку. Для ВыражениеСхемыЗапроса установленная справка явно документирует строковое преобразование и сравнение по строке; найденный объект должен совпасть с текущим элементом.
Проверить фактический индекс цены1 и вызвать Удалить(1). Остаться должен код0 с прежним полным выражением/псевдонимом/признаком. Удалённую Цена больше не читать. Добавить новый элемент цены по тому же собственному выражению и восстановить весь исходный список.
После каждого состояния 0→2→1→2→0 сформировать текст и заново разобрать НОВОЙ схемой в режиме СКД: пять полных контрольных разборов, не поиск подстроки в тексте. Каждый раз также проверяются неизменные обычные колонки.
Перед финальной очисткой сохранить независимую Копия со всеми двумя выражениями. Очистить только свой исходный контейнер. Оригинал пуст, копия хранит код и цену со всеми ожидаемыми свойствами. Дочерние элементы между схемами не переносятся.
Как проверить результат
Будущий результат: исходная схема после очистки имеет0 выражений отбора и2 обычные колонки. Копия имеет2 выражения в порядке История.КодТовара/КодДляОтбора и История.Цена/ЦенаДляОтбора, оба ИспользоватьРеквизиты=Ложь. Никаких строк регистра не прочитано и не записано.
Будущий отрицательный контроль вне опыта: поменять только ожидаемое полное выражение цены в ПроверитьСвойОтбор на История.КодТовара. После сохранения/F7 до нового собственного сеанса проверка должна отказать, хотя число элементов2. Вернуть код и до нового сеанса снова сохранить/F7. Здесь контроль не выполнялся.
runtimeVerifiedScenarios=0: структуры, форма и сериализация в1С не исполнялись. Сохранение описаний фильтра не доказывает фактический результат СКД-процессора, интерфейс настройки или права на реальные данные.
Ожидаемый результат
Удаление и очистка затрагивают только принадлежащую своему оператору модель отбора; полные самостоятельные разборы и копия проверяют смысл выражений, а не только их количество.
На что обратить внимание
У выражения отбора Выражение Только чтение, ИспользоватьРеквизиты Чтение и запись. Не путать этот тип с ПолеВыбораКомпоновкиДанныхСхемыЗапроса, где одноимённый признак в установленной справке readonly.
Удалить принимает Число, не элемент. Индекс принимает реальный элемент. Найти принимает строку представления; формат не составляется вручную. После удаления/очистки старые описания не читаются.
Эта коллекция описывает доступные выражения отбора СКД, но не устанавливает сама условие Цена>100 и не выбирает данные. Источник, две обычные колонки и поля выбора СКД — отдельные части модели.
Запрос.Выполнить, транзакции, записи, сеть и рабочие конфигурации здесь отсутствуют. Все классы схемы работают в серверном модуле только своей новой базы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Убрать повторы изменением вида объединения
Два оператора выбирают одинаковые числа. ОБЪЕДИНИТЬ ВСЕ даёт две строки, после изменения объединения ожидаем одну. Это не изменение данных базы.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 250");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный объединённый запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Ожидался собственный запрос выбора";
КонецЕсли;
Операторы = Выбор.Операторы;
Если Операторы.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались два собственных оператора";
КонецЕсли;
Первый = Операторы.Получить(0);
Второй = Операторы.Получить(1);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
До = Запрос.Выполнить().Выгрузить();
Сообщить(До.Количество() = 2);
Первый.ВыбиратьДляИзменения = Ложь;
Первый.КоличествоПолучаемыхЗаписей = 1;
Сообщить(Первый.КоличествоПолучаемыхЗаписей = 1);
Первый.КоличествоПолучаемыхЗаписей = Неопределено;
Сообщить(Первый.КоличествоПолучаемыхЗаписей = Неопределено);
Сообщить(Не Первый.ВыбиратьДляИзменения И Не Первый.ВыбиратьРазличные);
Сообщить(Первый.Источники.Количество() = 0);
Сообщить(Первый.Группировка.Количество() = 0 И Первый.Отбор.Количество() = 0);
Сообщить(Первый.ТаблицыДляИзменения.Количество() = 0);
Сообщить(Первый.ВыраженияОтбораКомпоновкиДанных.Количество() = 0);
Второй.ТипОбъединения = ТипОбъединенияСхемыЗапроса.Объединить;
Сообщить(Второй.ТипОбъединения = ТипОбъединенияСхемыЗапроса.Объединить);
Запрос.Текст = Схема.ПолучитьТекстЗапроса();
После = Запрос.Выполнить().Выгрузить();
Если После.Количество() <> 1 Тогда
ВызватьИсключение "Повторы собственных строк не устранены";
КонецЕсли;
Сообщить(После[0].Количество = 3 И После[0].Цена = 250);Разбор по шагам
Сначала выполняем исходный текст и проверяем две строки с одинаковыми собственными значениями.
ПЕРВЫЕ задаётся КоличествоПолучаемыхЗаписей; Неопределено снимает ограничение. Здесь каждая выборка и так создаёт одну строку.
ВыбиратьРазличные соответствует РАЗЛИЧНЫЕ внутри оператора и readonly по API. Его не присваиваем и не путаем с видом объединения операторов.
Пустые источники, группировка и отбор объясняются запросом констант. ТаблицыДляИзменения пусты: блокировка данных не запрашивается.
Меняем ТипОбъединения второго оператора на Объединить, заново формируем текст и выполняем его.
Результат проверяем по одной реальной строке 3/250. Исходные строки не удалены из базы: они созданы только выражениями запроса.
Как проверить результат
Десять сравнений Истина.
После изменения одна строка 3/250 вместо двух; никаких рабочих таблиц или изменений записей нет.
Ожидаемый результат
Показана практическая разница между сохранением и удалением повторов в объединении.
На что обратить внимание
При разных значениях строк Объединить не сводит результат к одной строке.
ВыбиратьДляИзменения относится к блокировкам, а не к обновлению чисел автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.