Проверить путь товара через две собственные группы

Учебные задачи

В одной отменяемой транзакции создаём Бумага → Книги → Учебная книга. Полное наименование, полный код, уровень и принадлежность читают именно это дерево.

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

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

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

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

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

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

  6. Запускайте строго в новой пустой базе Учебная85, с пустыми модулями объектов и без подписок. Здесь временно записываются только созданные самим примером объекты.

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

  8. Откат базы не отменяет письма, HTTP-запросы и другие внешние действия обработчиков. Поэтому копия рабочей конфигурации с неизвестными обработчиками не заменяет эту подготовку.


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

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

  1. СоздатьГруппу создаёт группы, СоздатьЭлемент — товар. Родитель всегда получает ссылку, не объект группы.

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

  3. УстановитьНовыйКод вычисляет следующий код с префиксом У. Не ожидаем конкретный числовой суффикс.

  4. Полные представления включают всех родителей слева направо через /. Уровень корня 0, вложенной группы 1, товара 2.

  5. ПринадлежитЭлементу учитывает все уровни; сам объект не считается подчинённым самому себе. Все три записи намеренно откатываются.

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

  1. Девять сравнений в транзакции Истина. После неё ещё два: транзакция закрыта, собственный товар отсутствует.

  2. В списке не осталось созданных этим запуском групп Бумага и Книги.

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

Проверена реальная иерархия временно записанных учебных объектов с откатом.

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

  1. Не используйте этот урок в типовой базе или при ограничении иерархии, запрещающем такой уровень.

  2. ПолныйКод — представление пути, не новый уникальный код для обмена.

  3. Фиксированные наименования не используются для поиска/удаления существующих групп.

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

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

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

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

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