Как в 1С:УНФ добавить колонку в заказ покупателя и настроить расчет итогов только по подтвержденным товарам

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

При переходе на 1С:УНФ с других систем (например, CRM-систем для ритейла) часто возникает потребность адаптировать документ ЗаказПокупателя под привычный бизнес-процесс. Одной из типовых задач является добавление статуса для каждой строки товара (например, "Подтвержден", "Нет в наличии") и настройка системы так, чтобы итоговая сумма заказа и последующие документы (накладные, счета) учитывали только подтвержденные позиции.

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

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

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

Расширение позволяет хранить все ваши доработки в отдельном слое. При обновлении основной конфигурации расширение просто "накладывается" сверху. Поэтому мы будем использовать именно этот механизм.

Шаг 1. Добавление реквизита в табличную часть через расширение

Многие разработчики сталкиваются с проблемой: реквизит в расширении добавлен, но в режиме "1С:Предприятие" колонка не отображается. Разберем по шагам, как сделать это правильно:

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

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

Шаг 2. Расчет итоговой суммы только по подтвержденным товарам

Стандартный механизм 1С считает итог по всей колонке Всего. Нам же нужно, чтобы в подвале документа отображалась сумма только тех строк, где статус установлен в значение "Подтвержден". Проанализируем, как это реализовать.

Типовой итог в подвале формы — это часто путь к данным Объект.Запасы.ИтогСумма. Нам придется заменить это на программный расчет. Для этого создадим процедуру пересчета в модуле формы расширения:


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

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

Шаг 3. Фильтрация данных при вводе на основании

Выясним, как передать в РасходнуюНакладную или СчетНаОплату только те позиции, которые мы подтвердили в заказе. Весь механизм создания документов на основании сосредоточен в процедуре ОбработкаЗаполнения модуля объекта создаваемого документа.

Рассмотрим пример для документа РасходнаяНакладная. Нам нужно подключиться к методу ОбработкаЗаполнения через расширение с аннотацией &После или &Вместо:


&После("ОбработкаЗаполнения")
Процедура Расшир_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        // Проанализируем таблицу Запасы, которая уже заполнилась типовым механизмом
        МассивСтрокНаУдаление = Новый Массив;
        Для Каждого СтрокаТЧ Из ЭтотОбъект.Запасы Цикл
            // Проверяем статус в исходном документе
            // Обратите внимание: статус нужно искать в ТЧ исходного заказа
            // через поиск соответствия строк или обращение к данным заполнения
            Если СтрокаТЧ.ЗаказПокупателя.Запасы.Найти(СтрокаТЧ.НомерСтроки).СтатусСтроки <> "Подтвержден" Тогда
                МассивСтрокНаУдаление.Добавить(СтрокаТЧ);
            КонецЕсли;
        КонецЦикла;
        
        Для Каждого СтрокаДляУдаления Из МассивСтрокНаУдаление Цикл
            ЭтотОбъект.Запасы.Удалить(СтрокаДляУдаления);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

Опасные моменты: почему не стоит создавать "вторую табличную часть"

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

Поэтому правильный путь — расширение существующей табличной части. Современные версии платформы 8.3 позволяют это делать без каких-либо костылей.

Заключение

Мы проанализировали ситуацию и выяснили, что для решения задачи лучше всего подходит создание расширения с добавлением реквизита в типовую ТЧ Запасы. Мы рассмотрели методы программного пересчета итогов на форме и способ фильтрации строк при создании документов на основании. Следуя этим рекомендациям, вы получите надежное решение, которое не "сломается" при очередном обновлении 1С:УНФ.

← На главную