R
Раскрой Панелей
🌐 Тонкий / Веб-клиент 🖥️ Толстый — UI ⚡ Толстый — UI + API 🤖 Без UI 🏭 On-Premise

🖥️ Толстый клиент — UI Средняя

⏱ 1–2 часа 📝 ~60 строк ObjectScript 📋 Версия 1С: 8.3+
Толстый клиент, только интерфейс. HTML-поле открывает наш сервис. Поддерживает оба режима форм: управляемые (УФ, 8.3+) и обычные (ОФ, совместимость). HTTP-запросы к API не нужны — всё общение через JS-события.
Когда подходит
  • Толстый клиент, Windows
  • Управляемые или обычные формы
  • Нет доступа к внешним HTTP-сервисам
  • Нужен быстрый старт с минимальным кодом
  • Типовые конфигурации (УТ, ERP, БП)
Ограничения
  • Нет автообновления статусов заказа
  • Нет синхронизации склада остатков
  • Требует интернет на клиентской машине
  • Хотите больше — переходите на UI+API
Отличие от тонкого клиента: в толстом дополнительно работает перехват через ПриНавигации — это резервный механизм для старых конфигураций и обычных форм. В управляемых формах основной механизм тот же — ПриПолученииСообщенияОтВебСтраницы.

Пошаговая инструкция

1
Добавить общий модуль «РаскройПанелей»
В конфигураторе: Общие → Общие модули → Добавить. Имя: РаскройПанелей.
Флаги: Клиент (управляемое приложение) + Клиент (обычное приложение) — чтобы работал в обоих режимах.
РаскройПанелей (Общий модуль)
// ═══════════════════════════════════════════════════════════
// РаскройПанелей — толстый клиент, только UI
// Совместим: управляемые формы (УФ) + обычные формы (ОФ)
// ═══════════════════════════════════════════════════════════

BASE_URL  = "https://raskroy.app";
API_TOKEN = "rsk_ВАШ_КЛЮЧ";

// ── Открыть расчёт ───────────────────────────────────────────
&НаКлиенте
Процедура ОткрытьРасчёт(ПолеHTML, НомерСчёта, Контрагент, Детали, Стратегия = "optimal") Экспорт

    ДеталиСтрока = "";
    Для Каждого Д Из Детали Цикл
        ДеталиСтрока = ДеталиСтрока
            + ?(ДеталиСтрока = "", "", ",")
            + Д.ИД + ":" + Строка(Д.Ширина) + ":"
            + Строка(Д.Высота) + ":" + Строка(Д.Количество);
    КонецЦикла;

    URL = BASE_URL + "/?source=1c"
        + "&invoice="  + КодироватьСтроку(НомерСчёта,  СпособКодированияСтроки.URLВАдресеСтроки)
        + "&client="   + КодироватьСтроку(Контрагент,   СпособКодированияСтроки.URLВАдресеСтроки)
        + "&strategy=" + Стратегия
        + "&token="    + API_TOKEN
        + "&parts="    + ДеталиСтрока;

    ПолеHTML.Перейти(URL);

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

// ── Обработать ответ (общий для УФ и ОФ) ─────────────────────
&НаКлиенте
Процедура ОбработатьОтвет(Форма, JSONСтрока) Экспорт

    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(JSONСтрока);
    Данные = ПрочитатьJSON(Чтение);

    Если Данные.type <> "raskroy.fillInvoice" Тогда Возврат; КонецЕсли;

    ТабЧасть = Форма.Объект.Товары;
    Стр      = Неопределено;
    Для Каждого С Из ТабЧасть Цикл
        Если СтрНайти(НРег(С.Номенклатура.Наименование), "сэндвич") > 0 Тогда
            Стр = С; Прервать;
        КонецЕсли;
    КонецЦикла;
    Если Стр = Неопределено Тогда Стр = ТабЧасть.Добавить(); КонецЕсли;

    Стр.Количество  = Данные.sheets_used;
    Стр.Комментарий = "Раскрой " + Данные.strategy
        + ": "    + Данные.sheets_used  + " л."
        + " КПД " + Данные.efficiency_pct + "%"
        + " ликвид " + Данные.liquid_m2 + " м²";

    Сообщить("✓ Счёт заполнен: " + Данные.sheets_used + " листов");

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

// ── Разобрать URL-ответ (для обычных форм / ОФ) ──────────────
// Вызывается из ПолеРаскройПриНавигации если ПриПолученииСообщения не сработал
&НаКлиенте
Функция ИзвлечьДанныеИзURL(URL) Экспорт
    МаркерИндекс = СтрНайти(URL, "raskroy-data=");
    Если МаркерИндекс = 0 Тогда Возврат ""; КонецЕсли;
    Возврат Сред(URL, МаркерИндекс + СтрДлина("raskroy-data="));
КонецФункции
2
Добавить HTML-поле и кнопку на форму счёта
Откройте форму «Счёт покупателю» в конфигураторе. Добавьте вкладку «Раскрой», на ней — элемент ПолеHTMLДокумента (имя: ПолеРаскрой) и кнопку «Раскрой сэндвича».
3
Код модуля формы — выберите тип форм
Вставьте в модуль формы документа. Если не знаете тип форм — выберите «Управляемые». Если форма не открывается в 8.3 — выберите «Обычные».
Управляемые формы — МодульФормы
&НаКлиенте
Процедура РаскройСэндвичаНажатие(Элемент)
    Детали = Новый Массив;
    Счётчик = 1;
    Для Каждого Стр Из Объект.Товары Цикл
        Если СтрНайти(НРег(Стр.Номенклатура.Наименование), "сэндвич") > 0 Тогда
            Д = Новый Структура("ИД,Ширина,Высота,Количество",
                "P" + Счётчик, Стр.Номенклатура.Ширина,
                Стр.Номенклатура.Высота, Стр.Количество);
            Детали.Добавить(Д); Счётчик = Счётчик + 1;
        КонецЕсли;
    КонецЦикла;
    Если Детали.Количество() = 0 Тогда
        Предупреждение("Нет строк с сэндвич-панелями"); Возврат;
    КонецЕсли;
    РаскройПанелей.ОткрытьРасчёт(
        Элементы.ПолеРаскрой, Строка(Объект.Ссылка),
        Строка(Объект.Контрагент), Детали);
КонецПроцедуры

// Основной обработчик ответа (УФ, window.external.notify)
&НаКлиенте
Процедура ПолеРаскройПриПолученииСообщенияОтВебСтраницы(Элемент, ТипСообщения, Данные)
    Если ТипСообщения <> "notify" Или Данные = "" Тогда Возврат; КонецЕсли;
    Попытка
        РаскройПанелей.ОбработатьОтвет(ЭтотОбъект, Данные);
    Исключение
        Сообщить("Ошибка: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры

// Резервный обработчик (навигация, если notify не сработал)
&НаКлиенте
Процедура ПолеРаскройПриНавигации(Элемент, ОписаниеПерехода, СтандартнаяОбработка)
    JSONДанные = РаскройПанелей.ИзвлечьДанныеИзURL(ОписаниеПерехода.URL);
    Если JSONДанные = "" Тогда Возврат; КонецЕсли;
    СтандартнаяОбработка = Ложь;
    РаскройПанелей.ОбработатьОтвет(ЭтотОбъект, JSONДанные);
КонецПроцедуры
Обычные формы — МодульФормы
// Обычные формы: нет &НаКлиенте, нет ПриПолученииСообщения
// Используем ПриНавигации + URL-маркер

Процедура РаскройСэндвичаНажатие(Кнопка)
    Детали = Новый Массив;
    Счётчик = 1;
    Для Каждого Стр Из Объект.Состав Цикл  // в ОФ табчасть может называться "Состав"
        Если СтрНайти(НРег(Стр.Номенклатура.Наименование), "сэндвич") > 0 Тогда
            Д = Новый Структура("ИД,Ширина,Высота,Количество",
                "P" + Счётчик, Стр.Номенклатура.Ширина,
                Стр.Номенклатура.Высота, Стр.Количество);
            Детали.Добавить(Д); Счётчик = Счётчик + 1;
        КонецЕсли;
    КонецЦикла;
    РаскройПанелей.ОткрытьРасчёт(
        ЭлементыФормы.ПолеРаскрой, Строка(Объект.Ссылка),
        Строка(Объект.Контрагент), Детали);
КонецПроцедуры

// ОФ: перехват через ПриНавигации
Процедура ПолеРаскройПриНавигации(Элемент, Адрес, Отказ)
    JSONДанные = РаскройПанелей.ИзвлечьДанныеИзURL(Адрес);
    Если JSONДанные = "" Тогда Возврат; КонецЕсли;
    Отказ = Истина;
    РаскройПанелей.ОбработатьОтвет(ЭтотОбъект, JSONДанные);
КонецПроцедуры
В обычных формах имя табличной части в счёте может быть Состав, Товары или другое — проверьте в конфигураторе.
4
Заменить BASE_URL и API_TOKEN
В общем модуле замените значения констант на реальные.
Настройки
BASE_URL  = "https://raskroy.app";
API_TOKEN = "rsk_xxxxxxxxxxxx";  // ключ из /dashboard

Тестирование

💡Хотите авто-статусы и синхронизацию склада? Переходите к Толстый UI + API.