Загрузка прайса поставщика в номенклатуру УТ 11 по JSON-схеме: прогон на копии демобазы, ошибки простой версии и внешняя обработка
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Как загружать прайс поставщика в номенклатуру УТ 11 по JSON-схеме и что ломается, когда модуль, прошедший тесты на пустой конфигурации, встречает настоящую УТ. Все прогоны на копиях баз, снимки из Конфигуратора и тонкого клиента.
- ПрочитатьJSON(…, Ложь) возвращает Структуру без метода Получить; синтаксический контроль этого не видит.
- В УТ артикул не уникален: товар «Не годен» - отдельный элемент с тем же артикулом.
- Записать() из кода не вызывает проверку заполнения; форма вызывает, а проведение поступления элемент не проверило.
- Новый элемент заполняется штатно: Заполнить() с видом номенклатуры, inherit, ПроверитьЗаполнение().
- Обработка подключается к УТ без изменения конфигурации; через COM нужен ОписаниеЗащитыОтОпасныхДействий.
Тест на пустой конфигурации проверяет код. Загрузку в типовую конфигурацию проверяют прогон на её копии, запись элемента формой и документ, проведённый с загруженным элементом.
Для кого: разработчики 1С, которые загружают прайсы поставщиков в УТ и другие конфигурации на БСП.
- Стенды
- Ловушка ПрочитатьJSON: структура вместо соответствия
- Схема маппинга
- Первый прогон на УТ: что сделала простая версия
- Что в УТ устроено иначе, чем в стенде
- Как модуль обрабатывает новую строку
- Прогон версии 3 на УТ
- Внешняя обработка в работающей УТ
- Обработка в Конфигураторе
- Стенд 1: колонки, кодировка, числа
- Замер на 10 000 и 100 000 строк
- Чем это отличается от готовых обработок
- Что не проверено
- Источники
- Файл к статье
- Итог
Поставщик присылает прайс в CSV, и раз в полгода в нём что-нибудь меняется: «Артикул» становится «Кодом товара», колонки меняются местами, файл приходит из Excel в windows-1251. Я вынесла сопоставление колонок с реквизитами в JSON-файл: модуль 1С читает схему, ищет колонки по заголовку и загружает справочник с протоколом по каждой строке.
Первую рабочую версию модуля я проверила на пустой конфигурации, и все сценарии прошли. Потом запустила её на копии демобазы «Управление торговлей» 11.5.22.77. Модуль переименовал элемент брака «Вентилятор BINATONE ALPINE, Не годен» в нормальный товар и создал кабели, которые форма номенклатуры УТ записать не даёт. Ниже - что в УТ устроено иначе, как модуль это теперь обрабатывает и как выглядит загрузка во внешней обработке, не меняющей конфигурацию. Всё запускалось на этом компьютере 19 и 20 октября 2026 года, на копиях баз; снимки сделаны с экрана Конфигуратора и тонкого клиента УТ.
Стенды
| Условие | Значение |
|---|---|
| Даты | 19-20.10.2026 |
| Платформа | 1С:Предприятие 8.3.27.2130 (x86) |
| Стенд 1 | Файловая база из XML (build_ib.py): справочники «Номенклатура» (Артикул, Производитель, Цена) и «ЖурналЗагрузок», модуль загрузки как общий модуль |
| Стенд 2 | Копия демобазы «Управление торговлей» 11.5.22.77, файловая, 2,8 ГБ. Конфигурация не менялась, модуль работает в модуле объекта внешней обработки ЗагрузкаПрайсаПоСхеме.epf. Каждый сценарий начинается со свежей копии, оригинал только читается |
| Вызов | Внешнее соединение V83.COMConnector из 32-битного PowerShell 5.1; в УТ ещё тонкий клиент и Конфигуратор |
| Python | 3.12.10, только стандартная библиотека |
| Компьютер | Intel Core i5-2400 3,1 ГГц (4 ядра, 2011 год), 7,9 ГБ ОЗУ, SSD Samsung 850 EVO (SATA), Windows 11 Pro 10.0.22631. Компьютер рабочий: во время замеров были открыты браузер и приложение Claude |

Ловушка ПрочитатьJSON: структура вместо соответствия
Первая функция чтения схемы, написанная по памяти, выглядела так:
Второй параметр ПрочитатьJSON («ПрочитатьВСоответствие») при Ложь превращает объект JSON в Структуру, у которой нет метода Получить. Синтаксический контроль это пропускает: тип ДанныеСхемы известен только во время выполнения. Вызов на стенде 1:
=== 0. Функция из черновика статьи (ЧтениеМаппинга1С.ПрочитатьСхемуМаппингаИзJSON) на mapping_v1.json
ИСКЛЮЧЕНИЕ: Метод объекта не обнаружен (Получить)
{ОбщийМодуль.ЧтениеМаппинга1С.Модуль(21)}:МассивПолей = ДанныеСхемы.Получить("fields");
{ОбщийМодуль.СтендПроверки.Модуль(34)}:Таблица = ЧтениеМаппинга1С.ПрочитатьСхемуМаппингаИзJSON(ПутьСхемы);

С Истина объекты читаются в Соответствие: ключи вида column_index и target_1c в нём могут быть любыми строками, а ключ структуры обязан быть идентификатором 1С. Кодировку файла схемы модуль указывает явно, ОткрытьФайл(Путь, "UTF-8").
Схема маппинга
Черновик схемы делает mapping_gen.py по первой строке CSV: определяет кодировку (UTF-8 или windows-1251, в которой Excel сохраняет «CSV (разделители - запятые)») и разделитель, сопоставляет знакомые заголовки по словарю, незнакомые помечает skip. Дальше схему открывает и правит человек. Для прайса дистрибьютора в УТ она выглядит так (фрагмент examples-ut/mapping_ut.json):
| Режим или поле | Что делает |
|---|---|
search_key |
Колонка, по которой ищется существующий элемент; ровно одна |
fill, numeric |
Строковый и числовой реквизит; числа понимаются в виде 1 450,00 и 1450.00 |
ref |
Ссылка на справочник или перечисление: элемент ищется по наименованию, не группа и не помеченный на удаление; найдено два - ошибка строки |
property |
Дополнительный реквизит БСП по заголовку свойства; значение типа «Дополнительное значение» ищется среди значений этого свойства |
lookup_filters |
Уточнение поиска ссылки, когда одно наименование есть у нескольких элементов |
inherit |
Новый элемент берёт значение из поля другого реквизита (ставка НДС из вида номенклатуры) |
defaults |
Значения для новых элементов, если в файле нет колонки |
skip |
Колонка не загружается |
Колонка ищется по заголовку source_column, поэтому перестановка колонок схему не ломает. Цены в схеме УТ стоят skip: у справочника «Номенклатура» в УТ нет реквизита цены, цены живут в документах установки цен, и это отдельная задача.
Первый прогон на УТ: что сделала простая версия
Простая версия модуля (в архиве - evidence/ЗагрузкаПоСхемеМаппинга_v2_до_УТ.bsl) прошла все сценарии стенда 1. На УТ со схемой «как для стенда» она остановилась на проверке схемы:
строк: 0, создано: 0, обновлено: 0, без изменений: 0, пропущено: 0, время: 4 мс ошибка: схема: Колонка «Производитель»: реквизит «Производитель» не строковый, для него нужен режим numeric ошибка: схема: Колонка «Цена, руб.»: у справочника «Номенклатура» нет реквизита «Цена»
Совет «нужен режим numeric» для ссылочного реквизита неверный: режима для ссылок в этой версии не было. В схеме остались артикул и наименование, и версия загрузила файл:
строк: 10, создано: 5, обновлено: 3, без изменений: 2, пропущено: 0, время: 11217 мс элементов номенклатуры: было 192, стало 197 код | артикул | наименование | вид | ед. | тип | производитель ЦУ-00000031 | NYM 1х4 | Кабель NYM (Севкабель) 1х4 | Кабели силовые NYM | м | Товар | Севкабель ЦУ-00000032 | NYM 1х6 | Кабель NYM (Севкабель) 1х6 | Кабели силовые NYM | м | Товар | Севкабель ЦБ-00000323 | NYM 3х0,75 | Кабель NYM (Севкабель) 3х0,75 | - | - | - | - ЦУ-00000033 | NYM 3х1,5 | Кабель NYM (Севкабель) 3х1,5, бухта 100 м | Кабели силовые NYM | м | Товар | Севкабель ЦБ-00000319 | NYM 3х2,5 | Кабель NYM (Севкабель) 3х2,5 | - | - | - | - ЦБ-00000321 | NYM 3х4 | Кабель NYM 3х4 | - | - | - | - ЦУ-00000035 | NYM 5х1,5 | Кабель NYM (Севкабель) 5х1,5 | Кабели силовые NYM | м | Товар | Севкабель ЦБ-00000320 | NYM 5х2,5 | Кабель NYM (Севкабель) 5х2,5 | - | - | - | - ЦУ-00000034 | NYM 5х35 | Кабель NYM (Севкабель) 5х35 | Кабели силовые NYM | м | Товар | Севкабель 000000064 | В-789 | Вентилятор BINATONE ALPINE 160вт, напольный, оконный | Электротовары | шт | Товар | Завод бытовой техники ЦУ-00000046 | В-789 | Вентилятор BINATONE ALPINE 160вт, напольный, оконный | Электротовары | шт | Товар | Завод бытовой техники 000000066 | ВО-890 | Вентилятор оконный | Электротовары | шт | Товар | Завод бытовой техники ЦБ-00000322 | УДЛ-5 | Удлинитель 5 м, 3 розетки | - | - | - | -
В таблице видно три проблемы. Пять новых элементов без вида, единицы, типа и производителя. Артикул NYM 5х1,5 с пробелом в начале стал NYM 5х1,5, хотя об этом никто не просил. И главное: в базе два элемента с артикулом В-789, модуль взял последний из запроса и переписал его наименование.

Новый кабель из этого прогона в форме УТ:

Кнопка «Записать» в этой форме выдаёт ошибку: форма вызывает проверку заполнения, а Объект.Записать() из кода её не вызывает.

Я ожидала, что с таким элементом не проведётся и документ, и проверила это: скопировала проведённое поступление кабеля и подставила новый элемент в первую строку.
=== 2а. Годится ли элемент версии 2 для документа NYM 3х2,5: копия поступления № ТД00-000056 с товаром «Кабель NYM (Севкабель) 3х2,5» проведена: Приобретение товаров и услуг ТДЦБ-000004 от 20.10.2026 15:18:41 (проведён: Да)
Документ провёлся. Проведение этого поступления не проверило заполненность карточки номенклатуры, и неполный элемент попал в учёт без единого предупреждения; исправлять его пришлось бы вместе с документами.
Что в УТ устроено иначе, чем в стенде
Всё ниже найдено в копии демобазы запросами через внешнее соединение (stand-ut/probe_ut.ps1, probe_data.ps1, probe_props.ps1).
| Что | Как в демобазе УТ 11.5.22.77 | Что делает модуль |
|---|---|---|
| Артикул не уникален | 192 элемента, у 63 артикула нет, у остальных 129 элементов 106 разных артикулов. Элемент «…, Не годен» - тот же товар другого качества с тем же артикулом | Ключ, который в базе у нескольких элементов, - ошибка строки с перечнем этих элементов |
| Пробелы в ключах | NYM 5х1,5, КВ- 900, Б- 130005 |
Ключи сравниваются без крайних пробелов; у существующего элемента ключ не переписывается |
| Ссылочные реквизиты | «Производитель», «Вид номенклатуры», «Единица измерения» - ссылки | Режим ref, поиск по наименованию |
| «шт» не одна | Четыре упаковки «шт»: базовая единица и упаковки трёх товаров | lookup_filters по владельцу «Базовые единицы измерения» |
| Дополнительные реквизиты | Вид «Кабели силовые NYM» требует «Число жил», «Сечение (кв_мм)», «Наружный диаметр», «Расчетная масса» | Режим property |
| Разный разделитель | Значения сечения записаны и как «1,5», и как «2.5» | Для числового текста второй поиск с другим разделителем |
| Поля по виду | Заполнить() не берёт ставку НДС и использование характеристик из вида, это делает форма |
inherit в схеме |
| Защита от опасных действий | Обработка, открытая через COM, получает «Предупреждение безопасности» | ВнешниеОбработки.Создать(Путь, Ложь, ОписаниеЗащитыОтОпасныхДействий) |
| Нет реквизита цены | Цены - в документах установки цен | Колонка цены skip |
Как модуль обрабатывает новую строку
Для нового элемента модуль вызывает штатное заполнение с видом номенклатуры и значениями из строки, затем inherit, затем проверку заполнения, и только после неё запись. Фрагмент модуля, открытый в Конфигураторе:

Текущие значения всех загружаемых реквизитов и дополнительных реквизитов читаются двумя запросами до цикла. Строка, которая совпадает с базой, пропускается без чтения объекта. Ключ, найденный у нескольких элементов, попадает в отдельный список, и строки с ним не загружаются.
Через внешнее соединение текст исключения 1С не доходит, приходит только NullReferenceException. Поэтому у модуля есть обёртка ЗагрузитьИВернутьПротокол, которая возвращает протокол или подробный текст ошибки строкой.
Прогон версии 3 на УТ
Пробный прогон на свежей копии, ничего не записывается:
ПРОБНЫЙ ПРОГОН, ничего не записано; строк: 10, создано: 2, обновлено: 1, без изменений: 3, пропущено: 4, время: 3862 мс предупреждение: в базе 21 значений ключа «Артикул» встречаются у нескольких элементов; строки с ними не загружаются ошибка: строка 7: в базе 2 элемента с ключом «В-789» (Вентилятор BINATONE ALPINE 160вт, напольный, оконный; Вентилятор BINATONE ALPINE, Не годен); какой обновлять, решает человек ошибка: строка 9: колонка «Производитель»: «Электрокабель-НН» не найдено (Производитель) ошибка: строка 10: не прошла проверка заполнения: Поле "Вид номенклатуры" не заполнено / Поле "Использование характеристик" не заполнено / Поле "Ставка НДС" не заполнено ошибка: строка 11: колонка «Сечение, мм2»: «0,75» не найдено (Дополнительное значение, отбор: Владелец = Сечение (кв_мм))
Загрузка того же файла:
строк: 10, создано: 2, обновлено: 1, без изменений: 3, пропущено: 4, время: 10426 мс предупреждение: в базе 21 значений ключа «Артикул» встречаются у нескольких элементов; строки с ними не загружаются ошибка: строка 7: в базе 2 элемента с ключом «В-789» (Вентилятор BINATONE ALPINE 160вт, напольный, оконный; Вентилятор BINATONE ALPINE, Не годен); какой обновлять, решает человек ошибка: строка 9: колонка «Производитель»: «Электрокабель-НН» не найдено (Производитель) ошибка: строка 10: не прошла проверка заполнения: Поле "Вид номенклатуры" не заполнено / Поле "Использование характеристик" не заполнено / Поле "Ставка НДС" не заполнено ошибка: строка 11: колонка «Сечение, мм2»: «0,75» не найдено (Дополнительное значение, отбор: Владелец = Сечение (кв_мм))
| Строка | Что в ней | Результат |
|---|---|---|
| 2, 4 | NYM 1х4, NYM 5х1,5 (в базе NYM 5х1,5) с теми же значениями |
без изменений |
| 3 | NYM 3х1,5 с новым наименованием | обновлено наименование |
| 5, 6 | NYM 3х2,5 и NYM 5х2,5, новые | созданы с видом, единицей, ставкой НДС и четырьмя доп. реквизитами |
| 7 | В-789: в базе нормальный товар и «Не годен» | пропущена, оба элемента не тронуты |
| 8 | ВО-890 с теми же значениями | без изменений |
| 9 | производитель «Электрокабель-НН», которого нет в базе | пропущена |
| 10 | удлинитель без вида номенклатуры | пропущена: проверка заполнения назвала три поля |
| 11 | сечение «0,75», такого значения свойства нет | пропущена |
Созданные кабели и их дополнительные реквизиты:
новые и изменённые кабели: ставка НДС, характеристики, дополнительные реквизиты NYM 1х4 | 20% | Не используются | Базовые единицы измерения NYM 3х1,5 | 20% | Не используются | Базовые единицы измерения NYM 3х2,5 | 20% | Не используются | Базовые единицы измерения NYM 5х2,5 | 20% | Не используются | Базовые единицы измерения NYM 3х2,5 | Наружный диаметр (кв. мм) | 9.6 NYM 3х2,5 | Расчетная масса (кг/км) | 155 NYM 3х2,5 | Сечение (кв_мм) | 2.5 NYM 3х2,5 | Число жил | 3 NYM 5х2,5 | Наружный диаметр (кв. мм) | 11.5 NYM 5х2,5 | Расчетная масса (кг/км) | 250 NYM 5х2,5 | Сечение (кв_мм) | 2.5 NYM 5х2,5 | Число жил | 5
Повторная загрузка того же файла ничего не записала:
строк: 10, создано: 0, обновлено: 0, без изменений: 6, пропущено: 4, время: 3043 мс предупреждение: в базе 21 значений ключа «Артикул» встречаются у нескольких элементов; строки с ними не загружаются ошибка: строка 7: в базе 2 элемента с ключом «В-789» (Вентилятор BINATONE ALPINE 160вт, напольный, оконный; Вентилятор BINATONE ALPINE, Не годен); какой обновлять, решает человек ошибка: строка 9: колонка «Производитель»: «Электрокабель-НН» не найдено (Производитель) ошибка: строка 10: не прошла проверка заполнения: Поле "Вид номенклатуры" не заполнено / Поле "Использование характеристик" не заполнено / Поле "Ставка НДС" не заполнено ошибка: строка 11: колонка «Сечение, мм2»: «0,75» не найдено (Дополнительное значение, отбор: Владелец = Сечение (кв_мм))
И проверка проведением, на этот раз с элементами версии 3:
=== 6. Годится ли элемент версии 3 для документа NYM 3х2,5: копия поступления № ТД00-000056 с товаром «Кабель NYM (Севкабель) 3х2,5» проведена: Приобретение товаров и услуг ТДЦБ-000004 от 20.10.2026 15:22:29 (проведён: Да) NYM 5х2,5: копия поступления № ТД00-000056 с товаром «Кабель NYM (Севкабель) 5х2,5» проведена: Приобретение товаров и услуг ТДЦБ-000005 от 20.10.2026 15:23:27 (проведён: Да)
Внешняя обработка в работающей УТ
Обработка открывается в тонком клиенте как обычный внешний файл: «Файл - Открыть» или параметр запуска /Execute. УТ сначала спрашивает, доверяете ли вы файлу:

Форма обработки - пути к файлам, «Проверить без записи», «Загрузить» и протокол. Элементы формы создаются в ПриСозданииНаСервере, поэтому Form.xml в исходниках короткий. Для стенда форма понимает параметр запуска /C "mapping;csv=…;schema=…;run=check" и сразу выполняет пробный прогон:

После кнопки «Загрузить»:

Карточка нового кабеля в УТ: вид, тип «Товар», ставка НДС 20%, единица хранения «м», производитель «Севкабель» и четыре дополнительных реквизита. Наименование для печати УТ заполнила сама. Кнопка «Записать» в этой форме сработала без ошибок.

Элемент брака после версии 3 остался прежним:

Проведённая копия поступления с новым кабелем в первой строке:

Обработка в Конфигураторе
Обработка собирается из исходников архива командой python epf/build_epf.py --base <любая файловая база> (Конфигуратор, /LoadExternalDataProcessorOrReportFromFiles). Модуль объекта - тот же файл ЗагрузкаПоСхемеМаппинга.bsl, что и общий модуль стенда 1. Открытая в Конфигураторе УТ:



Синтаксический контроль тех же модулей в пакетном режиме, стенд 1:
== /CheckModules -> код 0 Синтаксических ошибок не обнаружено!
Стенд 1: колонки, кодировка, числа
На стенде проверено то, что от УТ не зависит. Новый прайс из Excel: windows-1251, «Артикул» переименован в «Код товара», колонки переставлены, четыре строки испорчены намеренно. По старой схеме:
=== 4. Поставщик прислал новый прайс price_v2_cp1251.csv (Excel, windows-1251, колонки переименованы и переставлены); схема старая строк: 0, создано: 0, обновлено: 0, без изменений: 0, пропущено: 0, время: 3 мс предупреждение: в заголовке есть символы замены: файл, похоже, не в кодировке «UTF-8» из схемы (Excel сохраняет CSV в windows-1251) предупреждение: в файле нет колонки «Производитель», реквизит Производитель не заполняется предупреждение: в файле нет колонки «Цена», реквизит Цена не заполняется ошибка: в файле нет обязательной колонки «Артикул» (реквизит Артикул); заголовок файла: A533;A533;A533;A533;A533;A533;A533;A533;A533;A533;A533;A533;;A533;A533;A533; A533;A533;A533;A533;A533;A533;;A533;A533;A533;A533;A533;;A533;A533;A533;A533;, A533;A533;A533;.;A533;A533;A533;A533;A533;A533;A533; ошибка: в файле нет обязательной колонки «Наименование» (реквизит Наименование); заголовок файла: A533;A533;A533;A533;A533;A533;A533;A533;A533;A533;A533;A533;;A533;A533;A533; A533;A533;A533;A533;A533;A533;;A533;A533;A533;A533;A533;;A533;A533;A533;A533;, A533;A533;A533;.;A533;A533;A533;A533;A533;A533;A533;
По новой схеме, модуль тот же:
строк: 10, создано: 1, обновлено: 2, без изменений: 3, пропущено: 4, время: 40 мс ошибка: строка 5: «договорная» в колонке «Цена, руб.» не число ошибка: строка 9: пустая обязательная колонка «Код товара» ошибка: строка 10: ключ «ГМ12» уже был в строке 4 ошибка: строка 11: в колонке «Наименование» 188 симв., реквизит Наименование вмещает 150; платформа обрезала бы молча
Схема с опечатками (serach_key, numeric на строковом реквизите, реквизит Цнеа) отклоняется до чтения файла:
ошибки схемы: Колонка «Артикул»: неизвестный режим «serach_key» (допустимы search_key, fill, numeric, ref, property, skip) Колонка «Производитель»: режим numeric, а реквизит «Производитель» не числовой Колонка «Цена»: у справочника «Номенклатура» нет реквизита «Цнеа» Нужна ровно одна колонка с режимом search_key, в схеме: 0
Разбор чисел:
строк: 7, создано: 5, обновлено: 0, без изменений: 0, пропущено: 2, время: 72 мс ошибка: строка 5: «договорная» в колонке «Цена» не число ошибка: строка 6: «1.450,00» в колонке «Цена» не число 000000007 | ХЧ-16 | Хомут червячный 16-25 мм | Норма | 14,90 000000008 | Ч-1 | Проверка числа Ч-1 | | 1450,00 000000009 | Ч-2 | Проверка числа Ч-2 | | 1450,00 000000010 | Ч-3 | Проверка числа Ч-3 | | 1450,00 000000011 | Ч-6 | Проверка числа Ч-6 | | 000000012 | Ч-7 | Проверка числа Ч-7 | | -12,50
И что делает платформа без проверок модуля:
=== 8. Что делает платформа без проверок модуля присвоено Наименование длиной 188, в объекте длина 150, исключения нет Элемент["Цнеа"] = 1450: Поле объекта не обнаружено (Цнеа) Производитель (строка) = 1450.5 -> "1 450,5"
Длинная строка обрезается по квалификатору молча, число в строковом реквизите становится «1 450,5» с неразрывным пробелом между разрядами, опечатка в реквизите даёт исключение только на первой строке файла.
Замер на 10 000 и 100 000 строк
Стенд 1, синтетический прайс из gen_big.py, у варианта «изменены» примерно у 10% строк выросла цена. Версий три. Первая читала каждый объект через Ссылка.ПолучитьОбъект() и сравнивала реквизиты с ним. Вторая читает текущие значения запросом и открывает объект только для изменённых строк. Итоговая к этому добавляет Заполнить() для новых элементов и ПроверитьЗаполнение() перед каждой записью. Журналы: evidence/run_bench_v1_ПолучитьОбъект.txt, run_bench_v2_значения_запросом.txt, run_bench.txt.
10 000 строк, три серии, секунды:
| Операция | Версия 1 | Версия 2 | Итоговая |
|---|---|---|---|
| Первая загрузка, создано 10 000 | 28,9 / 24,3 / 24,8 | 21,4 / 20,9 / 22,6 | 35,0 / 34,2 / 32,2 |
| Повтор того же файла | 8,2 / 7,1 / 7,2 | 1,5 / 1,5 / 1,5 | 2,3 / 2,2 / 2,2 |
| Цены изменены, обновлено 1 041 | 8,4 / 8,5 / 9,2 | 3,3 / 3,1 / 3,2 | 5,5 / 4,8 / 4,7 |
100 000 строк, одна серия, секунды:
| Операция | Версия 1 | Версия 2 | Итоговая |
|---|---|---|---|
| Первая загрузка, создано 100 000 | 210,8 | 198,6 | 237,9 |
| Повтор того же файла | 67,1 | 15,8 | 19,4 |
| Цены изменены, обновлено 9 974 | 81,5 | 32,3 | 36,3 |
| Повтор файла с изменениями | 67,2 | 16,0 | 19,4 |
Итоговая версия с РазмерПакета = 1 (транзакция на каждый элемент) создала 10 000 элементов за 190,2 с вместо 32-35 с и обновила 1 041 элемент за 20,9 с вместо 4,7-5,5 с. В файловой базе на этом диске фиксация транзакции стоит дороже записи элемента.
Проверка заполнения и штатное заполнение сделали создание элементов примерно в полтора раза медленнее, чем во второй версии. Это цена того, что модуль не пишет элементы, которые конфигурация считает неполными. Повтор файла по-прежнему в 3-4 раза быстрее первой версии: неизменённые строки не трогают базу.
Журнал итоговой версии:
--- 10 000 строк, серия 1 первая загрузка (создание) строк: 10000, создано: 10000, обновлено: 0, без изменений: 0, пропущено: 0, время: 34983 мс повтор того же файла строк: 10000, создано: 0, обновлено: 0, без изменений: 10000, пропущено: 0, время: 2271 мс цены изменены примерно у 10% строк: 10000, создано: 0, обновлено: 1041, без изменений: 8959, пропущено: 0, время: 5476 мс --- 10 000 строк, серия 2 первая загрузка (создание) строк: 10000, создано: 10000, обновлено: 0, без изменений: 0, пропущено: 0, время: 34151 мс повтор того же файла строк: 10000, создано: 0, обновлено: 0, без изменений: 10000, пропущено: 0, время: 2231 мс цены изменены примерно у 10% строк: 10000, создано: 0, обновлено: 1041, без изменений: 8959, пропущено: 0, время: 4762 мс --- 10 000 строк, серия 3 первая загрузка (создание) строк: 10000, создано: 10000, обновлено: 0, без изменений: 0, пропущено: 0, время: 32217 мс повтор того же файла строк: 10000, создано: 0, обновлено: 0, без изменений: 10000, пропущено: 0, время: 2179 мс цены изменены примерно у 10% строк: 10000, создано: 0, обновлено: 1041, без изменений: 8959, пропущено: 0, время: 4653 мс --- 10 000 строк, транзакция на каждую запись (РазмерПакета = 1) первая загрузка (создание) строк: 10000, создано: 10000, обновлено: 0, без изменений: 0, пропущено: 0, время: 190218 мс цены изменены примерно у 10% строк: 10000, создано: 0, обновлено: 1041, без изменений: 8959, пропущено: 0, время: 20857 мс --- 100 000 строк первая загрузка (создание) строк: 100000, создано: 100000, обновлено: 0, без изменений: 0, пропущено: 0, время: 237949 мс повтор того же файла строк: 100000, создано: 0, обновлено: 0, без изменений: 100000, пропущено: 0, время: 19420 мс цены изменены примерно у 10% строк: 100000, создано: 0, обновлено: 9974, без изменений: 90026, пропущено: 0, время: 36283 мс повтор файла с изменениями строк: 100000, создано: 0, обновлено: 0, без изменений: 100000, пропущено: 0, время: 19377 мс элементов в справочнике: 100000 размер базы 1Cv8.1CD: 84,6 МБ
Время снято на файловой базе и старом i5-2400, переносить секунды на свой сервер нельзя. На УТ загрузка десяти строк заняла от 8 до 12 секунд: там срабатывают обработчики записи номенклатуры, и большие прайсы в УТ я не замеряла.
Чем это отличается от готовых обработок
На Infostart уже есть «Универсальный загрузчик Excel/CSV в 1С с интеллектуальным автосопоставлением колонок». По описанию на странице (смотрела 20.10.2026, саму обработку не запускала), версия 1.6 умеет больше, чем модуль из этой статьи: читает .xlsx, сопоставляет колонки сама по словарю синонимов и расстоянию Левенштейна, подбирает ссылки, хранит шаблоны в JSON, требует прогон без записи, останавливается на ключе, найденном у нескольких элементов, и откатывает загрузку по протоколу. Проверена на УТ 11.5.27.79 и ещё четырёх конфигурациях, стоит 6 100 руб. с годом обновлений.
| Загрузчик 2715613 (по описанию) | Модуль из статьи | |
|---|---|---|
.xlsx |
да | нет, только CSV |
| Сопоставление колонок | автоматическое с подтверждением | явное, в JSON, правит человек |
| Ссылки по наименованию | да | да, с lookup_filters |
| Ключ у нескольких элементов | остановка на таком ключе | ошибка строки, остальные строки загружаются |
| Откат загрузки | да | нет; транзакция на пакет из 1000 записей |
ПроверитьЗаполнение() объекта, доп. реквизиты БСП, поля из вида |
в описании не нашла | да |
Если нужна обработка для пользователя, у которого каждый прайс разный, готовый загрузчик удобнее. Модуль из статьи подойдёт разработчику, которому нужна загрузка как часть своего решения: схема лежит рядом с кодом, её можно положить в Git и проверять ревью.
Что не проверено
- Другие конфигурации и релизы: проверена только демобаза УТ 11.5.22.77.
- Клиент-серверный вариант. В тонком клиенте пути к файлам читаются на сервере; в файловой базе это тот же компьютер, на сервере 1С файл должен лежать там, где его видит сервер.
- Права пользователя без роли администратора и параллельная загрузка двумя сеансами.
- Большие прайсы в УТ, загрузка цен, характеристики и упаковки товаров.
- Чтение
.xlsxи перенос строки внутри поля в кавычках.
Источники
- Синтакс-помощник платформы 8.3.27:
ЧтениеJSON.ОткрытьФайл, функцияПрочитатьJSONи её параметр «ПрочитатьВСоответствие»,ВнешниеОбработки.Создатьс параметром «ОписаниеЗащитыОтОпасныхДействий»,ПроверитьЗаполнение. - «Универсальный загрузчик Excel/CSV в 1С с интеллектуальным автосопоставлением колонок» - сравнение выше. Ещё на Infostart: «Загрузка прайс-листов и установка цен номенклатуры», «Загрузка прайса поставщиков», «Чтение CSV файла с многострочным текстом»; эти страницы я не открывала.
- Журналы прогонов из архива:
evidence/(стенд 1) иevidence-ut/(УТ).
Файл к статье
В архиве mapping-csv-1c-companion.zip:
ЗагрузкаПоСхемеМаппинга.bsl- модуль загрузки (общий модуль или модуль объекта обработки);ЗагрузкаПрайсаПоСхеме.epf- готовая внешняя обработка с формой, SHA-256 68B29F8CD2986C37, иepf/для сборки из исходников;mapping_gen.pyиtests/- генератор схемы и семь тестов;examples/иexamples-ut/- прайсы и схемы для обоих стендов, включая схемы с ошибками;stand/- сборка стенда 1, сценарий и замер;stand-ut/- сценарий на копии УТ, пробы метаданных, проверка проведением (СтендУТ.bsl);evidence/,evidence-ut/- журналы, снимки экрана, версия 2 модуля и её обработка для повтора опыта «до»;README.md- как встроить и как повторить.
Сценарий УТ (stand-ut/run_all_ut.sh) сам делает свежие копии демобазы и оригинал не меняет.
Итог
Сопоставление колонок прайса хранится в JSON и правится без изменения модуля: на стенде новый прайс из Excel с переименованными колонками загрузился после правки схемы. Перенос на копию демобазы УТ показал, что «записалось» ещё не значит «правильно»: простая версия переименовала элемент брака, создала кабели, которые форма УТ не сохраняет, и такой кабель спокойно провёлся в поступлении. Итоговая версия на тех же данных создаёт элементы через штатное заполнение и проверку заполнения, отказывается выбирать между двумя элементами с одним артикулом и объясняет каждую пропущенную строку. Проверено на копии демобазы УТ 11.5.22.77 и пустой конфигурации, на файловой базе.
Вступайте в нашу телеграмм-группу Инфостарт