Прежде чем писать код — выберите нужный паттерн. Ошибка в выборе приводит либо к дублям, либо к пропущенным обновлениям.
Ensure — найти или создать
Главный паттерн всей библиотеки. Ensure(Name, Description, Attrs)
сначала ищет по наименованию.
Нашёл — возвращает ссылку, ничего не трогает. Не нашёл — создаёт с переданными реквизитами и возвращает
новую ссылку.
Реквизиты Attrs применяются только при создании.
Ссылка = Справочники.Номенклатура .НайтиПоНаименованию("Квартира 101", Истина); Если НЕ ЗначениеЗаполнено(Ссылка) Тогда НовЭл = Справочники.Номенклатура .СоздатьЭлемент(); НовЭл.Наименование = "Квартира 101"; НовЭл.Родитель = ГрКвартиры; НовЭл.Записать(); Ссылка = НовЭл.Ссылка; КонецЕсли;
Ссылка = A1sCatalogs.Ensure( "Номенклатура", "Квартира 101", A1sDS.Of( "Родитель", ГрКвартиры));
// ── Базовый вариант: только наименование ────────────────────────────────── Орг = A1sCatalogs.Ensure("Организации", "ООО Ромашка"); // ── С реквизитами: передаются только при СОЗДАНИИ, при нахождении — игнорируются Кв101 = A1sCatalogs.Ensure( "Номенклатура", "Квартира 101", A1sDS.Of( "Родитель", ГрКвартиры, "ВидНоменклатуры", ВидКвартира, "ЕдиницаИзмерения", ЕдШт, "Площадь", 42.5, "Этаж", 3)); // ── Контрагент с ИНН ────────────────────────────────────────────────────── Покупатель = A1sCatalogs.Ensure( "Контрагенты", "ООО СтройГрупп", A1sDS.Of( "ИНН", "7707083893", "КПП", "770701001", "ВидКонтрагента", ВидЮрЛицо)); // ── Нечёткий поиск: ExactMatch = Ложь ──────────────────────────────────── // Найдёт "Квартира 101 (корпус А)" по подстроке "Квартира 101" НечёткаяСсылка = A1sCatalogs.Ensure( "Номенклатура", "Квартира 101", Неопределено, // без доп. реквизитов Ложь); // ExactMatch = Ложь // ── В цикле: загрузка массива из Excel ─────────────────────────────────── Для Каждого СтрЭксель Из ДанныеExcel Цикл Ссылка = A1sCatalogs.Ensure( "Номенклатура", СтрЭксель.Наименование, A1sDS.Of( "Родитель", ГрКвартиры, "Площадь", СтрЭксель.Площадь)); Сообщить(СтрЭксель.Наименование + " → " + Ссылка); КонецЦикла;
EnsureBatch — он работает так же, но за один вызов. Подробнее в
рецепте 3.EnsureGroup — создать структуру папок
EnsureGroup(Name, Description, Parent?)
— то же самое, что Ensure, но для групп.
Ищет среди групп по наименованию, создаёт если не найдена.
Вкладывать можно на любую глубину.
// ── Простая группа на верхнем уровне ───────────────────────────────────── ГрКвартиры = A1sCatalogs.EnsureGroup( "Номенклатура", "Квартиры"); // ── Вложенная группа: корпус → этаж ────────────────────────────────────── ГрКорпусА = A1sCatalogs.EnsureGroup( "Номенклатура", "Корпус А", ГрКвартиры); // родитель — уже созданная группа ГрЭтаж3 = A1sCatalogs.EnsureGroup( "Номенклатура", "Этаж 3", ГрКорпусА); // ── Создать дерево за один раз: универсальная утилита ───────────────────── // Паттерн: строим полное дерево групп перед массовой загрузкой Дерево = A1sDS.Of( "Квартиры", Неопределено, // корень "Услуги", Неопределено, "НомГруппы", Неопределено); Для Каждого КЗ Из Дерево Цикл КЗ.Значение = A1sCatalogs.EnsureGroup("Номенклатура", КЗ.Ключ); КонецЦикла; // Дерево.Квартиры → ссылка на группу "Квартиры" // ── EnsureGroup для номенклатурных групп (документы) ───────────────────── ГрПроживание = A1sCatalogs.EnsureGroup("НоменклатурныеГруппы", "ПРОЖИВАНИЕ"); ГрПитание = A1sCatalogs.EnsureGroup("НоменклатурныеГруппы", "ПИТАНИЕ"); ГрКоммунальные = A1sCatalogs.EnsureGroup("НоменклатурныеГруппы", "КОММУНАЛЬНЫЕ УСЛУГИ");
EnsureBatch — массово, одной командой
EnsureBatch(Name, Descriptions, Attrs?)
принимает массив наименований и возвращает массив ссылок
в том же порядке. Для каждого — find-or-create. Общие реквизиты Attrs применяются ко всем новым
элементам.
// ── Простой вариант: только имена ───────────────────────────────────────── Имена = A1sAR.Of( "Квартира 101", "Квартира 102", "Квартира 103", "Квартира 201"); Ссылки = A1sCatalogs.EnsureBatch("Номенклатура", Имена); // Ссылки[0] → ссылка на "Квартира 101" // Ссылки[1] → ссылка на "Квартира 102" и т.д. // Порядок сохраняется! // ── С общими реквизитами для всех создаваемых ──────────────────────────── Ссылки = A1sCatalogs.EnsureBatch( "Номенклатура", A1sAR.Of("Квартира 301", "Квартира 302", "Квартира 303"), A1sDS.Of( "Родитель", ГрКвартиры, // одинаково для всех "ВидНоменклатуры", ВидКвартира, "ЕдиницаИзмерения", ЕдШт)); // ── Практика: сразу назначить ссылки переменным ────────────────────────── НомГруппы = A1sCatalogs.EnsureBatch( "НоменклатурныеГруппы", A1sAR.Of("ПРОЖИВАНИЕ", "ПИТАНИЕ", "ПРОЧИЕ УСЛУГИ")); ГрПроживание = НомГруппы[0]; ГрПитание = НомГруппы[1]; ГрПрочие = НомГруппы[2]; // ── EnsureBatch из столбца Excel ───────────────────────────────────────── // ДанныеExcel — массив структур, колонка "Номенклатура" содержит имена ИменаНом = Новый Массив; Для Каждого Стр Из ДанныеExcel Цикл ИменаНом.Добавить(Стр.Номенклатура); КонецЦикла; ИменаНом = A1sAR.RemoveDuplicates(ИменаНом); // убрать дубли перед созданием СсылкиНом = A1sCatalogs.EnsureBatch("Номенклатура", ИменаНом, A1sDS.Of("Родитель", ГрКвартиры));
EnsureBatch удобнее
читается и проще поддерживать. При 50+ записях разница в производительности несущественна (оба делают N
запросов), но при 1000+ — уже имеет смысл разбивать на Chunk из Части 1.EnsureByType — data-driven без хардкода
Суперсила библиотеки. EnsureByType(TypeValue, Description)
получает тип реквизита из метаданных
и сам определяет, в какой справочник нужно обратиться. Код не содержит строки "Номенклатура"
или "Контрагенты" — он читает это из метаданных конфигурации.
// Имя справочника прибито гвоздями Ном = A1sCatalogs.Ensure( "Номенклатура", // ← строка СтрокаJSON.item); // При смене документа — переписывать
// Тип берётся из метаданных ТЧ Тип = A1sDocs.TabAttrType( "ВыпускПродукцииУслуг", "Продукция", "Номенклатура"); Ном = A1sCatalogs.EnsureByType( Тип, СтрокаJSON.item);
// ── Получить тип реквизита из метаданных ───────────────────────────────── // A1sDocs.TabAttrType возвращает ОписаниеТипов реквизита ТЧ ТипНоменклатуры = A1sDocs.TabAttrType( "ВыпускПродукцииУслуг", // документ "Продукция", // ТЧ "Номенклатура"); // реквизит // ТипНоменклатуры содержит "СправочникСсылка.Номенклатура" // EnsureByType сам это распарсит — мы не пишем "Номенклатура" в коде // ── Теперь создаём ссылку, не зная имени справочника ───────────────────── Ссылка = A1sCatalogs.EnsureByType(ТипНоменклатуры, "Квартира 101"); // ── Практика: универсальный загрузчик строк ТЧ ─────────────────────────── // Этот код работает с ЛЮБЫМ документом и ЛЮБОЙ ТЧ // Не нужно переписывать при добавлении нового вида документа ИмяДокумента = "ВыпускПродукцииУслуг"; ИмяТЧ = "Продукция"; // Получаем схему ТЧ — имена и типы всех реквизитов СхемаТЧ = A1sDocs.TabSchema(ИмяДокумента, ИмяТЧ); // → массив структур: [{Имя:"Номенклатура", Тип:ОписаниеТипов, ЭтоСсылка:Истина}, ...] Для Каждого СтрокаJSON Из ДанныеJSON Цикл СтрокаДляДока = Новый Структура; Для Каждого Поле Из СхемаТЧ Цикл Значение = СтрокаJSON[Поле.Имя]; Если Поле.ЭтоСсылка И ТипЗнч(Значение) = Тип("Строка") Тогда // Строковое значение ссылочного поля → EnsureByType Значение = A1sCatalogs.EnsureByType(Поле.Тип, Значение); КонецЕсли; СтрокаДляДока.Вставить(Поле.Имя, Значение); КонецЦикла; A1sDocs.AddRow(Dok, ИмяТЧ, СтрокаДляДока); КонецЦикла;
EnsureUpdate — upsert для регулярной синхронизации
В отличие от Ensure (который при нахождении ничего не делает), EnsureUpdate
всегда обновляет реквизиты найденного элемента. Идеальный выбор для синхронизации прайс-листов,
справочников из CRM, ГИС ЖКХ.
// ── Сценарий: прайс-лист от застройщика приходит раз в неделю ──────────── // Нужно: обновить цены существующих квартир, добавить новые ПрайсЛист = /* ... массив структур из файла CSV ... */; Счётчик = A1sDS.OfKeys("Обновлено, Создано, Ошибок", 0); Для Каждого Позиция Из ПрайсЛист Цикл Попытка A1sCatalogs.EnsureUpdate( "Номенклатура", Позиция.Наименование, A1sDS.Of( "Цена", Позиция.Цена, // обновится всегда "Площадь", Позиция.Площадь, "Статус", Позиция.Статус, "Родитель", ГрКвартиры)); // для новых Счётчик.Обновлено = Счётчик.Обновлено + 1; Исключение Счётчик.Ошибок = Счётчик.Ошибок + 1; Сообщить("Ошибка: " + Позиция.Наименование + " — " + ОписаниеОшибки()); КонецПопытки; КонецЦикла; Сообщить("Синхронизация завершена: обновлено " + Счётчик.Обновлено + ", ошибок: " + Счётчик.Ошибок); // ── Разница между Ensure и EnsureUpdate ────────────────────────────────── // Ensure: нашёл "Квартира 101" → вернул ссылку, Цена НЕ изменилась // EnsureUpdate: нашёл "Квартира 101" → обновил Цену = 3750000, вернул ссылку // ── AutoResolve: автоматически разрешать строки в ссылки ───────────────── A1sCatalogs.EnsureUpdate( "Номенклатура", "Квартира 101", A1sDS.Of( "ВидНоменклатуры", "Квартира"), // строка → найдёт ссылку сам Истина, // ExactMatch Истина); // AutoResolve = Истина
ByName · ByAttr · ByCode — простой точечный поиск
Три функции для точечного поиска — каждая делает один запрос и возвращает одну ссылку. Если ничего не найдено — возвращается пустая ссылка (не ошибка).
// ── ByName: найти по наименованию ──────────────────────────────────────── Ном = A1sCatalogs.ByName("Номенклатура", "Квартира 101"); // С родителем — ищет только в конкретной группе Ном = A1sCatalogs.ByName("Номенклатура", "Квартира 101", ГрКорпусА); // Нечёткий поиск (подстрока) Ном = A1sCatalogs.ByName("Номенклатура", "Квартира 1", Неопределено, Ложь); // ── ByCode: найти по коду ───────────────────────────────────────────────── Валюта = A1sCatalogs.ByCode("Валюты", "840"); // USD Ном = A1sCatalogs.ByCode("Номенклатура", "000101"); // ── ByAttr: найти по любому реквизиту ──────────────────────────────────── Контрагент = A1sCatalogs.ByAttr("Контрагенты", "ИНН", "7707083893"); Сотрудник = A1sCatalogs.ByAttr("Сотрудники", "Табельный", "ТБ-0042"); // ── ByGUID: найти по GUID-строке (из внешней системы) ──────────────────── Элемент = A1sCatalogs.ByGUID("Номенклатура", "12345678-1234-5678-1234-567812345678"); // ── ByNameList: список имён через запятую → массив ссылок ───────────────── Валюты = A1sCatalogs.ByNameList("Валюты", "USD,EUR,CNY"); // → [СправочникСсылка.Валюты, ...] — только найденные // ── Проверить перед использованием ─────────────────────────────────────── Ном = A1sCatalogs.ByName("Номенклатура", "Квартира 999"); Если НЕ ЗначениеЗаполнено(Ном) Тогда Сообщить("Квартира 999 не найдена в справочнике"); КонецЕсли;
PickByName · PickByAttr — массовый поиск одним запросом
PickByName и
PickByAttr
принимают массив значений и возвращают массив найденных ссылок.
Не найденные элементы — пропускаются. Отличие от EnsureBatch — ничего не создаёт.
// ── PickByName: массив имён → массив ссылок (только найденные) ─────────── НомГруппы = A1sCatalogs.PickByName( "НоменклатурныеГруппы", A1sAR.Of("ПРОЖИВАНИЕ", "ПИТАНИЕ", "ПРОЧИЕ УСЛУГИ")); // → [СсылкаПроживание, СсылкаПитание, СсылкаПрочие] // Если "ПРОЧИЕ УСЛУГИ" нет в базе — в массиве будет только 2 элемента // ── PickByCode: массив кодов → массив ссылок ───────────────────────────── Товары = A1sCatalogs.PickByCode( "Номенклатура", A1sAR.Of("000101", "000102", "000103")); // ── PickByAttr: по значениям произвольного реквизита ───────────────────── Контрагенты = A1sCatalogs.PickByAttr( "Контрагенты", "ИНН", A1sAR.Of("7701234567", "7707654321", "7709999999")); // ── PickPredefined: предопределённые элементы по именам ────────────────── ВидыНом = A1sCatalogs.PickPredefined( "ВидыНоменклатуры", A1sAR.Of("Товар", "Услуга", "Работа")); // Обращается к Справочники.ВидыНоменклатуры.Товар и т.д. // ── Практика: быстро получить нужные ссылки перед циклом загрузки ───────── // Вместо: внутри цикла каждый раз искать ЕдиницаИзмерения... ЕдИзмерения = A1sCatalogs.PickByName( "КлассификаторЕдиницИзмерения", A1sAR.Of("шт", "м2", "м3", "усл")); // ЕдИзмерения[0] → шт, [1] → м2, [2] → м3, [3] → усл // Теперь используем в цикле без лишних запросов
Refs · Count · Exists — запросы без написания запросов
Три функции для произвольных запросов к справочникам. Вы передаёте только условие WHERE и параметры — функция строит и выполняет запрос сама.
// ── Refs: массив ссылок с условием ─────────────────────────────────────── АктивныеКвартиры = A1sCatalogs.Refs( "Номенклатура", "НЕ ПометкаУдаления И Родитель = &Группа И Статус = &Статус", A1sDS.Of("Группа", ГрКвартиры, "Статус", СтатусАктив), "Наименование"); // OrderBy — сортировка // Без параметров — все элементы справочника ВсяНоменклатура = A1sCatalogs.Refs("Номенклатура"); // ── Count: подсчёт элементов ────────────────────────────────────────────── КолвоКвартир = A1sCatalogs.Count( "Номенклатура", "Родитель = &Гр И НЕ ПометкаУдаления", A1sDS.Of("Гр", ГрКвартиры)); Сообщить("Квартир в группе: " + КолвоКвартир); // ── Exists: есть ли хоть один? ──────────────────────────────────────────── ЕстьСпецПредложения = A1sCatalogs.Exists( "Номенклатура", "СпецПредложение = Истина И НЕ ПометкаУдаления"); Если НЕ ЕстьСпецПредложения Тогда Сообщить("Нет активных спецпредложений"); КонецЕсли; // ── TopLevelItems: элементы верхнего уровня ─────────────────────────────── ВерхнийУровень = A1sCatalogs.TopLevelItems("Номенклатура"); // с группами ТолькоЭлементы = A1sCatalogs.TopLevelItems("Номенклатура", Ложь); // без групп // ── AllInGroup: все элементы в группе ──────────────────────────────────── КвартирыКорпусА = A1sCatalogs.AllInGroup("Номенклатура", ГрКорпусА); // с вложенными ТолькоПрямые = A1sCatalogs.AllInGroup("Номенклатура", ГрКорпусА, Ложь); // только прямые // ── AllByOwner: подчинённый справочник по владельцу ─────────────────────── ДоговорыКонтрагента = A1sCatalogs.AllByOwner("ДоговорыКонтрагентов", КонтрагентСсылка);
"Родитель = &Гр", не
"ГДЕ Родитель = &Гр". Слово ГДЕ функция добавит сама. Параметры запроса — через
A1sDS.Of.
Update · UpdateAll — обновить реквизиты
Update
принимает ссылку и структуру полей — открывает объект, заполняет, записывает.
UpdateAll
делает то же самое для массива. Оба возвращают {Success, Failed}.
// ── Update: один элемент, несколько реквизитов ──────────────────────────── A1sCatalogs.Update( НомСсылка, A1sDS.Of( "Цена", 3750000, "Статус", СтатусАктив, "Площадь", 42.5)); // Старый стиль — одно поле (обратная совместимость) A1sCatalogs.Update(НомСсылка, "Цена", 3750000); // Без немедленной записи (DoWrite=Ложь) — для пакетных операций A1sCatalogs.Update(НомСсылка, A1sDS.Of("Цена", 4000000), Ложь); // ── UpdateAll: массив элементов, одинаковые изменения ───────────────────── ВсеКвартирыКорпусА = A1sCatalogs.AllInGroup("Номенклатура", ГрКорпусА); Итог = A1sCatalogs.UpdateAll( ВсеКвартирыКорпусА, A1sDS.Of( "Статус", СтатусСдан, "ДатаСдачи", ТекущаяДата(), "ЭтапСтроительства", ЭтапСдан)); Сообщить("Обновлено: " + Итог.Success.Количество()); Сообщить("С ошибками: " + Итог.Failed.Количество()); // ── Старый стиль UpdateAll — одно поле для всего массива ───────────────── A1sCatalogs.UpdateAll(СписокЭлементов, "Ответственный", НовыйОтветственный);
Move · MarkForDeletion — перемещение и удаление
// ── Move: переместить элемент в другую группу ───────────────────────────── A1sCatalogs.Move(НомСсылка, НоваяГруппа); // ── MoveBatch: переместить массив элементов в одну группу ──────────────── КвартирыЭтаж3 = A1sCatalogs.Refs( "Номенклатура", "Этаж = 3 И Родитель = &Гр", A1sDS.Of("Гр", ГрКорпусА)); Итог = A1sCatalogs.MoveBatch(КвартирыЭтаж3, ГрЭтаж3КорпусА); Сообщить("Перемещено: " + Итог.Success.Количество()); // ── MarkForDeletion: пометить один элемент ──────────────────────────────── A1sCatalogs.MarkForDeletion(УстаревшаяНом); // пометить A1sCatalogs.MarkForDeletion(УстаревшаяНом, Ложь); // снять пометку // ── MarkForDeletionBatch: пометить массив ────────────────────────────────── УстаревшиеКвартиры = A1sCatalogs.Refs( "Номенклатура", "Статус = &С И Год < &Г", A1sDS.Of("С", СтатусАрхив, "Г", 2020)); Итог = A1sCatalogs.MarkForDeletionBatch(УстаревшиеКвартиры); Сообщить("Помечено на удаление: " + Итог.Success.Количество() + ", ошибок: " + Итог.Failed.Количество());
Parent · Children · Level · Path — навигация по дереву
// ── Parent: родительская группа ─────────────────────────────────────────── Группа = A1sCatalogs.Parent(НомСсылка); Сообщить("Группа: " + Группа); // ── Children: прямые дочерние элементы ─────────────────────────────────── ПрямыеДети = A1sCatalogs.Children(ГрКорпусА); // Recursive=Ложь ВсеПотомки = A1sCatalogs.Children(ГрКорпусА, Истина); // все вложенные Сообщить("Прямых: " + ПрямыеДети.Количество() + ", всего: " + ВсеПотомки.Количество()); // ── Level: уровень в иерархии (0 = корень) ─────────────────────────────── Уровень = A1sCatalogs.Level(НомСсылка); // Квартиры (0) → Корпус А (1) → Этаж 3 (2) → Квартира 301 (3) // ── Path: полный путь через разделитель ────────────────────────────────── Путь = A1sCatalogs.Path(НомСсылка); // "Квартиры / Корпус А / Квартира 101" ПутьСтрелка = A1sCatalogs.Path(НомСсылка, " → "); // свой разделитель ПутьСлэш = A1sCatalogs.Path(НомСсылка, "/"); // "Квартиры/Корпус А/..." // ── HasChildren · IsGroup ───────────────────────────────────────────────── Если A1sCatalogs.IsGroup(Ссылка) Тогда Сообщить("Это группа"); Если A1sCatalogs.HasChildren(Ссылка) Тогда Сообщить("В ней есть элементы"); КонецЕсли; КонецЕсли;
Details · IsEmpty · IsGroup — диагностика и проверки
// ── Details: получить реквизиты одним вызовом без GetObject() ──────────── Инфо = A1sCatalogs.Details(НомСсылка); // → { Type:"Номенклатура", Code:"000101", Description:"Квартира 101", // IsFolder:Ложь, DeletionMark:Ложь, Parent:СсылкаГруппы } Сообщить(Инфо.Description + " (код: " + Инфо.Code + ")"); Сообщить("Помечен на удаление: " + Инфо.DeletionMark); // С дополнительными реквизитами Инфо = A1sCatalogs.Details(НомСсылка, "Площадь, Этаж, Цена, Статус"); Сообщить("Площадь: " + Инфо.Площадь + " м², этаж: " + Инфо.Этаж); // ── IsEmpty: пустая ли ссылка ───────────────────────────────────────────── Если A1sCatalogs.IsEmpty("Номенклатура", НомСсылка) Тогда Сообщить("Пустая ссылка!"); КонецЕсли; // ── Проверки типа значения ──────────────────────────────────────────────── Если A1sCatalogs.IsCatalog(НекоеЗначение) Тогда // является ли справочником Сообщить("Это справочник: " + НекоеЗначение.Метаданные().Имя); КонецЕсли; Если A1sCatalogs.IsRef(НекоеЗначение) Тогда // ссылка (не объект) ИначеЕсли A1sCatalogs.IsObject(НекоеЗначение) Тогда // объект КонецЕсли; // GetObject / GetRef: явное приведение типа ─────────────────────────────── Объект = A1sCatalogs.GetObject(НомСсылка); // ссылка → объект Ссылка = A1sCatalogs.GetRef(НомОбъект); // объект → ссылка
Details делает один лёгкий запрос через свойства ссылки — это
быстрее, чем открывать объект. Используйте его когда нужно просто «прочитать» несколько полей без
изменения.A1sCatalogs — все экспортируемые функции
| Функция | Сигнатура | Что делает |
|---|---|---|
| Проверки типа | ||
| IsCatalog | IsCatalog(Value) → Bool | Является ли справочником (ссылка или объект) |
| IsRef | IsRef(Value) → Bool | Является ли ссылкой справочника |
| IsObject | IsObject(Value) → Bool | Является ли объектом справочника |
| GetObject | GetObject(Value) → CatalogObject | Привести к объекту |
| GetRef | GetRef(Value) → CatalogRef | Привести к ссылке |
| Manager | Manager(Name) → CatalogManager | Менеджер справочника по имени |
| Empty | Empty(Name) → CatalogRef | Пустая ссылка |
| Создание | ||
| Of | Of(Name, Attrs?) → CatalogObject | Создать новый элемент с реквизитами (не записан) |
| CreateGroup | CreateGroup(Name, Desc, Parent?, Attrs?) | Создать группу (не записана) |
| Copy | Copy(ItemRef, Overrides?) → CatalogObject | Скопировать элемент с перекрытием реквизитов |
| Find-or-create | ||
| Ensure | Ensure(Name, Desc, Attrs?, Exact?) | Найти по имени или создать |
| EnsureByCode | EnsureByCode(Name, Code, Attrs?) | Найти по коду или создать |
| EnsureGroup | EnsureGroup(Name, Desc, Parent?) | Найти или создать группу |
| EnsureBatch | EnsureBatch(Name, Names[], Attrs?) | Массово find-or-create по массиву имён |
| EnsureByTypev2.1 | EnsureByType(TypeValue, Desc, Attrs?) | Find-or-create по типу из метаданных реквизита |
| EnsureUpdatev2.1 | EnsureUpdate(Name, Desc, Attrs?, Exact?, AutoResolve?) | Upsert: найти и обновить или создать |
| Data mapping | ||
| MapRowv2.1 | MapRow(SourceData, Scheme?) | Трансформировать структуру: строки → ссылки по схеме |
| PickFromDocumentv2.1 | PickFromDocument(DocRef, TabName, Field) | Уникальные ссылки из ТЧ документа |
| Реквизиты и ТЧ | ||
| FillAttrs | FillAttrs(Item, Data) | Заполнить реквизиты из структуры |
| FillAttrsAuto | FillAttrsAuto(Item, Data) | Заполнить с авторазрешением строк в ссылки |
| Set | Set(Item, Key, Value) | Установить один реквизит |
| AddRow | AddRow(Item, TabName, RowData) | Добавить строку в ТЧ |
| AddRowAuto | AddRowAuto(Item, TabName, RawData) | Добавить строку с авторазрешением ссылок |
| AddRows | AddRows(Item, TabName, Source, Mapping?) | Загрузить строки из ТЗ или массива структур |
| ExportRows | ExportRows(Item, TabName, Cols?) | Выгрузить ТЧ в ТаблицуЗначений |
| Запись и удаление | ||
| Write | Write(Item) → CatalogRef | Записать элемент |
| Update | Update(Ref, Fields|Name, Val?, Write?) | Обновить реквизит(ы) и записать |
| UpdateAll | UpdateAll(Items[], Fields|Name, Val?) | Обновить массив → {Success, Failed} |
| MarkForDeletion | MarkForDeletion(Ref, Mark?) | Пометить / снять пометку удаления |
| MarkForDeletionBatch | MarkForDeletionBatch(Items[], Mark?) | Массовая пометка → {Success, Failed} |
| Move | Move(Ref, NewParent, Write?) | Переместить в другую группу |
| MoveBatch | MoveBatch(Items[], NewParent) | Переместить массив → {Success, Failed} |
| Поиск | ||
| ByName | ByName(Name, Desc, Parent?, Exact?) | По наименованию |
| ByCode | ByCode(Name, Code) | По коду |
| ByAttr | ByAttr(Name, AttrName, Value) | По реквизиту |
| ByGUID | ByGUID(Name, GUIDStr) | По GUID |
| ByNameList | ByNameList(Name, "a,b,c", Sep?) | Список имён через разделитель → массив |
| PickByName | PickByName(Name, Names[]) | Массив имён → массив найденных ссылок |
| PickByCode | PickByCode(Name, Codes[]) | Массив кодов → массив ссылок |
| PickByAttr | PickByAttr(Name, AttrName, Values[]) | Массив значений реквизита → массив ссылок |
| PickPredefined | PickPredefined(Name, Names[]) | Предопределённые по именам |
| Refs | Refs(Name, Where?, Params?, Order?) | Произвольное WHERE → массив ссылок |
| Count | Count(Name, Where?, Params?) → Num | Количество с условием |
| Exists | Exists(Name, Where?, Params?) → Bool | Проверить наличие с условием |
| TopLevelItems | TopLevelItems(Name, Groups?) | Элементы верхнего уровня |
| AllInGroup | AllInGroup(Name, GroupRef, Nested?) | Все элементы в группе |
| AllByOwner | AllByOwner(Name, OwnerRef) | Подчинённый справочник по владельцу |
| Иерархия | ||
| Parent | Parent(Ref) → CatalogRef | Родительская группа |
| Children | Children(Ref, Recursive?) | Дочерние элементы |
| Level | Level(Ref) → Num | Уровень вложенности (0 = корень) |
| Path | Path(Ref, Sep=" / ") → String | Полный путь через разделитель |
| HasChildren | HasChildren(Ref) → Bool | Есть ли дочерние элементы |
| Валидация | ||
| IsGroup | IsGroup(Ref) → Bool | Является ли группой |
| IsEmpty | IsEmpty(Name, Value) → Bool | Пустая ли ссылка |
| IsCodeUnique | IsCodeUnique(Name, Code, Exclude?) | Уникален ли код |
| Details | Details(Ref, ExtraAttrs?) → Structure | Реквизиты элемента без GetObject |
| On | On(Name) → Fluent | Fluent-обёртка A1sDP_Catalogs |
| SelfTest | SelfTest() → Bool | Самотест модуля |