При загрузке партии химических товаров паспорта безопасности часто теряются, прикрепляются к неверному товару или имеют неправильные версии. Ручная обработка занимает до 2 часов на 100 позиций, а ошибки в названиях файлов ведут к несоответствию юридическим требованиям. Автоматизация решает задачу: мы настраиваем свойства инфоблоков, пишем скрипт массовой загрузки из ZIP и выводим ссылку на SDS в карточке. Результат — менеджер загружает документы за минуты, покупатель видит актуальную версию. Наш опыт — 5 лет внедрений для магазинов химии, лакокрасочных материалов и промышленного оборудования. Гарантируем поддержку после запуска.
Safety Data Sheet (SDS) — обязательный документ для многих категорий: химические вещества, лаки, краски, чистящие средства, промышленные газы. В интернет-магазине на Битрикс документ должен быть доступен покупателю до покупки — это означает PDF в карточке товара с версионным контролем и возможностью скачивания.
Проблемы, которые решаем
Типичные сложности:
- Ручная загрузка каждого файла — до 2 часов на 100 товаров.
- Ошибки в именах файлов: артикул не совпадает, паспорт прикрепляется к неверному товару.
- Отсутствие версионности: непонятно, актуальный ли документ.
- Поиск товаров без SDS вручную через админку.
Мы автоматизируем процесс, сокращая время загрузки на 80% по сравнению с ручным прикреплением. Экономия на зарплате менеджера — существенная.
Организация массовой загрузки паспортов
Хранение документов
Паспорта безопасности хранятся в файловом хранилище Битрикс (/upload/) через модуль main. Связь с товаром — через свойство-файл инфоблока:
Свойство SAFETY_DATA_SHEET (тип F):
- Множественное: нет (один актуальный паспорт)
- Обязательное: нет (не у всех товаров)
- Подсказка: «PDF паспорта безопасности (ГОСТ 30333-2007)»
Для версионного контроля — свойство SAFETY_DATA_SHEET_DATE (тип DateTime).
Скрипт массовой загрузки из ZIP
Паспорта часто приходят пачкой от поставщика в ZIP-архиве с именами по артикулу. Наш скрипт обрабатывает архив за минуты:
Развернуть пример кода скрипта
function importSdsDocuments(string $zipPath, int $iblockId): array { $zip = new \ZipArchive(); $zip->open($zipPath); $results = ['ok' => 0, 'not_found' => [], 'error' => []]; for ($i = 0; $i < $zip->numFiles; $i++) { $filename = $zip->getNameIndex($i); if (!str_ends_with(strtolower($filename), '.pdf')) continue; preg_match('/^([A-Z0-9\-]+)/i', $filename, $matches); $article = $matches[1] ?? ''; $product = \CIBlockElement::GetList([], [ 'IBLOCK_ID' => $iblockId, 'PROPERTY_ARTICLE' => $article, ], false, ['nPageSize' => 1], ['ID', 'NAME'])->GetNext(); if (!$product) { $results['not_found'][] = $filename; continue; } $tmpPath = sys_get_temp_dir() . '/' . $filename; file_put_contents($tmpPath, $zip->getFromIndex($i)); $fileId = \CFile::SaveFile([ 'name' => $filename, 'tmp_name' => $tmpPath, 'type' => 'application/pdf', ], 'sds_documents'); if ($fileId) { \CIBlockElement::SetPropertyValuesEx($product['ID'], $iblockId, [ 'SAFETY_DATA_SHEET' => $fileId, 'SAFETY_DATA_SHEET_DATE' => date('d.m.Y'), ]); $results['ok']++; } } $zip->close(); return $results; } Скрипт в 5 раз быстрее ручной загрузки: обрабатывает 100 файлов за 20 минут вместо 2 часов. Настройка загрузки за 4 шага:
- Создайте свойства
SAFETY_DATA_SHEETиSAFETY_DATA_SHEET_DATEв инфоблоке товаров. - Разместите скрипт
importSdsDocumentsв административной части. - Добавьте в шаблон карточки вывод ссылки на паспорт.
- Настройте отчёт и обработчик валидации.
Проверка наличия SDS: важность и реализация
Отображение в карточке товара
В шаблоне bitrix:catalog.element добавляем блок:
<?php if (!empty($arResult['PROPERTIES']['SAFETY_DATA_SHEET']['VALUE'])): ?> <?php $sdsFile = \CFile::GetFileArray($arResult['PROPERTIES']['SAFETY_DATA_SHEET']['VALUE']); ?> <div class="product-sds"> <h4>Документация по безопасности</h4> <a href="<?= \CFile::GetPath($arResult['PROPERTIES']['SAFETY_DATA_SHEET']['VALUE']) ?>" download="<?= htmlspecialchars($sdsFile['ORIGINAL_NAME']) ?>" class="sds-download-btn"> <span class="pdf-icon"></span> Паспорт безопасности (PDF) <?php if (!empty($arResult['PROPERTIES']['SAFETY_DATA_SHEET_DATE']['VALUE'])): ?> <small>версия от <?= $arResult['PROPERTIES']['SAFETY_DATA_SHEET_DATE']['VALUE'] ?></small> <?php endif; ?> </a> <p class="sds-note">В соответствии с <cite>ГОСТ 30333-2007</cite></p> </div> <?php endif; ?> Атрибут download обеспечивает скачивание.
Валидация при добавлении товара
Для разделов, где SDS обязателен (например, «Химия», «Лакокрасочные материалы»), используем обработчик OnBeforeIBlockElementAdd:
AddEventHandler('iblock', 'OnBeforeIBlockElementAdd', function(&$fields) { $requiredSdsSections = \Bitrix\Main\Config\Option::get('sds_module', 'required_sections', ''); $requiredSectionIds = array_filter(explode(',', $requiredSdsSections)); if (in_array($fields['IBLOCK_SECTION_ID'], $requiredSectionIds)) { if (empty($fields['PROPERTY_VALUES']['SAFETY_DATA_SHEET'])) { $GLOBALS['APPLICATION']->ThrowException( 'Внимание: для этого раздела рекомендуется прикрепить паспорт безопасности.', 'SDS_MISSING' ); } } }); Отчёт по товарам без SDS
Административный отчёт (GET /bitrix/admin/sds_report.php) показывает список товаров из «химических» разделов без прикреплённого паспорта, с кнопкой быстрой загрузки.
SELECT ie.ID, ie.NAME, s.NAME as section_name FROM b_iblock_element ie JOIN b_iblock_section s ON s.ID = ie.IBLOCK_SECTION_ID LEFT JOIN b_iblock_element_property iep ON iep.IBLOCK_ELEMENT_ID = ie.ID AND iep.IBLOCK_PROPERTY_ID = ( SELECT ID FROM b_iblock_property WHERE IBLOCK_ID = ie.IBLOCK_ID AND CODE = 'SAFETY_DATA_SHEET' ) WHERE ie.IBLOCK_ID = ? AND ie.ACTIVE = 'Y' AND s.ID IN (/* разделы с обязательным SDS */) AND (iep.VALUE IS NULL OR iep.VALUE = '') ORDER BY s.NAME, ie.NAME; Отчёт позволяет за пару кликов выявить все товары без SDS.
Процесс работы
| Этап | Что делаем |
|---|---|
| Аналитика | Изучаем каталог, определяем разделы с обязательным SDS, согласовываем свойства |
| Проектирование | Схема хранения, скрипт загрузки, шаблон вывода, отчёт |
| Реализация | Настройка инфоблоков, скрипт, шаблон, обработчик валидации |
| Тестирование | На тестовых данных, исправляем ошибки |
| Деплой | Перенос на боевой сайт, обучение менеджеров |
Что входит в работу
- Свойства инфоблока (SAFETY_DATA_SHEET, SAFETY_DATA_SHEET_DATE)
- Скрипт массовой загрузки из ZIP с обработкой ошибок
- Шаблон отображения в карточке
- Отчёт по товарам без SDS
- Документация и обучение (1 час)
- Поддержка 1 месяц
Типичные ошибки и чек-лист
Ошибки:
- Неправильное имя файла (артикул не совпадает) — скрипт помечает как
not_found. - Файл превышает лимит (>20 МБ) — настраиваем ограничения.
- Дата версии не проставлена — автоматически берется текущая.
- Забыли прикрепить SDS вручную — валидация предупреждает.
Чек-лист перед запуском:
- [ ] Все артикулы в названиях файлов совпадают с товарами
- [ ] Свойства SAFETY_DATA_SHEET и SAFETY_DATA_SHEET_DATE созданы
- [ ] Разделы с обязательным SDS заданы в опциях
- [ ] Шаблон карточки выводит ссылку на скачивание
- [ ] Отчёт работает и показывает правильные товары
Сроки
| Этап | Срок |
|---|---|
| Настройка свойств инфоблока | 0.5 дня |
| Скрипт массовой загрузки из ZIP | 1 день |
| Шаблон отображения в карточке | 1 день |
| Отчёт по недостающим документам | 1 день |
| Тестирование и деплой | 0.5 дня |
| Итого | 4 дня |
Закажите настройку паспортов безопасности под ключ — получите готовое решение за 4 дня. Свяжитесь с нами для консультации и оценки вашего проекта. Мы гарантируем качество и поддержку после запуска.







