Не создаются записи в регистре сведений штрихкоды номенклатуры

1. user1619761 09.12.21 15:47 Сейчас в теме
Здравствуйте. Написал обработку, для создания записей в регистр сведений, но столкнулся с проблемой: записи не создаются, ни через набор записей, ни через менеджер. Подскажите, пожалуйста, где я мог ошибиться? УТ 11, демо база.

Результат = Запрос.Выполнить().Выбрать();
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();

Если Результат.Количество() = 0 Тогда

МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;

КонецЕсли;

МенеджерЗаписи .Записать(Истина);

КонецЦикла;
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Release 09.12.21 16:34 Сейчас в теме
(1) По вашему куску кода ничего непонятно. У вас там какой-то запрос, который выполняется в цикле. Присваивание значений записи регистра зависит от условия, а создание записи и её запись в регистр вне этого условия.
Приведите полный текст того что у вас в цикле происходит.
И пользуйтесь тегами для кода (кнопка "</>"), пожалуйста.
5. user1619761 09.12.21 16:45 Сейчас в теме
(4)
Для Строка = 2 По ExcelПоследняяСтрока Цикл
		
		Штрихкод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 1).Value), Символы.НПП, "");
		НомКод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 2).Value), Символы.НПП, "");
		НаимНом = Сокрлп(ОткрытьФайл.Cells(Строка, 3).Value);
		НоменклатураСпр = Справочники.Номенклатура.НайтиПоКоду(НомКод);
Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("Номенклатура", НоменклатураСпр);
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
		|	ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
		|	ШтрихкодыНоменклатуры.Номенклатура.Код КАК НоменклатураКод
		|ИЗ
		|	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
		|ГДЕ
		|	ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура";
		Результат = Запрос.Выполнить().Выбрать();
		МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
		
		Если Результат.Количество() = 0 Тогда
			
			МенеджерЗаписи .Номенклатура = НоменклатураСпр;
			МенеджерЗаписи .Штрихкод = Штрихкод;
			МенеджерЗаписи.Записать(Истина);
	
			КонецЕсли;					
			
	КонецЦикла;
Показать
6. Release 09.12.21 16:56 Сейчас в теме
(5)
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
тоже можно под условие вставить.

В остальном не вижу возможной проблемы, кроме как когда "Результат.Количество()" всегда больше нуля.
В отладке на строку "МенеджерЗаписи.Записать(Истина);" точно попадает?
Если да, посмотрите соответствующие записи по операции в журнале регистрации.
7. user1619761 09.12.21 16:58 Сейчас в теме
(6) да, точно попадает, я полностью весь код отладкой прошел для нескольких позиций, в результате записей никаких в регистрах не создалось. Спасибо.
9. Release 09.12.21 17:01 Сейчас в теме
(7) Значит смотрите журнал регистрации.

Кроме того, хорошо бы делать проверку на возврат существующего значения при поиске ссылки "НоменклатураСпр = Справочники.Номенклатура.НайтиПоКоду(НомКод);". Вдруг там возвращает Неопределено.
13. user1619761 09.12.21 17:06 Сейчас в теме
(9) Изначально проверка была на НоменклатураСпр.Пустая() :

Для Строка = 2 По ExcelПоследняяСтрока Цикл
        
        Штрихкод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 1).Value), Символы.НПП, "");
        НомКод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 2).Value), Символы.НПП, "");
        НаимНом = Сокрлп(ОткрытьФайл.Cells(Строка, 3).Value);
        НоменклатураСпр = Справочники.Номенклатура.НайтиПоКоду(НомКод);
        Если Не НоменклатураСпр.Пустая() Тогда

        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("Номенклатура", НоменклатураСпр);
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
        |    ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
        |    ШтрихкодыНоменклатуры.Номенклатура.Код КАК НоменклатураКод
        |ИЗ
        |    РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
        |ГДЕ
        |    ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура";
        Результат = Запрос.Выполнить().Выбрать();
        МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
        
        Если Результат.Количество() = 0 Тогда
            
            МенеджерЗаписи .Номенклатура = НоменклатураСпр;
            МенеджерЗаписи .Штрихкод = Штрихкод;
            МенеджерЗаписи.Записать(Истина);
    
            КонецЕсли;                    
    
     КонецЕсли;
        
    КонецЦикла;
Показать
15. user1619761 09.12.21 17:07 Сейчас в теме
16. nomad_irk 76 09.12.21 17:07 Сейчас в теме
(9)не может оно вернуть неопределено, оно вернет Справочники.Номенклатура.ПустаяСсылка()
17. Release 09.12.21 17:10 Сейчас в теме
(16) Да, конечно именно так, это я отвлекся на свои дела.
2. GeraltSnow 175 09.12.21 16:00 Сейчас в теме
У тебя в переменной Результат не результат запроса, а выборка.
Сделай так:

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
//добавить запись в регистр
КонецЕсли;
3. Release 09.12.21 16:29 Сейчас в теме
(2) А разве есть принципиальное отличие?
14. nomad_irk 76 09.12.21 17:06 Сейчас в теме
(3) есть, не формируется выборка, чтобы проверить есть ли записи в БД.
18. Release 09.12.21 17:13 Сейчас в теме
(14) И? Это решает проблему автора с отсутствием нужных записей в РС.
Это вопрос оптимизации, а значит для решения проблемы не принципиален.
Т.е. в (2) было предложение изменить код, которое абсолютно не поможет решить проблему.
22. nomad_irk 76 09.12.21 17:19 Сейчас в теме
(18)В (2) было дано решение проблемы проверки записей в БД.
Когда происходит 1М итераций таких вот проверок, то задержка в 0.001с даст в итоге 1000 секунд сверху ко времени выполнения + породит кучу всяких дополнительных действий(что еще добавит времени выполнения) СУБД для достижения поставленной цели.
23. Release 09.12.21 17:21 Сейчас в теме
(22) Но у автора, судя по всему, такой проблемы не возникло. Т.е. дано решение проблемы, которой в данном случае нет.
24. nomad_irk 76 09.12.21 17:22 Сейчас в теме
(23)Судя по предоставленному куску кода в (5), автора вообще не интересует быстродействие и он проблемы не увидит.
25. Release 09.12.21 17:24 Сейчас в теме
(24) Если не увидит, значит нет. Если кто-то увидит её позже, заказчик например, тогда она и возникнет. Смысл в том, что предложенное ранее решение не соответствует заданному вопросу.
27. nomad_irk 76 09.12.21 17:26 Сейчас в теме
(25)автор ответа и не говорил, что его ответ будет решением проблемы ТС.
Автор ответа посоветовал другим способом определить наличие записей в БД.
28. Release 09.12.21 17:30 Сейчас в теме
(27) Он никак не обозначил, что это предложение оптимизации, а не ответ на вопрос. А значит, по умолчанию, он воспринимается именно так, как ответ на вопрос.
Это только, кто понимает само предложенное решение, поймет и для чего оно. С большой уверенностью могу сказать, что тот для кого оно предназначалось не понял бы этого, иначе использовал бы его с самого начала.
26. Release 09.12.21 17:25 Сейчас в теме
(24) И да, я не спорю, что автор должен изначально писать корректный по быстродействию код.
8. user1461477 09.12.21 16:59 Сейчас в теме
Результат = Запрос.Выполнить().Выбрать();

Если Результат.Количество() = 0 Тогда
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;
МенеджерЗаписи .Записать(Истина);
КонецЕсли;
Показать


а на замечания про запросы в цикле наплюйте
вы - художник, вы так видите
и всегда делайте выборку результата запроса, если хотите узнать, не пуст ли он!
10. user1461477 09.12.21 17:01 Сейчас в теме
(8) патамушта работодателей, способных оценить качество кода своего 1сника, не то чтобы не было совсем или их слишком мало

нет. на самом деле им глубоко плевать на то, что творится в внутри их 1сной базы

и у них таки есть свои резоны для этого
11. nomad_irk 76 09.12.21 17:04 Сейчас в теме
(10)ага, а потом "че-та эта ваша желтая программа тормозит как не в себя....."
12. Release 09.12.21 17:04 Сейчас в теме
(10) Конечно плевать, поэтому они часто в требованиях к вакансии пишут "опыт работы с большим объемом данных", ну или как-то так.
19. user1619761 09.12.21 17:14 Сейчас в теме
(10) Хорошо, передам я из цикла данные в другую процедуру, там уже создам запрос с присвоением нужного параметра, на скорости работы это вряд ли скажется, хотя может и ошибаюсь.
20. Release 09.12.21 17:19 Сейчас в теме
(19) зависит от количества строк номенклатуры в экселе. В любом случае, дергать сервер запросом по каждому отдельному случаю плохой подход. Хотя я об этом ранее решил умолчать. И можно делать все в одной процедуре: создать таблицу номенклатуры со штрих-кодами из экселя, а потом передать ее в запрос в качестве параметра, и получить в качестве результата только номенклатуру, для которой нужно добавить записи штрихкодов в РС.
21. user1461477 09.12.21 17:19 Сейчас в теме
(19) нет, вот конкретно тут вы не ошиблись
29. gybson 09.12.21 22:55 Сейчас в теме
(8)"ты плохо подметай, но много, богатый дворник будешь"

Как-то так я это вижу =) Если начал делать херню, то не будет никаких "потом круто буду делать", так это не работает!
30. user1619761 10.12.21 08:27 Сейчас в теме
(21)
(29) Я, конечно, был наслышан о токсичности комьюнити 1с, но до последнего надеялся, что это всего лишь слухи. Сделал бы я обход экселя с добавлением значений в массив , присвоил бы параметр Номенклатура В Массиве, еще б кучу кода написал, и он бы просто не отрабатывал,записи в регистр как не делались так и не делались бы, а кода написано в разы больше, нафига а главное зачем? А тут я простенький запрос написал, чтоб просто проверить, будут ли делаться записи или нет, но нашлись коллеги, которые скорей за это грязью поливать. Спасибо)
31. user1461477 10.12.21 11:48 Сейчас в теме
(30) :))))))))))))))))))))

конечно, всегда виноват тот, кто может

некоторую проблему я вижу в том, что подобные вам шустрики как-то вдруг оказываются в ИТ-начальниках
мелких, конечно, но бла-бла-бла на своем месте умеют хорошо
32. user1619761 10.12.21 12:22 Сейчас в теме
(31) я кого то обвиняю? Я мечу в начальники? Вы вообще не знаете меня, как человека, к чему тогда такие выводы? ))
33. gybson 10.12.21 23:40 Сейчас в теме
(30)Я же не ругал и не обзывался.

Даже если запрос внутри цикла, то создание запроса почему внутри цикла?

Какие проблемы из экселя запросом выбрать данные и следующим запросом выбрать нужные записи? Никаких.

Но нет, мы посоветуем писать говнокод.

Я ничего не посоветовал автору, каюсь. Советую

1. Не использовать сокращения в именах переменных, никаких Ном. Максимум, что можно себе позволить, назвать переменную цикла Сч
2. Проверять на пустоту результат запроса, а не выборку. Но это уже посоветовали.

Надо запомнить, что есть 2 кейса

1. Мы получаем результат, проверяем его на пустоту и выгружаем, а потом обходим
2. Мы получаем выборку и не проверяем ее на пустоту, а сразу обходим.

Файл эксель мы легко открываем в качестве табличного документа, делаем к нему запрос и не надо его обходить при чтении данных. Приложение эксель мы используем тогда, когда нам нужно вписать свои данные в документ и формулы сработали.
Оставьте свое сообщение

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