В процессе разработки на платформе «1С:Предприятие 8» программисты, особенно начинающие, часто сталкиваются с ошибками, которые на первый взгляд кажутся необъяснимыми. Одной из таких классических проблем является ошибка «Метод объекта не обнаружен (Следуюший)». Несмотря на то что причина может крыться в простой опечатке, эта ситуация открывает важную тему для обсуждения: как наиболее эффективно работать с выборками данных и почему старые методы могут замедлять работу системы.
В этой статье мы подробно разберем, как исправить данную ошибку, проанализируем разницу между методом Выбрать() и использованием запросов, а также изучим правила работы с объектами выборки в коде.
Разберем ситуацию, представленную в исходном коде. Программист написал следующий фрагмент:
&НаСервере
Процедура ПечДокум()
ВыбДок = Документы.ЗаказКлиента.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
Пока ВыбДок.Следуюший() Цикл
Сообщить("Док = " + ВыбДок);
КонецЦикла;
КонецПроцедуры
При выполнении этого кода система выдает ошибку, сообщая, что метод не обнаружен. Проанализируем написание слова Следуюший(). Ошибка заключается в использовании буквы «ш» вместо «щ». В языке 1С названия встроенных методов строго фиксированы. Правильное написание метода для перехода к следующей записи в выборке — Следующий().
Стоит отметить, что подобные ошибки могут возникать и из-за использования символов латиницы, которые визуально неотличимы от кириллицы (например, буквы «с», «е», «а», «о»). Чтобы исключить влияние раскладки или опечаток, рекомендуется использовать механизм автоподстановки (Ctrl + Space) в конфигураторе 1С.
После исправления опечатки код станет работоспособным, но возникнет следующий вопрос: что именно выведет команда Сообщить()? Проанализируем ситуацию подробнее. Когда мы используем ВыбДок в цикле, переменная ВыбДок является объектом типа ДокументВыборка.ЗаказКлиента.
Если мы просто передаем выборку в функцию Сообщить(), система попытается привести объект к строке, что обычно возвращает представление документа (например, «Заказ клиента №001 от 01.01.2023»). Однако для надежной работы и обращения к конкретным данным (номеру, дате, контрагенту) необходимо обращаться к свойствам выборки. Рассмотрим правильный вариант вывода данных:
&НаСервере
Процедура ПечДокум()
ВыбДок = Документы.ЗаказКлиента.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
Пока ВыбДок.Следующий() Цикл
// Обращаемся к ссылке документа для получения точного представления
Сообщить("Обработан документ: " + ВыбДок.Ссылка);
КонецЦикла;
КонецПроцедуры
В профессиональной среде разработчиков 1С использование метода Выбрать() менеджера документа считается «дурным тоном», за исключением очень простых или специфических задач. Выясним причину этого ограничения.
Метод Выбрать() работает по принципу «чтения всего объекта». Когда вы вызываете ВыбДок.Следующий(), платформа считывает из базы данных абсолютно все реквизиты документа, включая все его табличные части (товары, услуги, налоги и так далее). Представим, что в базе за год накоплено 10 000 заказов клиентов, в каждом из которых по 50 строк товаров. Использование метода Выбрать() заставит сервер перекачать гигантский объем лишних данных только ради того, чтобы вы могли просто вывести номер документа в консоль.
Основные недостатки метода Выбрать():
Рассмотрим, как ту же задачу решить с помощью объекта Запрос. Это золотой стандарт разработки на платформе 1С. Запрос позволяет извлечь из базы только те поля, которые нам действительно нужны.
Проанализируем пример кода с использованием запроса:
&НаСервере
Процедура ПечДокумЧерезЗапрос()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказКлиента.Ссылка КАК Ссылка,
| ЗаказКлиента.Номер КАК Номер,
| ЗаказКлиента.Дата КАК Дата
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецГода(ТекущаяДата()));
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить("Документ №" + ВыборкаДетальныеЗаписи.Номер + " от " + Формат(ВыборкаДетальныеЗаписи.Дата, "ДФ=dd.MM.yyyy"));
КонецЦикла;
КонецПроцедуры
В данном примере мы явно указали поля Ссылка, Номер и Дата. Система проигнорирует табличные части и другие тяжелые реквизиты, что ускорит выполнение кода в десятки раз.
Чтобы избежать ошибок в будущем и писать качественный код, разберем несколько важных моментов:
Следующий() это Next(). Если у вас возникают проблемы с раскладкой, использование Next() может быть альтернативой, хотя в русскоязычной разработке это встречается реже.ТипЗнч(ВашаПеременная). В нашем случае отладчик показал бы, что объект имеет тип ДокументВыборка, и вы смогли бы увидеть список всех доступных методов этого объекта, убедившись, что «Следуюший» там отсутствует.&НаСервере. Работа с менеджерами документов и запросами напрямую возможна только на стороне сервера. Попытка выполнить такой код в процедуре с директивой &НаКлиенте приведет к ошибке «Переменная не определена (Документы)».Подведем итог нашему разбору. Ошибка автора темы была вызвана простой опечаткой в слове Следующий(). Однако, исправляя подобные ошибки, всегда стоит задумываться об архитектуре кода. Переход от использования метода Выбрать() к объекту Запрос — это важный шаг в профессиональном росте разработчика 1С, который позволяет создавать быстрые и отказоустойчивые системы.
Помните, что платформа 1С очень чувствительна к синтаксису, и использование встроенной проверки конфигурации (клавиша F7 или Ctrl+F7) поможет вам выявить подобные опечатки еще на этапе написания кода, до запуска программы пользователями.