В процессе работы с типовыми конфигурациями на базе 1С:ERP, такими как «1С:ERP Управление предприятием 2», «Комплексная автоматизация 2» или «Управление торговлей 11», программисты часто сталкиваются с трудноуловимыми ошибками в формах выбора. Одна из таких проблем — ошибка «Поле не найдено "Организация"», которая возникает при попытке активировать строку в списке номенклатуры. Ситуация осложняется тем, что ошибка может проявляться периодически и не всегда перехватывается отладчиком в обычном режиме.
В этой статье мы подробно разберем, почему возникает эта ошибка, как механизмы БСП (Библиотеки стандартных подсистем) влияют на работу динамических списков и какие шаги необходимо предпринять для окончательного устранения проблемы.
На первый взгляд кажется странным, что ошибка запроса происходит при простом перемещении курсора по списку. Однако в современных решениях 1С форма выбора номенклатуры — это сложный интерактивный инструмент. Рассмотрим основные причины:
ПриАктивацииСтроки. В этот момент система инициирует фоновый запрос для получения данных об остатках и ценах текущей номенклатуры. Если код, отвечающий за расчет остатков, пытается применить отбор по организации, которая была передана в форму, но не находит это поле в доступных полях компоновки данных, выполнение прерывается с ошибкой.Отбор параметров формы.Организация, но оно присутствует в параметрах выбора, возникает конфликт.Проанализируем, как форма получает данные. Когда мы открываем форму выбора из поля ввода, 1С передает структуру ПараметрыВыбора. Если в этой структуре присутствует «Организация», система будет пытаться наложить этот отбор на динамический список формы выбора.
Для проверки этой гипотезы нам необходимо найти процедуру ПриСозданииНаСервере в модуле формы выбора номенклатуры. Проверим содержимое параметров:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверим наличие организации в отборах, переданных извне
Если Параметры.Отбор.Свойство("Организация") Тогда
// Если поле "Организация" не предусмотрено в динамическом списке,
// это и будет причиной ошибки при выполнении запроса.
Сообщить("В форму передан отбор по организации: " + Параметры.Отбор.Организация);
КонецЕсли;
КонецПроцедуры
Если мы обнаружили, что отбор передается, но в самом запросе динамического списка поля Организация нет, у нас есть два пути: либо удалить этот отбор из параметров, либо добавить поле в запрос.
Самый надежный способ решить проблему — сделать поле Организация доступным для системы компоновки данных, даже если мы не планируем выводить его в таблицу. Разберем, как это сделать правильно:
Организация и установим для него флаг Использовать всегда.Установка флага Использовать всегда критически важна. Это гарантирует, что поле будет включено в SQL-запрос к базе данных, даже если пользователь скрыл соответствующую колонку в настройках формы. Именно отсутствие этого флага часто приводит к «периодическим» ошибкам, когда у одного пользователя все работает (колонка выведена), а у другого — нет.
Поскольку проблема часто носит индивидуальный характер, проанализируем влияние сохраненных настроек. 1С сохраняет состояние динамических списков (состав колонок, активные отборы) в системном хранилище настроек.
Если конфигурация обновлялась, а у пользователя остались старые настройки формы, в которых фигурирует несуществующее или переименованное поле, это вызовет ошибку «Поле не найдено». Выясним, как это исправить:
Это действие сбросит форму к «заводскому» виду, определенному в конфигураторе, и зачастую устраняет проблему без изменения кода.
Если мы понимаем, что в контексте выбора номенклатуры из ручных проводок отбор по организации нам не нужен или вреден (например, справочник номенклатуры общий для всех организаций), мы можем программно вмешаться в процесс инициализации формы. Рассмотрим пример кода в ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Удаляем отбор по организации, если он мешает работе списка
Если Параметры.Отбор.Свойство("Организация") Тогда
НовыйОтбор = Новый Структура;
Для Каждого ЭлементОтбора Из Параметры.Отбор Цикл
Если ЭлементОтбора.Ключ <> "Организация" Тогда
НовыйОтбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
КонецЕсли;
КонецЦикла;
// Перезаписываем отбор в параметрах
Параметры.Отбор = НовыйОтбор;
КонецЕсли;
КонецПроцедуры
Важный момент: если вы используете расширение конфигурации, этот код лучше разместить в методе &Перед("ПриСозданииНаСервере"), чтобы очистить структуру параметров до того, как основной код БСП начнет их обрабатывать и применять к динамическому списку.
Мы выяснили, что ошибка «Поле не найдено "Организация"» в форме выбора номенклатуры ERP — это следствие нестыковки между параметрами, передаваемыми при открытии формы, и структурой динамического списка. Для решения проблемы мы рекомендуем:
Организация в запросе динамического списка.Параметры.Отбор при создании формы на сервере.Соблюдение этих рекомендаций позволит сделать работу с подбором номенклатуры стабильной и избавит пользователей от внезапных завершений работы при активации строк в списке.