На ссылках двух собственных субсчетов видно отличие строки кода, результата ПолучитьПорядокКода и ручного Порядок. Дополнительно проверяется собственная иерархия без проводок.
Где и как запускать
Полный серверный модуль своей НОВОЙ пустой учебной конфигурации по подготовке; платформа 8.5.1.1343. При записи всегда откат, рабочие данные не используются. Здесь не запускался.
Подготовка
Создайте НОВУЮ пустую файловую базу, корневое имя УчебныйУчет85. В рабочей БП/КА2/УТ/УНФ эти задачи не запускайте. Это технический пример API, не готовый бухгалтерский учёт.
Планы видов характеристик → Добавить: УчебныеАналитики85. Тип значения только Строка 30. Элементы, дополнительные реквизиты, табличные части и предопределённые значения не создавайте.
Планы счетов → Добавить: УчебныеСчета85. ДлинаКода 10, МаскаКода @@@.@@@.@@, ДлинаНаименования 100, ДлинаПорядка 20. АвтоПорядокПоКоду выключен, КонтрольУникальности включён. ВидыСубконто=УчебныеАналитики85, МаксКоличествоСубконто=2.
У плана нет пользовательских реквизитов/табличных частей, признаков учёта и предопределённых счетов. История выключена, регистров бухгалтерии, проводок и реальных остатков нет. Это технический опыт типов, не методология учёта.
Опыт с маской @@@.@@@.@@ использует строковые коды. Не переносите его сравнения на иной числовой/немаскированный план. АвтоПорядокПоКоду выключен: Порядок хранится отдельно от кода.
Модули собственных объектов/менеджеров пустые, подписок, расширений и внешних действий нет. Не используйте рабочую базу или её копию с действующими обработчиками.
Код здесь в 1С не запускался. HTML показывает урок: проверены исходники и установленная справка именно 8.5.1.1343, но запись/открытие формы в ваших базах не выполнялись.
Ссылка идентифицирует запись, объект служит для её изменения. Свойства ссылки readonly, ВерсияДанных — непрозрачная строка, не номер версии конфигурации.
Непустая плановая ссылка не подтверждает существование записи; перед чтением данных отсутствующая запись исключается отдельно.
В собственной базе создайте серверный общий модуль УчебныеСсылкиПланов, вставьте ВЕСЬ модуль одного урока. ВыполнитьПример() Экспорт вызывайте из собственной процедуры формы с &НаСервереБезКонтекста. Обновите конфигурацию БД.
Опыт записи допускается только вне чужой транзакции. Внутри своей транзакции создаются исключительно новые собственные записи; при успехе и ошибке выполняется откат. Не заменяйте его фиксацией.
Записанные собственные ссылки запоминаются сразу после записи. После отмены каждая проверяется на ПолучитьОбъект=Неопределено. Никакого удаления по имени, первой строке или всей коллекции нет.
Процедура ВыполнитьПример() Экспорт
Описание = Метаданные.ПланыСчетов.Найти("УчебныеСчета85");
Если Описание = Неопределено Тогда
ВызватьИсключение "Сначала создайте собственный план УчебныеСчета85";
КонецЕсли;
Если Описание.ДлинаКода <> 10 Или Описание.ДлинаНаименования <> 100
Или Описание.ДлинаПорядка <> 20 Или Описание.МаскаКода <> "@@@.@@@.@@"
Или Описание.АвтоПорядокПоКоду Или Описание.МаксКоличествоСубконто <> 2 Тогда
ВызватьИсключение "Настройки учебного плана не соответствуют подготовке";
КонецЕсли;
Если Описание.ВидыСубконто = Неопределено Тогда
ВызватьИсключение "Назначьте собственный план аналитик";
КонецЕсли;
Если Описание.ВидыСубконто.Имя <> "УчебныеАналитики85" Тогда
ВызватьИсключение "Нужны только собственные учебные аналитики";
КонецЕсли;
Менеджер = ПланыСчетов.УчебныеСчета85;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Не запускайте урок внутри чужой транзакции";
КонецЕсли;
СозданныеСсылки = Новый Массив;
НачатьТранзакцию();
Попытка
Для Каждого СвойКод Из СтрРазделить("41,41.2,41.10", ",") Цикл
Найденная = Менеджер.НайтиПоКоду(СвойКод);
Если Найденная <> Неопределено Тогда
Если Не Найденная.Пустая() Тогда
ВызватьИсключение "Один из собственных кодов опыта занят, не используйте существующий счёт";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Корень = Менеджер.СоздатьСчет();
Корень.Код = "41";
Корень.Наименование = "Собственный корень структуры";
Корень.Вид = ВидСчета.Активный;
Корень.Порядок = "ROOT";
Корень.Записать();
СозданныеСсылки.Добавить(Корень.Ссылка);
Второй = Менеджер.СоздатьСчет();
Второй.Код = "41.2";
Второй.Наименование = "Собственный субсчёт 2";
Второй.Вид = ВидСчета.Активный;
Второй.Родитель = Корень.Ссылка;
Второй.Порядок = "SECOND";
Второй.Записать();
СозданныеСсылки.Добавить(Второй.Ссылка);
Десятый = Менеджер.СоздатьСчет();
Десятый.Код = "41.10";
Десятый.Наименование = "Собственный субсчёт 10";
Десятый.Вид = ВидСчета.Активный;
Десятый.Родитель = Корень.Ссылка;
Десятый.Порядок = "TENTH";
Десятый.Записать();
СозданныеСсылки.Добавить(Десятый.Ссылка);
СсылкаКорня = Корень.Ссылка;
СсылкаВторого = Второй.Ссылка;
СсылкаДесятого = Десятый.Ссылка;
Сообщить(СсылкаВторого.ПолучитьПорядокКода() = " 41. 2");
Сообщить(СсылкаДесятого.ПолучитьПорядокКода() = " 41. 10");
Сообщить(СсылкаВторого.Порядок = "SECOND");
Список = Новый ТаблицаЗначений;
Список.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Список.Колонки.Добавить("ПорядокКода", Новый ОписаниеТипов("Строка"));
СтрокаСписка = Список.Добавить();
СтрокаСписка.Код = СсылкаВторого.Код;
СтрокаСписка.ПорядокКода = СсылкаВторого.ПолучитьПорядокКода();
СтрокаСписка = Список.Добавить();
СтрокаСписка.Код = СсылкаДесятого.Код;
СтрокаСписка.ПорядокКода = СсылкаДесятого.ПолучитьПорядокКода();
Список.Сортировать("Код Возр");
Сообщить(Список[0].Код = "41.10");
Список.Сортировать("ПорядокКода Возр");
Сообщить(Список[0].Код = "41.2");
Сообщить(Список[1].Код = "41.10");
Сообщить(СсылкаКорня.Уровень() = 0);
Сообщить(СсылкаВторого.Уровень() = 1 И СсылкаДесятого.Уровень() = 1);
Сообщить(СсылкаВторого.ПринадлежитЭлементу(СсылкаКорня));
Сообщить(Не СсылкаВторого.ПринадлежитЭлементу(СсылкаВторого));
Сообщить(СсылкаДесятого.Родитель = СсылкаКорня);
ОтменитьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Сообщить(Не ТранзакцияАктивна());
Для Каждого СозданнаяСсылка Из СозданныеСсылки Цикл
Сообщить(СозданнаяСсылка.ПолучитьОбъект() = Неопределено);
КонецЦикла;
КонецПроцедурыРазбор по шагам
Проверить, что свои три кода свободны; все записи новые, не предопределённые.
Временно записать свой корень 41 и двух детей 41.2/41.10, запомнить каждую ссылку.
Вызвать ПолучитьПорядокКода именно на ссылках. Маска @@@.@@@.@@ прижимает числовые части вправо пробелами.
Создать собственную таблицу из двух строк и сравнить обычную сортировку кода с сортировкой выровненного порядка кода.
Проверить, что ручной Порядок SECOND не подменён автоматически; АвтоПорядокПоКоду выключен.
Проверить уровни 0/1, принадлежность корню и отсутствие принадлежности самому себе.
Отменить все три собственные записи и проверить их отсутствие.
Как проверить результат
Одиннадцать сравнений сортировки/иерархии Истина.
По коду сначала 41.10, по ПорядокКода сначала 41.2.
После отката три собственных определения отсутствуют; денежных движений нет.
Ожидаемый результат
Условие маски, сортировка и методы иерархии ссылки применены на полном собственном дереве счетов.
На что обратить внимание
Прикладной Тип существует только после создания указанных собственных метаданных. В функциональный Новый массив передаёт аргументы конструктора.
Свойства ссылки не присваиваются. Для изменения копии используется именно новый объект, который возвращает Скопировать.
Уровень пустой ссылки вызывает исключение; иерархические методы используются только у записанных собственных объектов внутри транзакции.
Откат БД не отменяет внешние действия обработчиков. Поэтому конфигурация пустая, модули/подписки без сети, печати, файлов и почты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.