Black Friday: Cashback 35% при покупке 1С лицензий на счет INFOSTART.RU

Транзакционная печать на примере БП3 и УТ10

Публикация № 685797

Разработка - Практика программирования

печать транзакции

1
Рассмотрим недостатки типовой подсистемы печати и один из вариантов её обхода – запись в транзакции модифицированного объекта, его печать и откат назад в исходное состояние на примерах для БП3 и УТ10.

Недостатки типовой подсистемы печати

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

 

Очень жаль, что методисты из 1С не могут придумать рациональные и удобные подходы и алгоритмы к печати.

 

Основные недостатки подсистемы печати:

  1. В БП3 (и прочих конфигурациях на УФ) система почему-то заточена на быстродействие. Хотя любой принтер печатает медленнее, чем формируется форма. Зачем собирать несколько объектов в одном запросе, непонятно. Ведь код печати одного объекта был бы намного проще.
    Зачем эти сэкономленные миллисекунды исполнения, когда за ними стоят долгие часы разбирательств программистов в полученных сложных запросах?
    Подстановка в макеты используется перебором объекта ВыборкаИзРезультатаЗаброса, а его изменить нельзя, т.е. если нужно поставить небольшую заплатку, заменив типовое значение на свое, не получится, приходится чрезмерно усложнять код.
  2. В УТ10 нет единой точки в процедуру печати объекта, соответственно, если стоит задача перехватывать любую печать любого документа, не получится.

Транзакционная печать в БП3

Была поставлена задача – каждая строчка накладной реализации могла быть разбита на поставки несколькими машинами.

 

Соответственно, требовались печатные формы как по всей накладной, так и по отдельным машинам.

 

 

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

 

Вот образцы полученных печатных форм.

 

Вся накладная, 20 брусов:

Первая машина, 18 брусов:

Вторая машина, 2 бруса (с маслом тут ошибка, потом она была исправлена):

 

Чтобы максимально эффективно достичь результата, нужно вставить заплатку в блок, который вызывается всегда при печати.

 

Дело в том, что печать реализации в БП3 может происходить в менеджере документа и в обработках типа «Печать ТТН».

 

В модуль УправлениеПечатьюСлужебныйКлиент в процедуру ВыполнитьПодключаемуюКомандуПечатиЗавершение, перед выполнением команды печати вставить код, определяющий, нужно использовать транзакционную печать или нет:

   

//ИЗМ Осипов 2016-03-20 ТранзакционнаяПечать чтобы выбрать текущую машину при печати накладной +
    Попытка
        ОписаниеКоманды.ДополнительныеПараметры.Вставить("ТекущаяМашина", ДополнительныеПараметры.Форма._ТекущаяМашина);
    Исключение
    КонецПопытки;
    //ИЗМ Осипов 2016-03-20 чтобы выбрать текущую машину при печати накладной -


…
Обработчик = ИмяОбработчика + "(ОписаниеКоманды)";
    Результат = Вычислить(Обработчик);

В процедуре СформироватьПечатныеФормы модуля УправлениеПечатью добавить в самом начале:

   

 //ИЗМ Осипов 2016-03-30 ТранзакционнаяПечать меняем объекты, соответственно номеру машины +
    Если ПараметрыПечати.Свойство("_ТекущаяМашина") И ПараметрыПечати._ТекущаяМашина <> 0 Тогда
        НачатьТранзакцию();
        Для Каждого Элемент Из МассивОбъектов Цикл
            Если ТипЗнч(Элемент) = Тип("ДокументСсылка._ЗаявкаПокупателя") Тогда
                ДО = Элемент.ПолучитьОбъект();
                Если ИмяМенеджераПечати = "Обработка.ПечатьТТН" Тогда
                    ДО.Номер = "66666666";
                КонецЕсли;
                _ДопСервер.ОбработатьДокументЗаявкиПокупателяДляПечати(ДО, ПараметрыПечати._ТекущаяМашина);
                ДО.ОбменДанными.Загрузка = истина;
                ДО.Записать();
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    //ИЗМ Осипов 2016-03-30 ТранзакционнаяПечать меняем объекты, соответственно номеру машины -

И в самом конце этого модуля, перед возвратом результата, код по откату транзакции:

   

//ИЗМ Осипов Откатываем 2016-03-20 ТранзакционнаяПечать +
    Если ПараметрыПечати.Свойство("_ТекущаяМашина") И ПараметрыПечати._ТекущаяМашина <> 0 Тогда
        ОтменитьТранзакцию();
        Сч = 0;
        Для Каждого ТекПечатнаяФорма ИЗ КоллекцияПечатныхФорм Цикл
            Сч = СЧ + 1;
            Если Сч > ОбъектыПечати.Количество() Тогда Продолжить; КонецЕсли;
            ТекОбъект = ОбъектыПечати[Сч - 1];

            ПравильныйНомер = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(ТекОбъект.Значение.Номер, Истина, Ложь);
            ПравильныйНомер = ПравильныйНомер + "/" + ПараметрыПечати._ТекущаяМашина;

            ТекОбласть = ТекПечатнаяФорма.ТабличныйДокумент.НайтиТекст("66666666", , , );
            Если ТекОбласть <> Неопределено Тогда
                ТекОбласть.Текст = ПравильныйНомер;
            КонецЕсли;

        КонецЦикла;

    КонецЕсли;
    //ИЗМ Осипов 2016-03-20 ТранзакционнаяПечать -

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

 

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

Функция ОбработатьДокументЗаявкиПокупателяДляПечати(ДО, НомерМашины) Экспорт
    Всего = ДО.Товары.Количество();
    Для Инд = 1 ПО Всего Цикл
        Строка = ДО.Товары[Всего-Инд];
        ИскСтрокиМашин = ДО._Машины.НайтиСтроки(Новый Структура("_КлючСтроки", Строка._КлючСтроки));
        ОбщееКоличествоПоМашинам = 0;
        РезКоличество = 0;
        Для Каждого ИскСтрокаМашин ИЗ ИскСтрокиМашин Цикл
            ОбщееКоличествоПоМашинам = ОбщееКоличествоПоМашинам + ИскСтрокаМашин.Количество;
            Если ИскСтрокаМашин.НомерМашины = НомерМашины Тогда
                РезКоличество = ИскСтрокаМашин.Количество;
            КонецЕсли;
        КонецЦикла;
        //Если по машинам не распределено
        Если ОбщееКоличествоПоМашинам = 0 Тогда
            РезКоличество = Строка.Количество;
        КонецЕсли;
        ИсходноеКоличество = Строка.Количество;
        Строка.Количество = РезКоличество;
        Если Строка.Количество = 0 ИЛИ ИсходноеКоличество = 0 Тогда
        Иначе
            //Делим суммы пропорционально количеству
            Строка.Сумма = Строка.Сумма * Строка.Количество / ИсходноеКоличество;
            Строка.СуммаНДС = Строка.СуммаНДС * Строка.Количество / ИсходноеКоличество;
        КонецЕсли;

    КонецЦикла;
КонецФункции

Обратите внимание, как обработана замена номера, чтобы печатался номер машины через слэш.

Транзакционная печать в УТ10

В УТ10 мне понадобилась транзакционная печать в других целях. Заказчик поставил задачу заменять при печати наименование товара во всех торговых документах. Если бы это происходило всегда, можно было бы поменять полное наименование, но нужно было чтобы старые документы перепечатывались бы без изменения.

 

Соответственно, перед печатью документа нужно изменять наименование товара:

Функция НужнаТранзакционнаяПечать(Объект)Экспорт
    //Осипов 2016-03-24 Замена наименования... +++
    Если Объект.Дата >= '20160323' И НЕ Объект.Модифицированность() Тогда
        ТранзакцияОткрыта = ложь;
        ТекСсылка = Объект.Ссылка;
        Если ТипЗнч(ТекСсылка) = Тип("ДокументСсылка.СчетФактураВыданный")  Тогда
            ТекСсылка = ТекСсылка.ДокументОснование;
        КонецЕсли;      Если ТекСсылка.Метаданные().ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
            Маркер = "Палка "; ДлинаМаркера = СтрДлина(Маркер);
            НовыйМаркер = "Палка для коррекции ";
            ДлинаНовогоМаркера = СтрДлина(НовыйМаркер);
            Для Каждого ТекСтрока Из ТекСсылка.Товары Цикл
                ТекНаименование = ТекСтрока.Номенклатура.НаименованиеПолное;
                Если
                    Лев(ТекНаименование, ДлинаМаркера) = Маркер И
                    Лев(ТекНаименование, ДлинаНовогоМаркера) <> НовыйМаркер
                Тогда
                    Если НЕ ТранзакцияОткрыта Тогда
                        НачатьТранзакцию();
                        ТранзакцияОткрыта = истина;
                    КонецЕсли;
                    О = ТекСтрока.Номенклатура.ПолучитьОбъект();
                    О.НаименованиеПолное = СтрЗаменить(О.НаименованиеПолное, Маркер, НовыйМаркер);
                    О.ОбменДанными.Загрузка = истина;
                    О.Записать();;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
    //Осипов 2016-03-24 Замена наименования... --

    Возврат ТранзакцияОткрыта;
КонецФункции

 

Осталось выяснить, где вставить вызов этой процедуры.

Печать происходит методами Объект.Печать и НапечататьВнешнююФорму.

Эти методы вызываются в модуле УниверсальныеМеханизмы в двух  местах - в процедуре ОткрытьФормуВыбораПечатныхФормОбъекта и ПечатьПоДополнительнойКнопке. Да, программистам 1С не хватило ума вынести одинаковый код в отдельную функцию, мы наблюдаем обычный копи-паст.

 

Если ... Тогда
    ТабДокумент = НапечататьВнешнююФорму(Объект.Ссылка, Расшифровка);
    НапечататьДокумент(ТабДокумент,  ....);
Иначе
    Объект.Печать(...);
КонецЕсли;

 

В процедуре печати учтено, что объект может быть модифицирован, тогда он не печатается.

 

В случае ошибки может долго висеть предупреждение, и транзакция будет открыта, это недостатки решения, но такое бывает редко. В УФ отказались от модальности, такое не грозит.

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

 

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

 

Вот как вставлять вызов процедуры:

 

1

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. shard 251 18.10.17 13:16 Сейчас в теме
я в подобных ситуациях (когда требуется изменить результат запроса, текст которого очень не хочется ковырять) применяю врезку:
1) выгружаю результат типового запроса в таблицу
2) обрабатываю таблицу как необходимо
3) получившуюся таблицу передаю параметров в свой запрос, результат которого записываю в переменную выборки или результата типового запроса
Оставьте свое сообщение

См. также

Полезные процедуры и функции для программиста 160

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Практика программирования Универсальные функции

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

07.10.2019    11496    HostHost    23       

Cashback 35% при покупке 1С лицензий на счет INFOSTART.RU с 27.11 по 04.12 Промо

Оформляете заказ на 1С лицензии или конфигурации. Получаете 35% от стоимости на счет в профиле INFOSTART.RU. Выбираете сервисы и продукты на сумму кэшбэка.

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Агрегатные функции СКД, о которых мало кто знает 353

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    15400    ids79    44       

Три костыля. Сказ про фокусы в коде 124

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    10457    YPermitin    69       

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

Отслеживание выполнения фонового задания 143

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    12582    ids79    16       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 261

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    17782    ids79    31       

Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо

Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.

24700 руб.

Фоновое выполнение кода в 1С - это просто 124

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

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

02.08.2019    12683    avalakh    21       

Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо

Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.

29700 руб.

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 141

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    15940    ids79    8       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 155

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    13495    ids79    27       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Регистры сведений. За кулисами 129

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    10525    YPermitin    12       

"Меньше копипаста!", или как Вася универсальную процедуру писал 183

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    9302    SeiOkami    49       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Создание отчетов с помощью СКД - основные понятия и элементы 216

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    23613    ids79    17       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    13567    dmurk    134       

Онлайн-курс "Технология выполнения проектов ERP-класса – процессный подход". Третий поток. Курс проходит с 21 января по 18 марта 2020 года. Промо

Курс разработан Внедренческим центром «Раздолье». Курс предназначен для подготовки аналитиков, архитекторов и руководителей проектов автоматизации процессов управления с использованием комплексных ИТ-систем (1С:ERP, 1С:УХ, 1С:КА, 1С:УТ). В основе курса лежит методика применения процессного подхода.

9000 рублей

Регистры накопления. Структура хранения в базе данных 178

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    21011    YPermitin    27       

Выполнение внешней обработки в фоновом задании 149

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    12910    Eret1k    23       

Специальное предложение по 1С:Документооборот 8! Промо

Оперативно навести порядок в документообороте? Легко! Воспользуйтесь специальным предложением! Внедрение за 2 недели! Фиксированная цена и гарантия результата!

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    7296    m-rv    2       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    9865    m-rv    16       

Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо

Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).

от 11000 до 29000 рублей

О расширениях замолвите слово... 195

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    18860    ellavs    125       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    15086    ellavs    83       

Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.

19700 руб.

Трюки с внешними источниками данных 166

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    15827    YPermitin    52       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 173

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    19099    ids79    9