Как правильно реализовать печать документов из заказа-наряда с изменением цен?

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

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

Почему создание временных документов — это плохая практика

Первое, что приходит на ум при такой постановке задачи — создать «копию» документа, изменить в ней цены, распечатать и удалить. Однако мы настоятельно рекомендуем отказаться от этого подхода. Рассмотрим, почему это опасно:

  1. Риск нарушения целостности данных: Если в системе настроена автоматическая нумерация или другие механизмы, временный документ может успеть «зацепить» порядковый номер или создать записи в регистрах, которые потом будет крайне сложно очистить.
  2. Проблемы производительности: Постоянное создание и удаление объектов вызывает фрагментацию таблиц базы данных. В SQL-версиях 1С это со временем приводит к замедлению работы всей системы.
  3. Засорение журнала регистрации: Вы получите огромный объем «мусорных» записей, что сделает аудит действий реальных пользователей практически невозможным.

Реализация через обработку: архитектурно верный путь

Вместо создания документов-объектов, давайте воспользуемся архитектурой Внешних печатных форм (ВПФ) или специализированной обработки. Суть заключается в передаче данных «на лету» в оперативную память.

Алгоритм работы выглядит следующим образом:

  1. Вызов обработки: Вы передаете ссылку на документ Заказ-наряд в форму вашей обработки.
  2. Заполнение данных: В процедуре ПриСозданииНаСервере или при открытии обработки мы считываем данные из табличных частей Материалы и Услуги и помещаем их в ТаблицуЗначений на форме обработки.
  3. Редактирование: Пользователь работает с ТаблицейЗначений прямо в окне обработки. Все изменения происходят в оперативной памяти и не затрагивают реальный документ в базе данных.
  4. Печать: При нажатии на кнопку печати мы берем измененные данные из ТаблицыЗначений и передаем их в процедуру печати, которая заполняет Макет.

Пример передачи данных для печати

Давайте посмотрим, как можно организовать структуру данных для заполнения нескольких печатных форм сразу. Мы можем использовать Структуру для передачи параметров в менеджер печати:


// Пример подготовки данных для печати
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить(\"ТаблицаМатериалов\", Объект.Материалы.Выгрузить());
ПараметрыПечати.Вставить(\"ТаблицаУслуг\", Объект.Услуги.Выгрузить());
ПараметрыПечати.Вставить(\"ДатаДокумента\", ТекущаяДата());

// После этого вызываем процедуру формирования печатной формы
ПечатнаяФорма = ПолучитьМакетДляПечати(ПараметрыПечати);

Как реализовать вывод нескольких форм

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


Процедура ПечатьНажатие(Кнопка)
    Для Каждого Элемент Из СписокВыбораПечати Цикл
        Если Элемент.Пометка Тогда
            Если Элемент.Значение = \"ЗаказНаряд\" Тогда
                СформироватьЗаказНаряд(ДанныеДляПечати);
            ИначеЕсли Элемент.Значение = \"Акт\" Тогда
                СформироватьАкт(ДанныеДляПечати);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Рекомендация по бизнес-процессу

Если вы заметили, что пользователям постоянно требуется корректировать цены «на лету» перед печатью, это сигнал того, что в конфигурации 1С недостаточно гибко настроены Виды цен или механизмы Автоматических скидок. Возможно, вместо создания отдельной обработки стоит доработать форму самого Заказа-наряда, добавив туда колонку «Цена со скидкой» или «Ручная корректировка». Это позволит не переключаться между окнами и печатать документы стандартными средствами системы, что всегда является наиболее предпочтительным для пользователей вариантом.

Таким образом, мы реализовали задачу, обеспечив максимальную чистоту данных в базе, высокую скорость работы и удобство для пользователя, избежав при этом создания лишних объектов в системе.

← На главную