Как добавить колонку Номенклатура в список документов Заявка покупателя

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

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

Анализ архитектуры решения

Прежде всего, разберем, почему нельзя просто «вытащить» номенклатуру из табличной части в запрос динамического списка. Табличная часть может содержать десятки строк. Если мы попытаемся соединить основную таблицу документов с таблицей запасов в динамическом списке, мы получим дублирование строк документа (по одной строке на каждую позицию номенклатуры), либо столкнемся с серьезным падением производительности при попытке программной агрегации строк в запросе.

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

Шаг 1: Создание реквизита в конфигураторе

Для начала нам необходимо добавить новое поле в структуру документа. Выполним следующие действия:

  1. Откроем конфигуратор и найдем документ ЗаказПокупателя.
  2. В ветке Реквизиты добавим новый реквизит. Назовем его с использованием префикса, чтобы избежать конфликтов при обновлении, например: прф_СписокНоменклатуры.
  3. Установим тип данных — Строка. Длину лучше выбрать неограниченную или достаточно большую (например, 1000 символов), чтобы названия позиций не обрезались слишком рано.

Важный совет: Использование префиксов (например, прф_ или изм_) — это признак хорошего тона в разработке 1С. Это позволит вам или другому программисту в будущем быстро отличить доработки от типовых реквизитов при обновлении конфигурации.

Шаг 2: Написание кода для заполнения реквизита

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

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


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Пропускаем выполнение, если идет загрузка данных (например, через обмен)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

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

Шаг 3: Настройка динамического списка на форме

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

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

Шаг 4: Обновление существующих данных

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

Использование расширений (рекомендуемый способ)

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

Возможные ошибки и способы их решения

Проанализируем ситуацию, если колонка все равно пустая:

  1. Точка останова: Поставьте точку останова в коде ПередЗаписью. Проверьте, заходит ли туда программа при нажатии кнопки «Записать».
  2. Проверка типа данных: Убедитесь, что реквизит прф_СписокНоменклатуры имеет тип «Строка». Если вы случайно выбрали «СправочникСсылка», данные не будут записываться.
  3. Тип операции: В УНФ документ «Заказ покупателя» может иметь разные виды операций (Заказ-наряд, Продажа). Убедитесь, что вы берете данные из правильной табличной части. Например, для заказ-нарядов данные могут лежать в таблице Работы, а для обычных заказов — в Запасы.

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

← На главную