Как добавить столбец «Производитель (FA)» в табличную часть документа Реализация товаров и услуг

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

В работе с конфигурацией 1С:Управление торговлей 11.1 пользователи часто сталкиваются с необходимостью отображения специфических данных в документах продажи. Одной из таких задач является вывод производителя товара непосредственно в список реализуемых позиций. Однако стандартный механизм Изменить форму часто не видит нужное поле, особенно если оно имеет пометку (FA).

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

Выясняем причину: почему поле отсутствует в списке доступных полей

Прежде всего, проанализируем ситуацию, почему при нажатии кнопки Еще — Изменить форму и переходе к группе Номенклатура мы не видим поля Производитель (FA). В платформе 1С данные в формах могут отображаться только в том случае, если они являются прямыми реквизитами объекта или связаны с ним простой ссылочной связью.

Суффикс (FA) в названии поля практически однозначно указывает на то, что это дополнительный реквизит, созданный пользователем или добавленный внешней обработкой. Дополнительные реквизиты в 1С хранятся не в самой таблице справочника Номенклатура, а в специальной подчиненной таблице (табличной части ДополнительныеРеквизиты). Механизм Изменить форму «не умеет» самостоятельно нырять в подчиненные таблицы и извлекать оттуда конкретные значения для каждой строки документа. Именно поэтому поле доступно внутри карточки номенклатуры, но «невидимо» для настройки колонок в реализации.

Проверка типа реквизита в системе

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

  1. Перейдем в раздел Администрирование.
  2. Выберем пункт Общие настройки.
  3. Откроем ссылку Дополнительные реквизиты и сведения.
  4. В появившемся списке найдем справочник Номенклатура.
  5. Проверим наличие элемента с наименованием Производитель (FA).

Если мы нашли его там, значит, подтвердилось: это дополнительный реквизит, и вывести его стандартными средствами настройки интерфейса в таблицу товаров не получится.

Решение проблемы через создание расширения конфигурации

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

Шаг 1. Создание расширения и добавление формы

Создадим новое расширение, назовем его, например, ДоработкаРеализации. В это расширение нам нужно добавить документ РеализацияТоваровУслуг и его форму ФормаДокумента.

Шаг 2. Добавление колонки в форму

В редакторе формы расширения найдем таблицу Товары. Добавим в нее новый элемент — Поле формы с типом Поле надписи или Поле ввода (только для чтения). Назовем его ТоварыПроизводительFA. Важно: это поле не будет связано с данными документа напрямую, мы будем заполнять его программно.

Шаг 3. Программное заполнение данных

Для того чтобы значения отображались при открытии документа и при изменении номенклатуры, нам нужно написать код в модуле формы. Разберем пример кода для процедуры ПриЧтенииНаСервере или ПриСозданииНаСервере. Нам нужно получить значения доп. реквизитов для всех товаров в документе одним запросом, чтобы не нагружать систему.


&НаСервере
Процедура ЗаполнитьПроизводителяВТаблице()
    
    // Подготовим массив ссылок на номенклатуру из табличной части
    МассивНоменклатуры = Объект.Товары.ВыгрузитьКолонку("Номенклатура");
    
    // Создадим запрос к таблице дополнительных реквизитов
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	НоменклатураДополнительныеРеквизиты.Ссылка КАК Номенклатура,
    |	НоменклатураДополнительныеРеквизиты.Значение КАК ЗначениеПроизводителя
    |ИЗ
    |	Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    |ГДЕ
    |	НоменклатураДополнительныеРеквизиты.Ссылка В(&МассивНоменклатуры)
    |	И НоменклатураДополнительныеРеквизиты.Свойство.Заголовок = ""Производитель (FA)""";
    
    Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    // Заполним созданную нами колонку в форме
    Для Каждого СтрокаТовара Из Объект.Товары Цикл
        НайденнаяСтрока = РезультатЗапроса.Найти(СтрокаТовара.Номенклатура, "Номенклатура");
        Если НайденнаяСтрока <> Неопределено Тогда
            // Предположим, мы создали реквизит в ТЧ на форме с именем "ПроизводительПредставление"
            СтрокаТовара.ПроизводительПредставление = НайденнаяСтрока.ЗначениеПроизводителя;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Обновление данных при выборе товара

Недостаточно просто заполнить данные при открытии. Если пользователь добавит новый товар или изменит существующий, колонка должна обновиться мгновенно. Для этого проанализируем событие ТоварыНоменклатураПриИзменении.

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


&НаСервере
Функция ПолучитьПроизводителяДляНоменклатуры(ТекущаяНоменклатура)
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	НоменклатураДополнительныеРеквизиты.Значение
    |ИЗ
    |	Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    |ГДЕ
    |	НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура
    |	И НоменклатураДополнительныеРеквизиты.Свойство.Заголовок = ""Производитель (FA)""";
    
    Запрос.УстановитьПараметр("Номенклатура", ТекущаяНоменклатура);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Значение;
    КонецЕсли;
    
    Возврат "";
КонецФункции

&НаКлиенте
Процедура Расш1_ТоварыНоменклатураПриИзмененииПосле(Элемент)
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока.ПроизводительПредставление = ПолучитьПроизводителяДляНоменклатуры(ТекущаяСтрока.Номенклатура);
    КонецЕсли;
КонецПроцедуры

Альтернативный вариант: Использование окна «Подбор»

Если внесение изменений в конфигурацию по каким-то причинам невозможно или нежелательно, рассмотрим ситуацию, когда производитель нужен только для визуального контроля в момент выбора товара. В документе Реализация товаров и услуг есть кнопка Подбор.

Окно подбора в УТ 11.1 работает на основе динамических списков. В нем гораздо проще настроить отображение дополнительных реквизитов:

  1. В окне подбора нажмите Еще — Настроить список.
  2. Перейдите на закладку Поля.
  3. Найдите в списке доступных полей Номенклатура, раскройте ее и найдите раздел дополнительных реквизитов.
  4. Установите флажок напротив Производитель (FA).

После этого в окне подбора появится колонка с производителем, и менеджер сможет видеть его при формировании заказа. Однако стоит помнить, что в саму таблицу документа после переноса товаров эта колонка не попадет без программирования.

Важные замечания по производительности

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

Рекомендуем:

Таким образом, мы выяснили, что отсутствие поля связано с архитектурой хранения дополнительных данных в 1С. Для решения задачи требуется либо настройка окна подбора (как временная мера), либо создание небольшого расширения для программного вывода колонки.

← На главную