Подводный камень метода документа НайтиПоНомеру
Думаю, многим из вас знаком метод документа НайтиПоНомеру. Казалось бы, что там интересного может быть. Однако, как показал недавний случай из моей практики и такие, давно существующие методы могут преподнести сюрпризы.
Метод имеет 2 параметра НомерДокумента и ДатаИнтервала. Передаешь в метод эти параметры, возвращается ссылка на найденный документ, либо Неопределено, если он не найден.
Подводный камень кроется в разрядности номера документа. Если вы передаете в качестве параметра номер, длина которого больше разрядности документа в системе, то метод обрезает лишние правые символы и ищет документ по этому обрезанному номеру. И если документ с таким номером существует, то он возвращает ссылку на него.
Проблема в том, что такое поведение метода имеет неявный характер. В документации эти особенности не отражены.
Разрядность документа в системе задана 11 символами. Передаем по ошибке номер ВН0000000307. 12 разрядов. Метод обрезает номер до 11 разрядов. Получается ВН000000030. Документ с таким номером существует в системе и метод возвращает ссылку на него. Естественно, все дальнейшие действия выполняются не с тем документом, который мы искали.
С моей точки зрения такое поведение метода является не корректным. Более правильным было бы, либо выдать ошибку о том, что длина номера не соответствует заданному в системе, либо поиск документа по полному номеру, пусть даже и превышающему разрядность, в этом случае документ не будет найден, и метод вернет Неопределено.
Если вы используете этот метод, не забывайте добавлять проверку на разрядность.
Тестирование проведено на платформе 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) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.
Описание:
Осуществляет поиск элемента по его наименованию.
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Если существует несколько элементов с указанным наименованием, то будет найден только один из них.
Источник