Анатомия цепочки
Каждая цепочка устроена одинаково: одна точка входа, произвольное число трансформаторов, один терминатор.
A1sDocs.On()
A1sCatalogs.On()
A1sDS.On()
A1sAR.On()
Обработки.A1sDP_Docs.Создать()), который недоступен на клиенте. Если ваш
код выполняется в &НаКлиентеНаСервере или на клиенте — используйте обычные функции.A1sDocs.Post(Dok)) —
обычный вызов проще. Правило: если цепочка длиннее трёх методов — Fluent оправдан.Создать документ цепочкой
A1sDocs.On("ИмяДокумента", Header)
создаёт документ и оборачивает в Fluent.
Дальше — цепочка методов. Последний метод (.Post() или .Write()) записывает
документ
и возвращает ссылку, завершая цепочку.
Dok = A1sDocs.Of("ВыпускПродукцииУслуг",
A1sDS.Of("Дата", '20260201',
"Организация", Орг));
A1sDocs.Set(Dok, "Комментарий", "А");
A1sDocs.AddRows(Dok, "Продукция", ТЗ);
Ссылка = A1sDocs.Post(Dok);
Ссылка = A1sDocs.On(
"ВыпускПродукцииУслуг",
A1sDS.Of("Дата", '20260201',
"Организация", Орг))
.Set("Комментарий", "А")
.AddRows("Продукция", ТЗ)
.Post();
// ── Базовая цепочка: создать → заполнить → провести ───────────────────────
Ссылка = A1sDocs.On("ВыпускПродукцииУслуг",
A1sDS.Of(
"Дата", '20260201',
"Организация", МояОрг,
"Склад", СкладГП))
.Set("Комментарий", "Корпус А — февраль 2026")
.AddRows("Продукция", ТЗКвартиры)
.Post();
// ── Несколько ТЧ ─────────────────────────────────────────────────────────
Ссылка = A1sDocs.On("РеализацияТоваровУслуг",
A1sDS.Of("Дата", ТекущаяДата(), "Контрагент", Контрагент))
.Set("Договор", Договор)
.Set("Склад", Склад)
.AddRows("Товары", ТЗТовары)
.AddRows("Услуги", ТЗУслуги)
.Post();
// ── Write вместо Post — записать без проведения ───────────────────────────
Ссылка = A1sDocs.On("ВыпускПродукцииУслуг",
A1sDS.Of("Дата", '20260201', "Организация", МояОрг))
.AddRows("Продукция", ТЗКвартиры)
.Write(); // черновик — не проводим
// ── Fluent с LoadRows (авторазрешение строк) ──────────────────────────────
Ссылка = A1sDocs.On("ВыпускПродукцииУслуг",
A1sDS.Of("Дата", '20260201', "Организация", МояОрг))
.LoadRows("Продукция", МассивСтрокИзJSON) // строки → ссылки
.Post();
Обернуть существующий документ
Если передать в On()
не строку, а ссылку или объект — обёртка открывает существующий документ.
Потом применяете нужные изменения и перепроводите.
// ── Обернуть существующий и изменить ─────────────────────────────────────
A1sDocs.On(ДокСсылка)
.Set("Комментарий", "Исправлено вручную")
.Post(Истина); // Force=Истина — перепровести даже если уже проведён
// ── Заменить всю ТЧ существующего документа ──────────────────────────────
A1sDocs.On(ДокСсылка)
.ClearRows("Продукция") // очистить старые строки
.AddRows("Продукция", НоваяТЗ) // загрузить новые
.Post(Истина);
// ── On с Header: обернуть и сразу изменить несколько реквизитов шапки ────
A1sDocs.On(ДокСсылка,
A1sDS.Of(
"Комментарий", "Откорректировано",
"Ответственный", НовыйОтвет))
.Post(Истина);
// ── Передать объект если он уже открыт ───────────────────────────────────
ДокОбъект = A1sDocs.GetObject(ДокСсылка); // открыт ранее
A1sDocs.On(ДокОбъект) // обёртка без лишнего GetObject
.LoadRows("Продукция", НовыеДанные)
.Post(Истина);
Все методы A1sDP_Docs
| Метод | Сигнатура | Что делает | Тип |
|---|---|---|---|
| Шапка | |||
| .Set | .Set(Key, Value) | Установить один реквизит шапки | → this |
| .FillHeader | .FillHeader(Structure) | Заполнить несколько реквизитов шапки из структуры | → this |
| Табличные части | |||
| .AddRow | .AddRow(TabName, RowData) | Добавить строку из структуры (ссылки готовы) | → this |
| .AddRows | .AddRows(TabName, Source, Map?) | Добавить из ТЗ или массива структур | → this |
| .LoadRows | .LoadRows(TabName, Rows[]) | Добавить с авторазрешением строк → ссылок | → this |
| .ClearRows | .ClearRows(TabName) | Очистить ТЧ | → this |
| .SetRows | .SetRows(TabName, Source) | ClearRows + AddRows в одном | → this |
| Терминаторы | |||
| .Post | .Post(Force?) | Записать и провести → DocumentRef | → ссылка |
| .Write | .Write() | Записать без проведения → DocumentRef | → ссылка |
| .Unpost | .Unpost() | Отменить проведение → DocumentRef | → ссылка |
| .Value | .Value() | Получить объект документа без записи | → объект |
| .Ref | .Ref() | Получить ссылку (только если уже записан) | → ссылка |
Создать элемент справочника шаг за шагом
A1sCatalogs.On("ИмяСправочника")
создаёт новый незаписанный элемент и оборачивает в Fluent.
Метод .Write() записывает и возвращает ссылку.
// ── Создать новую номенклатуру ────────────────────────────────────────────
НомСсылка = A1sCatalogs.On("Номенклатура")
.Set("Наименование", "Квартира 401")
.Set("Родитель", ГрКвартиры)
.Set("ВидНоменклатуры", ВидКвартира)
.Set("ЕдиницаИзмерения", ЕдШт)
.Set("Площадь", 48.5)
.Set("Этаж", 5)
.Write();
// ── Передать начальные реквизиты сразу в On() ─────────────────────────────
КонтрСсылка = A1sCatalogs.On("Контрагенты",
A1sDS.Of("Наименование", "ООО Ромашка", "ИНН", "7707083893"))
.Set("КПП", "770701001")
.Set("ВидКонтрагента", ВидЮрЛицо)
.Write();
// ── Создать элемент с ТЧ (например, у справочника есть ТЧ «Контакты») ────
Ссылка = A1sCatalogs.On("Контрагенты")
.Set("Наименование", "ООО Ромашка")
.AddRow("Контакты",
A1sDS.Of("Вид", "Email", "Значение", "info@romashka.ru"))
.AddRow("Контакты",
A1sDS.Of("Вид", "Телефон", "Значение", "+7 495 000-00-00"))
.Write();
Обернуть существующий элемент + полная шпаргалка
// ── Обернуть существующий и изменить один реквизит ───────────────────────
A1sCatalogs.On(НомСсылка)
.Set("Цена", 3750000)
.Write();
// ── Обернуть с немедленным Set в On() ────────────────────────────────────
A1sCatalogs.On(НомСсылка,
A1sDS.Of("Цена", 3750000, "Статус", СтатусАктив))
.Write();
// ── Заменить ТЧ существующего ─────────────────────────────────────────────
A1sCatalogs.On(КонтрСсылка)
.ClearRows("Контакты")
.AddRows("Контакты", НовыеКонтакты)
.Write();
| Метод | Сигнатура | Что делает | Тип |
|---|---|---|---|
| .Set | .Set(Key, Value) | Установить реквизит | → this |
| .FillAttrs | .FillAttrs(Structure) | Заполнить несколько реквизитов из структуры | → this |
| .AddRow | .AddRow(TabName, RowData) | Добавить строку в ТЧ | → this |
| .AddRows | .AddRows(TabName, Source) | Добавить из ТЗ или массива структур | → this |
| .ClearRows | .ClearRows(TabName) | Очистить ТЧ | → this |
| .Write | .Write() | Записать → CatalogRef | → ссылка |
| .Value | .Value() | Получить объект без записи | → объект |
| .Ref | .Ref() | Получить ссылку (только если уже записан) | → ссылка |
Построить структуру с условиями
A1sDS.On() —
пустая структура.
A1sDS.On(СуществующаяСтруктура)
— трансформация.
Терминатор .Value() возвращает обычную структуру.
.ToFixed() — фиксированную.
// ── Простая сборка структуры ──────────────────────────────────────────────
Шапка = A1sDS.On()
.Set("Организация", МояОрг)
.Set("Дата", ТекущаяДата())
.Set("Склад", СкладГП)
.Value();
// → обычная Структура {Организация, Дата, Склад}
// ── SetIf: добавить поле только при выполнении условия ────────────────────
Фильтр = A1sDS.On()
.Set("Организация", МояОрг)
.SetIf("Склад", Склад, ЗначениеЗаполнено(Склад))
.SetIf("Контрагент", Контрагент, ЗначениеЗаполнено(Контрагент))
.SetIf("ПремиумКлиент", Истина, ЕстьПодписка)
.Value();
// ── SetMany: добавить несколько ключей из структуры ───────────────────────
Параметры = A1sDS.On()
.Set("Версия", "2.1.0")
.SetMany(A1sDS.Of("Хост", "prod-server", "Порт", 8080))
.Value();
// ── ToFixed: неизменяемая структура-константа ─────────────────────────────
Константы = A1sDS.On()
.Set("MaxRetries", 3)
.Set("TimeoutSec", 30)
.Set("BatchSize", 100)
.ToFixed();
// Константы.MaxRetries = 5 → ОШИБКА: ФиксированнаяСтруктура нельзя изменить
Трансформировать данные из API
// ── Очистить ответ API: убрать служебные поля, переименовать ──────────────
ОтветAPI = A1sDS.Of(
"first_name", "Иван", "last_name", "Петров",
"email", "i@p.ru", "token", "eyJ...",
"_internal", 42, "role", "admin");
ПубличныйПрофиль = A1sDS.On(ОтветAPI)
.Omit("token, _internal") // убрать чувствительное
.Rename(A1sDS.Of(
"first_name", "Имя",
"last_name", "Фамилия",
"email", "Email",
"role", "Роль"))
.Value();
// → { Имя: "Иван", Фамилия: "Петров", Email: "i@p.ru", Роль: "admin" }
// ── Defaults: применить умолчания к пользовательским настройкам ──────────
НастройкиПользователя = A1sDS.Of("Хост", "prod-server"); // только хост
ИтоговаяКонфигурация = A1sDS.On(НастройкиПользователя)
.Defaults(A1sDS.Of(
"Хост", "localhost", // перезапишется "prod-server"
"Порт", 8080, // добавится
"Таймаут", 30, // добавится
"SSL", Ложь, // добавится
"ПулСоединений", 10)) // добавится
.Value();
// → { Хост: "prod-server", Порт: 8080, Таймаут: 30, SSL: Ложь, ПулСоединений: 10 }
// ── Слить данные из нескольких источников ────────────────────────────────
БазовыеДанные = /* из БД */;
КэшДанные = /* из кэша */;
СессионныеДанные = /* из сессии */;
ПолныеДанные = A1sDS.On(БазовыеДанные)
.Merge(КэшДанные) // перезапишет совпадающие ключи
.Merge(СессионныеДанные) // высший приоритет
.Set("ДатаЗагрузки", ТекущаяДата())
.Omit("ВнутренниеДанные")
.Value();
Все методы A1sDP_DS
| Метод | Сигнатура | Что делает | Тип |
|---|---|---|---|
| Трансформаторы | |||
| .Set | .Set(Key, Value) | Установить / перезаписать ключ | → this |
| .SetIf | .SetIf(Key, Value, Condition) | Установить ключ только если условие истинно | → this |
| .SetMany | .SetMany(Structure) | Установить несколько ключей из структуры | → this |
| .Remove | .Remove(Key) | Удалить ключ | → this |
| .Pick | .Pick("K1,K2") | Оставить только указанные ключи | → this |
| .Omit | .Omit("K1,K2") | Исключить указанные ключи | → this |
| .Merge | .Merge(Structure) | Слить структуру (источник перезаписывает) | → this |
| .Defaults | .Defaults(Structure) | Применить дефолты (не перезаписывает существующие) | → this |
| .Rename | .Rename(MapStruct) | Переименовать ключи по карте | → this |
| .DeepCopy | .DeepCopy() | Глубокое копирование текущей структуры | → this |
| .Clear | .Clear() | Очистить структуру | → this |
| .Transform | .Transform(Key, "expr") | Преобразовать значение выражением | → this |
| Терминаторы | |||
| .Value | .Value() → Structure | Получить структуру | → структура |
| .ToFixed | .ToFixed() → FixedStructure | Получить фиксированную структуру | → фикс. |
| .Get | .Get(Key) → Arbitrary | Получить значение по ключу | → значение |
| .Keys | .Keys() → Array | Получить массив ключей | → массив |
| .Values | .Values() → Array | Получить массив значений | → массив |
| .HasKey | .HasKey(Key) → Bool | Проверить наличие ключа | → булево |
| .IsEmpty | .IsEmpty() → Bool | Структура пустая? | → булево |
| .Count | .Count() → Num | Количество ключей | → число |
| .ToJSON | .ToJSON() → String | Сериализовать в JSON | → строка |
Цепочки над массивом + шпаргалка методов
A1sAR.On() —
пустой массив.
A1sAR.On(МассивИсточник)
— обёртка существующего.
Терминатор .Value() возвращает обычный массив.
// ── Построить массив шаг за шагом ─────────────────────────────────────────
Результат = A1sAR.On()
.Add(1).Add(2).Add(3).Add(2).Add(1)
.RemoveDuplicates()
.Sort()
.Value();
// → [1, 2, 3]
// ── Трансформация существующего массива ───────────────────────────────────
СырыеДанные = A1sAR.Of(Ном1, Неопределено, Ном2, Ном1, Неопределено, Ном3);
ЧистыйСписок = A1sAR.On(СырыеДанные)
.PickFilled() // убрать Неопределено и пустые
.RemoveDuplicates() // убрать дубли
.Value();
// → [Ном1, Ном2, Ном3]
// ── Объединить и обработать ───────────────────────────────────────────────
ВсяНоменклатура = A1sAR.On(НомДок1)
.Concatenate(НомДок2)
.Concatenate(НомДок3)
.RemoveDuplicates()
.Reverse()
.Value();
// ── Построить список условно ──────────────────────────────────────────────
Действия = A1sAR.On()
.Add("Проведение")
.AddIf("Отправить уведомление", НужноУведомление)
.AddIf("Обновить склад", ЕстьДвижениеТМЦ)
.AddIf("Печать документа", НужнаПечать)
.Value();
Сообщить("Будут выполнены: " + A1sAR.Join(Действия, ", "));
| Метод | Сигнатура | Что делает | Тип |
|---|---|---|---|
| Трансформаторы | |||
| .Add | .Add(Value) | Добавить элемент | → this |
| .AddIf | .AddIf(Value, Condition) | Добавить по условию | → this |
| .Concatenate | .Concatenate(Array) | Объединить с другим массивом | → this |
| .RemoveDuplicates | .RemoveDuplicates() | Убрать дубликаты | → this |
| .PickFilled | .PickFilled() | Оставить только заполненные | → this |
| .PickRefs | .PickRefs() | Оставить только ссылки | → this |
| .Sort | .Sort() | Сортировать | → this |
| .Reverse | .Reverse() | Обратить порядок | → this |
| .Flatten | .Flatten() | Схлопнуть массив массивов | → this |
| Терминаторы | |||
| .Value | .Value() → Array | Получить массив | → массив |
| .First | .First() → Arbitrary | Первый элемент | → значение |
| .Last | .Last() → Arbitrary | Последний элемент | → значение |
| .Count | .Count() → Num | Количество элементов | → число |
| .IsEmpty | .IsEmpty() → Bool | Массив пустой? | → булево |
| .Contains | .Contains(Value) → Bool | Содержит ли элемент | → булево |
| .Join | .Join(Sep) → String | Склеить через разделитель | → строка |
| .ToJSON | .ToJSON() → String | Сериализовать в JSON | → строка |
A1sDS.On
выигрывает у A1sDS.Of когда
нужен SetIf или цепочка трансформаций (Omit + Rename + Defaults).A1sDocs.On
выигрывает у обычных вызовов когда операций 3+ и они логически связаны.A1sAR.On
выигрывает когда нужно собрать массив условно с AddIf.Во всех остальных случаях — обычные функции проще и быстрее читаются.