СправочникВыборка.<Имя справочника>.Код

Свойства · Code

Тип: Число, Строка. Содержит код элемента справочника. Строка или число в зависимости от настроек справочника в Конфигураторе.

Полное описание, параметры и ограничения

СправочникВыборка.<Имя справочника>.Код (CatalogSelection.<Catalog name>.Code)

СправочникВыборка.<Имя справочника> (CatalogSelection.<Catalog name>)

Код (Code)

Доступен, начиная с версии 8.0.

Использование:
Только чтение.
Описание:
Тип: Число, Строка.
Содержит код элемента справочника. Строка или число в зависимости от настроек справочника в Конфигураторе.
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Найти книгу по имени и артикулу, не пропустив дубли

В двух группах намеренно одинаковое имя Книга, но разные артикулы. Сравниваем точное имя, начало имени, точный реквизит, ограничение родителя и отсутствие результата.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Создайте НОВУЮ пустую файловую базу на точной платформе 8.5.1.1343. Имя конфигурации УчебныеВыборкиКаталога85, совместимость НеИспользовать. Это не копия рабочих УТ/КА/УНФ/БП; исходные конфигурации и рабочие базы не трогайте. Здесь код не запускался: runtimeVerifiedScenarios=0.

  2. Создайте единственный справочник УчебныеТовары: иерархия групп и элементов, владельцы не назначены, предопределенных данных нет, код Строка длиной 10, автонумерация выключена, контроль уникальности включён, наименование длиной 100. Других объектов хранения данных не добавляйте.

  3. Добавьте единственный реквизит Артикул: Строка длиной 20, использование для групп и элементов, Индексировать. Индекс обязателен для отбора Выбрать по этому реквизиту. Табличных частей нет. Модули справочника/менеджера, подписки, регламентные задания, разделители и расширения должны быть пустыми/отсутствовать.

  4. Создайте два неглобальных общих модуля: УчебныйКаталог85 и УчебныеПримерыКаталога85, Сервер=Да, клиентские флаги=Нет, Вызов сервера=Да, привилегированный режим=Нет. В первый вставьте полный общий модуль подготовки ниже; во второй — полный основной код только одного выбранного урока. Не склеивайте разные процедуры ВыполнитьПример.

  5. Создайте собственную обработку УчебныйПульт85, управляемую форму Пульт, команду Выполнить и кнопку этой команды. В модуль формы вставьте полный отдельный модуль запуска ниже и назначьте действие команды Выполнить. Обновите конфигурацию базы, проверьте F7; до запуска вручную сверяйте настройки справочника.

  6. Данные создаёт сам урок: G01 Основной и G02 Архив в корне; A01 Книга/BOOK-A и A02 Ручка/PEN-A в Основной; B01 Книга/BOOK-B в Архив. Все пять записей существуют лишь внутри собственной транзакции. При успехе и ошибке выполняется откат; фиксации нет.

  7. Будущий ручной запуск вызывает настоящую запись пяти собственных строк в учебной базе до отката. Откат не отменяет внешние действия неизвестных обработчиков, поэтому рабочая конфигурация или её копия здесь недопустима. Запускайте одним пользователем, вне чужой транзакции; существующие данные код не удаляет.

Процедура ВыполнитьПример() Экспорт
    УчебныйКаталог85.ПроверитьСвойСтенд();
    НачатьТранзакцию();
    Попытка
        Данные = УчебныйКаталог85.ПодготовитьСвоиТовары();
        Менеджер = Справочники.УчебныеТовары;
        ВОсновном = Менеджер.НайтиПоНаименованию("Книга", Истина, Данные.G01);
        ВАрхиве = Менеджер.НайтиПоНаименованию("Книга", Истина, Данные.G02);
        ПоНачалу = Менеджер.НайтиПоНаименованию("Кни", Ложь, Данные.G01);
        Если ВОсновном <> Данные.A01 Или ВАрхиве <> Данные.B01 Или ПоНачалу <> Данные.A01 Тогда
            ВызватьИсключение "Поиск по имени должен учитывать точность и родителя";
        КонецЕсли;
        ПоАртикулу = Менеджер.НайтиПоРеквизиту("Артикул", "BOOK-A", Данные.G01);
        НетПрефикса = Менеджер.НайтиПоРеквизиту("Артикул", "BOOK", Данные.G01);
        НетВДругойГруппе = Менеджер.НайтиПоРеквизиту("Артикул", "BOOK-A", Данные.G02);
        НетИмени = Менеджер.НайтиПоНаименованию("Несуществующий учебный товар", Истина);
        Если ПоАртикулу <> Данные.A01 Или НетПрефикса <> Данные.Пустая
            Или НетВДругойГруппе <> Данные.Пустая Или НетИмени <> Данные.Пустая Тогда
            ВызватьИсключение "Поиск по реквизиту точный, отсутствие возвращает пустую ссылку";
        КонецЕсли;
        ОдинДубль = Менеджер.НайтиПоНаименованию("Книга", Истина);
        Если ОдинДубль <> Данные.A01 И ОдинДубль <> Данные.B01 Тогда
            ВызватьИсключение "Во всём справочнике подготовлены две книги";
        КонецЕсли;
        ВсеКниги = Менеджер.Выбрать(, , Новый Структура("Наименование", "Книга"), "Код Возр");
        КодыКниг = Новый Массив;
        Пока ВсеКниги.Следующий() Цикл
            КодыКниг.Добавить(ВсеКниги.Код);
        КонецЦикла;
        Если СтрСоединить(КодыКниг, ",") <> "A01,B01" Тогда
            ВызватьИсключение "Проверка всех дублей должна вернуть две книги";
        КонецЕсли;
        Сообщить("Основной: A01; Архив: B01; префикс имени: A01; все книги: A01,B01");
        ОтменитьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    УчебныйКаталог85.ПроверитьОткат(Данные);
    Сообщить("Собственные пять строк отменены; учебный справочник снова пуст");
КонецПроцедуры
УчебныйКаталог85

УчебныеВыборкиКаталога85 → Общие → Общие модули → УчебныйКаталог85

Полный серверный общий модуль: защита стенда, подготовка пяти записей и проверка отката. Не выполнялся.

Процедура ПроверитьСвойСтенд() Экспорт
    Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Каталог = Метаданные.Справочники[0];
    Если Каталог.Имя <> "УчебныеТовары" Или Не Каталог.Иерархический
        Или Каталог.Реквизиты.Количество() <> 1 Или Каталог.Реквизиты.Найти("Артикул") = Неопределено Тогда
        ВызватьИсключение "Нужен собственный иерархический справочник с единственным реквизитом Артикул";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция ПодготовитьСвоиТовары() Экспорт
    Если Не ТранзакцияАктивна() Тогда
        ВызватьИсключение "Подготовка допустима только внутри собственной отменяемой транзакции";
    КонецЕсли;
    ПроверкаПустоты = Справочники.УчебныеТовары.Выбрать();
    Если ПроверкаПустоты.Следующий() Тогда
        ВызватьИсключение "Учебный справочник должен быть пуст; чужие записи не изменяются";
    КонецЕсли;
    Пустая = Справочники.УчебныеТовары.ПустаяСсылка();
    Данные = Новый Структура;
    Данные.Вставить("G01", СоздатьСвоюСтроку("G01", "Основной", "GROUP-A", Пустая, Истина));
    Данные.Вставить("G02", СоздатьСвоюСтроку("G02", "Архив", "GROUP-B", Пустая, Истина));
    Данные.Вставить("A01", СоздатьСвоюСтроку("A01", "Книга", "BOOK-A", Данные.G01, Ложь));
    Данные.Вставить("A02", СоздатьСвоюСтроку("A02", "Ручка", "PEN-A", Данные.G01, Ложь));
    Данные.Вставить("B01", СоздатьСвоюСтроку("B01", "Книга", "BOOK-B", Данные.G02, Ложь));
    Данные.Вставить("Пустая", Пустая);
    Возврат Данные;
КонецФункции

Функция СоздатьСвоюСтроку(Код, Наименование, Артикул, Родитель, Группа)
    Если Группа Тогда
        Объект = Справочники.УчебныеТовары.СоздатьГруппу();
    Иначе
        Объект = Справочники.УчебныеТовары.СоздатьЭлемент();
    КонецЕсли;
    Ссылка = Справочники.УчебныеТовары.ПолучитьСсылку(Новый УникальныйИдентификатор);
    Объект.УстановитьСсылкуНового(Ссылка);
    Объект.Код = Код;
    Объект.Наименование = Наименование;
    Объект.Артикул = Артикул;
    Объект.Родитель = Родитель;
    Объект.Записать();
    Прочитанный = Ссылка.ПолучитьОбъект();
    Если Прочитанный = Неопределено Тогда
        ВызватьИсключение "Собственная учебная запись не прочитана";
    КонецЕсли;
    Если Прочитанный.Код <> Код Или Прочитанный.Наименование <> Наименование
        Или Прочитанный.Артикул <> Артикул Или Прочитанный.Родитель <> Родитель
        Или Прочитанный.ЭтоГруппа <> Группа Тогда
        ВызватьИсключение "Прочитанная учебная строка отличается от подготовленной";
    КонецЕсли;
    Возврат Ссылка;
КонецФункции

Процедура ПроверитьОткат(Данные) Экспорт
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Собственная транзакция не завершена";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("G01,G02,A01,A02,B01", ",") Цикл
        Если Данные[Имя].ПолучитьОбъект() <> Неопределено Тогда
            ВызватьИсключение "Собственная запись осталась после отката: " + Имя;
        КонецЕсли;
    КонецЦикла;
    ПроверкаПустоты = Справочники.УчебныеТовары.Выбрать();
    Если ПроверкаПустоты.Следующий() Тогда
        ВызватьИсключение "После отката справочник не пуст";
    КонецЕсли;
КонецПроцедуры
УчебныйПульт85.Пульт

УчебныеВыборкиКаталога85 → Обработки → УчебныйПульт85 → Формы → Пульт → Модуль

Полный модуль управляемой формы только собственной обработки. Не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеПримерыКаталога85.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. ТочноеСоответствие=Истина ищет целое наименование, Ложь — его левую часть. Поэтому Кни находит Книга только в режиме начала строки. Хвостовые пробелы имени не участвуют в точном соответствии.

  2. Третий параметр родителя разделяет две одинаково названные книги: G01 → A01, G02 → B01. Это не поиск по владельцу; владельцы в подготовке отсутствуют.

  3. НайтиПоРеквизиту использует реальное имя собственного Артикул и точное значение строки фиксированной длины. BOOK не равно BOOK-A: здесь нет режима поиска по префиксу.

  4. Отсутствие в этой подготовке возвращает пустую ссылку, не Неопределено. Отдельный случай имени длиной 0 и точного поиска может вернуть Неопределено; наш справочник имеет длину 100.

  5. Поиск Книга без родителя возвращает одну из двух ссылок. Код не угадывает, какая будет выбрана, и не делает вывода об уникальности.

  6. Чтобы действительно обнаружить дубли, создаём выборку с одним отбором Наименование и считаем все результаты: A01,B01. Значения не исправляем, базу заканчиваем откатом.

Как проверить результат

  1. В своей учебной базе проверки подтверждают четыре успешных поиска и три пустые ссылки; сообщение показывает A01,B01 как полный набор книг.

  2. Не требуйте, чтобы ОдинДубль всегда был A01: допустим и B01. Полная выборка обязана дать обе книги.

  3. В копии урока поменяйте ожидание НетПрефикса на A01: должна возникнуть ошибка и откат, показывая отличие точного артикула от начала имени.

Ожидаемый результат

Показаны точный и префиксный поиск имени, точный поиск реквизита, ограничение группой и отдельное обнаружение дублей. runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Первое совпадение не гарантирует уникальность; автоматический подбор товара по одному имени опасен без отдельного правила.

  2. НайтиПоРеквизиту не поддерживает ХранилищеЗначения и строки неограниченной длины. Точное имя и название реквизита задаёт ваша конфигурация.

  3. Не используйте произвольное имя справочника из рабочей базы: все имена и данные здесь подготовлены явно.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Прочитать товары группы: выборка, поля текущей строки и объект

Показываем G01 → A01 Книга и A02 Ручка, отдельно выбираем BOOK-A по индексированному артикулу и две корневые группы. Объект текущей строки читается без изменений.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Создайте НОВУЮ пустую файловую базу на точной платформе 8.5.1.1343. Имя конфигурации УчебныеВыборкиКаталога85, совместимость НеИспользовать. Это не копия рабочих УТ/КА/УНФ/БП; исходные конфигурации и рабочие базы не трогайте. Здесь код не запускался: runtimeVerifiedScenarios=0.

  2. Создайте единственный справочник УчебныеТовары: иерархия групп и элементов, владельцы не назначены, предопределенных данных нет, код Строка длиной 10, автонумерация выключена, контроль уникальности включён, наименование длиной 100. Других объектов хранения данных не добавляйте.

  3. Добавьте единственный реквизит Артикул: Строка длиной 20, использование для групп и элементов, Индексировать. Индекс обязателен для отбора Выбрать по этому реквизиту. Табличных частей нет. Модули справочника/менеджера, подписки, регламентные задания, разделители и расширения должны быть пустыми/отсутствовать.

  4. Создайте два неглобальных общих модуля: УчебныйКаталог85 и УчебныеПримерыКаталога85, Сервер=Да, клиентские флаги=Нет, Вызов сервера=Да, привилегированный режим=Нет. В первый вставьте полный общий модуль подготовки ниже; во второй — полный основной код только одного выбранного урока. Не склеивайте разные процедуры ВыполнитьПример.

  5. Создайте собственную обработку УчебныйПульт85, управляемую форму Пульт, команду Выполнить и кнопку этой команды. В модуль формы вставьте полный отдельный модуль запуска ниже и назначьте действие команды Выполнить. Обновите конфигурацию базы, проверьте F7; до запуска вручную сверяйте настройки справочника.

  6. Данные создаёт сам урок: G01 Основной и G02 Архив в корне; A01 Книга/BOOK-A и A02 Ручка/PEN-A в Основной; B01 Книга/BOOK-B в Архив. Все пять записей существуют лишь внутри собственной транзакции. При успехе и ошибке выполняется откат; фиксации нет.

  7. Будущий ручной запуск вызывает настоящую запись пяти собственных строк в учебной базе до отката. Откат не отменяет внешние действия неизвестных обработчиков, поэтому рабочая конфигурация или её копия здесь недопустима. Запускайте одним пользователем, вне чужой транзакции; существующие данные код не удаляет.

Процедура ВыполнитьПример() Экспорт
    УчебныйКаталог85.ПроверитьСвойСтенд();
    НачатьТранзакцию();
    Попытка
        Данные = УчебныйКаталог85.ПодготовитьСвоиТовары();
        Менеджер = Справочники.УчебныеТовары;
        Выборка = Менеджер.Выбрать(Данные.G01, , , "Код Возр");
        Если ТипЗнч(Выборка) <> Тип("СправочникВыборка.УчебныеТовары") Тогда
            ВызватьИсключение "Ожидалась выборка своего справочника";
        КонецЕсли;
        Коды = Новый Массив;
        Пока Выборка.Следующий() Цикл
            Если Выборка.Родитель <> Данные.G01 Или Выборка.ЭтоГруппа Или Выборка.ПометкаУдаления
                Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> ""
                Или Выборка.Владелец <> Неопределено Или ТипЗнч(Выборка.ВерсияДанных) <> Тип("Строка") Тогда
                ВызватьИсключение "Строка выборки не соответствует собственному учебному набору";
            КонецЕсли;
            Если Не Данные.Свойство(Выборка.Код, ОжидаемаяСсылка) Или ОжидаемаяСсылка <> Выборка.Ссылка Тогда
                ВызватьИсключение "Код и ссылка своей строки расходятся";
            КонецЕсли;
            Объект = Выборка.ПолучитьОбъект();
            Если Объект = Неопределено Тогда
                ВызватьИсключение "Объект текущей строки отсутствует";
            КонецЕсли;
            Если Объект.Ссылка <> Выборка.Ссылка Или Объект.Наименование <> Выборка.Наименование
                Или Объект.ВерсияДанных <> Выборка.ВерсияДанных Тогда
                ВызватьИсключение "Прочитанный объект не соответствует текущей строке выборки";
            КонецЕсли;
            Сообщить(Выборка.Код + ": " + Выборка.Наименование + "; артикул " + Объект.Артикул);
            Коды.Добавить(Выборка.Код);
        КонецЦикла;
        Если Коды.Количество() <> 2 Или СтрСоединить(Коды, ",") <> "A01,A02" Тогда
            ВызватьИсключение "Ожидались только два непосредственных потомка G01";
        КонецЕсли;
        Отбор = Новый Структура("Артикул", "BOOK-A");
        Отобранные = Менеджер.Выбрать(, , Отбор, "Код Возр");
        Если Не Отобранные.Следующий() Тогда
            ВызватьИсключение "Книга BOOK-A не найдена";
        КонецЕсли;
        Если Отобранные.Ссылка <> Данные.A01 Или Отобранные.Следующий() Тогда
            ВызватьИсключение "Ожидалась единственная книга BOOK-A";
        КонецЕсли;
        Корень = Менеджер.Выбрать(Данные.Пустая, , , "Код Возр");
        Группы = Новый Массив;
        Пока Корень.Следующий() Цикл
            Если Не Корень.ЭтоГруппа Тогда
                ВызватьИсключение "В своём корне подготовлены только группы";
            КонецЕсли;
            Группы.Добавить(Корень.Код);
        КонецЦикла;
        Если СтрСоединить(Группы, ",") <> "G01,G02" Тогда
            ВызватьИсключение "Пустая ссылка должна ограничить выборку корнем";
        КонецЕсли;
        ОтменитьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    УчебныйКаталог85.ПроверитьОткат(Данные);
    Сообщить("Собственные пять строк отменены; учебный справочник снова пуст");
КонецПроцедуры
УчебныйКаталог85

УчебныеВыборкиКаталога85 → Общие → Общие модули → УчебныйКаталог85

Полный серверный общий модуль: защита стенда, подготовка пяти записей и проверка отката. Не выполнялся.

Процедура ПроверитьСвойСтенд() Экспорт
    Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Каталог = Метаданные.Справочники[0];
    Если Каталог.Имя <> "УчебныеТовары" Или Не Каталог.Иерархический
        Или Каталог.Реквизиты.Количество() <> 1 Или Каталог.Реквизиты.Найти("Артикул") = Неопределено Тогда
        ВызватьИсключение "Нужен собственный иерархический справочник с единственным реквизитом Артикул";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция ПодготовитьСвоиТовары() Экспорт
    Если Не ТранзакцияАктивна() Тогда
        ВызватьИсключение "Подготовка допустима только внутри собственной отменяемой транзакции";
    КонецЕсли;
    ПроверкаПустоты = Справочники.УчебныеТовары.Выбрать();
    Если ПроверкаПустоты.Следующий() Тогда
        ВызватьИсключение "Учебный справочник должен быть пуст; чужие записи не изменяются";
    КонецЕсли;
    Пустая = Справочники.УчебныеТовары.ПустаяСсылка();
    Данные = Новый Структура;
    Данные.Вставить("G01", СоздатьСвоюСтроку("G01", "Основной", "GROUP-A", Пустая, Истина));
    Данные.Вставить("G02", СоздатьСвоюСтроку("G02", "Архив", "GROUP-B", Пустая, Истина));
    Данные.Вставить("A01", СоздатьСвоюСтроку("A01", "Книга", "BOOK-A", Данные.G01, Ложь));
    Данные.Вставить("A02", СоздатьСвоюСтроку("A02", "Ручка", "PEN-A", Данные.G01, Ложь));
    Данные.Вставить("B01", СоздатьСвоюСтроку("B01", "Книга", "BOOK-B", Данные.G02, Ложь));
    Данные.Вставить("Пустая", Пустая);
    Возврат Данные;
КонецФункции

Функция СоздатьСвоюСтроку(Код, Наименование, Артикул, Родитель, Группа)
    Если Группа Тогда
        Объект = Справочники.УчебныеТовары.СоздатьГруппу();
    Иначе
        Объект = Справочники.УчебныеТовары.СоздатьЭлемент();
    КонецЕсли;
    Ссылка = Справочники.УчебныеТовары.ПолучитьСсылку(Новый УникальныйИдентификатор);
    Объект.УстановитьСсылкуНового(Ссылка);
    Объект.Код = Код;
    Объект.Наименование = Наименование;
    Объект.Артикул = Артикул;
    Объект.Родитель = Родитель;
    Объект.Записать();
    Прочитанный = Ссылка.ПолучитьОбъект();
    Если Прочитанный = Неопределено Тогда
        ВызватьИсключение "Собственная учебная запись не прочитана";
    КонецЕсли;
    Если Прочитанный.Код <> Код Или Прочитанный.Наименование <> Наименование
        Или Прочитанный.Артикул <> Артикул Или Прочитанный.Родитель <> Родитель
        Или Прочитанный.ЭтоГруппа <> Группа Тогда
        ВызватьИсключение "Прочитанная учебная строка отличается от подготовленной";
    КонецЕсли;
    Возврат Ссылка;
КонецФункции

Процедура ПроверитьОткат(Данные) Экспорт
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Собственная транзакция не завершена";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("G01,G02,A01,A02,B01", ",") Цикл
        Если Данные[Имя].ПолучитьОбъект() <> Неопределено Тогда
            ВызватьИсключение "Собственная запись осталась после отката: " + Имя;
        КонецЕсли;
    КонецЦикла;
    ПроверкаПустоты = Справочники.УчебныеТовары.Выбрать();
    Если ПроверкаПустоты.Следующий() Тогда
        ВызватьИсключение "После отката справочник не пуст";
    КонецЕсли;
КонецПроцедуры
УчебныйПульт85.Пульт

УчебныеВыборкиКаталога85 → Обработки → УчебныйПульт85 → Формы → Пульт → Модуль

Полный модуль управляемой формы только собственной обработки. Не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеПримерыКаталога85.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. Выбрать(G01) ограничивает непосредственным родителем, а не всем деревом. Четвёртый параметр Код Возр задаёт проверяемый порядок A01,A02; второй параметр владельца пропущен, поскольку справочник неподчинённый.

  2. После получения выборки обязательно Следующий: только успешное позиционирование разрешает читать текущую строку. Выборка читает базу порциями, это не готовый массив всех записей.

  3. Код, Наименование и Ссылка сверяются с собственным набором. Родитель равен G01; ЭтоГруппа, ПометкаУдаления и Предопределенный ложны; ИмяПредопределенныхДанных пустое. Свойства выборки доступны только для чтения.

  4. Владелец равен Неопределено именно у неподчинённого справочника. Это не пустая ссылка владельца и не пример выбора подчинённых объектов.

  5. ВерсияДанных — служебная строка, не версия платформы и не бизнес-номер. На своём неизменяемом наборе сравниваем её с только что прочитанным объектом; конкретное содержимое не фиксируем.

  6. ПолучитьОбъект возвращает объект текущей записи либо Неопределено, поэтому сначала проверяем отсутствие. Читаем из него собственный Артикул, но не меняем и не записываем объект.

  7. Отбор содержит только один ключ Артикул. Индексирование задано в подготовке; два поля отбора через эту структуру добавлять нельзя — для сложного условия нужен запрос.

  8. Выбрать(ПустаяСсылка) выбирает корень, тогда как пропущенный родитель не ограничивает уровень. По окончании и при исключении пять собственных записей откатываются.

Как проверить результат

  1. Ожидаются строки A01: Книга; артикул BOOK-A и A02: Ручка; артикул PEN-A. Контрольные проверки подтверждают A01,A02, единственную BOOK-A и корень G01,G02.

  2. После сообщения об откате список снова пуст. Убедитесь в этом в своём учебном списке; код дополнительно проверяет отсутствие всех пяти собственных ссылок.

  3. Для проверки ошибки в копии урока поменяйте ожидаемую строку A01,A02 на A02,A01, не порядок метода. Должно быть исключение с откатом, а не успешное сообщение.

Ожидаемый результат

Прочитаны две строки группы, одна строка индексированного отбора и две группы корня; все пять подготовленных записей отменены. runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Не присваивайте свойства выборки: они readonly. Изменения записывают через объект и только в отдельной разрешённой задаче; этот урок этого не делает.

  2. Нельзя читать поля после Следующий=Ложь. В большой или многопользовательской базе конкурентные изменения требуют отдельной модели согласованности.

  3. Сравнение ВерсияДанных здесь проверяет свой неизменяемый набор, а не заменяет механизм блокировок.

  4. Индекс и ограниченная длина артикула обязательны; произвольный неиндексированный реквизит для Выбрать недопустим.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.