В работе с конфигурацией 1С:Управление торговлей 11.1 пользователи часто сталкиваются с необходимостью отображения специфических данных в документах продажи. Одной из таких задач является вывод производителя товара непосредственно в список реализуемых позиций. Однако стандартный механизм Изменить форму часто не видит нужное поле, особенно если оно имеет пометку (FA).
В этой статье мы подробно разберем, почему это происходит, как определить природу данного поля и какими способами можно вывести эти данные в документ Реализация товаров и услуг на вкладку Товары.
Прежде всего, проанализируем ситуацию, почему при нажатии кнопки Еще — Изменить форму и переходе к группе Номенклатура мы не видим поля Производитель (FA). В платформе 1С данные в формах могут отображаться только в том случае, если они являются прямыми реквизитами объекта или связаны с ним простой ссылочной связью.
Суффикс (FA) в названии поля практически однозначно указывает на то, что это дополнительный реквизит, созданный пользователем или добавленный внешней обработкой. Дополнительные реквизиты в 1С хранятся не в самой таблице справочника Номенклатура, а в специальной подчиненной таблице (табличной части ДополнительныеРеквизиты). Механизм Изменить форму «не умеет» самостоятельно нырять в подчиненные таблицы и извлекать оттуда конкретные значения для каждой строки документа. Именно поэтому поле доступно внутри карточки номенклатуры, но «невидимо» для настройки колонок в реализации.
Перед тем как приступать к программным действиям, нам необходимо убедиться, что реквизит действительно является дополнительным. Рассмотрим, как это сделать:
Номенклатура.Производитель (FA).Если мы нашли его там, значит, подтвердилось: это дополнительный реквизит, и вывести его стандартными средствами настройки интерфейса в таблицу товаров не получится.
Наиболее правильным и современным методом решения задачи является использование расширений (если версия вашей платформы 8.3.6 и выше). Это позволит не снимать основную конфигурацию с поддержки и сохранит возможность легкого обновления. Рассмотрим этот процесс по шагам.
Шаг 1. Создание расширения и добавление формы
Создадим новое расширение, назовем его, например, ДоработкаРеализации. В это расширение нам нужно добавить документ РеализацияТоваровУслуг и его форму ФормаДокумента.
Шаг 2. Добавление колонки в форму
В редакторе формы расширения найдем таблицу Товары. Добавим в нее новый элемент — Поле формы с типом Поле надписи или Поле ввода (только для чтения). Назовем его ТоварыПроизводительFA. Важно: это поле не будет связано с данными документа напрямую, мы будем заполнять его программно.
Шаг 3. Программное заполнение данных
Для того чтобы значения отображались при открытии документа и при изменении номенклатуры, нам нужно написать код в модуле формы. Разберем пример кода для процедуры ПриЧтенииНаСервере или ПриСозданииНаСервере. Нам нужно получить значения доп. реквизитов для всех товаров в документе одним запросом, чтобы не нагружать систему.
&НаСервере
Процедура ЗаполнитьПроизводителяВТаблице()
// Подготовим массив ссылок на номенклатуру из табличной части
МассивНоменклатуры = Объект.Товары.ВыгрузитьКолонку("Номенклатура");
// Создадим запрос к таблице дополнительных реквизитов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Ссылка КАК Номенклатура,
| НоменклатураДополнительныеРеквизиты.Значение КАК ЗначениеПроизводителя
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка В(&МассивНоменклатуры)
| И НоменклатураДополнительныеРеквизиты.Свойство.Заголовок = ""Производитель (FA)""";
Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Заполним созданную нами колонку в форме
Для Каждого СтрокаТовара Из Объект.Товары Цикл
НайденнаяСтрока = РезультатЗапроса.Найти(СтрокаТовара.Номенклатура, "Номенклатура");
Если НайденнаяСтрока <> Неопределено Тогда
// Предположим, мы создали реквизит в ТЧ на форме с именем "ПроизводительПредставление"
СтрокаТовара.ПроизводительПредставление = НайденнаяСтрока.ЗначениеПроизводителя;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Недостаточно просто заполнить данные при открытии. Если пользователь добавит новый товар или изменит существующий, колонка должна обновиться мгновенно. Для этого проанализируем событие ТоварыНоменклатураПриИзменении.
В расширении для этого события нужно создать обработчик (после основного кода), который будет вызывать функцию получения производителя для конкретной выбранной ссылки Номенклатура.
&НаСервере
Функция ПолучитьПроизводителяДляНоменклатуры(ТекущаяНоменклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Значение
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &Номенклатура
| И НоменклатураДополнительныеРеквизиты.Свойство.Заголовок = ""Производитель (FA)""";
Запрос.УстановитьПараметр("Номенклатура", ТекущаяНоменклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Значение;
КонецЕсли;
Возврат "";
КонецФункции
&НаКлиенте
Процедура Расш1_ТоварыНоменклатураПриИзмененииПосле(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
ТекущаяСтрока.ПроизводительПредставление = ПолучитьПроизводителяДляНоменклатуры(ТекущаяСтрока.Номенклатура);
КонецЕсли;
КонецПроцедуры
Если внесение изменений в конфигурацию по каким-то причинам невозможно или нежелательно, рассмотрим ситуацию, когда производитель нужен только для визуального контроля в момент выбора товара. В документе Реализация товаров и услуг есть кнопка Подбор.
Окно подбора в УТ 11.1 работает на основе динамических списков. В нем гораздо проще настроить отображение дополнительных реквизитов:
Номенклатура, раскройте ее и найдите раздел дополнительных реквизитов.Производитель (FA).После этого в окне подбора появится колонка с производителем, и менеджер сможет видеть его при формировании заказа. Однако стоит помнить, что в саму таблицу документа после переноса товаров эта колонка не попадет без программирования.
При реализации программного вывода данных крайне важно избегать выполнения запросов внутри цикла. Если в реализации 500 строк, и вы для каждой строки будете выполнять отдельный запрос к базе данных, открытие документа может занять значительное время.
Рекомендуем:
Производитель (FA) используется очень часто во многих отчетах и формах, стоит рассмотреть возможность переноса его из «Дополнительных реквизитов» в «родные» реквизиты справочника Номенклатура через изменение метаданных в конфигураторе. Это упростит доступ к данным и ускорит работу системы.Таким образом, мы выяснили, что отсутствие поля связано с архитектурой хранения дополнительных данных в 1С. Для решения задачи требуется либо настройка окна подбора (как временная мера), либо создание небольшого расширения для программного вывода колонки.