# Учебный ProductGroup: одна страница с переключателем

example.com зарезервирован для примеров. Марка, товары, SKU, цены, наличие и изображения вымышлены. Это полный синтаксический пример выбранной архитектуры, не действующее предложение. Замените все данные фактическими.

```json
{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Учебная сумка модели А",
  "description": "Вымышленная сумка в двух цветах; демонстрация одностраничного семейства.",
  "url": "https://example.com/bag-a/",
  "productGroupID": "BAG-A",
  "brand": {
    "@type": "Brand",
    "name": "Вымышленная марка А"
  },
  "variesBy": [
    "https://schema.org/color"
  ],
  "hasVariant": [
    {
      "@type": "Product",
      "name": "Учебная сумка модели А: синий",
      "description": "Вымышленный вариант для проверки структуры.",
      "sku": "BAG-A-BLUE",
      "color": "Синий",
      "image": "https://example.com/media/bag-a-blue.jpg",
      "offers": {
        "@type": "Offer",
        "url": "https://example.com/bag-a/?color=blue",
        "price": "2500",
        "priceCurrency": "RUB",
        "availability": "https://schema.org/InStock"
      }
    },
    {
      "@type": "Product",
      "name": "Учебная сумка модели А: чёрный",
      "description": "Вымышленный вариант для проверки структуры.",
      "sku": "BAG-A-BLACK",
      "color": "Чёрный",
      "image": "https://example.com/media/bag-a-black.jpg",
      "offers": {
        "@type": "Offer",
        "url": "https://example.com/bag-a/?color=black",
        "price": "2600",
        "priceCurrency": "RUB",
        "availability": "https://schema.org/OutOfStock"
      }
    }
  ]
}
```

Каждый Offer.url должен открывать уже выбранный цвет со своей ценой, изображением и состоянием покупки. У одностраничной модели общий canonical страницы группы. Для многостраничной архитектуры следуйте отдельному примеру Google: каждая страница содержит самостоятельную разметку, а url у ProductGroup не задают. Не переносите canonical одностраничного примера автоматически. Набор полей для merchant listings и товарных snippets проверяйте отдельно; успешный JSON.parse не равен приёмке Rich Results Test и не гарантирует показ.
