Как изменить цены в документе поступления на процент в 1С:Управление торговлей 11?

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

При переходе со старых конфигураций (например, 1С:Управление торговлей 10.3) на современные решения на управляемых формах (УТ 11, Комплексная автоматизация 2, ERP 2) пользователи часто сталкиваются с отсутствием привычных инструментов. Одним из таких разочарований становится отсутствие стандартной кнопки «Изменить» в табличной части документов поступления (в современных версиях документ называется «Приобретение товаров и услуг»). Раньше эта кнопка позволяла в два клика увеличить или уменьшить цены во всех строках на заданный процент.

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

Способ 1. Использование встроенного механизма «Загрузка из внешнего файла»

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

Рассмотрим по шагам, как быстро изменить цены с его помощью:

  1. Откроем документ «Приобретение товаров и услуг» и перейдем на вкладку «Товары».
  2. Выделим всю табличную часть или скопируем ключевые колонки (Номенклатура, Количество, Цена) в Excel.
  3. В Excel с помощью стандартной формулы умножим цену на нужный процент. Например, для увеличения цены на 10% используем формулу вида =A1 * 1.10. Протянем формулу на все строки.
  4. В документе 1С нажмем кнопку Заполнить и выберем пункт Загрузить из внешнего файла.
  5. В открывшееся окно помощника вставим скопированные из Excel обновленные данные (достаточно колонок с номенклатурой, количеством и новой ценой).
  6. Нажмем кнопку Перенести в документ.

Преимущество метода: программа автоматически сопоставит номенклатуру по штрихкоду, артикулу или наименованию, перенесет новые цены и запустит штатные алгоритмы пересчета сумм, НДС и итогов. Это полностью исключает проблему «расхождения на копейки».

Способ 2. Использование подчиненных типов цен номенклатуры поставщика

Если поставщик регулярно предоставляет скидку или делает наценку в виде фиксированного процента, можно настроить автоматический расчет цен через справочники конфигурации:

  1. Перейдем в настройки соглашения с поставщиком или в карточку партнера и создадим базовый тип цен (например, «Базовые цены поставщика»).
  2. Создадим второй тип цен — расчетный (подчиненный). В его настройках укажем способ расчета: наценка на базовый тип цен на определенный процент.
  3. При оформлении документа поступления достаточно выбрать расчетный тип цен. Программа автоматически пересчитает все позиции на заданный процент.

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

Способ 3. Программный метод: разработка внешней обработки заполнения ТЧ

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

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


// НЕПРАВИЛЬНЫЙ ПОДХОД
Для Каждого Строка Из Объект.Товары Цикл
    Строка.Цена = Строка.Цена + (Строка.Цена / 100 * ПроцентИзменения);
КонецЦикла;
Объект.Записать();

В чем опасность такого кода? В современных конфигурациях 1С логика документа жестко завязана на клиентские события формы. Если просто изменить реквизит Цена на сервере в объекте базы данных, то зависимые реквизиты (Сумма, СуммаНДС, Всего) останутся старыми. Документ либо запишется с некорректными суммами, либо выдаст ошибку при проведении.

Чтобы выполнить пересчет корректно, необходимо использовать функции стандартной библиотеки БСП и встроенные механизмы конфигурации. В УТ 11 за это отвечает общий модуль ОбработкаТабличнойЧастиСервер.

Выясним, как правильно написать процедуру пересчета на сервере во внешней обработке заполнения табличной части:


&НаСервере
Процедура ИзменитьЦеныНаПроцентНаСервере(ДанныеФормы, ПроцентИзменения)
    
    // Шаг 1. Обходим коллекцию строк формы и меняем непосредственно цену
    Для Каждого Строка Из ДанныеФормы.Товары Цикл
        Строка.Цена = Строка.Цена * (1 + ПроцентИзменения / 100);
    КонецЦикла;
    
    // Шаг 2. Формируем структуру действий для вызова стандартного пересчета
    СтруктураДействий = Новый Структура;
    СтруктураДействий.Вставить("ПересчитатьСумму", Истина);
    СтруктураДействий.Вставить("ПересчитатьСуммуНДС", Истина);
    СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", Истина);
    
    // Шаг 3. Вызываем типовой обработчик табличной части конфигурации УТ 11
    ОбработкаТабличнойЧастиСервер.ОбработатьТЧ(ДанныеФормы.Товары, СтруктураДействий, Неопределено);
    
КонецПроцедуры

Рассмотрим подробнее логику работы этого серверного метода:

Для интеграции этого алгоритма во внешнюю обработку заполнения ТЧ (БСП) на клиенте используем следующий код вызова:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ВладелецФормы) Экспорт
    
    // Получаем доступ к данным формы документа-владельца
    ДанныеФормы = ВладелецФормы.Объект;
    
    // Здесь можно вызвать интерактивный ввод числа у пользователя
    Оповещение = Новый ОписаниеОповещения("ПослеВводаПроцента", ЭтотОбъект, ВладелецФормы);
    ПоказатьВводЧисла(Оповещение, 0, "Укажите процент изменения цен (например, 10 или -15):");
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВводаПроцента(ЗначениеЧисла, ДополнительныеПараметры) Экспорт
    
    Если ЗначениеЧисла = Неопределено Или ЗначениеЧисла = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ВладелецФормы = ДополнительныеПараметры;
    
    // Вызываем серверный метод пересчета
    ИзменитьЦеныНаПроцентНаСервере(ВладелецФормы.Объект, ЗначениеЧисла);
    
    // Оповещаем форму о том, что данные были изменены
    ВладелецФормы.Модифицированность = Истина;
    
КонецПроцедуры

Использование связки клиентского ввода и серверного пересчета через стандартные модули конфигурации гарантирует стабильную работу системы, отсутствие блокировок базы данных и корректное формирование проводок при последующем проведении измененного документа приобретения.

← На главную