A1sCode библиотека 1С

Важно

Задачи дня

Базовый пример: перебор выборки


ТекстQ = "
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
|    Ном.Ссылка       КАК ID,
|    Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
";
Рез = A1sQ.ExecuteQ(ТекстQ, 10);          // позиционный параметр &Лимит
Выборка = Рез.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.ID + ": " + Выборка.Name);
КонецЦикла;
      

Здесь мы не создаём промежуточную таблицу — идём по строкам выборки.

Агрегаты «на лету» (без выгрузки)


ТекстQ = "
|ВЫБРАТЬ
|    Док.Ссылка         КАК ID,
|    Док.Дата           КАК Dt,
|    Док.СуммаДокумента КАК Amount
|ИЗ Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ Док.Дата МЕЖДУ &Начало И &Конец
";
Нач = НачалоДня(ТекущаяДата());
Кон = КонецДня(ТекущаяДата());

Рез = A1sQ.ExecuteQ(ТекстQ, Нач, Кон); // порядок: &Начало, &Конец
Выборка = Рез.Выбрать();

Всего = 0; КолВо = 0;
Пока Выборка.Следующий() Цикл
    Всего = Всего + Выборка.Amount;
    КолВо = КолВо + 1;
КонецЦикла;

A1sLog.Info("Day4", "Документов: " + КолВо + ", на сумму: " + Всего);
      

Ранний выход (как только нашли нужное)


ТекстQ = "
|ВЫБРАТЬ
|    Ном.Ссылка       КАК ID,
|    Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|ГДЕ Ном.Наименование ПОДОБНО &Маска
|УПОРЯДОЧИТЬ ПО Name
";
Рез = A1sQ.ExecuteQ(ТекстQ, "%кабель%");
Выборка = Рез.Выбрать();

НашлиID = Неопределено;
Пока Выборка.Следующий() Цикл
    Если СтрНачинаетсяС(СтрЗаменить(Выборка.Name, " ", ""), "Кабель") Тогда
        НашлиID = Выборка.ID;
        Прервать; // ранний выход
    КонецЕсли;
КонецЦикла;

Если НашлиID = Неопределено Тогда
    A1sLog.Info("Day4", "Ничего не нашли");
Иначе
    A1sLog.Info("Day4", "Нашли ID: " + НашлиID);
КонецЕсли;
      

Первая запись / первое значение


ТекстQ = "
|ВЫБРАТЬ ПЕРВЫЕ 1
|    Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
";
Рез = A1sQ.ExecuteQ(ТекстQ);
Выборка = Рез.Выбрать();

Имя = Неопределено;
Если Выборка.Следующий() Тогда
    Имя = Выборка.Name;
КонецЕсли;

Сообщить("Первое имя: " + A1sS.AsString(Имя));
      

COUNT без выгрузки


ТекстQ = "
|ВЫБРАТЬ
|    COUNT(Ном.Ссылка) КАК Cnt
|ИЗ Справочник.Номенклатура КАК Ном
|ГДЕ Ном.ЭтоГруппа = &ТолькоГруппы
";
Рез = A1sQ.ExecuteQ(ТекстQ, Ложь);
Выборка = Рез.Выбрать();

Cnt = 0;
Если Выборка.Следующий() Тогда
    Cnt = Выборка.Cnt;
КонецЕсли;

A1sLog.Info("Day4", "Позиций (не группы): " + Cnt);
      

Защита и логи


Функция БезопасноВыполнить(ТекстQ, П1 = Неопределено, П2 = Неопределено) Экспорт
    Попытка
        Возврат A1sQ.ExecuteQ(ТекстQ, П1, П2);
    Исключение
        A1sLog.Error("Day4", "Ошибка запроса: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
КонецФункции
      

Микро-утилита

ExecuteQFirstValue: получить первое значение первого столбца


Функция ExecuteQFirstValue(ТекстQ, П1 = Неопределено, П2 = Неопределено) Экспорт
    Рез = A1sQ.ExecuteQ(ТекстQ, П1, П2);
    Если Рез = Неопределено Тогда Возврат Неопределено; КонецЕсли;

    Вб = Рез.Выбрать();
    Если Вб.Следующий() Тогда
        // Берём первое поле по индексу 0
        Возврат Вб.Получить(0);
    КонецЕсли;

    Возврат Неопределено;
КонецФункции
      

Практика (15–30 минут)

  1. Переберите выборку «Номенклатуры» с лимитом и выведите строки.
  2. Посчитайте сумму документов за сегодня без выгрузки таблицы.
  3. Сделайте поиск по маске и выйдите из цикла на первой подходящей записи.
  4. Сделайте запрос COUNT(...) и прочтите значение из первой строки.

Чек-лист

Что дальше

День 5: BuildQ — параметры запросов и конструктор шаблонов.