Рабочий код внешних обработок для выгрузки и загрузки справочника номенклатура в 1с УТ или Розница.
Подойдёт и для других конфигураций с доработкой имён реквизитов.
В моём случае, выгружаю справочник Номенклатура с 1с УТ и загружаю в 1С Розница.
Создаю две внешние обработки. Одна для выгрузки, вторая для загрузки.
В обработке выгрузки создаётся форма. На форме реквизит выбора файла и команда выгрузки.
В загрузке так же создаётся реквизит выбора файла, кнопка загрузки, а также реквизит временного хранилища.
_________________________________________________________
Выгрузка в 1С
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
тДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если тДиалог.Выбрать() Тогда
ПутьКФайлу = тДиалог.Каталог;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВыгрузкаНоменклатурыНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ВидНоменклатуры.Наименование КАК ВидНоменклатурыНаименование,
| Номенклатура.ДлинаЕдиницаИзмерения.Код КАК ДлинаЕдиницаИзмеренияКод,
| Номенклатура.НаименованиеПолное КАК НаименованиеПолное,
| Номенклатура.Контрагент КАК Контрагент,
| Номенклатура.ЕдиницаДляОтчетов.Код КАК ЕдиницаДляОтчетовКод
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ";
РезультатЗапроса = Запрос.Выполнить();
ТЗ = РезультатЗапроса.Выгрузить();
ЗначениеВФайл(ПутьКФайлу + "\ном.isl",ТЗ);
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузкаНоменклатуры(Команда)
ВыгрузкаНоменклатурыНаСервере();
КонецПроцедуры
___________________________________________________
Загрузка в 1С
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
тДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если тДиалог.Выбрать() Тогда
ПутьКФайлу = тДиалог.Каталог;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузкаНоменклатурыНаСервере()
Данные = ПолучитьИзВременногоХранилища(АдресВХ);
Имя = ПолучитьИмяВременногоФайла("isl");
Данные.Записать(Имя);
Файл = ЗначениеИзФайла(Имя);
Для Каждого Стр Из Файл Цикл
Номен = Справочники.Номенклатура.СоздатьЭлемент();
Номен.Артикул = Стр.Артикул;
Номен.Наименование = Стр.Наименование;
Номен.НаименованиеПолное = Стр.НаименованиеПолное;
Номен.ЕдиницаИзмерения = Справочники.БазовыеЕдиницыИзмерения.НайтиПоКоду(Стр.ЕдиницаДляОтчетовКод);
Номен.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузкаНоменклатуры(Команда)
Путь = ПутьКФайлу + "\ном.isl";
Файл = Новый ДвоичныеДанные(Путь);
АдресВХ = ПоместитьВоВременноеХранилище(Файл,ЭтаФорма.УникальныйИдентификатор);
ЗагрузкаНоменклатурыНаСервере();
КонецПроцедуры
Разбор работы кода загрузки справочника 1с
Этот код представляет собой внешнюю обработку (расширение) для загрузки номенклатуры в системе 1С:Предприятие. Давайте разберем его работу пошагово:
Основные компоненты:
1. Выбор каталога с файлом (ПутьКФайлуНачалоВыбора)
1c
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
- Работает на клиенте (в интерфейсе пользователя)
- Открывает диалоговое окно для выбора каталога (папки)
- Сохраняет выбранный путь в переменную ПутьКФайлу
2. Загрузка данных (ЗагрузкаНоменклатуры)
1c
&НаКлиенте
Процедура ЗагрузкаНоменклатуры(Команда)
Что происходит:
- Формируется полный путь к файлу ном.isl в выбранной папке
- Файл читается как двоичные данные
- Данные помещаются во временное хранилище (для передачи на сервер)
- Вызывается серверная процедура ЗагрузкаНоменклатурыНаСервере()
3. Обработка данных на сервере (ЗагрузкаНоменклатурыНаСервере)
1c
&НаСервере
Процедура ЗагрузкаНоменклатурыНаСервере()
Шаги обработки:
- Получение данных из временного хранилища
- Запись данных во временный файл с расширением .isl
- Чтение данных из файла (предположительно, это таблица значений)
- Циклическая обработка каждой строки:
Создание новой позиции номенклатуры
Заполнение реквизитов:
Артикул
Наименование
Полное наименование
Единица измерения (ищется по коду)
Сохранение элемента
Ключевые моменты:
Формат данных:
- Ожидается файл ном.isl в выбранном каталоге
- Файл содержит табличные данные с колонками: Артикул, Наименование, НаименованиеПолное, ЕдиницаДляОтчетовКод
Обработка единиц измерения:
1c
Номен.ЕдиницаИзмерения = Справочники.БазовыеЕдиницыИзмерения.НайтиПоКоду(...)
- Поиск единицы измерения происходит по коду из исходного файла
- Используется справочник "БазовыеЕдиницыИзмерения"
Замечания по коду:
- Отсутствует обработка ошибок:
- Нет проверки существования файла
- Нет обработки дубликатов номенклатуры
- Нет проверки корректности данных
- Временные файлы:
Создается временный файл .isl, но нет его удаления после обработки.
Предложения по улучшению:
// Добавить проверки
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
ПоказатьПредупреждение("Не выбран каталог!");
Возврат;
КонецЕсли;
// Добавить обработку ошибок
Попытка
// основной код
Исключение
ПоказатьПредупреждение("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
// Удалять временный файл
УдалитьФайлы(Имя);
Этот код позволяет массово загружать номенклатуру из внешнего файла, что удобно при первоначальном заполнении базы или при регулярных обновлениях.
PS
Данный код нельзя считать практически применимым, но его разбор даёт возможность освоения механизма выгрузки и загрузки в 1С.
#загрузка_в_1с #выгрузка_в_1с