Не создаются записи в регистре сведений штрихкоды номенклатуры
Здравствуйте. Написал обработку, для создания записей в регистр сведений, но столкнулся с проблемой: записи не создаются, ни через набор записей, ни через менеджер. Подскажите, пожалуйста, где я мог ошибиться? УТ 11, демо база.
Результат = Запрос.Выполнить().Выбрать();
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
Если Результат.Количество() = 0 Тогда
МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;
КонецЕсли;
МенеджерЗаписи .Записать(Истина);
КонецЦикла;
Результат = Запрос.Выполнить().Выбрать();
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
Если Результат.Количество() = 0 Тогда
МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;
КонецЕсли;
МенеджерЗаписи .Записать(Истина);
КонецЦикла;
По теме из базы знаний
- Заполнение пустых артикулов и штрихкодов на основе кода номенклатуры в 1С:Бухгалтерия предприятия ред. 3
- Подключение сканера штрихкода к Бухгалтерии 3.0
- Создание записей в регистр сведений Акцизные марки ЕГАИС
- Массовое создание штрихкодов для номенклатуры. Розница 2.3
- Регистр сведений, подчиненный регистратору, и независимый регистр сведений в 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) По вашему куску кода ничего непонятно. У вас там какой-то запрос, который выполняется в цикле. Присваивание значений записи регистра зависит от условия, а создание записи и её запись в регистр вне этого условия.
Приведите полный текст того что у вас в цикле происходит.
И пользуйтесь тегами для кода (кнопка "</>"), пожалуйста.
Приведите полный текст того что у вас в цикле происходит.
И пользуйтесь тегами для кода (кнопка "</>"), пожалуйста.
(4)
Для Строка = 2 По ExcelПоследняяСтрока Цикл
Штрихкод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 1).Value), Символы.НПП, "");
НомКод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 2).Value), Символы.НПП, "");
НаимНом = Сокрлп(ОткрытьФайл.Cells(Строка, 3).Value);
НоменклатураСпр = Справочники.Номенклатура.НайтиПоКоду(НомКод);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура", НоменклатураСпр);
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодыНоменклатуры.Номенклатура.Код КАК НоменклатураКод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура";
Результат = Запрос.Выполнить().Выбрать();
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
Если Результат.Количество() = 0 Тогда
МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
КонецЦикла;
Показать
(5)
В остальном не вижу возможной проблемы, кроме как когда "Результат.Количество()" всегда больше нуля.
В отладке на строку "МенеджерЗаписи.Записать(Истина);" точно попадает?
Если да, посмотрите соответствующие записи по операции в журнале регистрации.
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
тоже можно под условие вставить.
В остальном не вижу возможной проблемы, кроме как когда "Результат.Количество()" всегда больше нуля.
В отладке на строку "МенеджерЗаписи.Записать(Истина);" точно попадает?
Если да, посмотрите соответствующие записи по операции в журнале регистрации.
(9) Изначально проверка была на НоменклатураСпр.Пустая() :
Для Строка = 2 По ExcelПоследняяСтрока Цикл
Штрихкод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 1).Value), Символы.НПП, "");
НомКод = СтрЗаменить(Сокрлп(ОткрытьФайл.Cells(Строка, 2).Value), Символы.НПП, "");
НаимНом = Сокрлп(ОткрытьФайл.Cells(Строка, 3).Value);
НоменклатураСпр = Справочники.Номенклатура.НайтиПоКоду(НомКод);
Если Не НоменклатураСпр.Пустая() Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура", НоменклатураСпр);
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
| ШтрихкодыНоменклатуры.Номенклатура.Код КАК НоменклатураКод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура";
Результат = Запрос.Выполнить().Выбрать();
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
Если Результат.Количество() = 0 Тогда
МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
(18)В (2) было дано решение проблемы проверки записей в БД.
Когда происходит 1М итераций таких вот проверок, то задержка в 0.001с даст в итоге 1000 секунд сверху ко времени выполнения + породит кучу всяких дополнительных действий(что еще добавит времени выполнения) СУБД для достижения поставленной цели.
Когда происходит 1М итераций таких вот проверок, то задержка в 0.001с даст в итоге 1000 секунд сверху ко времени выполнения + породит кучу всяких дополнительных действий(что еще добавит времени выполнения) СУБД для достижения поставленной цели.
(27) Он никак не обозначил, что это предложение оптимизации, а не ответ на вопрос. А значит, по умолчанию, он воспринимается именно так, как ответ на вопрос.
Это только, кто понимает само предложенное решение, поймет и для чего оно. С большой уверенностью могу сказать, что тот для кого оно предназначалось не понял бы этого, иначе использовал бы его с самого начала.
Это только, кто понимает само предложенное решение, поймет и для чего оно. С большой уверенностью могу сказать, что тот для кого оно предназначалось не понял бы этого, иначе использовал бы его с самого начала.
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() = 0 Тогда
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи .Номенклатура = НоменклатураСпр;
МенеджерЗаписи .Штрихкод = Штрихкод;
МенеджерЗаписи .Записать(Истина);
КонецЕсли;
Показатьа на замечания про запросы в цикле наплюйте
вы - художник, вы так видите
и всегда делайте выборку результата запроса, если хотите узнать, не пуст ли он!
(19) зависит от количества строк номенклатуры в экселе. В любом случае, дергать сервер запросом по каждому отдельному случаю плохой подход. Хотя я об этом ранее решил умолчать. И можно делать все в одной процедуре: создать таблицу номенклатуры со штрих-кодами из экселя, а потом передать ее в запрос в качестве параметра, и получить в качестве результата только номенклатуру, для которой нужно добавить записи штрихкодов в РС.
(21)
(29) Я, конечно, был наслышан о токсичности комьюнити 1с, но до последнего надеялся, что это всего лишь слухи. Сделал бы я обход экселя с добавлением значений в массив , присвоил бы параметр Номенклатура В Массиве, еще б кучу кода написал, и он бы просто не отрабатывал,записи в регистр как не делались так и не делались бы, а кода написано в разы больше, нафига а главное зачем? А тут я простенький запрос написал, чтоб просто проверить, будут ли делаться записи или нет, но нашлись коллеги, которые скорей за это грязью поливать. Спасибо)
(29) Я, конечно, был наслышан о токсичности комьюнити 1с, но до последнего надеялся, что это всего лишь слухи. Сделал бы я обход экселя с добавлением значений в массив , присвоил бы параметр Номенклатура В Массиве, еще б кучу кода написал, и он бы просто не отрабатывал,записи в регистр как не делались так и не делались бы, а кода написано в разы больше, нафига а главное зачем? А тут я простенький запрос написал, чтоб просто проверить, будут ли делаться записи или нет, но нашлись коллеги, которые скорей за это грязью поливать. Спасибо)
(30)Я же не ругал и не обзывался.
Даже если запрос внутри цикла, то создание запроса почему внутри цикла?
Какие проблемы из экселя запросом выбрать данные и следующим запросом выбрать нужные записи? Никаких.
Но нет, мы посоветуем писать говнокод.
Я ничего не посоветовал автору, каюсь. Советую
1. Не использовать сокращения в именах переменных, никаких Ном. Максимум, что можно себе позволить, назвать переменную цикла Сч
2. Проверять на пустоту результат запроса, а не выборку. Но это уже посоветовали.
Надо запомнить, что есть 2 кейса
1. Мы получаем результат, проверяем его на пустоту и выгружаем, а потом обходим
2. Мы получаем выборку и не проверяем ее на пустоту, а сразу обходим.
Файл эксель мы легко открываем в качестве табличного документа, делаем к нему запрос и не надо его обходить при чтении данных. Приложение эксель мы используем тогда, когда нам нужно вписать свои данные в документ и формулы сработали.
Даже если запрос внутри цикла, то создание запроса почему внутри цикла?
Какие проблемы из экселя запросом выбрать данные и следующим запросом выбрать нужные записи? Никаких.
Но нет, мы посоветуем писать говнокод.
Я ничего не посоветовал автору, каюсь. Советую
1. Не использовать сокращения в именах переменных, никаких Ном. Максимум, что можно себе позволить, назвать переменную цикла Сч
2. Проверять на пустоту результат запроса, а не выборку. Но это уже посоветовали.
Надо запомнить, что есть 2 кейса
1. Мы получаем результат, проверяем его на пустоту и выгружаем, а потом обходим
2. Мы получаем выборку и не проверяем ее на пустоту, а сразу обходим.
Файл эксель мы легко открываем в качестве табличного документа, делаем к нему запрос и не надо его обходить при чтении данных. Приложение эксель мы используем тогда, когда нам нужно вписать свои данные в документ и формулы сработали.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот