Алгоритм сохранения изменений в табличных полях печатных форм документов

22.10.11

Разработка - Математика и алгоритмы

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

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

Алгоритм рассмотрим на примере документа "Счет на оплату покупателю".
Документу добавлены две печатные формы "Счет договор" и "Спецификация".

1. Добавим документу два реквизита типа "Хранилище значения" - ПечатнаяФормаСчета и ПечатнаяФормаСпецификации. В них будут храниться измененные табличные документы.


2. Создаем общий модуль или используем существующий. Добавим в него функцию:

Функция ОткрытьСохраненнуюПечатнуюФорму( п_РеквизитХранилище ) Экспорт
    
    ТабДокумент = п_РеквизитХранилище.Получить();
    Если ТабДокумент <> Неопределено Тогда
        Ответ = Вопрос("Печатная формы была изменена и сохранена. Открыть сохраненный вариант? Да - Открыть; Нет - Сформировать заново.", РежимДиалогаВопрос.ДаНетОтмена );
        Если Ответ = КодВозвратаДиалога.Отмена Тогда
            Возврат "Отмена";
        ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
            Возврат Неопределено;
        КонецЕсли;
    КонецЕсли;    
    
    Возврат ТабДокумент;
    
КонецФункции


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

3. Вносим изменения в общую форму "ФормаПечати".

А. Изменям тип реквизита формы "Документ" на составной ДокументСсылка, СправочникСсылка (что бы можно было сохранять печатные формы справочников)

Б. Добавляем в модуль процедуру:

Процедура СохранитьПечатнуюФорму( п_Реквизит )
    
    Если Модифицированность Тогда
        Ответ = Вопрос( "Печатная форма была изменена. Сохранить изменения?", РежимДиалогаВопрос.ДаНетОтмена );
        Если Ответ = КодВозвратаДиалога.Отмена Тогда
            Отказ = Истина;
            Возврат;
        КонецЕсли;    
        Если Ответ = КодВозвратаДиалога.Да Тогда
            Объект = Документ.ПолучитьОбъект();
            ПечатныйДокумент.ВставитьОбласть(ЭлементыФормы.ПолеДокумента.Область());
            ХЗ = Новый ХранилищеЗначения(ПечатныйДокумент, Новый СжатиеДанных(9));
            Объект[п_Реквизит] = ХЗ;
            Объект.Записать();
        КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры 
   

Процедура проверяет модифицированность формы печати и предлагает сохранить изменения.

В. и обработчик ПередЗакрытием:

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    
    Если ТипЗнч( Документ ) = Тип( "СправочникСсылка.ДоговорыКонтрагентов" ) Тогда
        СохранитьПечатнуюФорму( "ПечатнаяФорма" );
    ИначеЕсли ТипЗнч( Документ ) = Тип( "ДокументСсылка.СчетНаОплатуПокупателю" ) Тогда
        Если ИмяМакета = "Спецификация" Тогда
            СохранитьПечатнуюФорму( "ПечатнаяФормаСпецификации" );
        ИначеЕсли ИмяМакета = "СчетСпец" Тогда
            СохранитьПечатнуюФорму( "ПечатнаяФормаСчета" );
        КонецЕсли;    
    КонецЕсли;    
    
КонецПроцедуры

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

4. Корректируем процедуру Печать модуля документа "Счет на оплату покупателю":

Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт
    
    // Получить экземпляр документа на печать
    Если ИмяМакета = "Счет" Тогда
       
        ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета);
       
    //ИЗМЕНЕНИЯ        
    ИначеЕсли ИмяМакета = "СчетСпец" Тогда
        ТабДокумент = СпецПечатныеФормы.ОткрытьСохраненнуюПечатнуюФорму( ПечатнаяФормаСчета );
        Если ТабДокумент = "Отмена"  Тогда
            Возврат;
        ИначеЕсли ТабДокумент = Неопределено Тогда
            ТабДокумент = ПечатьСчета( ИмяМакета );    
        КонецЕсли;    
    ИначеЕсли ИмяМакета = "Спецификация" Тогда
        ТабДокумент = СпецПечатныеФормы.ОткрытьСохраненнуюПечатнуюФорму( ПечатнаяФормаСпецификации );
        Если ТабДокумент = "Отмена"  Тогда
            Возврат;
        ИначеЕсли ТабДокумент = Неопределено Тогда
            ТабДокумент = ПечатьСпецификации();    
        КонецЕсли;    
    //ИЗМЕНЕНИЯ        
       
    КонецЕсли;
    
    //ИЗМЕНЕНИЯ        
    //УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект, ""), НепосредственнаяПечать);

    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(ЭтотОбъект, ""), НепосредственнаяПечать, Ссылка, ИмяМакета);
    //ИЗМЕНЕНИЯ        
    
КонецПроцедуры


Здесь видно как используется процедура ОткрытьСохраненнуюПечатнуюФорму которая, в данном примере, описана в общем модуле СпецПечатныеФормы.
Обратите внимание, что в процедуру "НапечататьДокумент" так же передаются Ссылка и ИмяМакета.

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3164    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7555    user1959478    51    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3110    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10904    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4359    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    3529    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9042    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bonni80@mail.ru 26.10.11 05:57 Сейчас в теме
2. unis 26.10.11 09:20 Сейчас в теме
Очень интересно и нужно.
Только помогите мне пожалуйста. Куда это все вносить?
заранее очень благодарна за подсказку!!!
3. scape 282 26.10.11 14:34 Сейчас в теме
Вообще то здесь уже написано, что и куда вносить! Если не понятно, то совет, найти того кто понимает. Извините пожалуйста...
E_BEREZIN; +1 Ответить
4. unis 26.10.11 14:49 Сейчас в теме
Вернее я понимаю куда это вносить.
просто куда именно: просто продолжить или полностью поменять алгоритм.
или где-то оставить, а где-то продолжить?
5. AlexKoso 20 26.10.11 15:28 Сейчас в теме
(4) unis, вообще ценность этой публикации не в коде, а в самой идее. Само собой у многих возникнут свои пожелания и взгляды на реализацию. А когда кто-то на форуме пишет "Вернее я понимаю куда это вносить.
просто куда именно?" мне становится страшно за судьбу вашего клиента. Перестаньте заниматься не своим делом.
Sejix; ssfedkin; +2 Ответить
Оставьте свое сообщение