Кулинарная книга A1sCode · Часть 3

Документы —
A1sDocs

Самый объёмный модуль. Закрывает полный жизненный цикл документа: создание шапки, заполнение табличных частей, запись, проведение, массовые операции, поиск. Ключевая идея — один документ = один экран кода, не пять.

A1sDocs v2.1.0 12 рецептов ~55 функций зависит от A1sDS · A1sAR · A1sCatalogs · A1sMeta
Жизненный цикл документа в A1sDocs

Каждый документ проходит один и тот же путь. A1sDocs даёт по одной функции на каждый шаг:

Of / OfAuto
Создать объект, заполнить шапку
AddRow / LoadRows
Добавить строки в ТЧ
Post / Write
Записать и провести
Details / Refs
Прочитать данные
PostAll / UpdateAll
Массовые операции
РЕЦЕПТ 1 · A1sDocs

Of / OfAuto — создать документ и заполнить шапку

⚡ Когда применять: нужен новый документ — всегда начинайте здесь

Of(Name, Header) создаёт объект документа и заполняет шапку из структуры. Документ ещё не записан — только создан в памяти. Записывать будем в конце через Post или Write.

OfAuto — то же самое, но строковые значения в шапке автоматически разрешаются в ссылки через метаданные.

✗ Классика (8 строк)
НовДок = Документы
    .ВыпускПродукцииУслуг
    .СоздатьДокумент();
НовДок.Дата         = '20260201';
НовДок.Организация  = МояОрг;
НовДок.Склад        = СкладГП;
НовДок.Комментарий  = "Корпус А";
// ... и это ещё без ТЧ ...
✓ A1sCode (2 строки)
Dok = A1sDocs.Of(
    "ВыпускПродукцииУслуг",
    A1sDS.Of(
        "Дата",        '20260201',
        "Организация", МояОрг,
        "Склад",       СкладГП,
        "Комментарий", "Корпус А"));
Of · OfAuto — шапка документа
// ── Of: передаём готовые ссылки ───────────────────────────────────────────
Dok = A1sDocs.Of("ВыпускПродукцииУслуг",
    A1sDS.Of(
        "Дата",        '20260201',     // дата
        "Организация", МояОрг,          // ссылка
        "Склад",       СкладГП,         // ссылка
        "Комментарий", "Загружено из Excel"));

// ── OfAuto: строки → ссылки автоматически ────────────────────────────────
// Если значение реквизита — строка — OfAuto сам найдёт/создаст ссылку
// через EnsureByType по типу реквизита из метаданных
Dok = A1sDocs.OfAuto("ВыпускПродукцииУслуг",
    A1sDS.Of(
        "Дата",        '20260201',
        "Организация", "ООО Ромашка",    // строка → найдёт в справочнике Организации
        "Склад",       "Основной склад")); // строка → найдёт в справочнике Склады

// ── Минимальная шапка: только дата ───────────────────────────────────────
// Остальное платформа заполнит значениями по умолчанию или оставит пустым
Dok = A1sDocs.Of("ВыпускПродукцииУслуг",
    A1sDS.Of("Дата", ТекущаяДата()));

// ── Set: дополнить шапку после создания ──────────────────────────────────
Dok = A1sDocs.Of("РеализацияТоваровУслуг",
    A1sDS.Of("Дата", ТекущаяДата()));
A1sDocs.Set(Dok, "Контрагент", КонтрагентСсылка);
A1sDocs.Set(Dok, "Договор",     ДоговорСсылка);

// ── FillHeaderAuto: заполнить шапку уже созданного документа ─────────────
A1sDocs.FillHeaderAuto(Dok,
    A1sDS.Of(
        "Организация", "ООО Ромашка",  // строка → ссылка
        "Склад",       СкладГП));      // ссылка → как есть
ℹ️
Of не записывает документ. После Of вы получаете объект в памяти. Он существует только внутри переменной — в базе ничего нет. Запись происходит только при вызове Post или Write. Это позволяет заполнить все ТЧ до единственного обращения к базе.

РЕЦЕПТ 2 · A1sDocs

OfBase / Copy — создать на основании или скопировать

⚡ Когда применять: нужен счёт на оплату из заказа, или копия документа с изменённой датой

OfBase(Name, Base, Overrides?) — создаёт документ через платформенный Заполнить() по документу-основанию. Copy(DocRef, Overrides?) — копирует документ с перекрытием нужных реквизитов. Оба возвращают незаписанный объект.

OfBase · Copy — создание по образцу
// ── OfBase: документ на основании другого ────────────────────────────────
// Например: счёт-фактура из реализации — платформа сама перенесёт нужные поля
СчётФактура = A1sDocs.OfBase(
    "СчётФактураВыданный",
    РеализацияСсылка,
    A1sDS.Of("Комментарий", "Сформирован автоматически"));

Ссылка = A1sDocs.Post(СчётФактура);

// ── Copy: копия документа с изменёнными реквизитами ──────────────────────
// Сценарий: ежемесячно копировать документ прошлого месяца, меняя только дату
НовыйВыпуск = A1sDocs.Copy(
    ВыпускФевральСсылка,
    A1sDS.Of(
        "Дата",        '20260301',              // новая дата
        "Комментарий", "Корпус А — март 2026"));  // новый комментарий
// ТЧ, организация, склад — скопированы из оригинала

Ссылка = A1sDocs.Post(НовыйВыпуск);

// ── Шаблонный паттерн: фабричная функция ─────────────────────────────────
// Создаём выпуск на каждый месяц по шаблону
Функция СоздатьВыпускМесяца(ШаблонСсылка, МесяцДата)
    Возврат A1sDocs.Copy(ШаблонСсылка,
        A1sDS.Of(
            "Дата", НачалоМесяца(МесяцДата),
            "Комментарий", "Авто: " + Формат(МесяцДата, "ДФ=ММММ ГГГГ")));
КонецФункции
Табличные части — полный арсенал

A1sDocs предлагает шесть способов заполнить ТЧ. Вот как выбрать нужный:

AddRow(Doc, Tab, Стр) Добавить одну строку из структуры. Ссылки уже готовые. ссылки готовы
AddRowAuto(Doc, Tab, Стр) Добавить одну строку. Строки → ссылки через метаданные ТЧ. авторазрешение
AddRows(Doc, Tab, ТЗ, Map?) Массово из ТаблицыЗначений или массива структур. Опциональный маппинг колонок. ссылки готовы
LoadRows(Doc, Tab, Масс) Массово из массива структур. Строки → ссылки автоматически (=AddRowAuto для каждой). авторазрешение
LoadRowsMapped(Doc, Tab, Масс, Map) Переименовать поля + авторазрешение. Один вызов вместо RenameFields + LoadRows. rename + auto
SetLoadRows / SetRows / SetLoadRowsMapped Сначала очистить ТЧ, потом загрузить. Set-версии любой из функций выше. очистить + загрузить
РЕЦЕПТ 3 · A1sDocs

AddRow / AddRowAuto — одна строка в ТЧ

⚡ Когда применять: количество строк заранее неизвестно или строки добавляются по условию

AddRow — когда у вас уже есть ссылки. AddRowAuto — когда данные пришли из внешней системы как строки, и нужно найти/создать соответствующие ссылки автоматически.

AddRow · AddRowAuto — строки в ТЧ
// ── AddRow: ссылки уже есть ───────────────────────────────────────────────
A1sDocs.AddRow(Dok, "Продукция",
    A1sDS.Of(
        "Номенклатура", Кв101Ссылка,  // готовая ссылка
        "Количество",   1,
        "Сумма",        3500000,
        "Цена",         3500000));

// ── AddRow по условию: добавляем только если площадь > 40 ────────────────
Для Каждого Кв Из СписокКвартир Цикл
    Если Кв.Площадь > 40 Тогда
        A1sDocs.AddRow(Dok, "Продукция",
            A1sDS.Of("Номенклатура", Кв.Ссылка, "Количество", 1, "Сумма", Кв.Цена));
    КонецЕсли;
КонецЦикла;

// ── AddRowAuto: строки → ссылки по метаданным ТЧ ─────────────────────────
// Поле "Номенклатура" в ТЧ имеет тип СправочникСсылка.Номенклатура
// AddRowAuto увидит что значение — строка, и вызовет EnsureByType автоматически
A1sDocs.AddRowAuto(Dok, "Продукция",
    A1sDS.Of(
        "Номенклатура", "Квартира 101",  // строка → найдёт/создаст ссылку
        "Количество",   1,               // число → как есть
        "Сумма",        3500000));       // число → как есть

// ── ExportRows: выгрузить ТЧ в ТаблицуЗначений ───────────────────────────
ТЗПродукция = A1sDocs.ExportRows(Dok, "Продукция");        // все колонки
ТЗСуммы     = A1sDocs.ExportRows(Dok, "Продукция", "Номенклатура, Сумма"); // только нужные
Сообщить("Строк в ТЧ: " + A1sDocs.RowCount(Dok, "Продукция"));

РЕЦЕПТ 4 · A1sDocs

AddRows — загрузить ТЧ из ТаблицыЗначений

⚡ Когда применять: данные уже в ТаблицеЗначений (из Excel, из другого документа, из запроса)

AddRows(Doc, TabName, Source, FieldMapping?) принимает ТаблицуЗначений или массив структур. Если имена колонок совпадают с реквизитами ТЧ — маппинг не нужен. Если отличаются — передаётся структура маппинга.

AddRows — из ТЗ, из массива, с маппингом
// ── Из ТЗ с совпадающими именами колонок ─────────────────────────────────
// ТЗКвартиры содержит колонки: Номенклатура, Количество, Сумма, Цена
A1sDocs.AddRows(Dok, "Продукция", ТЗКвартиры);

// ── Из массива структур ───────────────────────────────────────────────────
Строки = A1sAR.Of(
    A1sDS.Of("Номенклатура", Кв101, "Количество", 1, "Сумма", 3500000),
    A1sDS.Of("Номенклатура", Кв102, "Количество", 1, "Сумма", 3100000),
    A1sDS.Of("Номенклатура", Кв201, "Количество", 1, "Сумма", 4400000));
A1sDocs.AddRows(Dok, "Продукция", Строки);

// ── С маппингом: колонки ТЗ отличаются от реквизитов ТЧ ──────────────────
// ТЗ из внешней системы: колонки "Товар", "Кол", "Стоимость"
// ТЧ "Товары": реквизиты "Номенклатура", "Количество", "Сумма"
МаппингКолонок = A1sDS.Of(
    "Товар",      "Номенклатура",  // колонка ТЗ → реквизит ТЧ
    "Кол",        "Количество",
    "Стоимость",  "Сумма");

A1sDocs.AddRows(Dok, "Товары", ТЗВнешняя, МаппингКолонок);

// ── SetRows: очистить ТЧ и загрузить заново ───────────────────────────────
// Используется когда документ уже существует и нужно заменить строки
A1sDocs.SetRows(ДокСсылка, "Продукция", НовыеСтроки);
// Эквивалентно: ClearRows + AddRows — в одну строку

РЕЦЕПТ 5 · A1sDocs new v2.1

LoadRows / LoadRowsMapped — массив строк с авторазрешением

⚡ Когда применять: данные пришли из JSON или CSV со строковыми значениями вместо ссылок

LoadRows — это AddRowAuto для всего массива за один вызов. Каждая строка обрабатывается через метаданные ТЧ: строки → ссылки, числа и даты — как есть.

LoadRowsMapped = RenameFields + LoadRows в одном вызове — для JSON с чужими именами полей.

✗ Раньше: цикл с ручным маппингом
Для Каждого Стр Из JSON Цикл
    Ном = A1sCatalogs.Ensure(
        "Номенклатура",
        Стр.item);
    A1sDocs.AddRow(Dok, "Продукция",
        A1sDS.Of(
            "Номенклатура", Ном,
            "Количество",   Стр.qty,
            "Сумма",        Стр.sum));
КонецЦикла;
✓ Теперь: одна строка
A1sDocs.LoadRowsMapped(
    Dok, "Продукция",
    JSON,
    A1sDS.Of(
        "item", "Номенклатура",
        "qty",  "Количество",
        "sum",  "Сумма"));
// Строки → ссылки автоматически!
LoadRows · LoadRowsMapped · SetLoadRows — конвейер из JSON
// ── LoadRows: имена полей совпадают с реквизитами ТЧ ─────────────────────
// JSON содержит поля "Номенклатура" (строка), "Количество", "Сумма"
ДанныеJSON = A1sAR.Of(
    A1sDS.Of("Номенклатура", "Квартира 101", "Количество", 1, "Сумма", 3500000),
    A1sDS.Of("Номенклатура", "Квартира 102", "Количество", 1, "Сумма", 3100000));

// LoadRows прогоняет каждую строку через AddRowAuto:
// строка "Квартира 101" → найдёт/создаст ссылку → добавит в ТЧ
КоличествоСтрок = A1sDocs.LoadRows(Dok, "Продукция", ДанныеJSON);
Сообщить("Добавлено строк: " + КоличествоСтрок);

// ── LoadRowsMapped: имена полей отличаются ────────────────────────────────
// JSON из внешней системы: поля "item", "unit", "qty", "price"
// ТЧ документа: "Номенклатура", "ЕдиницаИзмерения", "Количество", "Цена"
A1sDocs.LoadRowsMapped(
    Dok,
    "Продукция",
    МассивИзJSON,
    A1sDS.Of(
        "item",  "Номенклатура",      // строка → ссылка через метаданные
        "unit",  "ЕдиницаИзмерения",  // строка → ссылка
        "qty",   "Количество",         // число → как есть
        "price", "Цена"));             // число → как есть
// Поля, которых нет в схеме маппинга — копируются с оригинальными именами

// ── SetLoadRows: очистить ТЧ и загрузить заново ───────────────────────────
// Для обновления существующего документа — заменить все строки ТЧ
A1sDocs.SetLoadRows(ДокОбъект, "Продукция", НовыеСтроки);
// Эквивалентно: ClearRows("Продукция") + LoadRows("Продукция", НовыеСтроки)

// ── Полный сценарий: JSON → документ → провести ───────────────────────────
Dok = A1sDocs.Of("ВыпускПродукцииУслуг",
    A1sDS.Of("Дата", ТекущаяДата(), "Организация", МояОрг));

A1sDocs.LoadRowsMapped(Dok, "Продукция", МассивИзJSON,
    A1sDS.Of("item", "Номенклатура", "qty", "Количество", "sum", "Сумма"));

Ссылка = A1sDocs.Post(Dok);
💡
LoadRowsMapped — самый мощный инструмент для интеграций. Один вызов заменяет: цикл по строкам + ручной вызов Ensure для каждой ссылки + AddRow. Схему маппинга объявляете один раз вне цикла — при изменении API меняете только схему.

РЕЦЕПТ 6 · A1sDocs

ClearRows · SetRows · ExportRows — управление ТЧ

⚡ Когда применять: обновляете существующий документ, проверяете количество строк, читаете ТЧ
ClearRows · SetRows · ExportRows · RowCount
// ── ClearRows: очистить ТЧ ───────────────────────────────────────────────
A1sDocs.ClearRows(Dok, "Продукция");

// ── SetRows: очистить + загрузить из ТЗ (без авторазрешения) ─────────────
A1sDocs.SetRows(Dok, "Товары", НоваяТЗ);

// ── RowCount: количество строк в ТЧ ─────────────────────────────────────
КолСтрок = A1sDocs.RowCount(Dok, "Продукция");
Если КолСтрок = 0 Тогда
    ВызватьИсключение "Нельзя провести документ с пустой ТЧ";
КонецЕсли;

// ── ExportRows: выгрузить ТЧ в ТаблицуЗначений ───────────────────────────
ТЗПродукция = A1sDocs.ExportRows(Dok, "Продукция");
// → ТаблицаЗначений с колонками как реквизиты ТЧ

// Только нужные колонки
ТЗСуммы = A1sDocs.ExportRows(Dok, "Продукция", "Номенклатура, Количество, Сумма");

// ── Паттерн: обновить ТЧ существующего документа ─────────────────────────
ДокОбъект = A1sDocs.GetObject(ДокСсылка); // получить объект из ссылки
A1sDocs.ClearRows(ДокОбъект, "Продукция");
Для Каждого Стр Из НовыеДанные Цикл
    A1sDocs.AddRow(ДокОбъект, "Продукция",
        A1sDS.Of("Номенклатура", Стр.Ссылка, "Количество", Стр.Кол, "Сумма", Стр.Сумма));
КонецЦикла;
A1sDocs.Post(ДокОбъект);
Запись, проведение, массовые операции
РЕЦЕПТ 7 · A1sDocs

Post / Write / Unpost — проведение и отмена

⚡ Когда применять: завершить создание или изменение документа

Три функции. Post — записать и провести (двигает регистры). Write — записать без проведения (черновик). Unpost — отменить проведение. Все три возвращают ссылку на документ.

Post · Write · Unpost · Update · MarkForDeletion
// ── Post: записать и провести ─────────────────────────────────────────────
Ссылка = A1sDocs.Post(Dok);
Сообщить("Документ проведён: " + Ссылка);

// Force=Истина: перепровести даже если уже проведён (для пересчёта)
Ссылка = A1sDocs.Post(Dok, Истина);

// ── Write: записать без проведения (черновик) ─────────────────────────────
Ссылка = A1sDocs.Write(Dok);
// Документ сохранён в базе, но регистры не сдвинуты

// ── Unpost: отменить проведение ───────────────────────────────────────────
A1sDocs.Unpost(ДокСсылка);
// Если документ не проведён — просто вернёт ссылку без ошибки

// ── Update: обновить реквизит существующего записанного документа ─────────
A1sDocs.Update(
    ДокСсылка,
    A1sDS.Of(
        "Комментарий",   "Исправлено вручную",
        "Ответственный", НовыйОтветственный));
// Открывает объект, меняет реквизиты, записывает — три шага в одной строке

// ── MarkForDeletion: пометить на удаление ────────────────────────────────
A1sDocs.MarkForDeletion(ДокСсылка);

// ── Полный цикл создания документа ───────────────────────────────────────
Dok     = A1sDocs.Of("ВыпускПродукцииУслуг", A1sDS.Of("Дата", ТекущаяДата(), "Организация", МояОрг));
A1sDocs.LoadRows(Dok, "Продукция", СтрокиДанных);
Ссылка  = A1sDocs.Post(Dok);
Сообщить("✓ Выпуск создан и проведён: " + Ссылка);
⚠️
Post принимает и ссылку, и объект. Если передать ДокСсылка — функция сначала откроет объект через GetObject(), потом проведёт. Если передать уже открытый ДокОбъект — дополнительного запроса не будет. При массовых операциях передавайте объект если он уже открыт.

РЕЦЕПТ 8 · A1sDocs

PostAll / UnpostAll — провести пачку документов

⚡ Когда применять: загрузили 100 документов и нужно провести все сразу с отчётом об ошибках

Обе функции принимают массив ссылок и возвращают структуру {Success: Array, Failed: Array}. Упавший документ не останавливает обработку остальных — если StopOnError = Ложь.

PostAll · UnpostAll · ProcessAll — пакетные операции
// ── PostAll: провести массив, не останавливаться на ошибках ───────────────
НепроведённыеЗаФевраль = A1sDocs.AllUnposted(
    "ВыпускПродукцииУслуг",
    '20260201', '20260228');

Итог = A1sDocs.PostAll(НепроведённыеЗаФевраль);  // StopOnError=Ложь по умолчанию

Сообщить("✓ Проведено: "    + Итог.Success.Количество());
Сообщить("✗ С ошибками: "  + Итог.Failed.Количество());

// Показать что именно упало
Для Каждого ДокСсылка Из Итог.Failed Цикл
    Сообщить("  ✗ Ошибка: " + ДокСсылка);
КонецЦикла;

// ── PostAll с остановкой на первой ошибке ────────────────────────────────
Итог = A1sDocs.PostAll(МассивДоков, Истина);  // StopOnError = Истина

// ── UnpostAll: отменить проведение у массива ───────────────────────────────
ВсеВыпускиQ1 = A1sDocs.AllPosted(
    "ВыпускПродукцииУслуг",
    '20260101', '20260331');

Итог = A1sDocs.UnpostAll(ВсеВыпускиQ1);
Сообщить("Отменено проведений: " + Итог.Success.Количество());

// ── ProcessAll: произвольное действие над массивом ────────────────────────
Итог = A1sDocs.ProcessAll(МассивДоков, "Проведение");   // или "ОтменаПроведения", "Запись"

// ── UnpostedDocs: отфильтровать непроведённые из массива ─────────────────
ВсеДоки        = A1sDocs.AllInPeriod("ВыпускПродукцииУслуг", '20260201', '20260228');
Непроведённые = A1sDocs.UnpostedDocs(ВсеДоки);
Сообщить("Из " + ВсеДоки.Количество() + " документов не проведено: " + Непроведённые.Количество());

РЕЦЕПТ 9 · A1sDocs

UpdateAll — изменить реквизит у множества документов

⚡ Когда применять: нужно переназначить ответственного, поменять статус или добавить комментарий во всех документах квартала
UpdateAll — массовое обновление реквизитов
// ── Переназначить ответственного всем выпускам за квартал ─────────────────
ВыпускиQ1 = A1sDocs.AllInPeriod(
    "ВыпускПродукцииУслуг",
    '20260101', '20260331');

Итог = A1sDocs.UpdateAll(
    ВыпускиQ1,
    A1sDS.Of(
        "Ответственный", НовыйОтветственный,
        "Комментарий",   "Q1 2026 — скорректировано"));

Сообщить("Обновлено: "   + Итог.Success.Количество());
Сообщить("С ошибками: " + Итог.Failed.Количество());

// ── Выборочно: только непроведённые из периода ───────────────────────────
Непроведённые = A1sDocs.AllUnposted("ВыпускПродукцииУслуг", '20260201', '20260228');
A1sDocs.UpdateAll(Непроведённые,
    A1sDS.Of("Комментарий", "Требует проверки перед проведением"));

// ── Комбо: обновить + провести ────────────────────────────────────────────
Доки = A1sDocs.Refs(
    "ВыпускПродукцииУслуг",
    "НЕ Проведен И Организация = &Орг",
    A1sDS.Of("Орг", МояОрг));

A1sDocs.UpdateAll(Доки, A1sDS.Of("Комментарий", "Загружено автоматом"));
A1sDocs.PostAll(Доки);
Поиск и чтение документов
РЕЦЕПТ 10 · A1sDocs

AllInPeriod / AllPosted / AllByBase — выборки по периоду и основанию

⚡ Когда применять: нужны все документы за месяц, все проведённые, все по конкретному заказу
AllInPeriod · AllPosted · AllUnposted · AllByBase · PickByAttr
// ── AllInPeriod: все документы за период ─────────────────────────────────
ВсеВыпуски = A1sDocs.AllInPeriod(
    "ВыпускПродукцииУслуг",
    '20260201',   // начало
    '20260228');  // конец

// С фильтром по организации — FilterStruct
ВыпускиПоОрг = A1sDocs.AllInPeriod(
    "ВыпускПродукцииУслуг",
    '20260201', '20260228',
    A1sDS.Of("Организация", МояОрг));  // реквизит = значение

// ── AllPosted / AllUnposted ───────────────────────────────────────────────
Проведённые    = A1sDocs.AllPosted("ВыпускПродукцииУслуг", '20260201', '20260228');
Непроведённые = A1sDocs.AllUnposted("ВыпускПродукцииУслуг", '20260201', '20260228');
Сообщить("Проведено " + Проведённые.Количество()
    + " из " + (Проведённые.Количество() + Непроведённые.Количество()));

// ── AllByBase: все документы по документу-основанию ──────────────────────
СчётаФактуры = A1sDocs.AllByBase(
    "СчётФактураВыданный",
    РеализацияСсылка);           // ищет где ДокументОснование = РеализацияСсылка

// Другой реквизит основания (не "ДокументОснование")
ДокиПоЗаказу = A1sDocs.AllByBase(
    "ВыпускПродукцииУслуг",
    ЗаказСсылка,
    "ЗаказНаПроизводство");       // имя реквизита-основания

// ── PickByAttr: массив ссылок по значениям реквизита (IN-запрос) ──────────
ВыпускиПоКонтрагентам = A1sDocs.PickByAttr(
    "РеализацияТоваровУслуг",
    "Контрагент",
    A1sAR.Of(Контрагент1, Контрагент2, Контрагент3));

РЕЦЕПТ 11 · A1sDocs

Refs · Details · ByNumber — гибкий поиск и чтение

⚡ Когда применять: нужна выборка с произвольным условием или прочитать реквизиты без GetObject
Refs · Count · Exists · Details · ByNumber · ByAttr
// ── Refs: произвольное WHERE ──────────────────────────────────────────────
ВыпускиСклада = A1sDocs.Refs(
    "ВыпускПродукцииУслуг",
    "Склад = &Склад И НЕ Проведен",
    A1sDS.Of("Склад", МойСклад),
    "Дата УБЫВ");   // сортировка

// ── Count: сколько документов с условием ─────────────────────────────────
КоличествоЗаМесяц = A1sDocs.Count(
    "ВыпускПродукцииУслуг",
    "Дата МЕЖДУ &Нач И &Кон И Проведен",
    A1sDS.Of("Нач", '20260201', "Кон", '20260228'));

// ── Exists: есть ли такой документ? ──────────────────────────────────────
УжеЕстьВыпуск = A1sDocs.Exists(
    "ВыпускПродукцииУслуг",
    "Дата = &Д И Организация = &О",
    A1sDS.Of("Д", ТекущаяДата(), "О", МояОрг));

Если УжеЕстьВыпуск Тогда
    Сообщить("ВНИМАНИЕ: выпуск за сегодня уже существует");
КонецЕсли;

// ── Details: реквизиты документа без GetObject ───────────────────────────
Инфо = A1sDocs.Details(ДокСсылка);
// → { Type:"ВыпускПродукцииУслуг", Number:"ВП-000042",
//      Date:Дата, Posted:Истина, DeletionMark:Ложь }
Сообщить(Инфо.Number + " от " + Формат(Инфо.Date, "ДФ=дд.ММ.гг")
    + " — проведён: " + Инфо.Posted);

// С дополнительными реквизитами
Инфо = A1sDocs.Details(ДокСсылка, "Организация, Склад, Комментарий");
Сообщить(Инфо.Организация + " / " + Инфо.Комментарий);

// ── ByNumber: найти по номеру ─────────────────────────────────────────────
ВыпускСсылка = A1sDocs.ByNumber("ВыпускПродукцииУслуг", "ВП-000042");

// С ограничением периода (быстрее на больших базах)
ВыпускСсылка = A1sDocs.ByNumber(
    "ВыпускПродукцииУслуг", "ВП-000042",
    '20260228',   // EndDate — искать до этой даты
    '20260101');  // StartDate — искать от этой даты

// ── ByAttr / ByGUID ───────────────────────────────────────────────────────
ДокПоАтрибуту = A1sDocs.ByAttr("ВыпускПродукцииУслуг", "Организация", МояОрг);
ДокПоGUID     = A1sDocs.ByGUID("ВыпускПродукцииУслуг", "12345678-1234-...");
Метаданные — читать конфигурацию, не открывать конфигуратор
РЕЦЕПТ 12 · A1sDocs

TabSchema · AttrType — читать метаданные ТЧ и реквизитов

⚡ Когда применять: пишете универсальный загрузчик или хотите понять структуру документа в коде

Функции метаданных позволяют в коде узнать типы реквизитов, имена ТЧ и их колонок. Это фундамент для data-driven подходов — код адаптируется к любому документу без хардкода.

TabSchema · AttrType · AttrSchema · TabNames · MetaNames
// ── AttrType: тип реквизита шапки ────────────────────────────────────────
ТипОрг = A1sDocs.AttrType("ВыпускПродукцииУслуг", "Организация");
// → ОписаниеТипов (содержит "СправочникСсылка.Организации")
// Используем в EnsureByType:
ОргСсылка = A1sCatalogs.EnsureByType(ТипОрг, "ООО Ромашка");

// ── TabAttrType: тип реквизита строки ТЧ ─────────────────────────────────
ТипНом = A1sDocs.TabAttrType(
    "ВыпускПродукцииУслуг",
    "Продукция",
    "Номенклатура");
// → ОписаниеТипов "СправочникСсылка.Номенклатура"

// ── TabSchema: схема всех реквизитов ТЧ ──────────────────────────────────
// Каждый элемент: {Имя, Тип, ТипСтрока, ЭтоСправочник, ИмяСсылки}
СхемаТЧ = A1sDocs.TabSchema("ВыпускПродукцииУслуг", "Продукция");

// Перебрать схему для диагностики
Для Каждого Поле Из СхемаТЧ Цикл
    Если Поле.ЭтоСправочник Тогда
        Сообщить(Поле.Имя + " → ссылка на " + Поле.ИмяСсылки);
    Иначе
        Сообщить(Поле.Имя + " → " + Поле.ТипСтрока);
    КонецЕсли;
КонецЦикла;

// ── AttrSchema: схема реквизитов шапки ───────────────────────────────────
СхемаШапки = A1sDocs.AttrSchema("ВыпускПродукцииУслуг");

// ── TabNames: имена всех ТЧ документа ────────────────────────────────────
ИменаТЧ = A1sDocs.TabNames("ВыпускПродукцииУслуг");
Сообщить("ТЧ документа: " + A1sAR.Join(ИменаТЧ, ", "));
// → "ТЧ документа: Продукция, Услуги, Возвраты"

// ── TabColumnNames: имена реквизитов конкретной ТЧ ────────────────────────
КолонкиТЧ = A1sDocs.TabColumnNames("ВыпускПродукцииУслуг", "Продукция");
Сообщить("Колонки ТЧ Продукция: " + A1sAR.Join(КолонкиТЧ, ", "));

// ── MetaNames: список всех документов конфигурации ───────────────────────
ВсеДокументы  = A1sDocs.MetaNames();
КолвоДокументов = A1sDocs.MetaCount();
Сообщить("Всего видов документов: " + КолвоДокументов);
💡
TabSchema — ключ к data-driven загрузчикам. Зная схему ТЧ, вы можете написать универсальный цикл, который обрабатывает любой документ с любой ТЧ: идёте по схеме, для каждого поля с типом-ссылкой вызываете EnsureByType, для остальных копируете напрямую. Именно так работает AddRowAuto внутри.
Справочник функций

A1sDocs — все экспортируемые функции

Функция Сигнатура Что делает
Проверки типа
IsDocument IsDocument(Value) → Bool Является ли документом
IsRef IsRef(Value) → Bool Является ли ссылкой на документ
IsObject IsObject(Value) → Bool Является ли объектом документа
GetObject GetObject(Value) → DocumentObject Привести к объекту
GetRef GetRef(Value) → DocumentRef Привести к ссылке
Manager Manager(Name) → DocumentManager Менеджер документа по имени
Empty Empty(Name) → DocumentRef Пустая ссылка
Создание
Of Of(Name, Header?) → DocumentObject Создать документ с шапкой (не записан)
OfAuto OfAuto(Name, Header?) → DocumentObject Создать с авторазрешением строк шапки
OfBase OfBase(Name, Base, Overrides?) Создать на основании другого документа
Copy Copy(DocRef, Overrides?) Скопировать документ с перекрытием реквизитов
Шапка
FillHeader FillHeader(Doc, Data) Заполнить шапку из структуры
FillHeaderAuto FillHeaderAuto(Doc, Data) Заполнить с авторазрешением строк
Set Set(Doc, Key, Value) Установить один реквизит шапки
Update Update(DocRef, Fields, Write?) Обновить реквизиты существующего документа
Табличные части
AddRow AddRow(Doc, Tab, RowData) Добавить строку (ссылки готовы)
AddRowAutov2.1 AddRowAuto(Doc, Tab, RawData) Добавить строку с авторазрешением ссылок
AddRows AddRows(Doc, Tab, Source, Map?) Массово из ТЗ или массива структур
LoadRowsv2.1 LoadRows(Doc, Tab, Rows[]) Массово с авторазрешением ссылок
SetLoadRowsv2.1 SetLoadRows(Doc, Tab, Rows[]) Очистить + LoadRows
LoadRowsMappedv2.1 LoadRowsMapped(Doc, Tab, Rows[], Map) RenameFields + LoadRows за один вызов
SetLoadRowsMappedv2.1 SetLoadRowsMapped(Doc, Tab, Rows[], Map) Очистить + LoadRowsMapped
ClearRows ClearRows(Doc, Tab) Очистить ТЧ
SetRows SetRows(Doc, Tab, Source, Map?) ClearRows + AddRows
ExportRows ExportRows(Doc, Tab, Cols?) Выгрузить ТЧ в ТаблицуЗначений
RowCount RowCount(Doc, Tab) → Num Количество строк в ТЧ
Запись и проведение
Write Write(Doc) → DocumentRef Записать без проведения
Post Post(Doc, Force?) → DocumentRef Записать и провести
Unpost Unpost(Doc) → DocumentRef Отменить проведение
MarkForDeletion MarkForDeletion(DocRef) → Bool Пометить на удаление
PostAll PostAll(Docs[], Stop?) → {Success, Failed} Провести массив
UnpostAll UnpostAll(Docs[]) → {Success, Failed} Отменить проведение у массива
ProcessAll ProcessAll(Docs[], Action, Stop?) Произвольное действие над массивом
UpdateAll UpdateAll(Docs[], Fields) → {Success, Failed} Обновить реквизиты массива
Поиск
ByNumber ByNumber(Name, Num, End?, Start?) По номеру
ByAttr ByAttr(Name, AttrName, Value) По реквизиту
ByGUID ByGUID(Name, GUIDStr) По GUID
AllInPeriod AllInPeriod(Name, Start, End, Filter?) Все за период с фильтром
AllPosted AllPosted(Name, Start, End) Проведённые за период
AllUnposted AllUnposted(Name, Start, End) Непроведённые за период
AllByBase AllByBase(Name, BaseDoc, AttrName?) Все по документу-основанию
PickByAttr PickByAttr(Name, AttrName, Values[]) IN-запрос по массиву значений
Refs Refs(Name, Where?, Params?, Order?) Произвольное WHERE → массив ссылок
Count Count(Name, Where?, Params?) → Num Количество с условием
Exists Exists(Name, Where?, Params?) → Bool Проверить наличие с условием
Валидация
IsPosted IsPosted(DocRef) → Bool Документ проведён?
IsEmpty IsEmpty(Name, Value) → Bool Пустая ссылка?
Details Details(DocRef, ExtraAttrs?) → Structure Реквизиты без GetObject
UnpostedDocs UnpostedDocs(Docs[]) → Array Отфильтровать непроведённые
Метаданные
AttrType AttrType(DocName, AttrName) Тип реквизита шапки
AttrSchema AttrSchema(DocName, StdAttr?) Схема всех реквизитов шапки
TabAttrType TabAttrType(DocName, Tab, AttrName) Тип реквизита строки ТЧ
TabSchema TabSchema(DocName, Tab, StdAttr?) Схема всех реквизитов ТЧ
TabNames TabNames(Name) → Array Имена всех ТЧ документа
TabColumnNames TabColumnNames(DocName, Tab) → Array Имена реквизитов ТЧ
MetaCount MetaCount() → Num Количество видов документов в конфигурации
MetaNames MetaNames() → Array Список имён всех документов конфигурации
On On(NameOrDoc, Header?) → Fluent Fluent-обёртка A1sDP_Docs
SelfTest SelfTest() → Bool Самотест без реальной БД