Imagine a catalog of 15,000 products, each with 60 unique attributes. Standard information blocks become slow, administrators lack flexibility, and marketplace integration turns into a nightmare. We have built 15 custom PIM systems on 1C-Bitrix and completed over 30 implementations. Custom PIM solves these problems without switching to third-party software—Bitrix becomes the single master system for product data. Product Information Management (PIM) is an approach we adapt to the 1C-Bitrix ecosystem, preserving fast implementation and no license fees. As stated in the 1C-Bitrix documentation, infoblock v2.0 supports the EAV model, but for scalability we use a hybrid approach.
How is the data architecture organized?
The standard infoblock stores properties in b_iblock_element_property using the EAV model. With 50+ attributes and high traffic, this causes performance issues. For a custom PIM, we use a hybrid approach: fixed attributes (name, description, images) in infoblock fields, and dynamic attributes in custom tables.
CREATE TABLE b_pim_attribute ( ID INT AUTO_INCREMENT PRIMARY KEY, IBLOCK_SECTION_ID INT, CODE VARCHAR(100) NOT NULL, NAME VARCHAR(255) NOT NULL, TYPE ENUM('string','number','boolean','list','multilist') DEFAULT 'string', IS_REQUIRED TINYINT(1) DEFAULT 0, IS_FILTERABLE TINYINT(1) DEFAULT 0, SORT INT DEFAULT 100, INDEX idx_section (IBLOCK_SECTION_ID) ); CREATE TABLE b_pim_attribute_value ( ID INT AUTO_INCREMENT PRIMARY KEY, PRODUCT_ID INT NOT NULL, ATTRIBUTE_ID INT NOT NULL, VALUE_STRING VARCHAR(1000), VALUE_NUMBER DECIMAL(15,4), VALUE_BOOLEAN TINYINT(1), INDEX idx_product_attr (PRODUCT_ID, ATTRIBUTE_ID) ); CREATE TABLE b_pim_attribute_option ( ID INT AUTO_INCREMENT PRIMARY KEY, ATTRIBUTE_ID INT NOT NULL, VALUE VARCHAR(500) NOT NULL, SORT INT DEFAULT 100 ); This approach allows setting attributes at the category level without modifying the infoblock schema. See CommerceML for more details.
How to start: three steps
- Design the attribute schema: define fixed and dynamic attributes for each category. We prepare a table prototype.
- Deploy custom tables: run migrations to create
b_pim_attribute,b_pim_attribute_value, and indexes. - Set up the administrative interface: use our component based on
bitrix:main.ui.gridto manage attributes.
This process takes 2–3 days for an experienced developer.
Why custom PIM is better than off-the-shelf solutions?
Custom PIM on Bitrix is implemented 2–3 times faster than Akeneo Enterprise and requires no license fees. Cost comparison:
| Criterion | Custom PIM on Bitrix | Akeneo / Pimcore |
|---|---|---|
| License cost | $0 (included in ecosystem) | From $20,000–$50,000 per year |
| Implementation time | 2–8 weeks | 3–6 months |
| Flexibility for specific needs | Maximum | Limited by API |
| Performance up to 100k SKUs | Excellent | Depends on server |
License savings can reach $15,000–$30,000 per year, covering development costs in the first year.
Example YML feed generation
function buildYmlOffer(int $productId): array { $connection = \Bitrix\Main\Application::getConnection(); $values = $connection->query( "SELECT a.CODE, v.VALUE_STRING, v.VALUE_NUMBER FROM b_pim_attribute_value v JOIN b_pim_attribute a ON a.ID = v.ATTRIBUTE_ID WHERE v.PRODUCT_ID = {$productId}" ); $params = []; while ($row = $values->fetch()) { $params[$row['CODE']] = $row['VALUE_STRING'] ?? $row['VALUE_NUMBER']; } return $params; } How we implement the attribute management interface
A custom admin section based on the bitrix:main.ui.grid component:
// /local/modules/company.pim/admin/attributes.php require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php'; $APPLICATION->SetTitle('PIM: Attribute Management'); $sectionId = (int)$_GET['section_id']; $connection = \Bitrix\Main\Application::getConnection(); $attributes = $connection->query( "SELECT * FROM b_pim_attribute WHERE IBLOCK_SECTION_ID = {$sectionId} ORDER BY SORT" ); The interface allows managers to:
- Add attributes to a category without changing the database structure
- Set type, required, and filterable options
- Sort attributes by drag and drop
- Copy attribute sets to child categories
The product edit form displays dynamic attributes of the current category. Validation of required attributes is performed upon save.
Syndication to multiple channels
Custom PIM exports data in formats: Yandex.Market (YML), Ozon, Wildberries (JSON), Google Merchant. The feed generation example is shown above.
What is included in the work?
- Technical specification and data schema prototype
- Core functionality development (tables, edit form, validation)
- Custom administrative interface with sorting and attribute copying
- Exporters for marketplaces (YML, JSON, XML)
- Documentation and source code delivery
- Administrator training on the system
- One-month warranty support
Process and timelines
| Stage | Duration | Result |
|---|---|---|
| Analysis and design | 3–5 days | Technical specification, schema prototype |
| Core functionality development | 2–3 weeks | Tables, edit form, save logic |
| Validation and UI improvements | 1–2 weeks | Custom admin panel, sorting, copying |
| Syndication and bulk editing | 2–3 weeks | Exporters, bulk edit |
| Testing and documentation | 1 week | Load test report, documentation |
Total duration: 2 to 8 weeks depending on scope. Contact us for an accurate estimate of your project.
How we test performance
We conduct load testing with ab and jmeter, simulating 500 concurrent requests. We check YML feed generation time (under 10 seconds for 50,000 products). If needed, we add tagged caching.
Typical mistakes in development
- Using only infoblock properties (EAV) for all attributes—causes slowdowns in mass queries.
- Not creating indexes on custom tables—queries slow down already at 10,000 products.
- Forgetting asynchronous attribute saving—blocks the interface during editing.
Order development
We will evaluate your project in one day and prepare a commercial proposal with precise timelines. Get an engineer's consultation—send us a message.







