1с найтипономеру не работает

Подводный камень метода документа НайтиПоНомеру

Думаю, многим из вас знаком метод документа НайтиПоНомеру. Казалось бы, что там интересного может быть. Однако, как показал недавний случай из моей практики и такие, давно существующие методы могут преподнести сюрпризы.

Метод имеет 2 параметра НомерДокумента и ДатаИнтервала. Передаешь в метод эти параметры, возвращается ссылка на найденный документ, либо Неопределено, если он не найден.

Подводный камень кроется в разрядности номера документа. Если вы передаете в качестве параметра номер, длина которого больше разрядности документа в системе, то метод обрезает лишние правые символы и ищет документ по этому обрезанному номеру. И если документ с таким номером существует, то он возвращает ссылку на него.

Проблема в том, что такое поведение метода имеет неявный характер. В документации эти особенности не отражены.

Разрядность документа в системе задана 11 символами. Передаем по ошибке номер ВН0000000307. 12 разрядов. Метод обрезает номер до 11 разрядов. Получается ВН000000030. Документ с таким номером существует в системе и метод возвращает ссылку на него. Естественно, все дальнейшие действия выполняются не с тем документом, который мы искали.

С моей точки зрения такое поведение метода является не корректным. Более правильным было бы, либо выдать ошибку о том, что длина номера не соответствует заданному в системе, либо поиск документа по полному номеру, пусть даже и превышающему разрядность, в этом случае документ не будет найден, и метод вернет Неопределено.

Если вы используете этот метод, не забывайте добавлять проверку на разрядность.

Читайте также:  Не работает 4 цилиндр змз 406 карбюраторный

Тестирование проведено на платформе 8.3.11.289.

Источник

Документ: НайтиПоНомеру

Документы.РеализацияТоваровИУслуг.НайтиПоНомеру(Номер)
или
Документы[ВидДока].НайтиПоНомеру(Номер)

. и вопрос: а почему не воспользоваться СП?

Это из Синтакс-Помошника:

Вариант синтаксиса: Для документов с непериодической нумерацией
Синтаксис:
НайтиПоНомеру( )
Параметры:
(обязательный)
Тип: Число, Строка. Номер искомого документа. Тип передаваемого значения зависит от установки в конфигураторе представления номера документа.
Вариант синтаксиса: Для документов с нумерацией в пределах периода
Синтаксис:
НайтиПоНомеру( , )
Параметры:
(обязательный)
Тип: Число, Строка. Номер искомого документа. Тип передаваемого значения зависит от установки в конфигураторе представления номера документа.
(обязательный)
Тип: Дата. Дата из интервала, в котором проводится поиск по номеру. Сам интервал определяется как период уникальности номеров документа, в который входит указанная дата. Например, если номера документов уникальны в пределах месяца и задана дата 10 декабря 2001 года, то поиск будет проводиться в интервале с 01 по 31 декабря 2001 года.
Возвращаемое значение:
Тип: ДокументСсылка. . Ссылка на найденный документ. Если документ не найден, возвращается пустая ссылка на документ.
Описание:
Осуществляет поиск документа по номеру. Для документов с нумерацией в пределах периода поиск осуществляется в указанном периоде.

Источник

Поиск документа по номеру

1С 8.1 УТ ред. 10.3.3.3.
Есть документ ЗаказПокупателя с номером 00000000001, который записан базе MySQL.

iID1C=oRecordset.Fields(«1c_id»).Value;
message(iID1C); //00000000001
aaa=Документы.ЗаказПокупателя.НайтиПоНомеру(iID1C);
message(«!»+aaa.Номер+»!»); //! !

Не находится документ по номеру.
aaa=Документы.ЗаказПокупателя.НайтиПоНомеру(«00000000001»); //тоже не пашет

В чем может быть проблема?

(1) По идее, дату я и не должен указывать, я же хочу найти документ по номеру, не касаясь временных рамок.
(2) не пашет
(3) номера идут ровные, в базу пишу текстом.

Со справочниками все нормально работает, а с документами косяк.

(4).1 Читаем до просветления.

НайтиПоНомеру (FindByNumber)
Синтаксис:
НайтиПоНомеру( , )
Параметры:
(обязательный)
Тип: Число, Строка. Номер искомого документа. Тип передаваемого значения зависит от установки в конфигураторе представления номера документа.
(необязательный)
Тип: Дата. Дата из интервала, в котором проводится поиск по номеру. Сам интервал определяется как период уникальности номеров документа, в который входит указанная дата. Например, если номера документов уникальны в пределах месяца и задана дата 10 декабря 2001 года, то поиск будет проводиться в интервале с 01 по 31 декабря 2001 года.
Параметр используется для документов с периодической нумерацией.

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

Поставил дату:
Документ нашелся. Жесть.

Если параметр Дата=ТекущаяДата(), то всегда ли найдется документ по номеру?
Если нет, то как сделать, чтобы документ всегда находился по номеру?

Источник

.NET и 1С V82.COMConnector ошибка при вызове .ПолучитьОбъект

Добрый день,
возникла следующая проблема.

Имеется модуль с простыми функциями типа отметить документ на удаление по номеру или провести документ по номеру.

Функция ПометитьРасходнаяНакладная(Номер, ПометкаУдаление, ПометкаПроведение) Экспорт
Попытка
документ = Документы.РасходнаяНакладная.НайтиПоНомеру(Номер).ПолучитьОбъект();
ПометитьДокумент(документ, ПометкаУдаление, ПометкаПроведение);
Возврат «ok»;
Исключение
Инфо = ИнформацияОбОшибке();
Возврат «Описание='» + Инфо.Описание + «‘»;
КонецПопытки
КонецФункции

Функция ПометитьДокумент(Документ, ПометкаУдаление, ПометкаПроведение)
Документ.УстановитьПометкуУдаления(ПометкаУдаление);
Если ПометкаПроведение
Тогда
Документ.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Документ.Проведен = Ложь;
Документ.Записать();
КонецЕсли
КонецФункции

Проблема с методом .ПолучитьОбъект() — при вызове функции ПометитьРасходнаяНакладная через COM из .NET приложения вылетает исключение, которое не перехватывается в теле функции ПометитьРасходнаяНакладная и более того некорректно сериализуется. То есть на стороне .NET приходит объект Exception с указателями-null’ами, не несущий никакой информации.

Что интересно:
— если эти функции вызываются непосредственно из 1С, то все прекрасно работает.
— если изменить тип документа с РасходнаяНакладная на некоторый другой, то все выполняется корректно. Есть еще как минимум один тип, для которого это также не работает. Заметить отличия этих типов документов от других, с которыми все ок, не удалось
— гарантируется, что сам вызов через COM осуществляется, если убрать проблемный вызов .ПолучитьОбъект(), то вызов отрабатывает корректно
-COM соединение выполняется под тем же аккаунтом, под которым функция корректно работает при выполнении через 1С:Предприятие
-другие методы типа .ПолучитьФорму() этой же ссылки работают корректно

Итого: непонятная ошибка, которая не ловится try\catch и возникает при вызове метода .ПолучитьОбъект на ссылках документа типа РасходнаяНакладная при соединении через COM.

.NET код:
var connection = GetConnection();
var msg = connection.ПроведениеДокументов.ПометитьРасходнаяНакладная(docNumber, true, false);

Могу выложить код GetConnection() если необхдимо

Источник

помогите найтиПоНаименованию

столкнулс с тем что в обычной базе метод, найти по наименованию работет , но это же база в sql метод «найтиПоНаименованию» уже не работает ,не могу понять как так может быт ? вот контрукция ?

физ=Справочники.ФизическиеЛица.НайтиПоНаименованию(фио,Истина) ;
Если Физ<>Справочники.ФизическиеЛица.ПустаяСсылка() Тогда

(8) Да ну
Возвращаемое значение:

Тип: СправочникСсылка. ; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.

(35) ТЫ ЧИТАТЬ УМЕЕШЬ.
или ты писатель.
НайтиПоНаименованию (FindByDescription)
Синтаксис:

Тип: Строка.
Определяет режим поиска по полному соответствию.
Поиск будет успешным, если строка поиска: в случае значения параметра Ложь — будет соответствовать левой части наименования; в случае значения параметра Истина — будет полностью совпадать с наименованием (за исключением «хвостовых» пробелов в наименовании).
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Возвращаемое значение:

Тип: СправочникСсылка. ; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.
Описание:

Осуществляет поиск элемента по его наименованию.

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Если существует несколько элементов с указанным наименованием, то будет найден только один из них.

Источник

Оцените статью