Как добавить колонку "Единица для отчетов" в подбор товаров УТ 11 через расширение

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

При работе с конфигурацией Управление торговлей 11.4 программисты часто сталкиваются с задачей кастомизации формы подбора товаров. Одной из популярных задач является добавление дополнительных реквизитов, таких как ЕдиницаДляОтчетов, в список номенклатуры при оформлении заказа клиента. Однако стандартное добавление колонки в расширение через визуальный редактор конфигуратора часто не приносит результата: колонка просто не отображается в режиме "1С:Предприятие". Разберем подробно, почему так происходит и как правильно решить эту задачу.

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

Проанализируем архитектуру формы подбора товаров в УТ 11. Основная причина проблемы кроется в том, что обработка ПодборТоваровВДокументПродажи использует динамические списки, текст запроса которых формируется программно. Даже если мы изменим запрос в реквизите СписокНоменклатура внутри расширения, при запуске формы типовой код конфигурации выполнит процедуры, которые полностью пересоберут строку ТекстЗапроса, игнорируя наши правки в метаданных.

Основные манипуляции с текстом запроса происходят в общем модуле ПодборТоваровСервер. Система динамически подставляет поля в зависимости от включенных функциональных опций, выбранных фильтров и видов номенклатуры. Поэтому для стабильного результата нам потребуется вмешаться в процесс формирования формы и текста запроса программно.

Способ 1: Программное добавление элемента на форму

Рассмотрим наиболее надежный метод, который позволяет гарантированно вывести поле на форму. Мы будем использовать механизм расширений для перехвата события ПриСозданииНаСервере. Нам нужно вставить новый элемент управления (поле надписи) в иерархию элементов формы.

Для этого в расширении создадим обработчик &После для процедуры ПриСозданииНаСервере формы обработки ПодборТоваровВДокументПродажи:


&НаСервере
Процедура DWZ_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Определяем имя нового элемента и его тип
    ИмяЭлемента = "ЕдиницаДляОтчетов2";
    Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        
        // Вставляем новую колонку перед Артикулом в расширенном поиске
        Родитель = Элементы.СписокРасширенныйПоискНоменклатура;
        ЭлементСравнения = Элементы.СписокРасширенныйПоискНоменклатураАртикул;
        
        НовЭлемент = Элементы.Вставить(ИмяЭлемента, Тип("ПолеФормы"), Родитель, ЭлементСравнения);
        НовЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
        
        // Указываем путь к данным через Ссылку
        НовЭлемент.ПутьКДанным = "СписокНоменклатура.Ссылка.ЕдиницаДляОтчетов";
        НовЭлемент.Заголовок = "Единица отчетов";
        НовЭлемент.Видимость = Истина;
        
    КонецЕсли;

КонецПроцедуры

Важное пояснение: Использование пути к данным СписокНоменклатура.Ссылка.ЕдиницаДляОтчетов позволяет системе автоматически вытащить это поле через точку от ссылки. Это самый простой способ, который не требует сложной модификации самого текста запроса динамического списка, так как платформа 1С умеет разыменовывать поля ссылок в динамических списках автоматически.

Способ 2: Модификация текста запроса динамического списка

Если нам требуется не просто вывести реквизит, а обеспечить высокую производительность или использовать данные, которых нет в реквизитах ссылки (например, расчетные данные), нам придется модифицировать текст запроса. Как мы выяснили, текст запроса переопределяется в процедурах типа ИспользоватьФильтрыПриИзмененииНаСервере или ВидНоменклатурыПриИзмененииНаСервере.

Выясним причину, по которой изменения в конфигураторе затираются. Процедура ПодборТоваровСервер.ТекстЗапросаСпискаФормыПодбора собирает запрос из фрагментов. Чтобы добавить свое поле, мы можем использовать функцию СтрЗаменить в расширении модуля формы:


&НаСервере
Процедура МодифицироватьЗапросСписка()
    
    ТекстЗапроса = СписокНоменклатура.ТекстЗапроса;
    
    // Внедряем поле в секцию ВЫБРАТЬ
    ЧтоМеняем = "СправочникНоменклатура.Ссылка КАК Ссылка,";
    НаЧтоМеняем = "СправочникНоменклатура.Ссылка КАК Ссылка, СправочникНоменклатура.ЕдиницаДляОтчетов КАК ЕдиницаДляОтчетов,";
    
    СписокНоменклатура.ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоМеняем, НаЧтоМеняем);
    
КонецПроцедуры

Эту процедуру следует вызывать после всех типовых вызовов, которые могут изменить запрос. Проанализируем ситуацию: если мы добавим поле в текст запроса, нам также нужно убедиться, что реквизит ЕдиницаДляОтчетов добавлен в расширение в сам объект ДинамическийСписок (в список полей), иначе возникнет ошибка при выполнении запроса.

Дополнительные настройки для корректного отображения

Даже после внесения изменений в код, колонка может не появиться у конкретных пользователей. Разберем по шагам, что нужно проверить:

  1. Сброс настроек формы: 1С сохраняет пользовательские настройки (состав колонок, их ширину и видимость) в системных таблицах. Если пользователь ранее открывал форму подбора, его старые настройки "перекрывают" новые изменения из расширения. Нужно зайти в меню Еще - Установить стандартные настройки или Еще - Изменить форму - Установить стандартные настройки.
  2. Свойство "Использовать всегда": В конфигураторе для реквизита динамического списка ЕдиницаДляОтчетов необходимо установить флаг Использовать всегда. Это предотвратит оптимизацию платформы, при которой поля, не выведенные на форму визуально, исключаются из SQL-запроса.
  3. Функциональные опции: Убедимся, что в программе включена возможность использования единиц измерения для отчетов. Если функциональная опция выключена, поле может быть пустым вне зависимости от корректности кода.
  4. Права доступа: Проверьте, что в расширение добавлен не только реквизит, но и соответствующие роли или права на чтение этого поля для пользователей.

Резюме по реализации

Подведем итог. Для реализации задачи в УТ 11 наиболее стабильным является первый способ с программным созданием элемента формы. Рассмотрим подробнее последовательность действий:

  1. Создаем расширение (Адаптация).
  2. Добавляем в расширение обработку ПодборТоваровВДокументПродажи и её форму Форма.
  3. В модуле формы перехватываем ПриСозданииНаСервере.
  4. Используем метод Элементы.Вставить(...) для создания колонки.
  5. Привязываем её к данным через СписокНоменклатура.Ссылка.ЕдиницаДляОтчетов.

Такой подход гарантирует, что даже при обновлении конфигурации и изменении логики построения запроса в ПодборТоваровСервер, ваше поле будет отображаться, так как оно привязано к ссылке объекта, которая всегда присутствует в выборке подбора.

← На главную