Как проводится программная перезапись в 1с и как решить проблему с запросами через массивы в 1с?

1. YA_728041067 31.07.23 08:38 Сейчас в теме
Доброго времени суток, Форумчане. Хотел бы задать вопрос более опытным из вас (т.к. опыт работы с 1с у меня второй месяц), где я могу поискать на форуме, интернете более подробное объяснение перезаписи реквизитов в 1с в коде. Я разобрался с тем, как можно импортировать из Excel данные (ниже будет мой код, скриншот, ) и некоторое моё пояснение самого кода.

В цикле приведённом ниже моя обработка ищет и проверяет наличие существующего реквизита, при несуществующем реквизите, то она его создаёт и заполняет. (с этим проблем нет, необходимо только для пояснения). Запись и перезапись будет идти следовательно в справочник Номенклатуры.

Если Ном.Пустая() или Не Ном.Пустая() Тогда

Ном = Справочники.Номенклатура.СоздатьЭлемент();
Ном.ОбменДанными.Загрузка = Истина;
Ном.Артикул = стр2.АртикулНаследник;
Ном.Наименование = стр2.МаркентиговоеНазвание;
Ном.НаименованиеПолное = стр2.НаименованиеПолное;
Ном.Вес = стр2.ВесИзделия;
Ном.Марка = ВидМарка;
Ном.ВидНоменклатуры = ВидНом;
Ном.ТипНоменклатуры = ВидНом.ТипНоменклатуры;
НоваяСтрока = Ном.ДанныеПоКамнямДоп.Добавить();
НоваяСтрока.ОсновнойКамень = ВидКамня;
Ном.ЕдиницаИзмерения = ЭтаФорма.ЕдиницаИзмерения;
Ном.СтавкаНДС = ЭтаФорма.СтавкаНДС;
Если Ном.Наименование = "" Тогда

Ном.Наименование = Ном.НаименованиеПолное;

КонецЕсли;

Получение имён, ссылок и прочее происходит через запросы.

Я понимаю, что данный запрос некорректный из-за того, что происходит его повторный вызов через цикл, что будет вторым вопросом, где мне поискать более подробное пояснение об методологиях в 1с и как мне результаты запроса записывать в массив(я понимаю, что это будет опять же отдельная процедура/функция, но у меня не очень в голове укладывается, как я могу это сделать). Т.к. то что я искал оно сухое и трудно воспринимается через мой опыт программирования на 1с.

Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО &Артикул
| И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное
| И Номенклатура.Вес = &Вес"
);

Запрос.УстановитьПараметр("Артикул", АртикулНаследник);
Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное);
Запрос.УстановитьПараметр("Вес", ВесИзделия);

Выборка = Запрос.Выполнить().Выбрать();


Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();

КонецЕсли;

В данном запросе реализовано получение реквизитов и проверка на их существование, что передаётся в цикл сверху. (существует ещё несколько подобных запросов, но они очень сильно идентичны между собой, что представлю на скриншотах).

Ещё раз повторю свои выше озвученные вопросы:
1) Как можно мне перезаписать существующие уже записи?
2) Как я могу через массив вынести запросы?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 76 31.07.23 09:01 Сейчас в теме
(1)
Если Ном.Пустая() или Не Ном.Пустая() Тогда


Первое же условие - прям огонь.
Уберите вообще это условие, если уж вам нужно в любом случае создавать элемент номенклатуры.

Ответы на вопросы:
1. найти существующий элемент в ИБ и использовать его
2. Почему именно через массив? Вынести куда? Зачем вообще выносить куда-то запросы?
4. YA_728041067 31.07.23 09:10 Сейчас в теме
(3)
Не совсем понимаю, как это будет выглядеть. Можно ли получить более наглядное объяснение на то, как мне поменять условие?
6. nomad_irk 76 31.07.23 09:15 Сейчас в теме
(4)В ваших терминах:

Если НЕ Ном.Пустая() Тогда
     Ном = Ном.ПолучитьОбъект();
Иначе
     Ном = Справочники.Номенклатура.СоздатьЭлемент();
КонецЕсли
//заполнение всех реквизитов номенклатуры
7. YA_728041067 31.07.23 09:17 Сейчас в теме
(6)

Спасибо большое, я учту.
5. DesertPunk 31.07.23 09:12 Сейчас в теме
(1)

Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО &Артикул
| И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное
| И Номенклатура.Вес = &Вес"
);

Запрос.УстановитьПараметр("Артикул", АртикулНаследник);
Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное);
Запрос.УстановитьПараметр("Вес", ВесИзделия);

Выборка = Запрос.Выполнить().Выбрать();

// Конструкция с Если/КонецЕсли работает с условиями. Выборка.Следующий() это не условие, а перебор в цикле
// Выборка.Ссылка - это не готовые данные. Их нужно передать в какую-то структуру (массив, список значений и т.д.)
// Возврат Справочники.Номенклатура.ПустаяСсылка() вообще непонятная конструкция

Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();

КонецЕсли;

Показать
8. DBV 31.07.23 09:57 Сейчас в теме
(1) чтобы не было запросов в цикле

1) Добавить данные из файла в таблицу значений (обязательно описать типы колонок, иначе в запрос нельзя передать)
2) Передать данную таблицу значений в запрос параметром
3) В запросе соединять с необходимыми таблицами БД
4) Обработать результат запроса
2. YA_728041067 31.07.23 08:43 Сейчас в теме
Докину обещанные скриншоты, обработки и кину более подробный код для описания в целом, что у меня происходит. Т.к. форум видимо их съел, когда я выбирал тэги для треда.
&НаСервере
Процедура ЗагрузкаНомНаСервере()
// Вставить содержимое обработчика.
//Тут мы принимает данные из временного хранилища.

Данные = ПолучитьИзВременногоХранилища(ЭтаФорма.ПутьВХ);
//ИмяВременногоФайла

ИмяВФ = ПолучитьИмяВременногоФайла("xlsx");
//ИмяВф = ПолучитьИмяВременногоФайла("xls");
Данные.Записать(ИМЯВф);
//Данные.Записать(ИмяВф);
//Не особо понимаю, как отлавливать в 1с события, поэтому пишу по второму разу запись документа.

Эксель.Очистить(); // В форме у меня существует табличная часть, которая принимает все значения ниже.
табдок = новый ТабличныйДокумент;
табдок.Прочитать(ИмяВФ,СпособЧтенияЗначенийТабличногоДокумента.Значение);
//ВысотаСтрок(ВысСтрок).
ВысСтрок = табдок.ВысотаТаблицы;
//Тут уже начинается перебор всего, что есть в Экселе.
Для стр = 2 По ВысСтрок Цикл
//СтрокаТекущееЗначение, которое будет принимать таблицу.
стрТЗ = Эксель .Добавить();
стрТЗ.ТипГруппы = табдок.Область(стр, 4).Текст; // Группа родитель.
стрТЗ.НазваниеГруппы = табдок.Область(стр,5).Текст; //
стрТЗ.Категория = табдок.Область(стр,6).Текст; //Что-то типа характеристики.
стрТЗ.Подкатегория = табдок.Область(стр,7).Текст; //Под характеристика.
стрТЗ.НаименованиеПолное = табдок.Область(стр,8).Текст; //Имя, которое берётся с самой Номенклатуры.
стрТЗ.МаркентиговоеНазвание = табдок.Область(стр,9).Текст;//Под вопросом, скорее всего марка.
стрТЗ.ТипСвадебногоИзделия = табдок.Область(стр,10).Текст; // Вроде бы тоже характеристика, которую надо добавить.
//стрТЗ.РодительскийАртикул = табдок.Область(стр,11).Текст;
стрТЗ.АртикулНаследник = табдок.Область(стр,12).Текст;
стрТЗ.Размер = табдок.Область(стр,13).Текст;
стрТЗ.Металл = табдок.Область(стр,14).Текст;
стрТЗ.Проба = табдок.Область(стр,15).Текст;
стрТЗ.ВесИзделия = табдок.Область(стр,16).Текст;
стрТЗ.Камни = табдок.Область(стр,17).Текст;
стрТЗ.ГендерныйПризнак = табдок.Область(стр,20).Текст;
стрТЗ.ВходнаяЦена = табдок.Область(стр,23).Текст;
стрТЗ.ВыходнаяЦена = табдок.Область(стр,24).Текст;


////////////////////////////////////////////////////////////­////////////////////////////////////////////////////////////­////////////////////////////

КонецЦикла;
//Тут уже начинаем заполнять нашу номенклатуру
Для каждого стр2 Из Эксель Цикл //ПЕИ - ПодставитьЕдиницуИзмерения.
//Ном - номенклатура.
Ном = НайтиНом(стр2.АртикулНаследник, стр2.НаименованиеПолное, стр2.МаркентиговоеНазвание, стр2.ВесИзделия);
ВидНом = НайтиВидНом(стр2.Категория);
ВидМарка = НайтиМарку(стр2.НазваниеГруппы);
ВидКамня = ТаблицаКамней(стр2.Камни);
//ТипГруппыНом = НайтиТипГруппы(стр.ТипГруппы);
//Тут у нас заполняется сама Марка.
Если ВидКамня.Пустая() Тогда
ВидКамня = Справочники.ОсновнойКамень.СоздатьЭлемент();
ВидКамня.Наименование = стр2.Камни;
ВидКамня.Записать();
КонецЕсли;
Если ВидМарка.Пустая() Тогда
ВидМарка = Справочники.Марки.СоздатьЭлемент();
ВидМарка.Наименование = стр2.НазваниеГруппы;
ВидМарка.Записать();
КонецЕсли;
//Тут создаются у нас ВидыНоменклатуры.
Если ВидНом.Пустая() Тогда
ВидНом = Справочники.ВидыНоменклатуры.СоздатьЭлемент();
ВидНом.ОбменДанными.Загрузка = Истина;
ВидНом.Наименование = стр2.Категория;
ВидНом.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
ВидНом.Записать();
КонецЕсли;
//Добавление Номенклатуры, где Ном - заданная у нас переменная. . - вызов имён, свойств, функций, реквизитов, табличных частей и т.п.

//СтавкаНДС = Справочники.СтавкиНДС.Выбрать();
Если Ном.Пустая() или Не Ном.Пустая() Тогда

Ном = Справочники.Номенклатура.СоздатьЭлемент();
Ном.ОбменДанными.Загрузка = Истина;
Ном.Артикул = стр2.АртикулНаследник;
Ном.Наименование = стр2.МаркентиговоеНазвание;
Ном.НаименованиеПолное = стр2.НаименованиеПолное;
Ном.Вес = стр2.ВесИзделия;
Ном.Марка = ВидМарка;
Ном.ВидНоменклатуры = ВидНом;
Ном.ТипНоменклатуры = ВидНом.ТипНоменклатуры;
НоваяСтрока = Ном.ДанныеПоКамнямДоп.Добавить();
НоваяСтрока.ОсновнойКамень = ВидКамня;
Ном.ЕдиницаИзмерения = ЭтаФорма.ЕдиницаИзмерения;
Ном.СтавкаНДС = ЭтаФорма.СтавкаНДС;
Если Ном.Наименование = "" Тогда

Ном.Наименование = Ном.НаименованиеПолное;

КонецЕсли;
//Если Ном = Знач Тогда
//
//
//
//КонецЕсли;

Ном.Записать();

КонецЕсли;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ВидКамня.Ссылка, ВидКамня.Ссылка);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Ном.Ссылка, Ном.Ссылка);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ВидНом.Ссылка, ВидНом.Ссылка);

КонецЦикла;


КонецПроцедуры
Прикрепленные файлы:
ИмпортИзЭкселяV3.epf
ИП загрузка.xlsx
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот