← Назад к вопросам
Доработка документа Накладная
2.3 Middle🔥 231 комментариев
#Стандарты разработки#Формы и интерфейс
Условие
В тестовой конфигурации доработайте документ "Накладная".
Требования:
- При создании документа подставлять "Расход" в реквизит "Вид операции"
- При выборе вида операции подставлять тип цен:
- Приход → Закупочная
- Расход → Продажная
- При выборе номенклатуры автоматически заполнять цену и коэффициент
- Пересчёт суммы по формуле: Сумма = Количество × Цена × Коэффициент
- Автопересчёт при изменении номенклатуры, количества, коэффициента, вида операции
- Кнопка печати простой формы
- Отображение итогов в колонке "Сумма"
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Часть 1: Обработчик при создании документа
// В модуле формы документа "Накладная"
&НаСервере
Процедура ПриСоздаленииНаСервере(Отмена, СтандартнаяОбработка)
// Заполняем вид операции по умолчанию
Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход;
// Устанавливаем тип цен при выборе вида операции
УстановитьТипЦенПоВидуОперации();
КонецПроцедуры
Процедура УстановитьТипЦенПоВидуОперации()
Если Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Приход Тогда
Объект.ТипЦен = ПолучитьТипЦен("Закупочная");
ИначеЕсли Объект.ВидОперации = Перечисления.ВидыОперацийНакладной.Расход Тогда
Объект.ТипЦен = ПолучитьТипЦен("Продажная");
КонецЕсли;
КонецПроцедуры
Функция ПолучитьТипЦен(Наименование)
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ТипыЦен ГДЕ Наименование = @Наименование";
Результат = Запрос.Выполнить();
Если Результат.Пусто() Тогда Возврат Неопределено; КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
Часть 2: Обработчик изменения вида операции
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
УстановитьТипЦенПоВидуОперацииНаКлиенте();
// Пересчитываем все строки таблицы
Для Каждого Строка Из Объект.Товары Цикл
ПересчитатьЦенуДляТипа(Строка);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьТипЦенПоВидуОперацииНаКлиенте()
Если Объект.ВидОперации = ПредопределённоеЗначение("Перечисление.ВидыОперацийНакладной.Приход") Тогда
ПолучитьТипЦенНаСервере("Закупочная");
ИначеЕсли Объект.ВидОперации = ПредопределённоеЗначение("Перечисление.ВидыОперацийНакладной.Расход") Тогда
ПолучитьТипЦенНаСервере("Продажная");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьТипЦенНаСервере(Наименование)
Объект.ТипЦен = ПолучитьТипЦен(Наименование);
КонецПроцедуры
Часть 3: Обработчик выбора номенклатуры в таблице
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Текущая = Элементы.Товары.ТекущаяСтрока;
Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
ЗаполнитьЦенуИКоэффициент(Строка);
ПересчитатьСумму(Строка);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьЦенуИКоэффициент(Строка)
// Получаем цену для выбранной номенклатуры
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("Номенклатура", Строка.Номенклатура);
Запрос.УстановитьПараметр("ТипЦен", Объект.ТипЦен);
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.Текст =
"""ВЫБРАТЬ
Цены.Цена,
Цены.Коэффициент
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
@Дата,
Номенклатура = @Номенклатура И ТипЦен = @ТипЦен
) КАС Цены
""";
Результат = Запрос.Выполнить();
Если НЕ Результат.Пусто() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Строка.Цена = Выборка.Цена;
Строка.Коэффициент = Выборка.Коэффициент;
Иначе
Строка.Цена = 0;
Строка.Коэффициент = 1;
КонецЕсли;
КонецПроцедуры
Часть 4: Автопересчёт сумм
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
Текущая = Элементы.Товары.ТекущаяСтрока;
Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
ПересчитатьСумму(Строка);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
Текущая = Элементы.Товары.ТекущаяСтрока;
Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
ПересчитатьСумму(Строка);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоэффициентПриИзменении(Элемент)
Текущая = Элементы.Товары.ТекущаяСтрока;
Строка = Объект.Товары.НайтиПоИдентификатору(Текущая);
ПересчитатьСумму(Строка);
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьСумму(Строка)
// Формула: Сумма = Количество × Цена × Коэффициент
Строка.Сумма = Строка.Количество * Строка.Цена * Строка.Коэффициент;
// Пересчитываем итог
ПересчитатьИтоги();
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьИтоги()
ОбщаяСумма = 0;
Для Каждого Строка Из Объект.Товары Цикл
ОбщаяСумма = ОбщаяСумма + Строка.Сумма;
КонецЦикла;
// Предполагаем реквизит "ОбщаяСумма" в документе
Объект.ОбщаяСумма = ОбщаяСумма;
КонецПроцедуры
Часть 5: Кнопка печати
// На форме добавляем командную кнопку
&НаКлиенте
Процедура КомандаПечатьНажатие(Кнопка)
ПечатьДокумента();
КонецПроцедуры
&НаСервере
Процедура ПечатьДокумента()
Макет = ПолучитьМакет("МакетПечатиНакладной");
ТабДок = Новый ТабличныйДокумент();
ТабДок = Макет.ПолучитьОбласть("Заголовок");
// Заполняем данные
Область = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
ТабДок.Добавить(Область);
Для Каждого Строка Из Объект.Товары Цикл
Область = Макет.ПолучитьОбласть("СтрокаТовара");
Область.Параметры.Номенклатура = Строка.Номенклатура;
Область.Параметры.Количество = Строка.Количество;
Область.Параметры.Цена = Строка.Цена;
Область.Параметры.Сумма = Строка.Сумма;
ТабДок.Добавить(Область);
КонецЦикла;
Область = Макет.ПолучитьОбласть("Итого");
Область.Параметры.ОбщаяСумма = Объект.ОбщаяСумма;
ТабДок.Добавить(Область);
// Печатаем
ТабДок.Показать();
КонецПроцедуры
Ключевые моменты решения:
Инициализация при создании:
- Устанавливаем вид операции по умолчанию (Расход)
- Подставляем соответствующий тип цен
Зависимые реквизиты:
- ВидОперации определяет ТипЦен
- Номенклатура определяет Цену и Коэффициент
- Цена, Количество, Коэффициент определяют Сумму
Обработчики событий:
- Срабатывают при изменении полей
- Клиентские (&НаКлиенте) для быстрого пересчёта
- Серверные (&НаСервере) для запросов к данным
Автопересчёт:
- При любом изменении влияющих полей
- Пересчитываются суммы в строках
- Пересчитывается общий итог
Печать:
- Используется макет формы
- Заполняются параметры из данных
- Выводится в табличный документ
Типы цен:
- Закупочная для приходных операций
- Продажная для расходных операций
- Берутся из срезов сведений по дате