При работе в 1С:Управление нашей фирмой (УНФ) менеджеры часто сталкиваются с необходимостью видеть состав заказа (номенклатуру, характеристики и количество) прямо в списке документов, не заходя в каждый отдельный заказ. В некоторых документах, таких как Заказ на производство, эта функция уже реализована типовыми средствами. Рассмотрим, как реализовать аналогичный функционал для документа Заказ покупателя (или Заявка покупателя).
Прежде всего, разберем, почему нельзя просто «вытащить» номенклатуру из табличной части в запрос динамического списка. Табличная часть может содержать десятки строк. Если мы попытаемся соединить основную таблицу документов с таблицей запасов в динамическом списке, мы получим дублирование строк документа (по одной строке на каждую позицию номенклатуры), либо столкнемся с серьезным падением производительности при попытке программной агрегации строк в запросе.
Оптимальным решением, которое используется в типовых конфигурациях 1С, является кэширование. Мы создаем специальный строковый реквизит в самом документе, который будет заполняться автоматически при записи. Именно этот реквизит мы и выведем в список.
Для начала нам необходимо добавить новое поле в структуру документа. Выполним следующие действия:
ЗаказПокупателя.прф_СписокНоменклатуры.Важный совет: Использование префиксов (например, прф_ или изм_) — это признак хорошего тона в разработке 1С. Это позволит вам или другому программисту в будущем быстро отличить доработки от типовых реквизитов при обновлении конфигурации.
Теперь нам нужно сделать так, чтобы при нажатии кнопки «Провести и закрыть» программа собирала все названия из таблицы «Запасы» и записывала их в наш новый реквизит. Рассмотрим реализацию в модуле объекта документа в процедуре ПередЗаписью.
Проанализируем ситуацию: нам нужно обойти табличную часть Запасы, учесть характеристики (если они используются) и количество. Вот пример кода, который решает эту задачу:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Пропускаем выполнение, если идет загрузка данных (например, через обмен)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
СписокСтрокой = "";
// Обходим табличную часть Запасы
Для Каждого СтрокаЗапасы Из Запасы Цикл
ПредставлениеПозиции = СокрЛП(СтрокаЗапасы.Номенклатура);
// Проверяем использование характеристик
Если ЗначениеЗаполнено(СтрокаЗапасы.Характеристика) Тогда
ПредставлениеПозиции = ПредставлениеПозиции + " (" + СокрЛП(СтрокаЗапасы.Характеристика) + ")";
КонецЕсли;
// Добавляем количество и единицу измерения
КоличествоСтр = Формат(СтрокаЗапасы.Количество, "ЧДЦ=2; ЧГ=0");
ПредставлениеПозиции = ПредставлениеПозиции + ", " + КоличествоСтр + " " + СокрЛП(СтрокаЗапасы.ЕдиницаИзмерения);
// Формируем общую строку с разделителем (точка с запятой и перенос строки)
СписокСтрокой = СписокСтрокой + ?(СписокСтрокой = "", "", "; " + Символы.ПС) + ПредставлениеПозиции;
// Контроль длины строки (необязательно, если тип неограничен, но полезно для интерфейса)
Если СтрДлина(СписокСтрокой) > 950 Тогда
СписокСтрокой = Лев(СписокСтрокой, 950) + "...";
Прервать;
КонецЕсли;
КонецЦикла;
// Записываем результат в наш реквизит
ЭтотОбъект.прф_СписокНоменклатуры = СписокСтрокой;
КонецПроцедуры
После того как данные начали сохраняться в документ, их нужно вывести на экран. Разберем, как изменить форму списка:
ЗаказПокупателя.Список (тип ДинамическийСписок).прф_СписокНоменклатуры в нужное место таблицы.Важно понимать, что после внесения изменений в старых документах колонка будет пустой. Код в процедуре ПередЗаписью сработает только тогда, когда документ будет перезаписан. Чтобы заполнить данные в уже созданных заказах, воспользуйтесь обработкой Групповое изменение реквизитов:
ПередЗаписью).Если вы не хотите менять типовую конфигурацию, чтобы не усложнять будущие обновления, выполните все те же действия через Расширение конфигурации. Рассмотрим преимущества этого метода:
&После("ПередЗаписью") для добавления программного кода.Проанализируем ситуацию, если колонка все равно пустая:
ПередЗаписью. Проверьте, заходит ли туда программа при нажатии кнопки «Записать».прф_СписокНоменклатуры имеет тип «Строка». Если вы случайно выбрали «СправочникСсылка», данные не будут записываться.Работы, а для обычных заказов — в Запасы.Таким образом, мы создали надежный и производительный механизм отображения состава заказа в списке. Этот метод позволяет менеджерам быстро ориентироваться в базе данных, не нагружая при этом сервер сложными запросами.