Как проводится программная перезапись в 1с и как решить проблему с запросами через массивы в 1с?
Доброго времени суток, Форумчане. Хотел бы задать вопрос более опытным из вас (т.к. опыт работы с 1с у меня второй месяц), где я могу поискать на форуме, интернете более подробное объяснение перезаписи реквизитов в 1с в коде. Я разобрался с тем, как можно импортировать из Excel данные (ниже будет мой код, скриншот, ) и некоторое моё пояснение самого кода.
В цикле приведённом ниже моя обработка ищет и проверяет наличие существующего реквизита, при несуществующем реквизите, то она его создаёт и заполняет. (с этим проблем нет, необходимо только для пояснения). Запись и перезапись будет идти следовательно в справочник Номенклатуры.
Если Ном.Пустая() или Не Ном.Пустая() Тогда
Ном = Справочники.Номенклатура.СоздатьЭлемент();
Ном.ОбменДанными.Загрузка = Истина;
Ном.Артикул = стр2.АртикулНаследник;
Ном.Наименование = стр2.МаркентиговоеНазвание;
Ном.НаименованиеПолное = стр2.НаименованиеПолное;
Ном.Вес = стр2.ВесИзделия;
Ном.Марка = ВидМарка;
Ном.ВидНоменклатуры = ВидНом;
Ном.ТипНоменклатуры = ВидНом.ТипНоменклатуры;
НоваяСтрока = Ном.ДанныеПоКамнямДоп.Добавить();
НоваяСтрока.ОсновнойКамень = ВидКамня;
Ном.ЕдиницаИзмерения = ЭтаФорма.ЕдиницаИзмерения;
Ном.СтавкаНДС = ЭтаФорма.СтавкаНДС;
Если Ном.Наименование = "" Тогда
Ном.Наименование = Ном.НаименованиеПолное;
КонецЕсли;
Получение имён, ссылок и прочее происходит через запросы.
Я понимаю, что данный запрос некорректный из-за того, что происходит его повторный вызов через цикл, что будет вторым вопросом, где мне поискать более подробное пояснение об методологиях в 1с и как мне результаты запроса записывать в массив(я понимаю, что это будет опять же отдельная процедура/функция, но у меня не очень в голове укладывается, как я могу это сделать). Т.к. то что я искал оно сухое и трудно воспринимается через мой опыт программирования на 1с.
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО &Артикул
| И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное
| И Номенклатура.Вес = &Вес"
);
Запрос.УстановитьПараметр("Артикул", АртикулНаследник);
Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное);
Запрос.УстановитьПараметр("Вес", ВесИзделия);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
В данном запросе реализовано получение реквизитов и проверка на их существование, что передаётся в цикл сверху. (существует ещё несколько подобных запросов, но они очень сильно идентичны между собой, что представлю на скриншотах).
Ещё раз повторю свои выше озвученные вопросы:
1) Как можно мне перезаписать существующие уже записи?
2) Как я могу через массив вынести запросы?
В цикле приведённом ниже моя обработка ищет и проверяет наличие существующего реквизита, при несуществующем реквизите, то она его создаёт и заполняет. (с этим проблем нет, необходимо только для пояснения). Запись и перезапись будет идти следовательно в справочник Номенклатуры.
Если Ном.Пустая() или Не Ном.Пустая() Тогда
Ном = Справочники.Номенклатура.СоздатьЭлемент();
Ном.ОбменДанными.Загрузка = Истина;
Ном.Артикул = стр2.АртикулНаследник;
Ном.Наименование = стр2.МаркентиговоеНазвание;
Ном.НаименованиеПолное = стр2.НаименованиеПолное;
Ном.Вес = стр2.ВесИзделия;
Ном.Марка = ВидМарка;
Ном.ВидНоменклатуры = ВидНом;
Ном.ТипНоменклатуры = ВидНом.ТипНоменклатуры;
НоваяСтрока = Ном.ДанныеПоКамнямДоп.Добавить();
НоваяСтрока.ОсновнойКамень = ВидКамня;
Ном.ЕдиницаИзмерения = ЭтаФорма.ЕдиницаИзмерения;
Ном.СтавкаНДС = ЭтаФорма.СтавкаНДС;
Если Ном.Наименование = "" Тогда
Ном.Наименование = Ном.НаименованиеПолное;
КонецЕсли;
Получение имён, ссылок и прочее происходит через запросы.
Я понимаю, что данный запрос некорректный из-за того, что происходит его повторный вызов через цикл, что будет вторым вопросом, где мне поискать более подробное пояснение об методологиях в 1с и как мне результаты запроса записывать в массив(я понимаю, что это будет опять же отдельная процедура/функция, но у меня не очень в голове укладывается, как я могу это сделать). Т.к. то что я искал оно сухое и трудно воспринимается через мой опыт программирования на 1с.
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО &Артикул
| И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное
| И Номенклатура.Вес = &Вес"
);
Запрос.УстановитьПараметр("Артикул", АртикулНаследник);
Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное);
Запрос.УстановитьПараметр("Вес", ВесИзделия);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
В данном запросе реализовано получение реквизитов и проверка на их существование, что передаётся в цикл сверху. (существует ещё несколько подобных запросов, но они очень сильно идентичны между собой, что представлю на скриншотах).
Ещё раз повторю свои выше озвученные вопросы:
1) Как можно мне перезаписать существующие уже записи?
2) Как я могу через массив вынести запросы?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Первое же условие - прям огонь.
Уберите вообще это условие, если уж вам нужно в любом случае создавать элемент номенклатуры.
Ответы на вопросы:
1. найти существующий элемент в ИБ и использовать его
2. Почему именно через массив? Вынести куда? Зачем вообще выносить куда-то запросы?
Если Ном.Пустая() или Не Ном.Пустая() Тогда
Первое же условие - прям огонь.
Уберите вообще это условие, если уж вам нужно в любом случае создавать элемент номенклатуры.
Ответы на вопросы:
1. найти существующий элемент в ИБ и использовать его
2. Почему именно через массив? Вынести куда? Зачем вообще выносить куда-то запросы?
(1)
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО &Артикул
| И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное
| И Номенклатура.Вес = &Вес"
);
Запрос.УстановитьПараметр("Артикул", АртикулНаследник);
Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное);
Запрос.УстановитьПараметр("Вес", ВесИзделия);
Выборка = Запрос.Выполнить().Выбрать();
// Конструкция с Если/КонецЕсли работает с условиями. Выборка.Следующий() это не условие, а перебор в цикле
// Выборка.Ссылка - это не готовые данные. Их нужно передать в какую-то структуру (массив, список значений и т.д.)
// Возврат Справочники.Номенклатура.ПустаяСсылка() вообще непонятная конструкция
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Показать
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул ПОДОБНО &Артикул
| И Номенклатура.НаименованиеПолное ПОДОБНО &НаименованиеПолное
| И Номенклатура.Вес = &Вес"
);
Запрос.УстановитьПараметр("Артикул", АртикулНаследник);
Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное);
Запрос.УстановитьПараметр("Вес", ВесИзделия);
Выборка = Запрос.Выполнить().Выбрать();
// Конструкция с Если/КонецЕсли работает с условиями. Выборка.Следующий() это не условие, а перебор в цикле
// Выборка.Ссылка - это не готовые данные. Их нужно передать в какую-то структуру (массив, список значений и т.д.)
// Возврат Справочники.Номенклатура.ПустаяСсылка() вообще непонятная конструкция
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
(1) чтобы не было запросов в цикле
1) Добавить данные из файла в таблицу значений (обязательно описать типы колонок, иначе в запрос нельзя передать)
2) Передать данную таблицу значений в запрос параметром
3) В запросе соединять с необходимыми таблицами БД
4) Обработать результат запроса
1) Добавить данные из файла в таблицу значений (обязательно описать типы колонок, иначе в запрос нельзя передать)
2) Передать данную таблицу значений в запрос параметром
3) В запросе соединять с необходимыми таблицами БД
4) Обработать результат запроса
Докину обещанные скриншоты, обработки и кину более подробный код для описания в целом, что у меня происходит. Т.к. форум видимо их съел, когда я выбирал тэги для треда.
&НаСервере
Процедура ЗагрузкаНомНаСервере()
// Вставить содержимое обработчика.
//Тут мы принимает данные из временного хранилища.
Данные = ПолучитьИзВременногоХранилища(ЭтаФорма.ПутьВХ);
//ИмяВременногоФайла
ИмяВФ = ПолучитьИмяВременногоФайла("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.ВесИзделия;
Ном.Марка = ВидМарка;
Ном.ВидНоменклатуры = ВидНом;
Ном.ТипНоменклатуры = ВидНом.ТипНоменклатуры;
НоваяСтрока = Ном.ДанныеПоКамнямДоп.Добавить();
НоваяСтрока.ОсновнойКамень = ВидКамня;
Ном.ЕдиницаИзмерения = ЭтаФорма.ЕдиницаИзмерения;
Ном.СтавкаНДС = ЭтаФорма.СтавкаНДС;
Если Ном.Наименование = "" Тогда
Ном.Наименование = Ном.НаименованиеПолное;
КонецЕсли;
//Если Ном = Знач Тогда
//
//
//
//КонецЕсли;
Ном.Записать();
КонецЕсли;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ВидКамня.Ссылка, ВидКамня.Ссылка);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Ном.Ссылка, Ном.Ссылка);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ВидНом.Ссылка, ВидНом.Ссылка);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗагрузкаНомНаСервере()
// Вставить содержимое обработчика.
//Тут мы принимает данные из временного хранилища.
Данные = ПолучитьИзВременногоХранилища(ЭтаФорма.ПутьВХ);
//ИмяВременногоФайла
ИмяВФ = ПолучитьИмяВременногоФайла("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
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот