В процессе разработки на платформе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда стандартный метод НайтиПоНомеру внезапно возвращает пустую ссылку, хотя документ с таким номером точно существует в базе данных. Рассмотрим детально, почему так происходит, разберем механику работы платформы и выясним, как правильно организовать поиск документов, чтобы избежать досадных ошибок.
Для начала обратимся к синтакс-помощнику и проанализируем параметры метода НайтиПоНомеру для менеджера документов. Синтаксис выглядит следующим образом:
НайтиПоНомеру(<НомерДокумента>, <ДатаИнтервала>)
Здесь мы видим два параметра:
Строка или Число. Это непосредственно тот номер, который мы ищем. Важно помнить, что если в конфигураторе тип номера определен как строка, то поиск будет идти по точному строковому соответствию, включая все префиксы и лидирующие нули.Дата. Именно в этом параметре чаще всего кроется причина неудачного поиска. Он определяет момент времени (период), в рамках которого система будет осуществлять поиск.Если поиск завершился неудачно, метод возвращает пустую ссылку на документ соответствующего типа. Если же номер не был задан вовсе (пустая строка или ноль), метод вернет значение Неопределено.
Самая распространенная причина, по которой НайтиПоНомеру возвращает пустую ссылку — это установленная периодичность нумерации документа в Конфигураторе. В 1С документы могут иметь нумерацию в пределах года, квартала, месяца или дня. Это означает, что в базе данных может существовать несколько документов с номером "0000-000819", но в разных годах.
Проанализируем ситуацию: если в настройках документа ЗаказПоставщику стоит периодичность "В пределах года", то при вызове метода только с одним параметром:
// Опасный код, который может вернуть пустую ссылку
СсылкаНаДокумент = Документы.ЗаказПоставщику.НайтиПоНомеру("0000-000819");
Платформа подставляет во второй параметр пустую дату (01.01.0001). В итоге поиск производится в самом первом периоде истории. Естественно, документа за 2024 или 2025 год там нет, и система закономерно возвращает пустую ссылку.
Решение: Всегда передавайте дату, попадающую в нужный вам период. Например, если мы ищем документ за 2025 год, код должен выглядеть так:
НужнаяДата = '20250101'; // Начало года или любая дата внутри года
СсылкаНаДокумент = Документы.ЗаказПоставщику.НайтиПоНомеру("0000-000819", НужнаяДата);
Если СсылкаНаДокумент.Пустая() Тогда
Сообщить("Документ не найден в указанном периоде!");
КонецЕсли;
Вторая по частоте причина — несоответствие формата передаваемой строки формату номера в базе. В системе 1С тип номера "Строка" требует строгого соответствия. Рассмотрим важные моменты:
Число. Если тип — число, то лидирующие нули не учитываются, и передавать нужно именно числовое значение.Опытные разработчики стараются избегать метода НайтиПоНомеру в высоконагруженных участках кода или при массовой обработке данных. Рассмотрим, почему это считается признаком не самого качественного кода:
НайтиПоНомеру — это отдельный запрос к базе данных. Если вам нужно найти 500 документов, вы сделаете 500 обращений.Вместо использования стандартного метода, мы рекомендуем использовать объект Запрос. Это не только профессиональнее, но и гораздо надежнее. Рассмотрим пример, как найти документ по номеру и дате более эффективно:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПоставщику.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПоставщику КАК ЗаказПоставщику
|ГДЕ
| ЗаказПоставщику.Номер = &Номер
| И ЗаказПоставщику.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("Номер", "0000-000819");
Запрос.УстановитьПараметр("НачалоПериода", НачалоГода('20250101'));
Запрос.УстановитьПараметр("КонецПериода", КонецГода('20250101'));
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Здесь мы можем обработать все найденные документы,
// даже если их несколько с одинаковым номером
СсылкаНаДокумент = Выборка.Ссылка;
КонецЦикла;
КонецЕсли;
Чтобы метод НайтиПоНомеру работал корректно, всегда учитывайте следующие правила:
Запрос — это ускорит работу вашей программы и сделает код более прозрачным.Проанализировав эти аспекты, мы видим, что "баги платформы", на которые часто жалуются новички, обычно оказываются особенностями работы механизмов нумерации, которые важно знать и учитывать в своей работе.