helpf.pro
Регистрация

Поиск значения(штрих-код) в подчиненном справочнике

mire
22.09.2010 14:51Прочитано: 25810
Здравствуйте!
1с.8.1.Упр.торговлей 10.3
Обрабатываю DBF файл,содержащий поля артикул и штри-код
Из этого файла нужно отобрать записи которые есть в базе данных 1с
Пытаюсь найти значение штрих- кода через значение Артикула.
Но ничего не получается.
Как связаться со справочником щтрих-кодов?
С программированием в 1с познакомился только неделю назад
Код 1C v 8.х
    БД.Первая();
Пока Не БД.ВКонце() Цикл
Попытка
Артикул = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",БД.Articul);
// Справочники.ХарактеристикиНоменклатуры.
// надо найти где-то значеник штрих-кода
Если Артикул.Пустая() Тогда
Сообщить("Не найден артикул: " + БД.Articul);
продолжить;
КонецЕсли;
Исключение
Сообщить("Ошибка обработки строки: " , СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки());
КонецПопытки;
БД.Следующая();
КонецЦикла;
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
22.09.2010 16:41Ответ № 1
(0) УТ под рукой нет *12, но если мне не изменяет память, то Штрих - коды хранятся в регистре сведений "Штрихкоды", с ним и нужно работать:

А вот примеры работы из великого интернета *06:
Код 1C v 8.х
 // Функция проверяет Есть ли у Номенклатуры ШтрихКоды
Функция владелецИмеетШк(обс)
Запрос = Новый Запрос("
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегШтрихкоды.ШтрихКод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК РегШтрихкоды
|ГДЕ
| РегШтрихкоды.Владелец = &Владелец
// если нужна проверка для определенного Типа ШтрихКодов, то добавить условие вида:
// | И РегШтрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13)
| И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)
|");
Запрос.УстановитьПараметр("Владелец", обс);
РезультатЗапроса = Запрос.Выполнить();
Возврат НЕ РезультатЗапроса.Пустой();
// если нужно обработать результат то:
//Если Не РезультатЗапроса.Пустой() Тогда
// Тут обрабатываем
// Возврат Истина;
//КонецЕсли;
КонецФункции

// Процедура Создает новый ШтрихКод для Номенклатуры
Процедура ПрисвоитьШкДляОб(обс)
об = обс.ПолучитьОбъект();
Если владелецИмеетШк(обс) Тогда
Сообщить(об.Наименование+" уже имеет шк ");
Возврат;
КонецЕсли;
новШк = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
новШк.Владелец = обс;
новШк.ЕдиницаИзмерения = об.ЕдиницаХраненияОстатков;
новШк.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
новШк.Качество = Справочники.Качество.Новый;
новШк.Штрихкод = РаботаСТорговымОборудованием.СформироватьШтрихКод();
Попытка
новШк.Записать();
Сообщить("для "+об.ПолноеНаименование()+" присвоен шк "+новШк.Штрихкод)
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры

//После нажания Кнопки Переберается вся номенклатура и той у которой еще нет штрихкода,
// присваивается новый штрихкод
Процедура КнопкаВыполнитьНажатие(Кнопка)
текНом = Справочники.Номенклатура.Выбрать();
Пока текНом.Следующий() Цикл
ПрисвоитьШкДляОб(текНом);
КонецЦикла;
КонецПроцедуры
mire
23.09.2010 06:40Ответ № 2
Здравствуйте!
Какое значение (или вид представления) должно быть у параметра обс.
Т.е. что передается в функцию?
Заранее спасибо.
E_Migachev
23.09.2010 09:23Ответ № 3
(2) обс - ссылка на номенклатуру
mire
23.09.2010 12:39Ответ № 4
Добрый день!
Как я понял у номенклатурного номера может быть несколько штрих-кодов даже для одной единицы измерения.
Как их все перебрать ( получить значение)?
Вот примерный код :
Код 1C v 8.х
 
РезультатЗапроса = Запрос.Выполнить();
//Возврат НЕ РезультатЗапроса.Пустой();
// если нужно обработать результат то:
Если Не РезультатЗапроса.Пустой() Тогда
// Тут обрабатываем
РезультатЗапроса = РезультатЗапроса.Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
// ... код обработки...
сообщить(ШтрихКод);// ??????????
КонецЦикла ;
Возврат Истина;
КонецЕсли;
E_Migachev
23.09.2010 12:49Ответ № 5
(4) вот так:
Код 1C v 8.х
 Если Не РезультатЗапроса.Пустой() Тогда
// Тут обрабатываем
РезультатЗапроса = РезультатЗапроса.Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Сообщить(РезультатЗапроса.ШтрихКод);
КонецЦикла ;
КонецЕсли;
mire
23.09.2010 20:20Ответ № 6
Добрый вечер.
код:
Код 1C v 8.х
 
Если Не РезультатЗапроса.Пустой() Тогда
// Тут обрабатываем
РезультатЗапроса = РезультатЗапроса.Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
сообщить(РезультатЗапроса.ШтрихКод);
сообщить(ТипЗнч(РезультатЗапроса.ШтрихКод));
КонецЦикла ;
Возврат Истина;
КонецЕсли;

в сообщениях вообще ничего не возвращает.
Надо как-то иначе писать?
E_Migachev
23.09.2010 20:35Ответ № 7
а отладчиком попробуй - в цикл Пока РезультатЗапроса.Следующий() Цикл вообще заходит?
похоже что нет *11
покажи весь код
mire
23.09.2010 21:09Ответ № 8
вот часть кода :
Код 1C v 8.х
 
Процедура ЗагрузитьDBFНажатие(Элемент)
БД = Новый XBase;
БД.ОткрытьФайл(ИмяФайла,,1);
Если БД.Открыта()=0 Тогда
Сообщить("Не удалось открыть файл DBF","!");
Возврат;
КонецЕсли;
ТекстКорзины = "";
ТП.Очистить();
БД.Первая();
Пока Не БД.ВКонце() Цикл
Попытка
ТекСтрока = БД.Articul+БД.Name+БД.Ed_I+Строка(БД.Cena_p) ;
//Сообщить(ТекСтрока);
ТекстКорзины = ТекстКорзины + Символы.ПС + ТекСтрока;
Исключение
Сообщить("Ошибка обработки строки: " , СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки());
КонецПопытки;
БД.Следующая();
КонецЦикла;

БД.Первая();
Пока Не БД.ВКонце() Цикл
Попытка
Артикул = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",БД.Articul);
Сообщить(БД.Articul);
Если Артикул.Пустая() Тогда
Сообщить("Не найден артикул: " + БД.Articul);
продолжить;
КонецЕсли;
владелецИмеетШк(Артикул);
//ПрисвоитьШкДляОб(Артикул);
стр = ТП.Добавить();
стр.Номенклатура = Артикул;
стр.Количество = БД.KOL;
стр.ЕдИзм = Артикул.ЕдиницаХраненияОстатков;
//стр.Аналитика = Артикул.НоменклатурнаяГруппа;
стр.Артикул = Артикул.Артикул;
стр.ЦенаПост= БД.Cena_p;
Сообщить("Цена посмтавщика"+стр.ЦенаПост);
стр.Номер = ТП.Количество() + 1;
Исключение
Сообщить("Ошибка обработки строки: " , СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки());
КонецПопытки;
БД.Следующая();
КонецЦикла;
БД.ЗакрытьФайл();
КонецПроцедуры

Процедура ИмяФайлаНачалоВыбораDBF(Элемент, СтандартнаяОбработка)

// Отключение стандартной обработки
СтандартнаяОбработка = Ложь;

// Выбор файла
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.Фильтр = "Документ предварительный просморт (*.dbf)|*.dbf";
ВыборФайла.ПроверятьСуществованиеФайла = Истина;
ВыборФайла.ПолноеИмяФайла = ИмяФайла;
ВыборФайла.Заголовок = "Выберите файл со склада";

Выбор = ВыборФайла.Выбрать();
Если НЕ Выбор Тогда

Возврат;

КонецЕсли;

ИмяФайла = ВыборФайла.ВыбранныеФайлы[0];


КонецПроцедуры

// Процедура читает заголовок файла обмена
//
Функция ПрочитатьФайл(Файл)

ФайлЗагр = Новый Файл(Файл);
Если ФайлЗагр.Существует() = Ложь Тогда
Сообщить("Файла "+Файл+" не существует!");
Возврат Неопределено;
КонецЕсли;

КонецФункции
Функция владелецИмеетШк(обс)
сообщить("Запрос");
Запрос = Новый Запрос("
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегШтрихкоды.ШтрихКод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК РегШтрихкоды
|ГДЕ
| РегШтрихкоды.Владелец = &Владелец
// если нужна проверка для определенного Типа ШтрихКодов, то добавить условие вида:
// | И РегШтрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13)
| И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)
|");
Запрос.УстановитьПараметр("Владелец", обс);
сообщить("1");
РезультатЗапроса = Запрос.Выполнить();
//Возврат НЕ РезультатЗапроса.Пустой();
// если нужно обработать результат то:
Если Не РезультатЗапроса.Пустой() Тогда
// Тут обрабатываем
РезультатЗапроса = РезультатЗапроса.Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
// ... код обработки...
сообщить("=1");
сообщить(РезультатЗапроса.ШтрихКод);
сообщить(ТипЗнч(РезультатЗапроса.ШтрихКод));
сообщить("=2");
КонецЦикла ;
Возврат Истина;
КонецЕсли;
КонецФункции

E_Migachev
23.09.2010 21:29Ответ № 9
(8) а замени запрос проверки ШК на
Код 1C v 8.х
 Запрос = Новый Запрос("
|ВЫБРАТЬ
| РегШтрихкоды.ШтрихКод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК РегШтрихкоды
|ГДЕ
| РегШтрихкоды.Владелец = &Владелец
|");
Что выдает?
E_Migachev
23.09.2010 21:34Ответ № 10
+(9) Функция владелецИмеетШк(обс) должна быть перед Процедура ЗагрузитьDBFНажатие(Элемент) !!!
mire
23.09.2010 21:43Ответ № 11
В окне сообщений на код:
Код 1C v 8.х
 
Пока РезультатЗапроса.Следующий() Цикл
// ... код обработки...
сообщить("=1");
сообщить(РезультатЗапроса.ШтрихКод);
сообщить(ТипЗнч(РезультатЗапроса.ШтрихКод));
сообщить("=2");
КонецЦикла ;


Теперь программа выдает:
Для номенклатурного номера у которого я завел нест\колько штрих-кодов для одной единицы измерения :
=1
Строка
=2
Для номенклатурных номеров у которых не штрих кода:
=1
=2

Т.е.Вообще ничего не выдает.
mire
23.09.2010 21:51Ответ № 12
Вы написали:
Функция владелецИмеетШк(обс) должна быть перед Процедура ЗагрузитьDBFНажатие(Элемент) !!!
А почему такой порядок не обходим?
E_Migachev
23.09.2010 21:58Ответ № 13
Потому что функция должна быть описана перед тем, как она будет вызываться!

(11) ок, а теперь сделай такой запрос
Код 1C v 8.х
  Запрос = Новый Запрос("
|ВЫБРАТЬ
| РегШтрихкоды.ШтрихКод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК РегШтрихкоды
|ГДЕ
| РегШтрихкоды.Владелец = &Владелец
| И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)
|");
mire
23.09.2010 22:01Ответ № 14
Поменял расположение функции.
Теперь программа выдает:
Для номенклатурного номера у которого я завел нест\колько штрих-кодов для одной единицы измерения :
=1
Строка
=2
Для номенклатурных номеров у которых не штрих кода:
теперь даже строки :
=1
=2
перестал выдавать
E_Migachev
23.09.2010 22:07Ответ № 15
Цитата
Для номенклатурного номера у которого я завел нест\колько штрих-кодов для одной единицы измерения :
=1
Строка
=2

это хорошо, только не понятно почему не выдает сам штрих код - какой ШК указал у номенклатуры?

Цитата
Для номенклатурных номеров у которых не штрих кода:
теперь даже строки :
=1
=2
перестал выдавать


Это правильно - так как поставили условие в запросе (| И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)) - не выводить без ШК
mire
23.09.2010 22:08Ответ № 16
Изменил запрос на
Код 1C v 8.х
 
Запрос = Новый Запрос("
|ВЫБРАТЬ ПЕРВЫЕ 1
| РегШтрихкоды.ШтрихКод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК РегШтрихкоды
|ГДЕ
| РегШтрихкоды.Владелец = &Владелец
// если нужна проверка для определенного Типа ШтрихКодов, то добавить условие вида:
// | И РегШтрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13)
| И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)
|");

Результат такой же как в предыдущем сообщении.
mire
23.09.2010 22:15Ответ № 17
Вы написали :
Это правильно - так как поставили условие в запросе (| И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)) - не выводить без ШК

Но для номенклатурного номера у которого я завел несколько штрих-кодов для одной единицы измерения код :
Код 1C v 8.х
 
сообщить("=1");
сообщить(РезультатЗапроса.ШтрихКод);
сообщить(ТипЗнч(РезультатЗапроса.ШтрихКод));
сообщить("=2");


выдает результат:
=1
Строка
=2
Для выражения сообщить(РезультатЗапроса.ШтрихКод);
вообщее никакогозначения программа не выдает.
E_Migachev
23.09.2010 22:15Ответ № 18
(16) только в этом запросе стоит |ВЫБРАТЬ ПЕРВЫЕ 1 - и значить он будет выбирать только одну запись, а не все записи по штрих кодам номенклатуры!
mire
23.09.2010 22:19Ответ № 19
Вы написали:
"только в этом запросе стоит |ВЫБРАТЬ ПЕРВЫЕ 1 - и значить он будет выбирать только одну запись, а не все записи по штрих кодам номенклатуры!"

Хорошо.А как выбрать все записи в справочнике штрих-кодов и получить их значение?
E_Migachev
23.09.2010 22:25Ответ № 20
(19) если ты хочешь выбрать все штрих коды для конкретной номенклатуры - то бери запрос из (11)

а если вообще - все какие есть, то:
Код 1C v 8.х
  Запрос = Новый Запрос("
|ВЫБРАТЬ
| РегШтрихкоды.ШтрихКод КАК Штрихкод,
| РегШтрихкоды.Владелец КАК Номенклатура
|ИЗ
| РегистрСведений.Штрихкоды КАК РегШтрихкоды
|");
mire
23.09.2010 22:29Ответ № 21
Все,разобрался.
Не внимательно переписал отредактированный Вами запрос.
Оставил только команду выбрать и все заработало.
Чтобы получить данные из регистра сведений нужно использовать только механизм запросов или еще можно что-то другое?
Еще раз спасибо.
E_Migachev
23.09.2010 22:34Ответ № 22
(21) пожалуйста ), если все то закрывай вопрос *13
mire
24.09.2010 14:22Ответ № 23
Здравствуйте!
Если возможно,то ответьте .пожалуйста на следующий вопрос:
Чтобы получить данные из регистра сведений нужно использовать только механизм запросов или еще можно что-то другое?
Я всего неделю назад познакомился с текстом программы на 1с,
а срок знакомства с 1с - еще нет и месяца.Поэтому много еще чего не понятно.
E_Migachev
24.09.2010 19:32Ответ № 24
кроме запроса можно получать еще выборкой, напрмер так
mire
25.09.2010 09:45Ответ № 25
Вопрос закрыт!
Mokey
12.10.2010 15:12Ответ № 26
(10) E_Migachev, в 8-ке такой необходимости нет
E_Migachev
12.10.2010 15:24Ответ № 27
(26) Согласен ) нет, но все-таки нужно писать программы правильно и последовательно!
Mokey
12.10.2010 17:22Ответ № 28
(27) Это уже дело компилятора, пусть разбирает все вызовы. И если разработчики 1С написали разбор, то нет необходимости тратить на это время, хотя по привычке я всё же описываю функцию/процедуру перед её вызовом.
E_Migachev
12.10.2010 18:18Ответ № 29
(28) вот и я старой закалки ) всегда пишу перед вызовом и другим говорю так делать *13
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.