Как найти точку входа в код 1С и исправить ошибку «Поле не найдено» в динамическом списке?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

Часто при разработке или доработке конфигураций 1С возникает необходимость найти «точку входа» — место в программном коде, откуда вызывается открытие конкретной экранной формы (например, списка сотрудников). Проанализируем ситуацию, разберем по шагам доступные методы поиска и выясним причину частой сопутствующей ошибки «Поле не найдено», которая может возникать при открытии таких форм.

Способы поиска точки входа при открытии формы

Рассмотрим подробнее несколько эффективных способов найти место вызова формы или определить, какой код выполняется при ее открытии:

  1. Анализ окна «Все подсистемы». Откройте окно «Все подсистемы» в конфигураторе. Найдите нужную подсистему и посмотрите, какая команда выполняется при клике на раздел (например, на «Кадры\Сотрудники»). Нажмите правой кнопкой мыши на команде и выберите «Найти в дереве». Вы увидите, что по команде «Сотрудники» открывается стандартная ФормаСписка справочника.
  2. Проверка событий формы. Сама команда открытия часто генерируется платформой автоматически на основе метаданных (стандартная команда списка). В таком случае искать «внешний» вызов бессмысленно. Перейдите в модуль открываемой формы и проверьте обработчики событий ПриОткрытии и ПриСозданииНаСервере. Именно они являются точками входа для логики, выполняемой при инициализации.
  3. Использование Замера производительности. Если вызов неочевиден, включите в конфигураторе Замер производительности, перейдите в режим предприятия, выполните действие (откройте форму), и сразу выключите замер. Платформа покажет вам весь стек выполненного кода за этот промежуток времени.

Почему отладчик не останавливается на ошибке при открытии формы?

Представим, что мы нашли форму, но при ее открытии выводится сообщение: Ошибка при выполнении запроса. по причине: Поле не найдено "ТекущаяДолжностьПоШтатномуРасписанию". При этом отладчик не останавливается на строке с ошибкой, а запуск в режиме толстого клиента не предлагает открыть конфигуратор.

Выясним причину. Ошибки, связанные с фразой «Поле не найдено», в 90% случаев относятся не к строкам программного кода (модулям), а к запросам динамических списков. Платформа 1С выполняет эти запросы «под капотом» для отображения данных на форме. Если в запросе динамического списка (или в его настройках) есть ссылка на удаленный реквизит, 1С выдаст ошибку конфигурации, но не покажет строку кода, так как падает сам механизм компоновки данных.

Решение проблемы в динамическом списке

Разберем по шагам, как локализовать и устранить такую ошибку:

  1. Откройте проблемную форму (например, ФормаСписка справочника Сотрудники) в конфигураторе.
  2. Перейдите на вкладку Реквизиты и найдите основной реквизит формы с типом ДинамическийСписок (обычно он называется Список).
  3. Нажмите правой кнопкой мыши на этот реквизит, выберите Свойства и в строке Настройка списка нажмите «Открыть».
  4. В открывшемся окне вы увидите текст запроса динамического списка. Поищите в нем проблемное поле (в нашем случае ТекущаяДолжностьПоШтатномуРасписанию).

Часто в текстах запросов динамических списков можно встретить фигурные скобки. Посмотрим на пример:


ВЫБРАТЬ
    СправочникСотрудники.Ссылка,
    СправочникСотрудники.Наименование,
    РегистрСведенийКадры.ТекущаяДолжностьПоШтатномуРасписанию
ИЗ
    Справочник.Сотрудники КАК СправочникСотрудники
    {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК РегистрСведенийКадры
    ПО СправочникСотрудники.Ссылка = РегистрСведенийКадры.Сотрудник}

Что означают фигурные скобки { } в запросе?
Это синтаксис расширения языка запросов для Системы Компоновки Данных (СКД). Внутри них описываются необязательные конструкции (поля, отборы, параметры). Если пользователь не вывел колонку на форму и не задал по ней отбор, платформа динамически вырежет этот кусок кода для оптимизации.

Почему удаление поля из запроса не всегда помогает?

Проанализируем ситуацию: вы нашли устаревшее поле в запросе (например, после обновления ERP с версии 2.2 на 2.4 разработчики 1С изменили структуру регистров), удалили его из текста, но ошибка все равно появляется. На это есть несколько скрытых причин:

Альтернативный способ отладки: Остановка по ошибке

Если визуальный поиск не дает результатов, воспользуемся мощным инструментом конфигуратора. Включите режим Остановка по ошибке (в меню Отладка -> Остановка по ошибке...). Поставьте галочку на остановку при любых исключениях.

В этом режиме платформа остановит выполнение программы ровно за долю секунды до того, как сгенерируется ошибка «Поле не найдено», даже если это происходит глубоко в платформенных вызовах или при программной модификации отборов динамического списка (например, в типовых процедурах вроде УдалитьЭлементыГруппыОтбораДинамическогоСписка). Это позволит вам проанализировать стек вызовов и понять, какой именно код пытается обратиться к несуществующему ресурсу.

← На главную