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