1. Если используете получение единицы измерения, артикула и подобного с помощью общего модуля, то используйте до конца. Если номенклатура будет неопределена, то вылетет исключение. А такая ситуация возможна легко. Используйте функцию ЗначениеЗаполнено(Номенклатура)
Если ЗначениеЗаполнено(Номенклатура) Тогда
Возврат Номенклатура.Артикул;
Иначе
Возврат "";
КонецЕсли;
2. Функция "СоздатьШтрихКод". Почему не установить отбор в запросе? Зачем лопатить весь справочник? Таблица автоматически индексируется по наименованию и запрос с отбором по наименованию отработает мгновенно.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихКоды.Ссылка,
| ШтрихКоды.Наименование
|ИЗ
| Справочник.ШтрихКоды КАК ШтрихКоды
|ГДЕ
| ШтрихКоды.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", Текст);
Результат = Запрос.Выполнить();
Если Результат.Пустой() тогда
НовыйШтрихКод = Справочники.ШтрихКоды.СоздатьЭлемент();
НовыйШтрихКод.Наименование = Текст;
НовыйШтрихКод.Записать();
КонецЕсли;
Показать
3. Функция "УстанавливаемаяНоменклатура". Если есть условие в запросе, зачем еще делать проверку в коде? Ну и если запрос не вернул результата (неправильный ШК), то переменная "номенклатура" вообще не определена, чтоб ее возвращать.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихКоды.Ссылка,
| ШтрихКоды.Наименование,
| ШтрихКоды.Владелец
|ИЗ
| Справочник.ШтрихКоды КАК ШтрихКоды
|ГДЕ
| ШтрихКоды.Наименование = &ШтрихКод";
Запрос.УстановитьПараметр("ШтрихКод", ШтрихКод);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Владелец;
Иначе
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Показать
Так же эта функция дублирует частично функционал предыдущей. Это вроде и не ошибка, но от дублированных механизмов надо избавляться. В идеале эту функцию переименовать в "ПолучитьНоменклатуруПоШтрихКоду". А в функции "СоздатьШтрихкод" сделать Так:
Если ПолучитьНоменклатуруПоШтрихКоду (Текст) = Справочники.Номенклатура.ПустаяСсылка() тогда
НовыйШтрихКод = Справочники.ШтрихКоды.СоздатьЭлемент();
НовыйШтрихКод.Наименование = Текст;
НовыйШтрихКод.Записать();
КонецЕсли;
Показать
4. Функция "УстанавливаемыйШтрихКод". Вам интересно получить в виде строки "Неопределено"? Вот код:
Если ЗначениеЗаполнено(Номенклатура) Тогда
Возврат Номенклатура.ШтрихКод.Наименование;
Иначе
Возврат "";
КонецЕсли;
5. Функция "НайтиМенеджера". Уберите ее. Используйте параметр сеанса "ТекущийПользователь", который заполняется в модуле сеанса и содержит ссылку на справочник "Сотрудники" (хотя в идеале это должен быть справочник пользователей). Это влияет на скорость. Проще получать уже готовую ссылку, чем каждый раз пользоваться не оптимальной функцией "НайтиПоНаименованию".
6. Функция "НайтиЦену". Зачем левым соединением опять цеплять справочник? Можно доставать нужные реквизиты через ссылку. Вот текст запроса:
"ВЫБРАТЬ
| НоменклатураЦены.ВидЦены,
| НоменклатураЦены.Цена,
| НоменклатураЦены.Ссылка,
| НоменклатураЦены.Ссылка.ЗакупочнаяЦена
|ИЗ
| Справочник.Номенклатура.Цены КАК НоменклатураЦены
|ГДЕ
| НоменклатураЦены.Ссылка = &Ссылка
| И НоменклатураЦены.ВидЦены = &ВидЦены"
Показать
7. Функция "ПолучитьЦену". Если выборка пустая, то нехорошо заканчивать функцию без возврата. Спасибо 1С, что позаботилась о возврате "Неопределено". Но это нехорошо. Если есть ключевое слово "Возврат", то все, что написано после него уже не важно. Т.е команда "Прервать" уже не нужна. Если нужно только первое значение выборки, то используй такую конструкцию:
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи.Цена;
Иначе
Возврат 0;
КонецЕсли;
8. Функция "ПоискСерийника". зачем приводить ссылку к строке?
9. Управление печатью. Если переносите механизм, доведите до конца. Возможны исключения.
Пока все... Перейду к документам еще что-нибудь напишу.