← Назад к вопросам

Доработка документа Накладная

2.3 Middle🔥 231 комментариев
#Стандарты разработки#Формы и интерфейс

Условие

В тестовой конфигурации доработайте документ "Накладная".

Требования:

  1. При создании документа подставлять "Расход" в реквизит "Вид операции"
  2. При выборе вида операции подставлять тип цен:
    • Приход → Закупочная
    • Расход → Продажная
  3. При выборе номенклатуры автоматически заполнять цену и коэффициент
  4. Пересчёт суммы по формуле: Сумма = Количество × Цена × Коэффициент
  5. Автопересчёт при изменении номенклатуры, количества, коэффициента, вида операции
  6. Кнопка печати простой формы
  7. Отображение итогов в колонке "Сумма"

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Часть 1: Обработчик при создании документа

// В модуле формы документа "Накладная"

&НаСервере
Процедура ПриСоздаленииНаСервере(Отмена, СтандартнаяОбработка)
    // Заполняем вид операции по умолчанию
    Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход;
    
    // Устанавливаем тип цен при выборе вида операции
    УстановитьТипЦенПоВидуОперации();
КонецПроцедуры

Процедура УстановитьТипЦенПоВидуОперации()
    Если Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Приход Тогда
        Объект.ТипЦен = ПолучитьТипЦен("Закупочная");
    ИначеЕсли Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход Тогда
        Объект.ТипЦен = ПолучитьТипЦен("Продажная");
    КонецЕсли;
КонецПроцедуры

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

Часть 2: Обработчик изменения вида операции

&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
    УстановитьТипЦенПоВидуОперацииНаКлиенте();
    
    // Пересчитываем все строки таблицы
    Для Каждого Строка Из Объект.Товары Цикл
        ПересчитатьЦенуДляТипа(Строка);
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьТипЦенПоВидуОперацииНаКлиенте()
    Если Объект.ВидОперации = ПредопределённоеЗначение("Перечисление.ВидыОперацийНакладной.Приход") Тогда
        ПолучитьТипЦенНаСервере("Закупочная");
    ИначеЕсли Объект.ВидОперации = ПредопределённоеЗначение("Перечисление.ВидыОперацийНакладной.Расход") Тогда
        ПолучитьТипЦенНаСервере("Продажная");
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПолучитьТипЦенНаСервере(Наименование)
    Объект.ТипЦен = ПолучитьТипЦен(Наименование);
КонецПроцедуры

Часть 3: Обработчик выбора номенклатуры в таблице

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    Текущая = Элементы.Товары.ТекущаяСтрока;
    Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
    
    ЗаполнитьЦенуИКоэффициент(Строка);
    ПересчитатьСумму(Строка);
КонецПроцедуры

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

Часть 4: Автопересчёт сумм

&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    Текущая = Элементы.Товары.ТекущаяСтрока;
    Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
    ПересчитатьСумму(Строка);
КонецПроцедуры

&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    Текущая = Элементы.Товары.ТекущаяСтрока;
    Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
    ПересчитатьСумму(Строка);
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоэффициентПриИзменении(Элемент)
    Текущая = Элементы.Товары.ТекущаяСтрока;
    Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
    ПересчитатьСумму(Строка);
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьСумму(Строка)
    // Формула: Сумма = Количество × Цена × Коэффициент
    Строка.Сумма = Строка.Количество * Строка.Цена * Строка.Коэффициент;
    
    // Пересчитываем итог
    ПересчитатьИтоги();
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьИтоги()
    ОбщаяСумма = 0;
    
    Для Каждого Строка Из Объект.Товары Цикл
        ОбщаяСумма = ОбщаяСумма + Строка.Сумма;
    КонецЦикла;
    
    // Предполагаем реквизит "ОбщаяСумма" в документе
    Объект.ОбщаяСумма = ОбщаяСумма;
КонецПроцедуры

Часть 5: Кнопка печати

// На форме добавляем командную кнопку
&НаКлиенте
Процедура КомандаПечатьНажатие(Кнопка)
    ПечатьДокумента();
КонецПроцедуры

&НаСервере
Процедура ПечатьДокумента()
    Макет = ПолучитьМакет("МакетПечатиНакладной");
    ТабДок = Новый ТабличныйДокумент();
    ТабДок = Макет.ПолучитьОбласть("Заголовок");
    
    // Заполняем данные
    Область = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ТабДок.Добавить(Область);
    
    Для Каждого Строка Из Объект.Товары Цикл
        Область = Макет.ПолучитьОбласть("СтрокаТовара");
        Область.Параметры.Номенклатура = Строка.Номенклатура;
        Область.Параметры.Количество = Строка.Количество;
        Область.Параметры.Цена = Строка.Цена;
        Область.Параметры.Сумма = Строка.Сумма;
        ТабДок.Добавить(Область);
    КонецЦикла;
    
    Область = Макет.ПолучитьОбласть("Итого");
    Область.Параметры.ОбщаяСумма = Объект.ОбщаяСумма;
    ТабДок.Добавить(Область);
    
    // Печатаем
    ТабДок.Показать();
КонецПроцедуры

Ключевые моменты решения:

Инициализация при создании:

  • Устанавливаем вид операции по умолчанию (Расход)
  • Подставляем соответствующий тип цен

Зависимые реквизиты:

  • ВидОперации определяет ТипЦен
  • Номенклатура определяет Цену и Коэффициент
  • Цена, Количество, Коэффициент определяют Сумму

Обработчики событий:

  • Срабатывают при изменении полей
  • Клиентские (&НаКлиенте) для быстрого пересчёта
  • Серверные (&НаСервере) для запросов к данным

Автопересчёт:

  • При любом изменении влияющих полей
  • Пересчитываются суммы в строках
  • Пересчитывается общий итог

Печать:

  • Используется макет формы
  • Заполняются параметры из данных
  • Выводится в табличный документ

Типы цен:

  • Закупочная для приходных операций
  • Продажная для расходных операций
  • Берутся из срезов сведений по дате