При автоматизации автосервиса часто возникает задача: пользователь хочет изменить цены в Заказе-наряде перед печатью пакета документов, при этом не желая сохранять эти изменения в базе данных «навсегда». Разберем, как реализовать такую задачу профессионально, не нарушая целостность учетной системы.
Первое, что приходит на ум при такой постановке задачи — создать «копию» документа, изменить в ней цены, распечатать и удалить. Однако мы настоятельно рекомендуем отказаться от этого подхода. Рассмотрим, почему это опасно:
Вместо создания документов-объектов, давайте воспользуемся архитектурой Внешних печатных форм (ВПФ) или специализированной обработки. Суть заключается в передаче данных «на лету» в оперативную память.
Алгоритм работы выглядит следующим образом:
Заказ-наряд в форму вашей обработки.ПриСозданииНаСервере или при открытии обработки мы считываем данные из табличных частей Материалы и Услуги и помещаем их в ТаблицуЗначений на форме обработки.ТаблицейЗначений прямо в окне обработки. Все изменения происходят в оперативной памяти и не затрагивают реальный документ в базе данных.ТаблицыЗначений и передаем их в процедуру печати, которая заполняет Макет.Давайте посмотрим, как можно организовать структуру данных для заполнения нескольких печатных форм сразу. Мы можем использовать Структуру для передачи параметров в менеджер печати:
// Пример подготовки данных для печати
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить(\"ТаблицаМатериалов\", Объект.Материалы.Выгрузить());
ПараметрыПечати.Вставить(\"ТаблицаУслуг\", Объект.Услуги.Выгрузить());
ПараметрыПечати.Вставить(\"ДатаДокумента\", ТекущаяДата());
// После этого вызываем процедуру формирования печатной формы
ПечатнаяФорма = ПолучитьМакетДляПечати(ПараметрыПечати);
Чтобы реализовать выбор необходимых документов, добавьте на форму обработки СписокЗначений или Группу переключателей. Пользователь отмечает «Заказ-наряд», «Акт», «Счет-фактуру» и «Счет на оплату». В коде обработки вы просто последовательно вызываете функции формирования табличного документа для каждой выбранной позиции:
Процедура ПечатьНажатие(Кнопка)
Для Каждого Элемент Из СписокВыбораПечати Цикл
Если Элемент.Пометка Тогда
Если Элемент.Значение = \"ЗаказНаряд\" Тогда
СформироватьЗаказНаряд(ДанныеДляПечати);
ИначеЕсли Элемент.Значение = \"Акт\" Тогда
СформироватьАкт(ДанныеДляПечати);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если вы заметили, что пользователям постоянно требуется корректировать цены «на лету» перед печатью, это сигнал того, что в конфигурации 1С недостаточно гибко настроены Виды цен или механизмы Автоматических скидок. Возможно, вместо создания отдельной обработки стоит доработать форму самого Заказа-наряда, добавив туда колонку «Цена со скидкой» или «Ручная корректировка». Это позволит не переключаться между окнами и печатать документы стандартными средствами системы, что всегда является наиболее предпочтительным для пользователей вариантом.
Таким образом, мы реализовали задачу, обеспечив максимальную чистоту данных в базе, высокую скорость работы и удобство для пользователя, избежав при этом создания лишних объектов в системе.