Загрузка прайса поставщика в номенклатуру УТ 11 по JSON-схеме: прогон на копии демобазы, ошибки простой версии и внешняя обработка

21.10.26

Задачи пользователя - Прайсы

Модуль загрузки прайса по JSON-схеме прошёл все тесты на пустой конфигурации. На копии демобазы УТ 11.5 он переименовал элемент «Не годен» в нормальный товар и создал кабели, которые форма номенклатуры не записывает, а поступление с таким кабелем провелось. Разбираю, что в УТ устроено иначе: неуникальный артикул, ссылки, доп. реквизиты БСП, поля по виду номенклатуры. Итоговая внешняя обработка создаёт элементы через Заполнить() и ПроверитьЗаполнение() и объясняет каждую пропущенную строку. Снимки Конфигуратора и тонкого клиента, проведённое поступление, замер на 100 000 строк; в архиве обработка, исходники и оба стенда.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Загрузка прайса в справочник 1С по JSON-схеме: внешняя обработка для УТ 11, модуль, генератор схемы, два стенда, журналы и снимки
.zip 1,44Mb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.
Разработка 1С
О чём это (в трёх тезисах)
1.Сопоставление колонок прайса с реквизитами лежит в JSON, модуль ищет колонки по заголовку; на копии демобазы УТ 11.5 он работает во внешней обработке, конфигурация не меняется.
2.Простая версия на УТ переименовала элемент «Не годен» в нормальный товар и создала кабели, которые форма УТ не записывает; такой кабель провёлся в поступлении.
3.Итоговая версия создаёт элемент через Заполнить() и ПроверитьЗаполнение(), заполняет доп. реквизиты БСП, отказывается выбирать между двумя элементами с одним артикулом и объясняет каждую пропущенную строку.
Протокол проверки
Что проверялосьМодуль ЗагрузкаПоСхемеМаппинга (версия 2 и итоговая), обработка ЗагрузкаПрайсаПоСхеме.epf, генератор схемы
Где и когда19-20.10.2026; 1С:Предприятие 8.3.27.2130 (x86); копия демобазы УТ 11.5.22.77 и пустая конфигурация, файловые базы; Windows 11 Pro, Intel Core i5-2400, 7,9 ГБ ОЗУ, SATA SSD
КакСценарии через внешнее соединение на свежих копиях, обработка в тонком клиенте УТ, Конфигуратор, проведение копии поступления с загруженным товаром, замер на 10 000 и 100 000 строк
РезультатУТ: создано 2, обновлено 1, пропущено 4 с причинами; новый кабель записывается формой и проводится; элемент «Не годен» не тронут. Стенд: повтор 100 000 строк 19,4 с (первая версия 67,1 с)
Не провереноДругие конфигурации и релизы, клиент-серверный вариант, права без роли администратора, цены, .xlsx
Суть статьи

Как загружать прайс поставщика в номенклатуру УТ 11 по JSON-схеме и что ломается, когда модуль, прошедший тесты на пустой конфигурации, встречает настоящую УТ. Все прогоны на копиях баз, снимки из Конфигуратора и тонкого клиента.

Ключевые идеи
  • ПрочитатьJSON(…, Ложь) возвращает Структуру без метода Получить; синтаксический контроль этого не видит.
  • В УТ артикул не уникален: товар «Не годен» - отдельный элемент с тем же артикулом.
  • Записать() из кода не вызывает проверку заполнения; форма вызывает, а проведение поступления элемент не проверило.
  • Новый элемент заполняется штатно: Заполнить() с видом номенклатуры, inherit, ПроверитьЗаполнение().
  • Обработка подключается к УТ без изменения конфигурации; через COM нужен ОписаниеЗащитыОтОпасныхДействий.
Главная мысль

Тест на пустой конфигурации проверяет код. Загрузку в типовую конфигурацию проверяют прогон на её копии, запись элемента формой и документ, проведённый с загруженным элементом.

Для кого: разработчики 1С, которые загружают прайсы поставщиков в УТ и другие конфигурации на БСП.

Поставщик присылает прайс в 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
Рис. 1. Два стенда: что запускалось и откуда

Ловушка ПрочитатьJSON: структура вместо соответствия

Первая функция чтения схемы, написанная по памяти, выглядела так:

BSL UTF-8 фрагмент
1
2
3
4
5
6
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПутьКФайлуСхемы);
ДанныеСхемы = ПрочитатьJSON(ЧтениеJSON, Ложь);
ЧтениеJSON.Закрыть();

МассивПолей = ДанныеСхемы.Получить("fields");

Второй параметр ПрочитатьJSON («ПрочитатьВСоответствие») при Ложь превращает объект JSON в Структуру, у которой нет метода Получить. Синтаксический контроль это пропускает: тип ДанныеСхемы известен только во время выполнения. Вызов на стенде 1:

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

С Истина объекты читаются в Соответствие: ключи вида column_index и target_1c в нём могут быть любыми строками, а ключ структуры обязан быть идентификатором 1С. Кодировку файла схемы модуль указывает явно, ОткрытьФайл(Путь, "UTF-8").

Схема маппинга

Черновик схемы делает mapping_gen.py по первой строке CSV: определяет кодировку (UTF-8 или windows-1251, в которой Excel сохраняет «CSV (разделители - запятые)») и разделитель, сопоставляет знакомые заголовки по словарю, незнакомые помечает skip. Дальше схему открывает и правит человек. Для прайса дистрибьютора в УТ она выглядит так (фрагмент examples-ut/mapping_ut.json):

JSON UTF-8 фрагмент
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
  "catalog": "Номенклатура",
  "encoding": "windows-1251",
  "delimiter": ";",
  "lookup_filters": {
    "ЕдиницаИзмерения": {"Владелец.Наименование": "Базовые единицы измерения"}
  },
  "inherit": {
    "СтавкаНДС": "ВидНоменклатуры.СтавкаНДС",
    "ИспользованиеХарактеристик": "ВидНоменклатуры.ИспользованиеХарактеристик"
  },
  "fields": [
    {"source_column": "Код товара", "target_1c": "Справочник.Номенклатура.Артикул", "mode": "search_key", "required": true},
    {"source_column": "Производитель", "target_1c": "Справочник.Номенклатура.Производитель", "mode": "ref"},
    {"source_column": "Вид", "target_1c": "Справочник.Номенклатура.ВидНоменклатуры", "mode": "ref"},
    {"source_column": "Ед.", "target_1c": "Справочник.Номенклатура.ЕдиницаИзмерения", "mode": "ref"},
    {"source_column": "Сечение, мм2", "target_1c": "Справочник.Номенклатура.ДополнительныеРеквизиты.Сечение (кв_мм)", "mode": "property"},
    {"source_column": "Цена, руб.", "target_1c": "", "mode": "skip"}
  ]
}
Режим или поле Что делает
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, модуль взял последний из запроса и переписал его наименование.

Рис. 3. Элемент брака после версии 2: рабочее наименование нормального товара, качество «Не годен», группа «Товары с дефектами»

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

Рис. 4. Кабель, созданный версией 2: вид, тип, единица и ставка НДС пусты

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

Рис. 5. Форма номенклатуры УТ не записывает элемент, созданный версией 2

Я ожидала, что с таким элементом не проведётся и документ, и проверила это: скопировала проведённое поступление кабеля и подставила новый элемент в первую строку.

=== 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, затем проверку заполнения, и только после неё запись. Фрагмент модуля, открытый в Конфигураторе:

Рис. 6. Модуль объекта обработки в Конфигураторе: наследование полей, ПроверитьЗаполнение() и запись
BSL UTF-8 фрагмент
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Если Текущие = Неопределено Тогда
	Объект = Менеджер.СоздатьЭлемент();
	ДанныеЗаполнения = Новый Структура;
	Для Каждого КлючИЗначение Из Схема.ЗначенияПоУмолчанию Цикл
		ДанныеЗаполнения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
	КонецЦикла;
	Для Каждого КлючИЗначение Из Значения Цикл
		Если Не ЭтоСвойство(КлючИЗначение.Ключ) Тогда
			ДанныеЗаполнения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
		КонецЕсли;
	КонецЦикла;
	Объект.Заполнить(ДанныеЗаполнения);
	ЭтоНовый = Истина;
КонецЕсли;

// ... значения из строки файла, 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. УТ сначала спрашивает, доверяете ли вы файлу:

Рис. 7. Предупреждение безопасности УТ при открытии обработки

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

Рис. 8. Пробный прогон в форме обработки: что будет создано и обновлено и почему пропущены остальные строки

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

Рис. 9. Протокол загрузки в форме обработки

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

Рис. 10. Кабель NYM 3х2,5, созданный версией 3

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

Рис. 11. «Вентилятор BINATONE ALPINE, Не годен» после загрузки версией 3

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

Рис. 12. Проведённое «Приобретение товаров и услуг» с загруженным кабелем

Обработка в Конфигураторе

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

Рис. 13. ЗагрузкаПрайсаПоСхеме.epf в Конфигураторе
Рис. 14. Модуль объекта: программный интерфейс и синтаксический контроль без ошибок
Рис. 15. Модуль формы: вызов загрузки на сервере

Синтаксический контроль тех же модулей в пакетном режиме, стенд 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 и перенос строки внутри поля в кавычках.

Источники

Файл к статье

В архиве 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 и пустой конфигурации, на файловой базе.

 
Нинель Адольевна Щербакова
Нинель Адольевна Щербакова (Ninel_S)
Архитектор • SRE & DevOps инженер • HighLoad 1С
Автор технических публикаций на Infostart. Разработчик NOPik, SRE-Suite-for-1C и мультиагентных ассистентов для экосистемы 1С:Предприятие.

Вступайте в нашу телеграмм-группу Инфостарт

1С:Предприятие 8.3 Загрузка из Excel CSV JSON Маппинг данных Обмен данными Python Инструменты разработчика

См. также

Внешние источники данных Разработчик Аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

35000 руб.

15.11.2022    33785    53    49    

51

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

12444 руб.

29.10.2014    237816    777    544    

509

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

85400 руб.

05.10.2022    14551    17    8    

17

Прайсы Оптовая торговля Сайты и интернет-магазины Разработчик Пользователь 1С:Предприятие 8 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Транспорт, автопарки, такси Управленческий учет Платные (руб)

Расширение, предназначено для наполнения вашей базы данных товарами и сопутствующей информацией, предоставляемой b2b.4tochki.ru, а также MIM(Север Авто) обновления остатков и цен.

18096 руб.

31.01.2020    35772    22    7    

19

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

122000 руб.

19.08.2020    30601    28    3    

29

Внешние источники данных Зарплата Бюджетный учет Разработчик Бухгалтер 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

85400 руб.

24.04.2017    57635    99    165    

91

Производство готовой продукции (работ, услуг) Внешние источники данных 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10370 руб.

24.06.2021    26829    66    55    

48
Для отправки сообщения требуется регистрация/авторизация