Таблицу значений формы заполняю данными из файла Excel.И эта таблица заполняется артикулами. Как в базе найти по этим артикулам номенклатуры и подставить в колонку номенклатура?
Сделал запрос по поиску номенклатуры по артикулу,но не понимаю,как в качестве параметра к этому параметру подставить артикулы из файла Excel.
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
| ДанныеИзФайла.НомерСтроки,
| ДанныеИзФайла.Артикул
|ПОМЕСТИТЬ ВТ_ДанныеИзФайла
|ИЗ
| &ДанныеИзФайла КАК ДанныеИзФайла
|ГДЕ
| ДанныеИзФайла.Артикул <> """"
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ДанныеИзФайла.НомерСтроки,
| ТаблицаДляПоиска.Ссылка КАК Номенклатура
|ИЗ
| ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТаблицаДляПоиска
| ПО ВТ_ДанныеИзФайла.Артикул = ТаблицаДляПоиска.Артикул");
Показать
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
тз_= ПЗ.Результат.Выгрузить();
Для каждого СтрокаТЗ Из тз_ Цикл
СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;
КонецЦикла
Запрос=Новый Запрос;
Запрос.Текст= "ВЫБРАТЬ
| ДанныеИзФайла.НомерСтроки,
| ДанныеИзФайла.Артикул
|ПОМЕСТИТЬ ВТ_ДанныеИзФайла
|ИЗ
| &ДанныеИзФайла КАК ДанныеИзФайла
|ГДЕ
| ДанныеИзФайла.Артикул <> """"
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ДанныеИзФайла.НомерСтроки,
| ТаблицаДляПоиска.Ссылка КАК Номенклатура
|ИЗ
| ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТаблицаДляПоиска
| ПО ВТ_ДанныеИзФайла.Артикул = ТаблицаДляПоиска.Артикул");
Запрос.УстановитьПараметр("ДанныеИзФайла",);
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
// И тут-то и происходят все твои действия по заполнению и тп и тд.....
//Типа
ЭтаФорма.БазовыеЦены.Очистить(); // ну очищать конечно не надо , это я пошутил.....
КонецПроцедуры
Показать
Ты заполняешь свою таблицу значений на клиенте, а потом делаешь с ней что угодно &НаСервере...
ЭтаФорма.БазовыеЦены
&НаСервере
Процедура РаспознаваниеНоменклатуры()
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
ДиалогВыбораФайла.Фильтр = "Лист Excel (*.xls; *.xlsx)|*.xls; *.xlsx|";
Если ДиалогВыбораФайла.Выбрать() Тогда
Если ФайлДляЗагрузки <> ДиалогВыбораФайла.ПолноеИмяФайла Тогда
мНомерЕдиницыИзмерения = 0;
КонецЕсли;
ФайлДляЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;
Если ЗначениеЗаполнено(ФайлДляЗагрузки) Тогда
ФайлНаДиске = Новый Файл(ФайлДляЗагрузки);
КонецЕсли;
КонецЕсли;
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ФайлДляЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗ1= ПЗ.Результат.Выгрузить();
тз_=Новый ТаблицаЗначений;
тз_.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(80)));
тз_.Колонки.Добавить("БазоваяЦена", Новый ОписаниеТипов("Число"));
тз_.Колонки.Добавить("АктуальнаяЦена", Новый ОписаниеТипов("Число"));
Для Каждого Стр Из ТЗ1 Цикл
ЗаполнитьЗначенияСвойств(тз_.Добавить(), Стр);
КонецЦикла;
ДанныеИзФ=ЭтаФорма.БазовыеЦены.Выгрузить();
Для Каждого Строка Из тз_ Цикл
Нов=СтрЗаменить(СтрЗаменить(СокрЛП(Строка(Строка.Артикул)), Символ(160), ""), Символ(32),"");
Строка.Артикул=Нов;
КонецЦикла;
Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
| ТЗ.Артикул,
| ТЗ.БазоваяЦена
|ПОМЕСТИТЬ ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЗ.Артикул,
| Номенклатура.Наименование,
| Номенклатура.Ссылка,
| ТЗ.БазоваяЦена
|ИЗ
| ТЗ КАК ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО ТЗ.Артикул = Номенклатура.Артикул";
Запрос.УстановитьПараметр("ТЗ",тз_);
РезультатЗапроса=Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТЗ Из РезультатЗапроса Цикл
СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;
СтрокаТЗ_БазовыеЦены.Номенклатура=СтрокаТЗ.Ссылка;
КонецЦикла;
(6) Вы должны использовать таблицу Объект.ТаблицаЦен, вытащив ее на форму и именно ее заполнять изначально.
Вы же как я понял создали какой-то реквизит Формы, заполняете его из Экселя ... Нет ?
вы же зачем-то создали вручную свой реквизит ТаблицаЦен и заполняете его не понятно зачем...
вы создаете себе трудности , а потом не знаете как с ними бороться!
(16)у меня нет реквизита "ТаблицаЦен". Я заполняю таблицу,которая находится на форме. У самого документа нет таблиц(скрин 2).
При создании документа, заполняется эта таблица.
(15) Ну с названием я ошибся , вы же создаете кучу новых тем про одну и туже задачу ...
См вашу картинку...
Таблицы называются БазовыеЦены,
удалите реквизит формы - он совершенно не нужен
(23)есть файл excel . В котором две колонки: Артикул и Цена. В чем задача?:Нужно артикулы выгрузить в колонку "Артикул" и по этим артикулам искать номенклатуры в базе и эти номенклатуры загрузить в в колонку "номенклатура" . Колонка "Цена" в табице "Базовые цены" должна заполняться колонкой из файла Excel "Цены". Надеюсь теперь понятно)
На данном этапе, по артикулам из файла Excel, нужно найти номенклатуры в базе и заполнить этими найденными номенклатурами колонку "Номенклатура" ,таблицы "БазовыеЦены"
(24) Возможно Вам помогут сервисы, которые я использовал для решения подобных задач. Первое, обратите внимание на обработку "Обработка Загрузка данных из табличного документа 1С 8.3 (управляемые формы)", примеры использования легко найти в интернете. Вы копируете из Excel данные в табличный документ, а затем используете алгоритмы обработки для загрузки данных в базу. Если же у Вас конфигурация на базе УТ, обратите внимание на обработку конфигурации "Загрузка цен поставщиков". Возможно, это Вам поможет, в плане готовых уже решений.
(3)Я тоже делаю ставку на это!) На скриншоте видно, у артикула по умолчанию разделитель групп есть, значит скорее всего это число. А в номенклатуре я еще не встречал, чтобы артикул был НЕ строковым. Сделайте тип значения Артикула в таблице значений таким же как и у реквизита "Артикул" в справочнике Номенклатура.
Да, и при загрузке данных из Excel сделайте для артикула СокрЛП(), а то может не соединить с номенклатурой.
(5) В запросе вы пытаетесь делать объединение двух таблиц по полю "артикул". Но это поле, возможно, имеет разный тип данных в этих таблицах, например "строка" и "число". Никогда строка "123" не будет равнятся числу 123. Необходимо сравнивать значения с одинаковыми типами. Посмотрите, может быть проблема в этом.
(25)у таблицы "БазовыеЦены" артикул имеет тип строка и реквизит справочника номенклатура тоже имеет тип строка. Проблема в том,что не знаю, что и как подставить в параметр запроса
(34) правильно разбивать процедуры загрузки данных из файла и обработки данных на разные процедуры которые будут выполняться в необходимом контексте. И вы сами себе противоречите: как вы откроете файл на сервере для считывания, если он лежит на клиенте?
Во многих ваших ответах вы занимаетесь переворачиванием информации и отвечаете не по сути вопроса.
(37) Я не противоречу себе уж точно!
Вы путаете понятия &НаСервере &НаКлиенте с реальными клиентами и серверами!
Файл лежит на клиенте , форма открывается на клиенте, НО в модуле формы существуют процедуры &НаСервере, которые будут выполняться на стороне 1С сервера.
Рекомендую все же подтянуть образование в части 1С программирования 8.3
(40) Вы очень глубоко заблуждаетесь и вводите в заблуждение других
Вы путаете понятия &НаСервере &НаКлиенте с реальными клиентами и серверами!
Это одно и тоже. В этом и суть!
Файл лежит на клиенте , форма открывается на клиенте, НО в модуле формы существуют процедуры &НаСервере, которые будут выполняться на стороне 1С сервера.
Положите файл на свой клиентский комп, напишите обработку считывания файла (типа D:\МойФайл) в процедуре &НаСервере. И ОПА!, а его там нет, какое разочарование.
При указании директивы &НаСервере выполнение кода будет происходить на сервере.
Где Открывается форма документа?
Надеюсь у вас не хватит смелости сказать На сервере!
Правильно - на клиенте...
И как выполнить в модуле этой формы код с запросом к базе данных?
вы можете без &НаСервере - значит вы чудесник!
Положите файл на свой клиентский комп, напишите обработку считывания файла (типа D:\МойФайл) в процедуре &НаСервере. И ОПА!, а его там нет, какое разочарование.
Покажите мне дурака, кто будет делать такое?
Во первых процедура с диалогом открытия файла выпоняется ТОЛКО &НаКлиенте, ибо нужна реакция живого пользователя.
А вот если у вас прописан в коде конкретный полный путь к файлу на сервере , то можно открыть и в процедуре &НаСервере
Либо вы действительно слишком долго программировали обычные формы и толстый клиент, либо мы просто предвзято относимся сейчас друг к другу...
Давайте все же будем миролюбивы и постараемся разобраться в смысловых разногласиях.
(я все же надеюсь мы правильно понимаем суть , но неверно трактуем слова друг друга)
(27) Вышепредложенный способ - прост и нагляден.
Второй способ несколько перекликается с вашими наработками.
Но тоже требует Табличных частей в Объекте....
Вы заполняете эту же ТЧ из екселя, но без поиска номенклатуры в базе сразу.
Потом выгружаете в таблицу значений
ДанныеИзФайла = Объект.БазовыеЦены.Выгрузить(,);
И уже дальше так как вы делаете в (27)
(25) вот вы и уперлись в то о чем я говорил...
Ваша задача по человечески решается немного по другому...
В обработке Объект не должен быть документом а должен быть Обработкой и в Объект делаете Табличную часть БазовыеЦены.
Потом табличную часть БазовыеЦены вытаскиваете на форму и начинаете заполнять из файла.
И на каждом шаге добавления строки - ищете в базе номеклатуру и цену по артикулу и присваиваете нужным колонкам,
Все эти действия выполняются &НаСервере.
Это просто...
То что вы сделали и пытаетесь домучить - не очень оптимально...
(30) А может проще все же сделать обюработку и подключив ее добавить выполнение в виде кнопки ?
Если у вас типовая конфа, то менять формы - вообще почти криминал...
А внешняя обработка ничего не изменит в конфе...
Если же изменение самого документа ваш Окончательный выбор не смотря ни на что, тогда используйте выгрузку вашей табличной части с формы в таблицу значений и передачу передачу ее через хранилище на сервер , а там уже выполняйте ваш запрос с параметром
(33)база уже далеко не типовая....Можно и вызвать обработку, но пока что в голову не приходит, как найти номенклатуры по артикулам и заполнить эту колонку
(36)в реализации.
Во-вторых, но ваш способ требует Табличных частей в Объекте. Если я создам табличную часть в объекте, я не знаю в каким последствиям может это привести
(39) ну хорошо 1 вариант касался чисто обработки , без обработки его не реализуешь
Но вот второй с выгрузкой ТЧ в ТЗ и передачей на сервер в чем проблема?
(35) Если вы ее совсем не обновляете , то безусловно можно кромсать в свое удовольствие.
А вот если все же обновления нужны - то любые изменения конфы порой совсем не нужные - явная глупость, и нужна именно обработка.
Которых кстати по загрузке цен из Экселя в документ Установка цен номенклатуры на просторе инета - как грязи...
(47) Вот это меня и смутило! Вроде ж управляемая форма на картинке.
При запуске в режиме тонкого клиента именно нужно передавать ТЗ на сервер .
Если работает из толстого , то нет разделений где чего выпонять и передавать не надо
Нужно просто
(50)у сервере у меня почему-то недоступно.Доступно НаСервереБезКонтексте и выдает ошибку:
{Документ.УстановкаБазовыхЦен.Форма.ФормаДокумента.Форма(119,43)}: Переменная не определена (БазовыеЦены)
Запрос.УстановитьПараметр("ДанныеИзФайла",<<?>>БазовыеЦены.Выгрузить());
(61) Ты должен разделить свои события на 2 части
Загрузка данных из файла выпонять &НаКлиенте , чтобы пользователь открывал свои файлы.
А вот дальнейшую работу с запросом к Справочнику невозможно выполнить &НаКлиенте, и потому вторую половину процедуры (где запрос) нужно отрезать и перенести в отдельную процедуру и выпонять ее &НаСервере
(9) Мне код ваш совершенно ни к чему....
У вашего Объекта есть ТаблицаЦен ? Вы явно его хотите заполнить в итоге...
Так вот и возникает вопрос - зачем вам тот реквизит формы ТаблицаЦен , который не является конечной целью?
Вы заполняете зачем-то дубль...
Вы же не пишете какой объект разрабатываете.
Даете какой-то огрызок информации, и по этой информации вам дают рекомендации...
Они порой могут быть совершенно бестолковыми... И все у вас начинает работать тоже бестолково...
Вы бы изначальную задачу описывали, поясняли как вы ее решаете и что не получается...
Вам бы давали советы и по глобальной методике и по путям ее исправления
отрежь запрос и засунь его в отдельную процедуру и все...
а в конце
ДанныеИзФ=ЭтаФорма.БазовыеЦены.Выгрузить()
Запрос.УстановитьПараметр("ДанныеИзФайла",ДанныеИзФ);
Запрос.Выполнить();
/// ну и все что ты там хочешь дальше....
КонецПроцедуры
ТЗ работает как и любой параметр.
Если в ней нету ничего перед запросом, то и запрос ясно будет пустой.
"Чтобы что-то ненужное продать , нужно сначала что-то ненужное купить..." (кот Матроскин)
Если же на картинке именно ваша ТЗ, то запрос видимо так составили , что он возвращает Пустоту.
Ну смотрите сами чудес же не бывает!
Сначала в отладке Уберите все ГДЕ из запроса и посмотрите , что вернет
И Учитесь пользоваться отладкой - без нее вы никогда не станете никаким программистом.
В отладке всегда видно что, где и как.... Остается только немного подумать и станет ясно - Почему...
Совершенно не важно каким он был изначально!
Вы должны сначала выстроить работающий минимум, который будет работать хоть как-то , и только потом вносить постепенно изменения для развития всей функциональности. При этом очень легко отслеживать на какой стадии перестало работать - значит эти улучшения и неверны.
А когда вы изначально наваяли скажем 3 км текста и потом пытаетесь понять почему оно не работает, то это непрофессионально!
(83)понял почему возвращает пустое значение в (85) )) В таблице значений ДанныеИзФ В Артикуле имеются пробелы. чтобы убрать пробелы,нужно выгрузить эту колонку и убрать пробелы?
&НаСервере
Процедура РаспознаваниеНоменклатуры()
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
ДиалогВыбораФайла.Фильтр = "Лист Excel (*.xls; *.xlsx)|*.xls; *.xlsx|";
Если ДиалогВыбораФайла.Выбрать() Тогда
Если ФайлДляЗагрузки <> ДиалогВыбораФайла.ПолноеИмяФайла Тогда
мНомерЕдиницыИзмерения = 0;
КонецЕсли;
ФайлДляЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;
Если ЗначениеЗаполнено(ФайлДляЗагрузки) Тогда
ФайлНаДиске = Новый Файл(ФайлДляЗагрузки);
КонецЕсли;
КонецЕсли;
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ФайлДляЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗ1= ПЗ.Результат.Выгрузить();
тз_=Новый ТаблицаЗначений;
тз_.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(80)));
тз_.Колонки.Добавить("БазоваяЦена", Новый ОписаниеТипов("Число"));
тз_.Колонки.Добавить("АктуальнаяЦена", Новый ОписаниеТипов("Число"));
Для Каждого Стр Из ТЗ1 Цикл
ЗаполнитьЗначенияСвойств(тз_.Добавить(), Стр);
КонецЦикла;
ДанныеИзФ=ЭтаФорма.БазовыеЦены.Выгрузить();
Для Каждого Строка Из тз_ Цикл
Нов=СтрЗаменить(СтрЗаменить(СокрЛП(Строка(Строка.Артикул)), Символ(160), ""), Символ(32),"");
Строка.Артикул=Нов;
КонецЦикла;
Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
| ТЗ.Артикул,
| ТЗ.БазоваяЦена
|ПОМЕСТИТЬ ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЗ.Артикул,
| Номенклатура.Наименование,
| Номенклатура.Ссылка,
| ТЗ.БазоваяЦена
|ИЗ
| ТЗ КАК ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО ТЗ.Артикул = Номенклатура.Артикул";
Запрос.УстановитьПараметр("ТЗ",тз_);
РезультатЗапроса=Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТЗ Из РезультатЗапроса Цикл
СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;
СтрокаТЗ_БазовыеЦены.Номенклатура=СтрокаТЗ.Ссылка;
КонецЦикла;
Ну вот , а ты говоришь , что запрос пустой... )))))))))))))
А вот дальше Анализируй, что ты хочешь сделать и как ты это реализовать пытаешься....
Ты делаешь Внутреннее соединение с таблицей Номенклатуры по полю Артикул.
А ты уверен, что сам артикул не содержит лишних пробелов скажем или еще чего?
Смысл в том что по твоему поиску - запрос не ищет в Справочнике Номенклатуры ничего , потому и пустой...
Помнишь я тебе предлагал сделать не по "продвинутому" а по простому - при каждом добавлении строки в таблицу значений на форме искать в Номенклатуре по артикулу?
Попробуй так, может у тебя лучше так получится...
Пытайся как угодно - это элементарная задача....
Способов несколько...
Ну ведь ты же должен хоть что-то элементарное сам делать?
Или полностью надеешься только на сайт? ;-)
(94)я делаю в процедуре выбора файла Excel, а там доступны только НаКлиенте и НаСервереБезКонтекста. Для этого не создавать же кнопку,при нажатии на которой будет заполняться таблица?
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
// И тут-то и происходят все твои действия по заполнению и тп и тд.....
//Типа
ЭтаФорма.БазовыеЦены.Очистить(); // ну очищать конечно не надо , это я пошутил.....
КонецПроцедуры
Показать
Ты заполняешь свою таблицу значений на клиенте, а потом делаешь с ней что угодно &НаСервере...
ЭтаФорма.БазовыеЦены