Статья #3

Генерация типовых обработок и отчетов с помощью AI

Проблема

1С-разработчики часто создают однотипные обработки и отчеты:
- Печатные формы документов
- Отчеты по остаткам и оборотам
- Обработки загрузки/выгрузки данных
- Служебные утилиты для администрирования

Написание такого кода с нуля занимает время и подвержено ошибкам.

Решение с Claude Code

Claude Code может генерировать полноценный код обработок и отчетов на основе описания требований и примеров существующего кода.

Практические примеры

Пример 1: Генерация печатной формы

Задача для Claude Code:

Создай печатную форму для документа "ЗаказПокупателя" в формате табличного документа.

Требования:
- Шапка с реквизитами организации
- Таблица товаров с колонками: Наименование, Количество, Цена, Сумма
- Итоговая строка с общей суммой
- Подписи ответственных лиц

Используй современный стиль оформления с границами ячеек.

Результат:

// Процедура печати документа ЗаказПокупателя
Процедура Печать(МассивОбъектов, ОбъектыПечати, ПараметрыВывода) Экспорт

    ТабДок = Новый ТабличныйДокумент;
    ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказПокупателя";

    Для Каждого Ссылка Из МассивОбъектов Цикл

        // Получаем данные документа
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказПокупателя.Номер КАК Номер,
        |    ЗаказПокупателя.Дата КАК Дата,
        |    ЗаказПокупателя.Организация КАК Организация,
        |    ЗаказПокупателя.Контрагент КАК Контрагент,
        |    ЗаказПокупателя.Товары.(
        |        Номенклатура,
        |        Количество,
        |        Цена,
        |        Сумма
        |    ) КАК Товары
        |ИЗ
        |    Документ.ЗаказПокупателя КАК ЗаказПокупателя
        |ГДЕ
        |    ЗаказПокупателя.Ссылка = &Ссылка";

        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
        Выборка.Следующий();

        // Шапка документа
        Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.ЗаказПокупателя.ПФ_MXL_ЗаказПокупателя");

        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ОбластьШапка.Параметры.НомерДокумента = Выборка.Номер;
        ОбластьШапка.Параметры.ДатаДокумента = Формат(Выборка.Дата, "ДЛФ=D");
        ОбластьШапка.Параметры.Организация = Выборка.Организация;
        ОбластьШапка.Параметры.Контрагент = Выборка.Контрагент;
        ТабДок.Вывести(ОбластьШапка);

        // Заголовок таблицы
        ОбластьЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
        ТабДок.Вывести(ОбластьЗаголовокТаблицы);

        // Строки таблицы
        ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
        ВыборкаТовары = Выборка.Товары.Выбрать();

        ОбщаяСумма = 0;
        Пока ВыборкаТовары.Следующий() Цикл
            ОбластьСтрока.Параметры.Заполнить(ВыборкаТовары);
            ТабДок.Вывести(ОбластьСтрока);
            ОбщаяСумма = ОбщаяСумма + ВыборкаТовары.Сумма;
        КонецЦикла;

        // Итоговая строка
        ОбластьИтого = Макет.ПолучитьОбласть("Итого");
        ОбластьИтого.Параметры.ОбщаяСумма = ОбщаяСумма;
        ТабДок.Вывести(ОбластьИтого);

        // Подписи
        ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");
        ТабДок.Вывести(ОбластьПодписи);

        УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок,
            НомерСтрокиНачало, ОбъектыПечати, Ссылка);

    КонецЦикла;

    Возврат ТабДок;

КонецПроцедуры

Пример 2: Отчет по остаткам товаров

Задача:

Создай СКД отчет "Остатки товаров на складах" со следующими возможностями:
- Группировка по складам и номенклатуре
- Отбор по складу, номенклатуре, дате
- Вывод количества и суммы
- Возможность детализации до документов движений

Claude Code создаст:
1. Схему компоновки данных (XML)
2. Модуль объекта отчета
3. Форму отчета
4. Настройки по умолчанию

Пример 3: Обработка загрузки из Excel

Задача:

Создай обработку для загрузки номенклатуры из Excel файла.

Структура файла:
- Колонка A: Артикул
- Колонка B: Наименование
- Колонка C: Цена
- Колонка D: Группа номенклатуры

Требования:
- Проверка обязательных полей
- Поиск существующих элементов по артикулу
- Создание новых элементов
- Обновление цен
- Логирование результатов

Результат:

// Модуль обработки ЗагрузкаНоменклатурыИзExcel

Процедура ЗагрузитьДанные(ПутьКФайлу) Экспорт

    Попытка
        ТабДок = Новый ТабличныйДокумент;
        ТабДок.Прочитать(ПутьКФайлу);
    Исключение
        ВызватьИсключение "Не удалось прочитать файл: " + ОписаниеОшибки();
    КонецПопытки;

    // Таблица для хранения результатов
    ТаблицаРезультатов = Новый ТаблицаЗначений;
    ТаблицаРезультатов.Колонки.Добавить("Артикул");
    ТаблицаРезультатов.Колонки.Добавить("Наименование");
    ТаблицаРезультатов.Колонки.Добавить("Результат");
    ТаблицаРезультатов.Колонки.Добавить("Комментарий");

    // Начинаем со второй строки (первая - заголовки)
    Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл

        Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст);
        Наименование = СокрЛП(ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2).Текст);
        ЦенаТекст = СокрЛП(ТабДок.Область(НомерСтроки, 3, НомерСтроки, 3).Текст);
        ГруппаНаименование = СокрЛП(ТабДок.Область(НомерСтроки, 4, НомерСтроки, 4).Текст);

        СтрокаРезультата = ТаблицаРезультатов.Добавить();
        СтрокаРезультата.Артикул = Артикул;
        СтрокаРезультата.Наименование = Наименование;

        // Проверка обязательных полей
        Если ПустаяСтрока(Артикул) Или ПустаяСтрока(Наименование) Тогда
            СтрокаРезультата.Результат = "Ошибка";
            СтрокаРезультата.Комментарий = "Не заполнены обязательные поля";
            Продолжить;
        КонецЕсли;

        // Преобразование цены
        Попытка
            Цена = Число(СтрЗаменить(ЦенаТекст, ",", "."));
        Исключение
            СтрокаРезультата.Результат = "Ошибка";
            СтрокаРезультата.Комментарий = "Неверный формат цены";
            Продолжить;
        КонецПопытки;

        // Поиск или создание группы
        Группа = НайтиСоздатьГруппу(ГруппаНаименование);

        // Поиск существующей номенклатуры
        НоменклатураСсылка = НайтиНоменклатуруПоАртикулу(Артикул);

        Если НоменклатураСсылка = Неопределено Тогда
            // Создаем новый элемент
            НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
            НоменклатураОбъект.Артикул = Артикул;
            НоменклатураОбъект.Наименование = Наименование;
            НоменклатураОбъект.Родитель = Группа;

            Попытка
                НоменклатураОбъект.Записать();
                СтрокаРезультата.Результат = "Создано";
            Исключение
                СтрокаРезультата.Результат = "Ошибка";
                СтрокаРезультата.Комментарий = ОписаниеОшибки();
                Продолжить;
            КонецПопытки;

        Иначе
            // Обновляем существующий
            НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
            НоменклатураОбъект.Наименование = Наименование;
            НоменклатураОбъект.Родитель = Группа;

            Попытка
                НоменклатураОбъект.Записать();
                СтрокаРезультата.Результат = "Обновлено";
            Исключение
                СтрокаРезультата.Результат = "Ошибка";
                СтрокаРезультата.Комментарий = ОписаниеОшибки();
                Продолжить;
            КонецПопытки;

        КонецЕсли;

        // Обновление цены
        УстановитьЦенуНоменклатуры(НоменклатураОбъект.Ссылка, Цена);

    КонецЦикла;

    Возврат ТаблицаРезультатов;

КонецПроцедуры

Функция НайтиНоменклатуруПоАртикулу(Артикул)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Артикул = &Артикул";

    Запрос.УстановитьПараметр("Артикул", Артикул);
    Результат = Запрос.Выполнить();

    Если Результат.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Выборка.Следующий();

    Возврат Выборка.Ссылка;

КонецФункции

// Дополнительные вспомогательные функции...

Генерация веб-сервисов и REST API

Команда:
"Создай HTTP-сервис для получения остатков товаров.

Метод: GET /api/v1/stock/{itemCode}

Ответ в формате JSON:
{
  "itemCode": "string",
  "itemName": "string",
  "warehouses": [
    {
      "warehouseName": "string",
      "quantity": number
    }
  ],
  "totalQuantity": number
}

Добавь обработку ошибок и базовую аутентификацию."

Claude Code создаст полный модуль HTTP-сервиса с обработкой запросов.

AI-агенты для генерации кода

Для сложных задач можно использовать специализированных агентов:

// custom-1c-generator-agent.js
// Агент для генерации 1С кода на основе спецификаций

const agent = {
  name: '1c-code-generator',

  async generateFromSpec(specification) {
    // 1. Анализ спецификации
    const analysis = await this.analyzeSpec(specification);

    // 2. Генерация структуры объектов
    const structure = await this.generateStructure(analysis);

    // 3. Генерация кода
    const code = await this.generateCode(structure);

    // 4. Проверка синтаксиса
    const validation = await this.validateSyntax(code);

    return {
      code,
      validation,
      documentation: this.generateDocs(code)
    };
  }
};

Шаблоны и переиспользование

Создайте библиотеку шаблонов для частых задач:

/templates/1c/
  ├── reports/
  │   ├── basic-query-report.bsl
  │   └── scd-report.xml
  ├── dataprocessors/
  │   ├── excel-import.bsl
  │   └── batch-edit.bsl
  └── modules/
      ├── rest-api.bsl
      └── integration-service.bsl

Команда:

"Используя шаблон templates/1c/reports/basic-query-report.bsl,
создай отчет по продажам с группировкой по менеджерам"

Лучшие практики

  1. Детальное описание: Чем подробнее описание, тем лучше результат
  2. Примеры: Предоставляйте примеры существующего кода для соблюдения стиля
  3. Итеративная разработка: Начинайте с прототипа, затем уточняйте
  4. Код-ревью: Всегда проверяйте сгенерированный код перед использованием
  5. Тестирование: Создавайте тесты для сгенерированного кода

Экономия времени

Типичная экономия времени при использовании AI-генерации:

  • Печатная форма: 2-3 часа → 15-30 минут
  • Простой отчет: 3-4 часа → 30-60 минут
  • Обработка импорта: 4-6 часов → 1-2 часа
  • Веб-сервис: 4-8 часов → 1-2 часа

Ограничения и риски

  • Сгенерированный код требует проверки и тестирования
  • Может не учитывать специфику конкретной конфигурации
  • Необходимо адаптировать под стандарты кодирования компании
  • Сложные бизнес-логики требуют ручной доработки

Интересно узнать больше?

Посмотрите другие статьи о том, как AI ускоряет разработку 1С

Перейти к блогу